diff --git a/ai/skills/build-verify/SKILL.md b/.agents/skills/build-verify/SKILL.md similarity index 99% rename from ai/skills/build-verify/SKILL.md rename to .agents/skills/build-verify/SKILL.md index efddc6f..bde248d 100644 --- a/ai/skills/build-verify/SKILL.md +++ b/.agents/skills/build-verify/SKILL.md @@ -7,7 +7,7 @@ description: > Used at the end of the prd → techspec → tasks → implement-tasks-sequence flow before `pr-review`, and can also be invoked manually when the user says "verify build", "run full verification", or "check everything". -allowed-tools: Bash, Read, Grep, Glob, Edit, Skill +allowed-tools: Bash Read Grep Glob Edit Skill model: claude-sonnet-4-6 --- diff --git a/ai/skills/build-verify/scripts/verify.sh b/.agents/skills/build-verify/scripts/verify.sh similarity index 100% rename from ai/skills/build-verify/scripts/verify.sh rename to .agents/skills/build-verify/scripts/verify.sh diff --git a/ai/skills/create-pr/SKILL.md b/.agents/skills/create-pr/SKILL.md similarity index 99% rename from ai/skills/create-pr/SKILL.md rename to .agents/skills/create-pr/SKILL.md index 88c0619..4464a21 100644 --- a/ai/skills/create-pr/SKILL.md +++ b/.agents/skills/create-pr/SKILL.md @@ -6,7 +6,7 @@ description: > approved, pushes, and opens or updates the PR. Supports stacked PRs by asking for the base branch when detection is ambiguous. Use when the user says "create PR", "open PR", "push PR", or wants to submit their work for review. -allowed-tools: Bash, Read, Write, Grep, Glob, Skill, Agent +allowed-tools: Bash Read Write Grep Glob Skill Agent user-invocable: true model: claude-sonnet-4-6 --- diff --git a/ai/skills/feature-data-flow/SKILL.md b/.agents/skills/feature-data-flow/SKILL.md similarity index 93% rename from ai/skills/feature-data-flow/SKILL.md rename to .agents/skills/feature-data-flow/SKILL.md index 25e64f4..f87b133 100644 --- a/ai/skills/feature-data-flow/SKILL.md +++ b/.agents/skills/feature-data-flow/SKILL.md @@ -1,7 +1,10 @@ --- name: feature-data-flow -description: Build a full feature in this Flutter repository that includes backend or storage data flow: read API schema, create DTOs, map DTOs to entities, add Riverpod use cases, connect feature state, and render UI data. Use when a task goes beyond a screen and needs real data integration. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +description: > + Build a full feature in this Flutter repository that includes backend or storage data flow: + read API schema, create DTOs, map DTOs to entities, add Riverpod use cases, connect feature + state, and render UI data. Use when a task goes beyond a screen and needs real data integration. +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/skills/feature-screen/SKILL.md b/.agents/skills/feature-screen/SKILL.md similarity index 98% rename from ai/skills/feature-screen/SKILL.md rename to .agents/skills/feature-screen/SKILL.md index ddb47a3..1432e69 100644 --- a/ai/skills/feature-screen/SKILL.md +++ b/.agents/skills/feature-screen/SKILL.md @@ -1,7 +1,7 @@ --- name: feature-screen description: Create a new Flutter screen in this repository using the existing feature structure, AutoRoute setup, Riverpod state pattern, and code generation workflow. Use when adding a new page, route, stateful screen, or feature folder in this template. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/skills/implement-tasks-sequence/SKILL.md b/.agents/skills/implement-tasks-sequence/SKILL.md similarity index 98% rename from ai/skills/implement-tasks-sequence/SKILL.md rename to .agents/skills/implement-tasks-sequence/SKILL.md index c1670ab..228991a 100644 --- a/ai/skills/implement-tasks-sequence/SKILL.md +++ b/.agents/skills/implement-tasks-sequence/SKILL.md @@ -7,7 +7,7 @@ description: > which runs `build-verify` and `pr-review uncommitted` afterwards). Use when the user says "implement all tasks", "run the task sequence", "implement the feature", or wants to execute multiple tasks from a task list end-to-end. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write, Agent +allowed-tools: Bash Read Grep Glob Edit Write Agent model: claude-sonnet-4-6 --- diff --git a/ai/skills/implement/SKILL.md b/.agents/skills/implement/SKILL.md similarity index 96% rename from ai/skills/implement/SKILL.md rename to .agents/skills/implement/SKILL.md index fa9e8f8..0a917fe 100644 --- a/ai/skills/implement/SKILL.md +++ b/.agents/skills/implement/SKILL.md @@ -8,7 +8,7 @@ description: > start-job/build-verify. Use when the user says "implement task X", "work on task X", or wants to execute a specific task from the task list. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write, Agent +allowed-tools: Bash Read Grep Glob Edit Write Agent model: claude-sonnet-4-6 --- @@ -101,9 +101,9 @@ In standalone mode, verify before considering the task complete. Use the smallest sufficient verification: - Run `make gen` when annotations, routes, DTOs, localization, or asset inputs changed. -- Run `ai/skills/lint-format/scripts/lint-format.sh` for normal Dart/Flutter code changes. +- Run `.agents/skills/lint-format/scripts/lint-format.sh` for normal Dart/Flutter code changes. - Run `fvm flutter test` when behavior, state, use cases, widgets, or tests changed. -- Run `ai/skills/build-verify/scripts/verify.sh` for broad, cross-platform, dependency, startup, routing, generated-code, or PR-ready tasks. +- Run `.agents/skills/build-verify/scripts/verify.sh` for broad, cross-platform, dependency, startup, routing, generated-code, or PR-ready tasks. - Run `make integration_test` only when Patrol integration flows changed or the user asks for it. If any step fails, fix the underlying issue and re-run the failed verification. Do not disable checks, delete tests, add broad `// ignore:` comments, or hand-edit generated files to make verification pass. diff --git a/ai/skills/layout-debug/SKILL.md b/.agents/skills/layout-debug/SKILL.md similarity index 98% rename from ai/skills/layout-debug/SKILL.md rename to .agents/skills/layout-debug/SKILL.md index 3c11578..4eed4d2 100644 --- a/ai/skills/layout-debug/SKILL.md +++ b/.agents/skills/layout-debug/SKILL.md @@ -6,7 +6,7 @@ description: > theme, localization, and shared widget patterns. Use when UI overflows, text clips, widgets disappear, layouts fail on mobile/tablet/desktop, or a feature needs responsive behavior. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/skills/lint-format/SKILL.md b/.agents/skills/lint-format/SKILL.md similarity index 96% rename from ai/skills/lint-format/SKILL.md rename to .agents/skills/lint-format/SKILL.md index 810ee93..28b85f5 100644 --- a/ai/skills/lint-format/SKILL.md +++ b/.agents/skills/lint-format/SKILL.md @@ -4,7 +4,7 @@ description: > Run Flutter/Dart formatting and static analysis for this repository. Use after completing Dart, Flutter, generated-source-input, or project configuration changes; when the user asks to lint, format, analyze, or check code style; or when preparing code for a pull request. -allowed-tools: Bash, Read, Grep, Glob +allowed-tools: Bash Read Grep Glob model: claude-sonnet-4-6 --- @@ -24,7 +24,7 @@ Run this skill after completing Flutter/Dart code changes unless a broader verif Run the wrapper script from the repo root: ```bash -ai/skills/lint-format/scripts/lint-format.sh +.agents/skills/lint-format/scripts/lint-format.sh ``` The script auto-detects whether Flutter-relevant files changed. When relevant files changed, it formats changed Dart files and runs a project-wide analyzer pass. diff --git a/ai/skills/lint-format/scripts/lint-format.sh b/.agents/skills/lint-format/scripts/lint-format.sh similarity index 100% rename from ai/skills/lint-format/scripts/lint-format.sh rename to .agents/skills/lint-format/scripts/lint-format.sh diff --git a/ai/skills/pr-review/SKILL.md b/.agents/skills/pr-review/SKILL.md similarity index 99% rename from ai/skills/pr-review/SKILL.md rename to .agents/skills/pr-review/SKILL.md index fb0e47b..ad60a51 100644 --- a/ai/skills/pr-review/SKILL.md +++ b/.agents/skills/pr-review/SKILL.md @@ -1,7 +1,7 @@ --- name: pr-review description: Review pull requests, branch diffs, and uncommitted changes in this Flutter repository with a bug-finding mindset. Use when asked to review changes, review a PR, audit a diff, check standards, check compliance, or look for regressions, missing tests, release risks, or architecture mismatches. -allowed-tools: Agent, Bash, Read, Grep, Glob, Edit +allowed-tools: Agent Bash Read Grep Glob Edit model: claude-sonnet-4-6 --- diff --git a/ai/skills/prd/SKILL.md b/.agents/skills/prd/SKILL.md similarity index 95% rename from ai/skills/prd/SKILL.md rename to .agents/skills/prd/SKILL.md index 1d0eeef..7ab7633 100644 --- a/ai/skills/prd/SKILL.md +++ b/.agents/skills/prd/SKILL.md @@ -6,7 +6,7 @@ description: > `.claude/tasks//prd.md`. Use when the user says "create a PRD", "write requirements", "define the feature", "start a feature spec", or wants to specify a feature before techspec/tasks/start-job. -allowed-tools: Bash, Read, Grep, Glob, Write, Edit +allowed-tools: Bash Read Grep Glob Write Edit model: claude-opus-4-7 --- @@ -21,14 +21,14 @@ You are a PRD creation specialist focused on producing clear, actionable product 4. Generate a PRD using the standardized template ## Template Reference -- Template: `ai/templates/prd.md` (also reachable as `.claude/templates/prd.md`) +- Template: `.agents/templates/prd.md` (also reachable as `.claude/templates/prd.md`) - Output: `.claude/tasks/[feature-name]/prd.md` ## Read First - `AGENTS.md` - `docs/PROJECT_OVERVIEW.md` - `docs/PROJECT_GUIDELINES.md` -- `ai/templates/prd.md` +- `.agents/templates/prd.md` - any user-provided brief, ticket, design, API notes, or KMP/source-platform reference material ## Scope Boundary @@ -73,7 +73,7 @@ Get explicit confirmation before drafting. ### Step 3: Draft the PRD (Mandatory) -Read the template at `ai/templates/prd.md` and use it to draft the PRD. +Read the template at `.agents/templates/prd.md` and use it to draft the PRD. - Focus on **WHAT** and **WHY**, not implementation details. - Keep requirements testable and unambiguous. - Reference domain entities from existing project docs, user input, or migration material where relevant. diff --git a/ai/skills/project-setup/SKILL.md b/.agents/skills/project-setup/SKILL.md similarity index 92% rename from ai/skills/project-setup/SKILL.md rename to .agents/skills/project-setup/SKILL.md index 5074030..db3e34c 100644 --- a/ai/skills/project-setup/SKILL.md +++ b/.agents/skills/project-setup/SKILL.md @@ -1,7 +1,7 @@ --- name: project-setup description: Customize a new project created from this Flutter template, including app identity, package name, platform cleanup, icons, splash screen, Firebase/secrets decisions, setup tool execution, code generation, and validation. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- @@ -54,20 +54,20 @@ Use this when setting up a new clone, preparing AI workflows, or debugging skill - Run `gh auth login --hostname github.com --git-protocol ssh --web`. - Run `gh auth status` and fix any invalid `GITHUB_TOKEN` / `GH_TOKEN` environment variables if they override the stored login. 3. Verify repo-local script permissions and syntax: - - `test -x ai/skills/build-verify/scripts/verify.sh` - - `test -x ai/skills/lint-format/scripts/lint-format.sh` - - `test -x ai/skills/release-builds/scripts/archive_ios_ipa.sh` - - `bash -n ai/skills/build-verify/scripts/verify.sh` - - `bash -n ai/skills/lint-format/scripts/lint-format.sh` - - `sh -n ai/skills/release-builds/scripts/archive_ios_ipa.sh` + - `test -x .agents/skills/build-verify/scripts/verify.sh` + - `test -x .agents/skills/lint-format/scripts/lint-format.sh` + - `test -x .agents/skills/release-builds/scripts/archive_ios_ipa.sh` + - `bash -n .agents/skills/build-verify/scripts/verify.sh` + - `bash -n .agents/skills/lint-format/scripts/lint-format.sh` + - `sh -n .agents/skills/release-builds/scripts/archive_ios_ipa.sh` 4. Verify Claude discovery wiring when Claude Code support is needed: - - every `ai/skills//SKILL.md` has a matching `.claude/skills/` symlink + - every `.agents/skills//SKILL.md` has a matching `.claude/skills/` symlink - every skill has a matching `.claude/commands/.md` - each symlink resolves to a `SKILL.md` 5. Run lightweight help checks: - - `ai/skills/build-verify/scripts/verify.sh --help` - - `ai/skills/lint-format/scripts/lint-format.sh --help` - - `ai/skills/release-builds/scripts/archive_ios_ipa.sh` should print usage and exit non-zero when no flavor is supplied. + - `.agents/skills/build-verify/scripts/verify.sh --help` + - `.agents/skills/lint-format/scripts/lint-format.sh --help` + - `.agents/skills/release-builds/scripts/archive_ios_ipa.sh` should print usage and exit non-zero when no flavor is supplied. ## Platform Cleanup Workflow Use this workflow to automate README First steps > Automated steps item 1. diff --git a/ai/skills/release-builds/SKILL.md b/.agents/skills/release-builds/SKILL.md similarity index 92% rename from ai/skills/release-builds/SKILL.md rename to .agents/skills/release-builds/SKILL.md index 0ab187e..8d1bf10 100644 --- a/ai/skills/release-builds/SKILL.md +++ b/.agents/skills/release-builds/SKILL.md @@ -1,7 +1,7 @@ --- name: release-builds description: Run post-merge release build steps for this repository, including Android tag-driven releases and sequential iOS IPA generation with archival for Transporter upload and Crashlytics deobfuscation. Use after the release PR has been merged. -allowed-tools: Bash, Read, Grep, Glob +allowed-tools: Bash Read Grep Glob model: claude-sonnet-4-6 --- @@ -16,7 +16,7 @@ Use this skill only after the release PR has been merged. - `pubspec.yaml` - `makefile` - `.github/workflows/` -- `ai/skills/release-builds/scripts/archive_ios_ipa.sh` +- `.agents/skills/release-builds/scripts/archive_ios_ipa.sh` ## Goal This skill is for the post-merge release-build phase. @@ -64,13 +64,13 @@ Immediately after each IPA build, archive the IPA out of `build/ios/ipa/` and Fl Use: ```bash -ai/skills/release-builds/scripts/archive_ios_ipa.sh +.agents/skills/release-builds/scripts/archive_ios_ipa.sh ``` Examples: -- `ai/skills/release-builds/scripts/archive_ios_ipa.sh develop` -- `ai/skills/release-builds/scripts/archive_ios_ipa.sh staging` -- `ai/skills/release-builds/scripts/archive_ios_ipa.sh production` +- `.agents/skills/release-builds/scripts/archive_ios_ipa.sh develop` +- `.agents/skills/release-builds/scripts/archive_ios_ipa.sh staging` +- `.agents/skills/release-builds/scripts/archive_ios_ipa.sh production` The script copies the generated IPA into: diff --git a/ai/skills/release-builds/scripts/archive_ios_ipa.sh b/.agents/skills/release-builds/scripts/archive_ios_ipa.sh similarity index 94% rename from ai/skills/release-builds/scripts/archive_ios_ipa.sh rename to .agents/skills/release-builds/scripts/archive_ios_ipa.sh index e752a23..ed023d2 100755 --- a/ai/skills/release-builds/scripts/archive_ios_ipa.sh +++ b/.agents/skills/release-builds/scripts/archive_ios_ipa.sh @@ -3,7 +3,7 @@ set -eu if [ "$#" -ne 1 ]; then - echo "Usage: ai/skills/release-builds/scripts/archive_ios_ipa.sh " >&2 + echo "Usage: .agents/skills/release-builds/scripts/archive_ios_ipa.sh " >&2 exit 1 fi diff --git a/ai/skills/release-prepare/SKILL.md b/.agents/skills/release-prepare/SKILL.md similarity index 97% rename from ai/skills/release-prepare/SKILL.md rename to .agents/skills/release-prepare/SKILL.md index 4e2f1be..a2b503b 100644 --- a/ai/skills/release-prepare/SKILL.md +++ b/.agents/skills/release-prepare/SKILL.md @@ -1,7 +1,7 @@ --- name: release-prepare description: Prepare a release in this repository by bumping the app version, updating release notes, creating a release branch named release/, and preparing the PR for merge before any release builds or tags are created. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/skills/review-pr-comments/SKILL.md b/.agents/skills/review-pr-comments/SKILL.md similarity index 99% rename from ai/skills/review-pr-comments/SKILL.md rename to .agents/skills/review-pr-comments/SKILL.md index 4dfca1a..548bfb3 100644 --- a/ai/skills/review-pr-comments/SKILL.md +++ b/.agents/skills/review-pr-comments/SKILL.md @@ -8,7 +8,7 @@ description: > comments, and pushes. Use when the user asks to review PR comments, resolve PR feedback, review AI comments, review human review comments, or handle code review feedback. -allowed-tools: Agent, Bash, Read, Edit, Write, Grep, Glob +allowed-tools: Agent Bash Read Edit Write Grep Glob model: claude-sonnet-4-6 --- diff --git a/ai/skills/secrets-bootstrap/SKILL.md b/.agents/skills/secrets-bootstrap/SKILL.md similarity index 98% rename from ai/skills/secrets-bootstrap/SKILL.md rename to .agents/skills/secrets-bootstrap/SKILL.md index f290768..1104782 100644 --- a/ai/skills/secrets-bootstrap/SKILL.md +++ b/.agents/skills/secrets-bootstrap/SKILL.md @@ -1,7 +1,7 @@ --- name: secrets-bootstrap description: Safely work with encrypted secrets, environment files, and signing material in this repository. Use when a task requires loading, decrypting, validating, or explaining the repo's secrets and signing setup. -allowed-tools: Bash, Read, Grep, Glob +allowed-tools: Bash Read Grep Glob model: claude-sonnet-4-6 --- diff --git a/ai/skills/start-job/SKILL.md b/.agents/skills/start-job/SKILL.md similarity index 98% rename from ai/skills/start-job/SKILL.md rename to .agents/skills/start-job/SKILL.md index 5e72133..6758451 100644 --- a/ai/skills/start-job/SKILL.md +++ b/.agents/skills/start-job/SKILL.md @@ -5,7 +5,7 @@ description: > tasks → implement-tasks-sequence → build-verify → pr-review uncommitted. Use after a PRD and tech spec are complete. Trigger phrases: "start job", "start the job", "run the full pipeline", "do it all", "implement the feature end-to-end". -allowed-tools: Bash, Read, Grep, Glob, Edit, Write, Agent, Skill +allowed-tools: Bash Read Grep Glob Edit Write Agent Skill user-invocable: true model: claude-sonnet-4-6 --- diff --git a/ai/skills/tasks/SKILL.md b/.agents/skills/tasks/SKILL.md similarity index 95% rename from ai/skills/tasks/SKILL.md rename to .agents/skills/tasks/SKILL.md index 1512bcb..95df835 100644 --- a/ai/skills/tasks/SKILL.md +++ b/.agents/skills/tasks/SKILL.md @@ -8,7 +8,7 @@ description: > for the next step. Use when the user says "break this down into tasks", "create tasks", "task breakdown", or after the tech spec is complete and the user wants to plan implementation. -allowed-tools: Bash, Read, Grep, Glob, Write, Edit +allowed-tools: Bash Read Grep Glob Write Edit model: claude-sonnet-4-6 --- @@ -41,7 +41,7 @@ Read both documents and identify: ### Step 2: Generate Task Structure -Order tasks following this Flutter-stack progression (mirrors the `ai/templates/task-list.md` +Order tasks following this Flutter-stack progression (mirrors the `.agents/templates/task-list.md` phases): 1. **Foundation (data layer)** — DTOs in `lib/common/data/dto/` (`@freezed` with @@ -67,13 +67,13 @@ Keep the total number of tasks reasonable — prefer fewer, well-scoped tasks ov ### Step 3: Create Task Summary -Use the template at `ai/templates/task-list.md` (also reachable as +Use the template at `.agents/templates/task-list.md` (also reachable as `.claude/templates/task-list.md` via symlink) to generate: `.claude/tasks/[feature-name]/tasks.md` ### Step 4: Generate Individual Task Files -Use the template at `ai/templates/task.md` (also reachable as `.claude/templates/task.md` +Use the template at `.agents/templates/task.md` (also reachable as `.claude/templates/task.md` via symlink) to create: `.claude/tasks/[feature-name]/[num]_task.md` diff --git a/ai/skills/techspec/SKILL.md b/.agents/skills/techspec/SKILL.md similarity index 97% rename from ai/skills/techspec/SKILL.md rename to .agents/skills/techspec/SKILL.md index 12c92e1..85da948 100644 --- a/ai/skills/techspec/SKILL.md +++ b/.agents/skills/techspec/SKILL.md @@ -5,7 +5,7 @@ description: > through deep project analysis and clarification. Use when the user says "create a tech spec", "write the technical design", "spec this out", or after a PRD is complete and the user wants to move to technical planning. -allowed-tools: Bash, Read, Grep, Glob, Write, Edit +allowed-tools: Bash Read Grep Glob Write Edit model: claude-opus-4-7 --- @@ -74,7 +74,7 @@ Do not proceed until clarifications are resolved. ### Step 4: Generate Tech Spec -Read the template at `ai/templates/techspec.md` (also reachable at +Read the template at `.agents/templates/techspec.md` (also reachable at `.claude/templates/techspec.md` via symlink) and draft the spec. - Reference concrete files and modules from the codebase diff --git a/ai/skills/upgrade/SKILL.md b/.agents/skills/upgrade/SKILL.md similarity index 99% rename from ai/skills/upgrade/SKILL.md rename to .agents/skills/upgrade/SKILL.md index 37318e6..ea0c7a6 100644 --- a/ai/skills/upgrade/SKILL.md +++ b/.agents/skills/upgrade/SKILL.md @@ -1,7 +1,7 @@ --- name: upgrade description: Upgrade Flutter and package dependencies in this repository while keeping .fvmrc, pubspec.yaml, code generation, CI, and tests aligned. Use when bumping Flutter, Dart constraints, direct dependencies, or generator toolchains. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/skills/widget-test/SKILL.md b/.agents/skills/widget-test/SKILL.md similarity index 98% rename from ai/skills/widget-test/SKILL.md rename to .agents/skills/widget-test/SKILL.md index 1568ce8..4e6014b 100644 --- a/ai/skills/widget-test/SKILL.md +++ b/.agents/skills/widget-test/SKILL.md @@ -5,7 +5,7 @@ description: > Riverpod provider overrides, generated localization, shared theme setup, and FVM test commands. Use when a task asks for widget tests, UI regression coverage, test coverage for a screen/component, or when implementation work changes visible Flutter behavior. -allowed-tools: Bash, Read, Grep, Glob, Edit, Write +allowed-tools: Bash Read Grep Glob Edit Write model: claude-sonnet-4-6 --- diff --git a/ai/templates/prd.md b/.agents/templates/prd.md similarity index 100% rename from ai/templates/prd.md rename to .agents/templates/prd.md diff --git a/ai/templates/task-list.md b/.agents/templates/task-list.md similarity index 100% rename from ai/templates/task-list.md rename to .agents/templates/task-list.md diff --git a/ai/templates/task.md b/.agents/templates/task.md similarity index 100% rename from ai/templates/task.md rename to .agents/templates/task.md diff --git a/ai/templates/techspec.md b/.agents/templates/techspec.md similarity index 100% rename from ai/templates/techspec.md rename to .agents/templates/techspec.md diff --git a/.agents/validate_skills.py b/.agents/validate_skills.py new file mode 100755 index 0000000..9306b12 --- /dev/null +++ b/.agents/validate_skills.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 +"""Validate .agents/skills/* against the Agent Skills spec (agentskills.io/specification) +and this repo's skill-exposure convention (see AGENTS.md "Creating a new skill"). + +Checks per skill: + - SKILL.md exists with parseable YAML frontmatter (strict — lenient parsers in + some clients mask errors that make other clients silently skip the skill) + - name: required, 1-64 chars, lowercase alphanumerics and single hyphens, + no leading/trailing hyphen, matches the directory name + - description: required, 1-1024 chars + - allowed-tools: optional, space-separated string, no comma-separated values + - unknown top-level frontmatter fields (spec fields + known Claude Code + extensions are accepted; anything else is a warning) + - SKILL.md body under 500 lines (spec recommendation; warning) + - Claude Code exposure exists: + .claude/skills/ symlink and .claude/commands/.md slash command file + +Exits 1 on errors, 0 if only warnings. +""" + +import os +import re +import sys + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +SKILLS_DIR = os.path.join(REPO_ROOT, ".agents", "skills") + +SPEC_FIELDS = {"name", "description", "license", "compatibility", "metadata", "allowed-tools"} +CLAUDE_EXTENSIONS = {"model", "user-invocable", "disable-model-invocation"} +NAME_RE = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$") +TOOL_RE = re.compile(r"^[A-Za-z0-9_./:-]+(?:\([^)\s]+\))?$") +MAX_BODY_LINES = 500 + +try: + import yaml +except ImportError: + yaml = None + + +def parse_frontmatter(text: str) -> dict[str, object]: + if yaml is not None: + fm = yaml.safe_load(text) + if not isinstance(fm, dict): + raise ValueError("frontmatter is not a YAML mapping") + return fm + + data: dict[str, object] = {} + lines = text.splitlines() + index = 0 + while index < len(lines): + line = lines[index] + index += 1 + if not line.strip(): + continue + if line.startswith((" ", "\t")) or ":" not in line: + raise ValueError("frontmatter uses YAML syntax that requires PyYAML") + + key, value = line.split(":", 1) + key = key.strip() + value = value.strip() + if not key: + raise ValueError("frontmatter contains an empty key") + + if value in {">", "|"}: + block_lines: list[str] = [] + while index < len(lines) and (lines[index].startswith((" ", "\t")) or not lines[index].strip()): + block_lines.append(lines[index].strip()) + index += 1 + data[key] = "\n".join(block_lines).strip() if value == "|" else " ".join(block_lines).strip() + continue + + if value.lower() == "true": + data[key] = True + elif value.lower() == "false": + data[key] = False + else: + data[key] = value.strip("\"'") + + return data + + +def check_skill(skill_dir: str) -> tuple[list[str], list[str]]: + errors: list[str] = [] + warnings: list[str] = [] + dirname = os.path.basename(skill_dir) + skill_md = os.path.join(skill_dir, "SKILL.md") + + if not os.path.isfile(skill_md): + return [f"missing SKILL.md"], warnings + + text = open(skill_md, encoding="utf-8").read() + match = re.match(r"^---\n(.*?)\n---\n?(.*)$", text, re.S) + if not match: + return ["SKILL.md has no YAML frontmatter block"], warnings + + try: + fm = parse_frontmatter(match.group(1)) + except Exception as exc: + msg = str(exc).splitlines()[0] + return [f"frontmatter is not valid YAML ({msg}) — " + "quote values containing colons or use a '>' block scalar"], warnings + + name = fm.get("name") + if not name: + errors.append("missing required field: name") + elif not isinstance(name, str): + errors.append("name must be a string") + else: + if name != dirname: + errors.append(f"name '{name}' does not match directory '{dirname}'") + if not NAME_RE.fullmatch(name): + errors.append(f"name '{name}' violates spec charset rules") + if len(name) > 64: + errors.append("name exceeds 64 characters") + + description = fm.get("description") + if not description: + errors.append("missing required field: description") + elif not isinstance(description, str): + errors.append("description must be a string") + elif len(description) > 1024: + errors.append(f"description is {len(description)} chars (max 1024)") + + allowed_tools = fm.get("allowed-tools") + if allowed_tools is not None: + if not isinstance(allowed_tools, str): + errors.append("allowed-tools must be a space-separated string") + elif "," in allowed_tools: + errors.append("allowed-tools must be space-separated; commas are not valid") + else: + tools = allowed_tools.split() + if not tools: + errors.append("allowed-tools must not be empty when provided") + for tool in tools: + if not TOOL_RE.fullmatch(tool): + errors.append(f"allowed-tools contains invalid tool token '{tool}'") + + for key in fm: + if key not in SPEC_FIELDS | CLAUDE_EXTENSIONS: + warnings.append(f"unknown frontmatter field '{key}' " + "(spec suggests nesting extras under 'metadata:')") + + body_lines = match.group(2).count("\n") + 1 + if body_lines > MAX_BODY_LINES: + warnings.append(f"body is {body_lines} lines (spec recommends < {MAX_BODY_LINES}; " + "consider moving detail into references/)") + + skill_link_rel = os.path.join(".claude", "skills", dirname) + skill_link_path = os.path.join(REPO_ROOT, skill_link_rel) + if not os.path.exists(skill_link_path): + errors.append(f"missing Claude Code symlink: {skill_link_rel}") + elif not os.path.islink(skill_link_path): + errors.append(f"Claude Code skill exposure must be a symlink: {skill_link_rel}") + + command_rel = os.path.join(".claude", "commands", f"{dirname}.md") + command_path = os.path.join(REPO_ROOT, command_rel) + if not os.path.isfile(command_path): + errors.append(f"missing slash command file: {command_rel}") + + return errors, warnings + + +def main() -> int: + if not os.path.isdir(SKILLS_DIR): + print(f"error: skills directory not found: {SKILLS_DIR}") + return 1 + + total_errors = 0 + total_warnings = 0 + for entry in sorted(os.listdir(SKILLS_DIR)): + skill_dir = os.path.join(SKILLS_DIR, entry) + if not os.path.isdir(skill_dir): + continue + errors, warnings = check_skill(skill_dir) + total_errors += len(errors) + total_warnings += len(warnings) + status = "FAIL" if errors else ("WARN" if warnings else "OK") + print(f"{status:4} {entry}") + for issue in errors: + print(f" error: {issue}") + for issue in warnings: + print(f" warning: {issue}") + + print(f"\n{total_errors} error(s), {total_warnings} warning(s)") + return 1 if total_errors else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index cda855e..fced3ee 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -1,18 +1,20 @@ @../AGENTS.md -Project-specific reusable AI workflows live in `../ai/skills/` and are surfaced -to Claude Code two ways: +Project-specific reusable AI workflows live in `../.agents/skills/` — the +standard cross-client Agent Skills location — and are surfaced to Claude Code +two ways: - **auto-discovery**: `./skills/` is a symlink with target - `../../ai/skills/` (resolved from `.claude/skills/`, this points - at `/ai/skills/`), so Claude reads the SKILL.md frontmatter + `../../.agents/skills/` (resolved from `.claude/skills/`, this points + at `/.agents/skills/`), so Claude reads the SKILL.md frontmatter and triggers them based on context. - **slash commands**: `./commands/.md` exposes each skill as an explicit command. Current commands mirror the skills listed in `AGENTS.md`, including `/project-setup`, `/feature-screen`, `/feature-data-flow`, `/prd`, `/techspec`, `/tasks`, `/implement`, `/implement-tasks-sequence`, - `/start-job`, `/build-verify`, `/lint-format`, `/create-pr`, - `/review-pr-comments`, `/upgrade`, `/release-prepare`, `/release-builds`, - `/secrets-bootstrap`, and `/pr-review`. + `/start-job`, `/build-verify`, `/lint-format`, `/widget-test`, + `/layout-debug`, `/create-pr`, `/review-pr-comments`, `/upgrade`, + `/release-prepare`, `/release-builds`, `/secrets-bootstrap`, and + `/pr-review`. See the "Reusable Workflows" section of `AGENTS.md` for the canonical list of -skills and the four-step convention for adding a new one. +skills and the five-step convention for adding a new one. diff --git a/.claude/skills/build-verify b/.claude/skills/build-verify index 038789c..48131cb 120000 --- a/.claude/skills/build-verify +++ b/.claude/skills/build-verify @@ -1 +1 @@ -../../ai/skills/build-verify \ No newline at end of file +../../.agents/skills/build-verify \ No newline at end of file diff --git a/.claude/skills/create-pr b/.claude/skills/create-pr index d71079b..d5b42b7 120000 --- a/.claude/skills/create-pr +++ b/.claude/skills/create-pr @@ -1 +1 @@ -../../ai/skills/create-pr \ No newline at end of file +../../.agents/skills/create-pr \ No newline at end of file diff --git a/.claude/skills/feature-data-flow b/.claude/skills/feature-data-flow index 3055f98..4c99c50 120000 --- a/.claude/skills/feature-data-flow +++ b/.claude/skills/feature-data-flow @@ -1 +1 @@ -../../ai/skills/feature-data-flow \ No newline at end of file +../../.agents/skills/feature-data-flow \ No newline at end of file diff --git a/.claude/skills/feature-screen b/.claude/skills/feature-screen index 3df57fb..db3a86b 120000 --- a/.claude/skills/feature-screen +++ b/.claude/skills/feature-screen @@ -1 +1 @@ -../../ai/skills/feature-screen \ No newline at end of file +../../.agents/skills/feature-screen \ No newline at end of file diff --git a/.claude/skills/implement b/.claude/skills/implement index 74bd3bf..e429be8 120000 --- a/.claude/skills/implement +++ b/.claude/skills/implement @@ -1 +1 @@ -../../ai/skills/implement \ No newline at end of file +../../.agents/skills/implement \ No newline at end of file diff --git a/.claude/skills/implement-tasks-sequence b/.claude/skills/implement-tasks-sequence index 9b015d6..42b9e43 120000 --- a/.claude/skills/implement-tasks-sequence +++ b/.claude/skills/implement-tasks-sequence @@ -1 +1 @@ -../../ai/skills/implement-tasks-sequence \ No newline at end of file +../../.agents/skills/implement-tasks-sequence \ No newline at end of file diff --git a/.claude/skills/layout-debug b/.claude/skills/layout-debug index 0ff119c..a8cfcb4 120000 --- a/.claude/skills/layout-debug +++ b/.claude/skills/layout-debug @@ -1 +1 @@ -../../ai/skills/layout-debug \ No newline at end of file +../../.agents/skills/layout-debug \ No newline at end of file diff --git a/.claude/skills/lint-format b/.claude/skills/lint-format index edbc66f..200a69a 120000 --- a/.claude/skills/lint-format +++ b/.claude/skills/lint-format @@ -1 +1 @@ -../../ai/skills/lint-format \ No newline at end of file +../../.agents/skills/lint-format \ No newline at end of file diff --git a/.claude/skills/pr-review b/.claude/skills/pr-review index dcb8e77..321fc63 120000 --- a/.claude/skills/pr-review +++ b/.claude/skills/pr-review @@ -1 +1 @@ -../../ai/skills/pr-review \ No newline at end of file +../../.agents/skills/pr-review \ No newline at end of file diff --git a/.claude/skills/prd b/.claude/skills/prd index 97e3cf4..51caf15 120000 --- a/.claude/skills/prd +++ b/.claude/skills/prd @@ -1 +1 @@ -../../ai/skills/prd \ No newline at end of file +../../.agents/skills/prd \ No newline at end of file diff --git a/.claude/skills/project-setup b/.claude/skills/project-setup index 73b95d9..bee4ce4 120000 --- a/.claude/skills/project-setup +++ b/.claude/skills/project-setup @@ -1 +1 @@ -../../ai/skills/project-setup \ No newline at end of file +../../.agents/skills/project-setup \ No newline at end of file diff --git a/.claude/skills/release-builds b/.claude/skills/release-builds index 50332b4..124d2fe 120000 --- a/.claude/skills/release-builds +++ b/.claude/skills/release-builds @@ -1 +1 @@ -../../ai/skills/release-builds \ No newline at end of file +../../.agents/skills/release-builds \ No newline at end of file diff --git a/.claude/skills/release-prepare b/.claude/skills/release-prepare index 243af08..d410e30 120000 --- a/.claude/skills/release-prepare +++ b/.claude/skills/release-prepare @@ -1 +1 @@ -../../ai/skills/release-prepare \ No newline at end of file +../../.agents/skills/release-prepare \ No newline at end of file diff --git a/.claude/skills/review-pr-comments b/.claude/skills/review-pr-comments index f6b35ff..7681e8a 120000 --- a/.claude/skills/review-pr-comments +++ b/.claude/skills/review-pr-comments @@ -1 +1 @@ -../../ai/skills/review-pr-comments \ No newline at end of file +../../.agents/skills/review-pr-comments \ No newline at end of file diff --git a/.claude/skills/secrets-bootstrap b/.claude/skills/secrets-bootstrap index fff4db6..ac86810 120000 --- a/.claude/skills/secrets-bootstrap +++ b/.claude/skills/secrets-bootstrap @@ -1 +1 @@ -../../ai/skills/secrets-bootstrap \ No newline at end of file +../../.agents/skills/secrets-bootstrap \ No newline at end of file diff --git a/.claude/skills/start-job b/.claude/skills/start-job index d9ea860..ed1e0e3 120000 --- a/.claude/skills/start-job +++ b/.claude/skills/start-job @@ -1 +1 @@ -../../ai/skills/start-job \ No newline at end of file +../../.agents/skills/start-job \ No newline at end of file diff --git a/.claude/skills/tasks b/.claude/skills/tasks index c56e514..ec1609b 120000 --- a/.claude/skills/tasks +++ b/.claude/skills/tasks @@ -1 +1 @@ -../../ai/skills/tasks \ No newline at end of file +../../.agents/skills/tasks \ No newline at end of file diff --git a/.claude/skills/techspec b/.claude/skills/techspec index 291e8e3..8b0ad23 120000 --- a/.claude/skills/techspec +++ b/.claude/skills/techspec @@ -1 +1 @@ -../../ai/skills/techspec \ No newline at end of file +../../.agents/skills/techspec \ No newline at end of file diff --git a/.claude/skills/upgrade b/.claude/skills/upgrade index 4bd522a..a7972b2 120000 --- a/.claude/skills/upgrade +++ b/.claude/skills/upgrade @@ -1 +1 @@ -../../ai/skills/upgrade \ No newline at end of file +../../.agents/skills/upgrade \ No newline at end of file diff --git a/.claude/skills/widget-test b/.claude/skills/widget-test index efdc1d7..c6706f8 120000 --- a/.claude/skills/widget-test +++ b/.claude/skills/widget-test @@ -1 +1 @@ -../../ai/skills/widget-test \ No newline at end of file +../../.agents/skills/widget-test \ No newline at end of file diff --git a/.claude/templates/prd.md b/.claude/templates/prd.md index f1808a0..db4f43f 120000 --- a/.claude/templates/prd.md +++ b/.claude/templates/prd.md @@ -1 +1 @@ -../../ai/templates/prd.md \ No newline at end of file +../../.agents/templates/prd.md \ No newline at end of file diff --git a/.claude/templates/task-list.md b/.claude/templates/task-list.md index 0333e67..39c6669 120000 --- a/.claude/templates/task-list.md +++ b/.claude/templates/task-list.md @@ -1 +1 @@ -../../ai/templates/task-list.md \ No newline at end of file +../../.agents/templates/task-list.md \ No newline at end of file diff --git a/.claude/templates/task.md b/.claude/templates/task.md index 17961ee..b724b87 120000 --- a/.claude/templates/task.md +++ b/.claude/templates/task.md @@ -1 +1 @@ -../../ai/templates/task.md \ No newline at end of file +../../.agents/templates/task.md \ No newline at end of file diff --git a/.claude/templates/techspec.md b/.claude/templates/techspec.md index 44313c5..bb0b2ee 120000 --- a/.claude/templates/techspec.md +++ b/.claude/templates/techspec.md @@ -1 +1 @@ -../../ai/templates/techspec.md \ No newline at end of file +../../.agents/templates/techspec.md \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 4c582b4..cd2c4fe 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,9 +43,10 @@ Use this file as the entrypoint for automated work in this repository. - If you learn a stable, repo-specific convention while working, update `docs/PROJECT_OVERVIEW.md` or `docs/PROJECT_GUIDELINES.md` instead of adding duplicate instructions elsewhere. ## Reusable Workflows -Repeatable procedures live as skills under `ai/skills//SKILL.md`. Each -skill has YAML frontmatter (`name:`, `description:`) so it can be auto-discovered -by AI tools that support skills. +Repeatable procedures live as skills under `.agents/skills//SKILL.md` — +the cross-client location defined by the [Agent Skills](https://agentskills.io) +format. Each skill has YAML frontmatter (`name:`, `description:`) so it can be +auto-discovered by AI tools that support skills. Existing skills: - `project-setup` — customize a new app from this template (identity, platforms, icons, splash, Firebase/secrets, validation) @@ -64,29 +65,31 @@ Existing skills: - `build-verify` — full build/test/analyze/format pass (codegen + analyze + test, then iOS + Android builds in parallel, then `dart format`); auto-scopes to the diff and leaves the working tree dirty for review - `start-job` — run the post-spec implementation pipeline (`tasks` → `implement-tasks-sequence` → `build-verify` → `pr-review`) - `prd` — create a Flutter feature Product Requirements Document under `.claude/tasks//prd.md` -- `tasks` — break a PRD + tech spec into discrete, dependency-ordered Flutter implementation tasks under `.claude/tasks//` using `ai/templates/task.md` and `ai/templates/task-list.md` +- `tasks` — break a PRD + tech spec into discrete, dependency-ordered Flutter implementation tasks under `.claude/tasks//` using `.agents/templates/task.md` and `.agents/templates/task-list.md` - `implement` — implement one generated Flutter task using the repo architecture and verification rules - `implement-tasks-sequence` — execute generated task files in dependency order before final verification - `techspec` — translate a PRD into an implementation-ready Flutter tech spec at `.claude/tasks//techspec.md`, grounded in the Riverpod / Freezed / AutoRoute / Dio / Firebase stack ### How AI tools find these skills -- **Codex** reads this `AGENTS.md` and the referenced `ai/skills//SKILL.md` - files. When delegating, mention the workflow by name, e.g. *"use the - feature-data-flow workflow"*. +- **Spec-compliant agents** scan `.agents/skills/` directly — it is the + standard cross-client skills location, so no extra wiring is needed. +- **Codex** reads this `AGENTS.md` and the referenced + `.agents/skills//SKILL.md` files. When delegating, mention the workflow + by name, e.g. *"use the feature-data-flow workflow"*. - **Claude Code** auto-discovers skills through `.claude/skills/` symlinks - that point at `ai/skills//`. Each skill is also exposed as a slash + that point at `.agents/skills//`. Each skill is also exposed as a slash command at `.claude/commands/.md`, so `/feature-screen`, `/pr-review`, `/release-prepare`, etc. work as explicit invocations. ### Creating a new skill -When adding a new repeatable workflow, complete all four steps so both Codex and -Claude can use it: -1. **Author the skill.** Create `ai/skills//SKILL.md` with YAML frontmatter - and the workflow body. Required fields: +When adding a new repeatable workflow, complete all five steps so Codex, Claude, +and other skills-compliant agents can use it: +1. **Author the skill.** Create `.agents/skills//SKILL.md` with YAML + frontmatter and the workflow body. Required fields: - `name:` matching the folder - `description:` explaining when to use the skill - `allowed-tools:` listing the tools the skill needs (for example - `Bash, Read, Grep, Glob, Edit, Write`; add `Agent` for skills that delegate + `Bash Read Grep Glob Edit Write`; add `Agent` for skills that delegate to subagents, `Skill` for orchestrators that invoke other skills) - `model:` selecting the model — use `claude-sonnet-4-6` for most implementation, verification, and review workflows, and `claude-opus-4-7` @@ -95,8 +98,13 @@ Claude can use it: `start-job` and `create-pr` 2. **Mention it for Codex.** Add the skill to the "Existing skills" list above. 3. **Expose it to Claude Code (auto-discovery).** Add a symlink: - `ln -s ../../ai/skills/ .claude/skills/` + `ln -s ../../.agents/skills/ .claude/skills/` 4. **Add a slash command.** Create `.claude/commands/.md` using one of the existing commands as a template — a short frontmatter (`description`, `argument-hint`) and a one-line body that invokes the skill, followed by `$ARGUMENTS`. +5. **Validate.** Run `python3 .agents/validate_skills.py` and fix any reported + issues. It checks Agent Skills spec compliance (strict YAML frontmatter, + name/description rules) and that the Claude Code symlink and slash command + from steps 3-4 exist. Also run it after editing any existing SKILL.md + frontmatter. diff --git a/README.md b/README.md index f6980f5..f936983 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ These are our four core values: ## Automated steps -The following steps can be completed or coordinated by `ai/skills/project-setup`. +The following steps can be completed or coordinated by `.agents/skills/project-setup`. 1. - [ ] Remove any unused platforms (Android, iOS, web, Windows, Linux (+snap), macOS) - Remove them from the folder structure of the template. @@ -503,7 +503,7 @@ Canonical project files: - `docs/PROJECT_GUIDELINES.md` contains implementation conventions and workflow defaults. - `.claude/CLAUDE.md` points Claude users at the shared project instructions. -Reusable workflow guides live under `ai/skills/`: +Reusable workflow guides live under `.agents/skills/`: - `project-setup` for app identity, icons, splash, platform cleanup, Firebase/secrets decisions, and initial validation. - `feature-screen` for route and UI scaffolding. - `feature-data-flow` for full backend-backed features with DTOs, entities, use cases, and state wiring. @@ -521,15 +521,15 @@ AI workflow prerequisites: - Install GitHub CLI for PR workflows (`brew install gh` on macOS) and authenticate with `gh auth login --hostname github.com --git-protocol ssh --web`. - Verify GitHub CLI with `gh auth status`. If an invalid `GITHUB_TOKEN` or `GH_TOKEN` is set in your environment, clear or replace it so the stored login can be used. - Repo-local scripts should be executable and syntax-check clean: - - `ai/skills/build-verify/scripts/verify.sh --help` - - `ai/skills/lint-format/scripts/lint-format.sh --help` - - `bash -n ai/skills/build-verify/scripts/verify.sh` - - `bash -n ai/skills/lint-format/scripts/lint-format.sh` - - `sh -n ai/skills/release-builds/scripts/archive_ios_ipa.sh` + - `.agents/skills/build-verify/scripts/verify.sh --help` + - `.agents/skills/lint-format/scripts/lint-format.sh --help` + - `bash -n .agents/skills/build-verify/scripts/verify.sh` + - `bash -n .agents/skills/lint-format/scripts/lint-format.sh` + - `sh -n .agents/skills/release-builds/scripts/archive_ios_ipa.sh` Recommended usage: - When working with an AI agent, explicitly mention the workflow you want to use, for example `Use the feature-data-flow skill`. -- Keep long-term project rules in `AGENTS.md` and the docs, and keep repeatable procedures in `ai/skills/`. +- Keep long-term project rules in `AGENTS.md` and the docs, and keep repeatable procedures in `.agents/skills/`. - Treat the repo-local workflow guides as project-specific assets that should evolve with the template. diff --git a/docs/PROJECT_GUIDELINES.md b/docs/PROJECT_GUIDELINES.md index 54d66f4..d03e0ce 100644 --- a/docs/PROJECT_GUIDELINES.md +++ b/docs/PROJECT_GUIDELINES.md @@ -111,11 +111,11 @@ Not every feature needs every file. Simple screens in the template only use `*_p - `fvm flutter test` ## AI Workflow Tooling -- Repo-local skills live under `ai/skills/` and Claude Code symlinks live under `.claude/skills/`. +- Repo-local skills live under `.agents/skills/` and Claude Code symlinks live under `.claude/skills/`. - Skill scripts should be executable and syntax-check clean before relying on them: - - `bash -n ai/skills/build-verify/scripts/verify.sh` - - `bash -n ai/skills/lint-format/scripts/lint-format.sh` - - `sh -n ai/skills/release-builds/scripts/archive_ios_ipa.sh` + - `bash -n .agents/skills/build-verify/scripts/verify.sh` + - `bash -n .agents/skills/lint-format/scripts/lint-format.sh` + - `sh -n .agents/skills/release-builds/scripts/archive_ios_ipa.sh` - PR-related skills use GitHub CLI. Install it locally and authenticate with `gh auth login`; verify with `gh auth status`. - If `gh auth status` reports an invalid `GITHUB_TOKEN` or `GH_TOKEN`, clear or replace that environment variable so the stored GitHub CLI login can be used. diff --git a/makefile b/makefile index 89220e5..ea1f799 100644 --- a/makefile +++ b/makefile @@ -32,7 +32,7 @@ install: # Install any required packages integration_test: # Runs Patrol Integration tests @patrol test --flavor develop -test: # Runs Flutter tests +test: # Runs Flutter tests @fvm flutter test generateAndroidProductionAppBundle: # Clean everything and build Android AppBundle