diff --git a/CHANGELOG.md b/CHANGELOG.md index e84904c92..2beff3d29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,49 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ## [Unreleased] +## [1.31.0] - 2026-04-01 + +### Added +- **Claude Code 2.1.88+ skills migration** — Commands now install as `skills/gsd-*/SKILL.md` instead of deprecated `commands/gsd/`. Auto-cleans legacy directory on install +- **`/gsd:docs-update` command** — Verified documentation generation with doc-writer and doc-verifier agents +- **`--chain` flag for discuss-phase** — Interactive discuss that auto-chains into plan+execute +- **`--only N` flag for autonomous** — Execute a single phase instead of all remaining +- **Schema drift detection** — Prevents false-positive verification when ORM schema files change without migration +- **`/gsd:secure-phase` command** — Security enforcement layer with threat-model-anchored verification +- **Claim provenance tagging** — Researcher marks claims with source evidence +- **Scope reduction detection** — Planner blocked from silently dropping requirements +- **`workflow.use_worktrees` config** — Toggle to disable worktree isolation +- **`project_code` config** — Prefix phase directories with project code +- **Project skills discovery** — CLAUDE.md generation now includes project-specific skills section +- **CodeRabbit integration** — Added to cross-AI review workflow +- **GSD SDK enhancements** — Auto `--init` flag, headless prompts, prompt sanitizer + +### Changed +- **`/gsd:quick --full` flag** — Now enables all phases (discussion + research + plan-checking + verification). New `--validate` flag covers previous `--full` behavior (plan-checking + verification only) + +### Fixed +- **Gemini CLI agent loading** — Removed `permissionMode` that broke agent frontmatter parsing +- **Phase count display** — Clarified misleading N/T banner in autonomous mode +- **Workstream `set` command** — Now requires name arg, added `--clear` flag +- **Infinite self-discuss loop** — Fixed in auto/headless mode with `max_discuss_passes` config +- **Orphan worktree cleanup** — Post-execution cleanup added +- **JSONC settings.json** — Comments no longer cause data loss +- **Incremental checkpoint saves** — Discuss answers preserved on interrupt +- **Stats accuracy** — Verification required for Complete status, added Executed state +- **Three-way merge for reapply-patches** — Never-skip invariant for backed-up files +- **SDK verify gates advance** — Skip advance when verification finds gaps +- **Manager delegates to Skill pipeline** — Instead of raw Task prompts +- **ROADMAP.md Plans column** — cmdPhaseComplete now updates correctly +- **Decimal phase numbers** — Commit regex captures decimal phases +- **Codex path replacement** — Added .claude path replacement +- **Verifier loads all ROADMAP SCs** — Regardless of PLAN must_haves +- **Verifier human_needed status** — Enforced when human verification items exist +- **Hooks shared cache dir** — Correct stale hooks path +- **Plan file naming** — Convention enforced in gsd-planner agent +- **Copilot path replacement** — Fixed ~/.claude to ~/.github +- **Windsurf trailing slash** — Removed from .windsurf/rules path +- **Slug sanitization** — Added --raw flag, capped length to 60 chars + ## [1.30.0] - 2026-03-26 ### Added diff --git a/README.ja-JP.md b/README.ja-JP.md index f8ee5537a..9c8d6c0a0 100644 --- a/README.ja-JP.md +++ b/README.ja-JP.md @@ -75,6 +75,8 @@ GSDはそれを解決します。Claude Codeを信頼性の高いものにする やりたいことを説明するだけで正しく構築してほしい人 — 50人のエンジニア組織を運営しているふりをせずに。 +ビルトインの品質ゲートが本当の問題を検出します:スキーマドリフト検出はマイグレーション漏れのORM変更をフラグし、セキュリティ強制は検証を脅威モデルに紐付け、スコープ削減検出はプランナーが要件を暗黙的に落とすのを防止します。 + --- ## はじめに @@ -376,7 +378,7 @@ claude --dangerously-skip-permissions **discuss → plan → execute → verify → ship** のループをマイルストーン完了まで繰り返します。 -ディスカッション中のインプットを速くしたい場合は、`/gsd:discuss-phase --batch` で1つずつではなく小さなグループにまとめた質問に一括で回答できます。 +ディスカッション中のインプットを速くしたい場合は、`/gsd:discuss-phase --batch` で1つずつではなく小さなグループにまとめた質問に一括で回答できます。`--chain` を使うと、ディスカッションからプラン+実行まで途中で止まらずに自動チェインできます。 各フェーズであなたのインプット(discuss)、適切なリサーチ(plan)、クリーンな実行(execute)、人間による検証(verify)が行われます。コンテキストは常にフレッシュ。品質は常に高い。 @@ -404,9 +406,11 @@ claude --dangerously-skip-permissions **`--research` フラグ:** 計画前にフォーカスされたリサーチャーを起動。実装アプローチ、ライブラリの選択肢、落とし穴を調査します。タスクへのアプローチが不明な場合に使用してください。 -**`--full` フラグ:** プランチェック(最大2回のイテレーション)と実行後の検証を有効にします。 +**`--full` フラグ:** 全フェーズを有効化 — ディスカッション + リサーチ + プランチェック + 検証。クイックタスク形式のフルGSDパイプライン。 -フラグは組み合わせ可能:`--discuss --research --full` でディスカッション + リサーチ + プランチェック + 検証が行われます。 +**`--validate` フラグ:** プランチェック + 実行後の検証のみを有効化(以前の `--full` の動作)。 + +フラグは組み合わせ可能:`--discuss --research --validate` でディスカッション + リサーチ + プランチェック + 検証が行われます。 ``` /gsd:quick @@ -512,7 +516,7 @@ lmn012o feat(08-02): create registration endpoint | コマンド | 説明 | |---------|--------------| | `/gsd:new-project [--auto]` | フル初期化:質問 → リサーチ → 要件定義 → ロードマップ | -| `/gsd:discuss-phase [N] [--auto] [--analyze]` | 計画前に実装の決定事項をキャプチャ(`--analyze` でトレードオフ分析を追加) | +| `/gsd:discuss-phase [N] [--auto] [--analyze] [--chain]` | 計画前に実装の決定事項をキャプチャ(`--analyze` でトレードオフ分析を追加、`--chain` でプラン+実行へ自動チェイン) | | `/gsd:plan-phase [N] [--auto] [--reviews]` | フェーズのリサーチ + プラン + 検証(`--reviews` でコードベースレビューの発見事項を読み込み) | | `/gsd:execute-phase ` | 全プランを並列ウェーブで実行し、完了時に検証 | | `/gsd:verify-work [N]` | 手動ユーザー受入テスト ¹ | @@ -618,7 +622,7 @@ lmn012o feat(08-02): create registration endpoint | `/gsd:debug [desc]` | 永続状態を持つ体系的デバッグ | | `/gsd:do ` | フリーフォームテキストを適切なGSDコマンドに自動ルーティング | | `/gsd:note ` | ゼロフリクションのアイデアキャプチャ — ノートの追加、一覧、todoへの昇格 | -| `/gsd:quick [--full] [--discuss] [--research]` | GSDの保証付きでアドホックタスクを実行(`--full` でプランチェックと検証を追加、`--discuss` で事前にコンテキストを収集、`--research` で計画前にアプローチを調査) | +| `/gsd:quick [--full] [--discuss] [--research]` | GSDの保証付きでアドホックタスクを実行(`--full` で全フェーズを有効化、`--discuss` で事前にコンテキストを収集、`--research` で計画前にアプローチを調査) | | `/gsd:health [--repair]` | `.planning/` ディレクトリの整合性を検証、`--repair` で自動修復 | | `/gsd:stats` | プロジェクト統計を表示 — フェーズ、プラン、要件、gitメトリクス | | `/gsd:profile-user [--questionnaire] [--refresh]` | セッション分析から開発者行動プロファイルを生成し、パーソナライズされた応答を提供 | diff --git a/README.ko-KR.md b/README.ko-KR.md index de8b0a154..57bd59c81 100644 --- a/README.ko-KR.md +++ b/README.ko-KR.md @@ -73,6 +73,8 @@ GSD가 그걸 고칩니다. Claude Code를 신뢰할 수 있게 만드는 컨텍 원하는 걸 설명하면 제대로 만들어지길 바라는 사람들 — 50인 규모 엔지니어링 조직인 척하지 않아도 되는. +내장 품질 게이트가 실제 문제를 잡아냅니다: 스키마 드리프트 감지는 마이그레이션 누락된 ORM 변경을 플래그하고, 보안 강제는 검증을 위협 모델에 고정시키고, 스코프 축소 감지는 플래너가 요구사항을 몰래 빠뜨리는 걸 방지합니다. + --- ## 시작하기 @@ -374,7 +376,7 @@ claude --dangerously-skip-permissions 마일스톤이 완료될 때까지 **논의 → 기획 → 실행 → 검증 → 출시** 반복. -논의 중에 더 빠르게 진행하고 싶다면 `/gsd:discuss-phase --batch`를 사용해 하나씩이 아닌 소그룹으로 한 번에 답할 수 있습니다. +논의 중에 더 빠르게 진행하고 싶다면 `/gsd:discuss-phase --batch`를 사용해 하나씩이 아닌 소그룹으로 한 번에 답할 수 있습니다. `--chain`을 사용하면 논의에서 기획+실행까지 중간에 멈추지 않고 자동 체이닝됩니다. 각 단계는 사용자 입력(논의), 적절한 리서치(기획), 깔끔한 실행(실행), 사람의 검증(검증)을 거칩니다. 컨텍스트는 새롭게 유지됩니다. 품질도 높게 유지됩니다. @@ -402,9 +404,11 @@ claude --dangerously-skip-permissions **`--research` 플래그:** 기획 전 집중 리서처를 생성합니다. 구현 접근법, 라이브러리 옵션, 주의사항을 조사합니다. 접근 방식이 불확실할 때 사용하세요. -**`--full` 플래그:** 계획 확인 (최대 2회 반복)과 실행 후 검증을 활성화합니다. +**`--full` 플래그:** 모든 단계를 활성화 — 논의 + 리서치 + 계획 확인 + 검증. 빠른 작업 형태의 전체 GSD 파이프라인. -플래그는 조합 가능합니다: `--discuss --research --full`은 논의 + 리서치 + 계획 확인 + 검증을 제공합니다. +**`--validate` 플래그:** 계획 확인 + 실행 후 검증만 활성화 (이전 `--full`의 동작). + +플래그는 조합 가능합니다: `--discuss --research --validate`은 논의 + 리서치 + 계획 확인 + 검증을 제공합니다. ``` /gsd:quick @@ -507,7 +511,7 @@ lmn012o feat(08-02): create registration endpoint | 명령어 | 역할 | |---------|------------| | `/gsd:new-project [--auto]` | 전체 초기화: 질문 → 리서치 → 요구사항 → 로드맵 | -| `/gsd:discuss-phase [N] [--auto] [--analyze]` | 기획 전 구현 결정 캡처 (`--analyze`는 트레이드오프 분석 추가) | +| `/gsd:discuss-phase [N] [--auto] [--analyze] [--chain]` | 기획 전 구현 결정 캡처 (`--analyze`는 트레이드오프 분석 추가, `--chain`은 기획+실행으로 자동 체이닝) | | `/gsd:plan-phase [N] [--auto] [--reviews]` | 단계에 대한 리서치 + 기획 + 검증 (`--reviews`는 코드베이스 리뷰 결과 로드) | | `/gsd:execute-phase ` | 병렬 웨이브로 모든 계획 실행, 완료 시 검증 | | `/gsd:verify-work [N]` | 수동 사용자 인수 테스트 ¹ | @@ -607,7 +611,7 @@ lmn012o feat(08-02): create registration endpoint | `/gsd:debug [desc]` | 지속적 상태를 이용한 체계적 디버깅 | | `/gsd:do ` | 자유 형식 텍스트를 적절한 GSD 명령어로 자동 라우팅 | | `/gsd:note ` | 마찰 없는 아이디어 캡처 — 추가, 목록, 또는 할 일로 승격 | -| `/gsd:quick [--full] [--discuss] [--research]` | GSD 보장과 함께 임시 작업 실행 (`--full`은 계획 확인 및 검증 추가, `--discuss`는 먼저 컨텍스트 수집, `--research`는 기획 전 접근법 조사) | +| `/gsd:quick [--full] [--discuss] [--research]` | GSD 보장과 함께 임시 작업 실행 (`--full`은 전체 단계 활성화, `--discuss`는 먼저 컨텍스트 수집, `--research`는 기획 전 접근법 조사) | | `/gsd:health [--repair]` | `.planning/` 디렉터리 무결성 검증, `--repair`로 자동 복구 | | `/gsd:stats` | 프로젝트 통계 표시 — 단계, 계획, 요구사항, git 지표 | | `/gsd:profile-user [--questionnaire] [--refresh]` | 개인화된 응답을 위해 세션 분석에서 개발자 행동 프로필 생성 | diff --git a/README.md b/README.md index cbde88b5e..1d69c25eb 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ GSD fixes that. It's the context engineering layer that makes Claude Code reliab People who want to describe what they want and have it built correctly — without pretending they're running a 50-person engineering org. +Built-in quality gates catch real problems: schema drift detection flags ORM changes missing migrations, security enforcement anchors verification to threat models, and scope reduction detection prevents the planner from silently dropping your requirements. + --- ## Getting Started @@ -94,7 +96,7 @@ Verify with: - Antigravity: `/gsd:help` > [!NOTE] -> Codex installation uses skills (`skills/gsd-*/SKILL.md`) rather than custom prompts. +> Claude Code 2.1.88+ and Codex install as skills (`skills/gsd-*/SKILL.md`). Older Claude Code versions use `commands/gsd/`. The installer handles this automatically. ### Staying Updated @@ -379,7 +381,7 @@ Or let GSD figure out the next step automatically: Loop **discuss → plan → execute → verify → ship** until milestone complete. -If you want faster intake during discussion, use `/gsd:discuss-phase --batch` to answer a small grouped set of questions at once instead of one-by-one. +If you want faster intake during discussion, use `/gsd:discuss-phase --batch` to answer a small grouped set of questions at once instead of one-by-one. Use `--chain` to auto-chain discuss into plan+execute without stopping between steps. Each phase gets your input (discuss), proper research (plan), clean execution (execute), and human verification (verify). Context stays fresh. Quality stays high. @@ -407,9 +409,11 @@ Quick mode gives you GSD guarantees (atomic commits, state tracking) with a fast **`--research` flag:** Spawns a focused researcher before planning. Investigates implementation approaches, library options, and pitfalls. Use when you're unsure how to approach a task. -**`--full` flag:** Enables plan-checking (max 2 iterations) and post-execution verification. +**`--full` flag:** Enables all phases — discussion + research + plan-checking + verification. The full GSD pipeline in quick-task form. -Flags are composable: `--discuss --research --full` gives discussion + research + plan-checking + verification. +**`--validate` flag:** Enables plan-checking + post-execution verification only (the previous `--full` behavior). + +Flags are composable: `--discuss --research --validate` gives discussion + research + plan-checking + verification. ``` /gsd:quick @@ -512,7 +516,7 @@ You're never locked in. The system adapts. | Command | What it does | |---------|--------------| | `/gsd:new-project [--auto]` | Full initialization: questions → research → requirements → roadmap | -| `/gsd:discuss-phase [N] [--auto] [--analyze]` | Capture implementation decisions before planning (`--analyze` adds trade-off analysis) | +| `/gsd:discuss-phase [N] [--auto] [--analyze] [--chain]` | Capture implementation decisions before planning (`--analyze` adds trade-off analysis, `--chain` auto-chains into plan+execute) | | `/gsd:plan-phase [N] [--auto] [--reviews]` | Research + plan + verify for a phase (`--reviews` loads codebase review findings) | | `/gsd:execute-phase ` | Execute all plans in parallel waves, verify when complete | | `/gsd:verify-work [N]` | Manual user acceptance testing ¹ | @@ -595,8 +599,10 @@ You're never locked in. The system adapts. | Command | What it does | |---------|--------------| | `/gsd:review` | Cross-AI peer review of current phase or branch | +| `/gsd:secure-phase [N]` | Security enforcement with threat-model-anchored verification | | `/gsd:pr-branch` | Create clean PR branch filtering `.planning/` commits | | `/gsd:audit-uat` | Audit verification debt — find phases missing UAT | +| `/gsd:docs-update` | Verified documentation generation with doc-writer and doc-verifier agents | ### Backlog & Threads @@ -618,7 +624,7 @@ You're never locked in. The system adapts. | `/gsd:debug [desc]` | Systematic debugging with persistent state | | `/gsd:do ` | Route freeform text to the right GSD command automatically | | `/gsd:note ` | Zero-friction idea capture — append, list, or promote notes to todos | -| `/gsd:quick [--full] [--discuss] [--research]` | Execute ad-hoc task with GSD guarantees (`--full` adds plan-checking and verification, `--discuss` gathers context first, `--research` investigates approaches before planning) | +| `/gsd:quick [--full] [--validate] [--discuss] [--research]` | Execute ad-hoc task with GSD guarantees (`--full` enables all phases, `--validate` adds plan-checking and verification, `--discuss` gathers context first, `--research` investigates approaches before planning) | | `/gsd:health [--repair]` | Validate `.planning/` directory integrity, auto-repair with `--repair` | | `/gsd:stats` | Display project statistics — phases, plans, requirements, git metrics | | `/gsd:profile-user [--questionnaire] [--refresh]` | Generate developer behavioral profile from session analysis for personalized responses | @@ -637,6 +643,7 @@ GSD stores project settings in `.planning/config.json`. Configure during `/gsd:n |---------|---------|---------|------------------| | `mode` | `yolo`, `interactive` | `interactive` | Auto-approve vs confirm at each step | | `granularity` | `coarse`, `standard`, `fine` | `standard` | Phase granularity — how finely scope is sliced (phases × plans) | +| `project_code` | string | `""` | Prefix phase directories with a project code | ### Model Profiles @@ -672,6 +679,7 @@ These spawn additional agents during planning/execution. They improve quality bu | `workflow.discuss_mode` | `'discuss'` | Discussion mode: `discuss` (interview), `assumptions` (codebase-first) | | `workflow.skip_discuss` | `false` | Skip discuss-phase in autonomous mode | | `workflow.text_mode` | `false` | Text-only mode for remote sessions (no TUI menus) | +| `workflow.use_worktrees` | `true` | Toggle worktree isolation for execution | Use `/gsd:settings` to toggle these, or override per-invocation: - `/gsd:plan-phase --skip-research` @@ -763,7 +771,7 @@ This prevents Claude from reading these files entirely, regardless of what comma **Commands not found after install?** - Restart your runtime to reload commands/skills -- Verify files exist in `~/.claude/commands/gsd/` (global) or `./.claude/commands/gsd/` (local) +- Verify files exist in `~/.claude/skills/gsd-*/SKILL.md` (Claude Code 2.1.88+) or `~/.claude/commands/gsd/` (legacy) - For Codex, verify skills exist in `~/.codex/skills/gsd-*/SKILL.md` (global) or `./.codex/skills/gsd-*/SKILL.md` (local) **Commands not working as expected?** diff --git a/README.pt-BR.md b/README.pt-BR.md index f70b25fa7..7e517aab3 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -71,6 +71,8 @@ O GSD corrige isso. É a camada de engenharia de contexto que torna o Claude Cod Para quem quer descrever o que precisa e receber isso construído do jeito certo — sem fingir que está rodando uma engenharia de 50 pessoas. +Quality gates embutidos capturam problemas reais: detecção de schema drift sinaliza mudanças ORM sem migrations, segurança ancora verificação a modelos de ameaça, e detecção de redução de escopo impede o planner de descartar requisitos silenciosamente. + --- ## Primeiros passos @@ -295,7 +297,7 @@ Cada tarefa gera commit próprio, facilitando `git bisect`, rollback e rastreabi | Comando | O que faz | |---------|-----------| | `/gsd:new-project [--auto]` | Inicializa projeto completo | -| `/gsd:discuss-phase [N] [--auto] [--analyze]` | Captura decisões antes do plano | +| `/gsd:discuss-phase [N] [--auto] [--analyze] [--chain]` | Captura decisões antes do plano (`--chain` encadeia automaticamente em plan+execute) | | `/gsd:plan-phase [N] [--auto] [--reviews]` | Pesquisa + plano + validação | | `/gsd:execute-phase ` | Executa planos em ondas paralelas | | `/gsd:verify-work [N]` | UAT manual | @@ -313,7 +315,7 @@ Cada tarefa gera commit próprio, facilitando `git bisect`, rollback e rastreabi | `/gsd:pr-branch` | Cria branch limpa para PR | | `/gsd:settings` | Configura perfis e agentes | | `/gsd:set-profile ` | Troca perfil (quality/balanced/budget/inherit) | -| `/gsd:quick [--full] [--discuss] [--research]` | Execução rápida com garantias do GSD | +| `/gsd:quick [--full] [--discuss] [--research]` | Execução rápida com garantias do GSD (`--full` ativa todas as etapas, `--validate` ativa apenas verificação) | | `/gsd:health [--repair]` | Verifica e repara `.planning/` | > Para a lista completa de comandos e opções, use `/gsd:help`. diff --git a/agents/gsd-debugger.md b/agents/gsd-debugger.md index 3ed354166..8c7109032 100644 --- a/agents/gsd-debugger.md +++ b/agents/gsd-debugger.md @@ -2,7 +2,6 @@ name: gsd-debugger description: Investigates bugs using scientific method, manages debug sessions, handles checkpoints. Spawned by /gsd:debug orchestrator. tools: Read, Write, Edit, Bash, Grep, Glob, WebSearch -permissionMode: acceptEdits color: orange # hooks: # PostToolUse: diff --git a/agents/gsd-doc-verifier.md b/agents/gsd-doc-verifier.md new file mode 100644 index 000000000..2f3551635 --- /dev/null +++ b/agents/gsd-doc-verifier.md @@ -0,0 +1,201 @@ +--- +name: gsd-doc-verifier +description: Verifies factual claims in generated docs against the live codebase. Returns structured JSON per doc. +tools: Read, Write, Bash, Grep, Glob +color: orange +# hooks: +# PostToolUse: +# - matcher: "Write" +# hooks: +# - type: command +# command: "npx eslint --fix $FILE 2>/dev/null || true" +--- + + +You are a GSD doc verifier. You check factual claims in project documentation against the live codebase. + +You are spawned by the `/gsd:docs-update` workflow. Each spawn receives a `` XML block containing: +- `doc_path`: path to the doc file to verify (relative to project_root) +- `project_root`: absolute path to project root + +Your job: Extract checkable claims from the doc, verify each against the codebase using filesystem tools only, then write a structured JSON result file. Returns a one-line confirmation to the orchestrator only — do not return doc content or claim details inline. + +**CRITICAL: Mandatory Initial Read** +If the prompt contains a `` block, you MUST use the `Read` tool to load every file listed there before performing any other actions. This is your primary context. + + + +Before verifying, discover project context: + +**Project instructions:** Read `./CLAUDE.md` if it exists in the working directory. Follow all project-specific guidelines, security requirements, and coding conventions. + +**Project skills:** Check `.claude/skills/` or `.agents/skills/` directory if either exists: +1. List available skills (subdirectories) +2. Read `SKILL.md` for each skill (lightweight index ~130 lines) +3. Load specific `rules/*.md` files as needed during verification +4. Do NOT load full `AGENTS.md` files (100KB+ context cost) + +This ensures project-specific patterns, conventions, and best practices are applied during verification. + + + +Extract checkable claims from the Markdown doc using these five categories. Process each category in order. + +**1. File path claims** +Backtick-wrapped tokens containing `/` or `.` followed by a known extension. + +Extensions to detect: `.ts`, `.js`, `.cjs`, `.mjs`, `.md`, `.json`, `.yaml`, `.yml`, `.toml`, `.txt`, `.sh`, `.py`, `.go`, `.rs`, `.java`, `.rb`, `.css`, `.html`, `.tsx`, `.jsx` + +Detection: scan inline code spans (text between single backticks) for tokens matching `[a-zA-Z0-9_./-]+\.(ts|js|cjs|mjs|md|json|yaml|yml|toml|txt|sh|py|go|rs|java|rb|css|html|tsx|jsx)`. + +Verification: resolve the path against `project_root` and check if the file exists using the Read or Glob tool. Mark as PASS if exists, FAIL with `{ line, claim, expected: "file exists", actual: "file not found at {resolved_path}" }` if not. + +**2. Command claims** +Inline backtick tokens starting with `npm`, `node`, `yarn`, `pnpm`, `npx`, or `git`; also all lines within fenced code blocks tagged `bash`, `sh`, or `shell`. + +Verification rules: +- `npm run