@joshuafolkken/kit 1.983.0 → 1.1003.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/.claude/skills/workflow-commands/backlogrun-child.md +4 -5
  2. package/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
  3. package/.github/workflows/sonar-qube.yml +12 -2
  4. package/CLAUDE.md +2 -2
  5. package/README.md +30 -21
  6. package/dist/CLAUDE.md +2 -2
  7. package/dist/hooks/batch-guard.js +4 -4
  8. package/dist/hooks/{chunk-ZT65LR3U.js → chunk-4GDR2YTV.js} +4 -4
  9. package/dist/hooks/{chunk-ASUZGZFT.js → chunk-56LGMJJV.js} +2 -2
  10. package/dist/hooks/{chunk-LBXQHXMC.js → chunk-6PSTVOLH.js} +263 -74
  11. package/dist/hooks/{chunk-P3UX7SFN.js → chunk-A2H5I2VD.js} +2 -2
  12. package/dist/hooks/{chunk-ERXMJJOV.js → chunk-AWTFKKFW.js} +1 -1
  13. package/dist/hooks/{chunk-IM3KM25Y.js → chunk-EZLHXKJ6.js} +10 -7
  14. package/dist/hooks/{chunk-APVOACVT.js → chunk-GBJUERYK.js} +1 -1
  15. package/dist/hooks/{chunk-5JX6HXDX.js → chunk-KPZN42RT.js} +3 -3
  16. package/dist/hooks/{chunk-47SPMGOD.js → chunk-PAXMLGSS.js} +26 -7
  17. package/dist/hooks/{chunk-RFPHKU7C.js → chunk-WMIR5SNX.js} +3 -3
  18. package/dist/hooks/codex-hook-adapter.js +10 -10
  19. package/dist/hooks/duplicate-read-guard.js +5 -5
  20. package/dist/hooks/format-edited.js +2 -2
  21. package/dist/hooks/investigation-guard.js +5 -5
  22. package/dist/hooks/pretool-guard.js +9 -9
  23. package/dist/hooks/stop-guard.js +98 -26
  24. package/dist/josh.js +5 -5
  25. package/package.json +5 -1
  26. package/prettier/basic.d.ts +3 -0
  27. package/prettier/basic.js +10 -0
  28. package/prettier/index.js +2 -2
  29. package/prettier/static.js +3 -10
  30. package/prompts/sonar-hotspot-handling.md +6 -0
  31. package/prompts/testing-guide.md +1 -1
  32. package/scripts/agent/agent-diagnostics.ts +1 -0
  33. package/scripts/agent/agent-role-profile.ts +1 -1
  34. package/scripts/behavior/behavior-rules.ts +8 -1
  35. package/scripts/build/build-claude-md.ts +13 -4
  36. package/scripts/ci/pr-classification.ts +11 -2
  37. package/scripts/document/document-byte-budget.ts +1 -1
  38. package/scripts/gate/gate-steps.ts +1 -1
  39. package/scripts/gate/project-checks.ts +12 -11
  40. package/scripts/gate/type-check-command.ts +1 -1
  41. package/scripts/git/git-branch.ts +14 -3
  42. package/scripts/git/git-command.ts +5 -2
  43. package/scripts/git/git-issue.ts +13 -5
  44. package/scripts/git/git-pr.ts +16 -10
  45. package/scripts/git/git-preflight.ts +138 -0
  46. package/scripts/git/telegram-notify.ts +21 -0
  47. package/scripts/hooks/stop-guard.ts +2 -0
  48. package/scripts/init/basic-path-migration.ts +24 -0
  49. package/scripts/init/distributed-paths.ts +22 -0
  50. package/scripts/init/init-actions.ts +27 -19
  51. package/scripts/init/init-ai-copy.ts +86 -28
  52. package/scripts/init/{init-static.ts → init-basic.ts} +6 -6
  53. package/scripts/init/init-bootstrap.ts +4 -3
  54. package/scripts/init/init-install.ts +1 -1
  55. package/scripts/init/init-logic-templates.ts +1 -1
  56. package/scripts/init/init-logic.ts +1 -1
  57. package/scripts/init/init.ts +41 -19
  58. package/scripts/init/kit-setup-state.ts +30 -0
  59. package/scripts/init/kit-written-paths.ts +33 -0
  60. package/scripts/init/project-profile-cli.ts +15 -1
  61. package/scripts/init/project-profile.ts +41 -12
  62. package/scripts/init/session-language-environment.ts +83 -0
  63. package/scripts/init/start-exec.ts +28 -0
  64. package/scripts/init/start-plan.ts +35 -13
  65. package/scripts/init/start-prompt.ts +22 -8
  66. package/scripts/init/start-setup-pr.ts +138 -0
  67. package/scripts/init/start-steps.ts +30 -30
  68. package/scripts/init/start.ts +7 -3
  69. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +3 -3
  70. package/scripts/josh/josh-commands-development.ts +3 -3
  71. package/scripts/josh/josh-commands-project.ts +2 -2
  72. package/scripts/lane/lane-leftover.ts +143 -0
  73. package/scripts/lane/lane-open.ts +14 -1
  74. package/scripts/lint/cspell-cached.ts +3 -3
  75. package/scripts/lint/format.ts +1 -1
  76. package/scripts/lint/lint-parallel.ts +2 -2
  77. package/scripts/propagate/propagate-steps.ts +14 -1
  78. package/scripts/rules/filing-cap.ts +1 -0
  79. package/scripts/rules/issue-citation.ts +30 -1
  80. package/scripts/rules/last-prompt.ts +79 -0
  81. package/scripts/rules/stop-rules.ts +5 -3
  82. package/scripts/run/run-hold.ts +3 -3
  83. package/scripts/run/run-preflight.ts +75 -5
  84. package/scripts/run/run-progress-cli.ts +14 -2
  85. package/scripts/safe-chain/ci-installer-pin.ts +19 -12
  86. package/scripts/safe-chain/project-config.ts +1 -1
  87. package/scripts/sync/sync-ai-files.ts +204 -0
  88. package/scripts/sync/sync.ts +48 -184
  89. package/scripts/test/josh-harness-environment.ts +1 -1
  90. package/scripts/test/pilot-files.ts +0 -1
  91. package/scripts/test/test-declared-changed.ts +1 -1
  92. package/scripts/test/test-declared-logic.ts +55 -14
  93. package/scripts/test/test-declared.ts +23 -11
  94. package/scripts/test/test-unit-guard.ts +6 -6
  95. package/scripts/time-runtime/time-shell.ts +36 -2
  96. package/scripts-ai/git-workflow.ts +10 -0
  97. package/templates/CLAUDE.basic.md +8 -0
  98. package/templates/workflows/ci.yml +27 -0
  99. /package/{templates/CLAUDE.static.md → dist/CLAUDE.basic.md} +0 -0
  100. /package/templates/{cursorrules.static → cursorrules.basic} +0 -0
  101. /package/templates/{pnpm-workspace.static.yaml → pnpm-workspace.basic.yaml} +0 -0
  102. /package/templates/{prettierignore.static → prettierignore.basic} +0 -0
@@ -90,7 +90,7 @@ still bounded at 25 lines. `pnpm josh lane:dispatch` is where a lane's child is
90
90
  child over" in `backlogrun-lanes.md` carries the command.
91
91
 
92
92
  **The lane child uses the invoking CLI's `worker` profile.** Claude Code defaults to Anthropic
93
- `claude-opus-5-5` / `medium`; Codex uses `codex exec`, OpenAI `gpt-6-sol` / `medium`, workspace-write and
93
+ `claude-opus-5-5` / `medium`; Codex uses `codex exec`, OpenAI `gpt-6.1-sol` / `medium`, workspace-write and
94
94
  JSONL. `JOSH_WORKER_MODEL` overrides Claude Code only; `JOSH_WORKER_EFFORT` covers both providers,
95
95
  and legacy `JOSH_LANE_*` applies only here. Bad markers, missing CLI/auth and failure
96
96
  refuse or park without fallback or retry.
@@ -295,7 +295,7 @@ answer=$(pnpm josh run:hold 926) # alias: josh rh ; one token on stdout, prose
295
295
  | --- | --- | --- |
296
296
  | `hold` | Nothing left behind; the tree is claimed | Start the child. This is the ordinary answer. |
297
297
  | `reclaim` | Uncommitted changes, or HEAD off the default branch | Run what stderr printed: `git stash push -u -m "run:hold reclaimed before #<N>"`, then `git switch <default> && git pull`. **`-u` is not optional** (a new `*.test.ts` is untracked). **Then record the stash on `#<N>` as a comment, and ask `run:hold` again** — the check is re-askable. |
298
- | `resume` | A branch for `#<N>`, or an open pull request, is still here | **Reuse it and run the whole verification gate from the start** — never only the part the interrupted run had not reached. The tools are idempotent; what was missing was that **nobody had verified what the dead run already committed**. |
298
+ | `resume` | An open PR, or a `#<N>` branch with commits or a dirty lane | **Reuse it and run the whole verification gate from the start** — never only the part the interrupted run had not reached. The tools are idempotent; what was missing was that **nobody had verified what the dead run already committed**. |
299
299
  | `park` | The pull request for `#<N>` is **merged** or **closed** | **Park the child** — `needs-decision` plus a comment naming what was found — and continue. Carrying on over a merged PR duplicates work; over a closed one revives rejected work. Do not delete the branch, reopen the PR, or commit on top of it. |
300
300
  | `busy` | Another **live** run holds this tree | Stop before filing anything — `run:hold`'s own answer, unchanged. |
301
301
  | `unknown` | The tree could not be read | Stop the session and report. It is not "the tree is clean". |
@@ -314,6 +314,5 @@ stash reference where there was one.
314
314
 
315
315
  **It is not asked in a lane** — `run:hold` claimed inside a lane skips the check, and `lane:open`'s own
316
316
  answer covers an interrupted lane instead. **Asked in the primary checkout while a lane for that child
317
- is open, `run:hold` would read `resume`, which is correct** — the branch read
318
- `git branch --list '<N>-*'` matches `<N>-lane`. The loop never reaches it that way, because `epic:next`
319
- does not offer a child already carrying `in-progress`.
317
+ is open, `run:hold` reads `resume` only if `<N>-lane` has a commit or a dirty tree** — a clean one
318
+ at the default branch reads `hold`. The loop never gets there, because `epic:next` does not offer a child already carrying `in-progress`.
@@ -237,7 +237,7 @@ setting are `docs/josh-commands.md` → "`josh run:wake`".
237
237
 
238
238
  **Every unattended role runs with the provider selected from the invoking CLI and its own profile.**
239
239
  Codex sessions use OpenAI; Claude Code sessions use Anthropic. Anthropic uses scheduler
240
- `claude-opus-5-5`, worker `claude-opus-5-5` and reviewer `claude-opus-5-5`; OpenAI uses `gpt-6-sol`,
240
+ `claude-opus-5-5`, worker `claude-opus-5-5` and reviewer `claude-opus-5-5`; OpenAI uses `gpt-6.1-sol`,
241
241
  with role efforts `medium`/`medium`/`high` (scheduler / worker / reviewer) for both. Role overrides
242
242
  resolve before launch; model overrides apply only to Claude Code, effort overrides to either provider,
243
243
  and legacy `JOSH_LANE_*` values to the worker only. Invalid configuration, a missing or conflicting
@@ -19,16 +19,26 @@ jobs:
19
19
  permissions:
20
20
  contents: read
21
21
  runs-on: ubuntu-latest
22
+ # A consumer that does not use SonarCloud has no SONAR_TOKEN, and the scan would fail on
23
+ # authentication and turn a required check red (joshuafolkken/kit#2815). `secrets` cannot be read
24
+ # in a step `if:`, so the secret is lifted into the job env and the steps branch on that instead.
25
+ # Token presence is the only signal that needs no consumer setup; a run GitHub withholds secrets
26
+ # from (a fork pull request, Dependabot without the secret) skips too — see sonar-hotspot-handling.md.
27
+ env:
28
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
22
29
  steps:
30
+ - name: Skip SonarQube Scan
31
+ if: env.SONAR_TOKEN == ''
32
+ run: echo "SonarQube scan skipped because SONAR_TOKEN is not set."
23
33
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ if: env.SONAR_TOKEN != ''
24
35
  with:
25
36
  fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
26
37
  - name: SonarQube Scan
38
+ if: env.SONAR_TOKEN != ''
27
39
  uses: SonarSource/sonarqube-scan-action@ba9859eae8dd6bd29e412f25ddbbef3d032000f4 # v8.2.2
28
40
  with:
29
41
  # Wait for the SonarCloud Quality Gate and fail this job (a required PR check) when the
30
42
  # gate is red, so a PR that introduces a Maintainability / code-smell finding cannot be
31
43
  # merged green. Without this flag the scan only uploads results and never blocks.
32
44
  args: -Dsonar.qualitygate.wait=true
33
- env:
34
- SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
package/CLAUDE.md CHANGED
@@ -108,7 +108,7 @@ For every code modification, in order:
108
108
 
109
109
  - **Tests are required for ALL code changes** (bug fixes, timing/animation fixes and refactors included): bug fix → regression test; UI/animation/timing → E2E for the observable change; logic/utility → unit; refactor → tests pinning existing behavior BEFORE the change (`prompts/refactoring.md`).
110
110
  - **Non-runtime updates (pre-approved manual-only exception)**: a change touching no executable runtime code path may proceed with manual verification — declare it in Step 0 and state why. It covers docs, non-executable config, editor/IDE files, and cosmetic asset swaps with no selector/path change; the mechanically exempt (`*.md`, `.editorconfig`, `.idea/**`, `.vscode/**`, `prompts/**`) are recognized by the command below, and the rest stay the exemption a person declares. A test infeasible for a runtime change needs its reason stated and user approval.
111
- - **static の HTML/CSS 例外:** `package.json` に `josh.profile: static` が記録され、変更が HTML/CSS だけなら自動テストの代わりにブラウザーで表示を確認する。対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認し、観察結果を報告する。HTML/CSS と同時に変更した場合も、JavaScript と TypeScript のファイルには自動テストが必要。`pnpm josh test:declared` はこの場合だけ理由を添えて `exempt` と表示する。
111
+ - **basic の手動確認例外:** `package.json` に `josh.profile: basic`(改名前の `static` も同じ)が記録され、変更が kit がテストを実行できない言語のファイル(HTML/CSS や Lua などのソース)だけなら、自動テストの代わりに手で確認する。HTML/CSS はブラウザーで対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認する。そのほかのソースは変更した処理を実際に動かす。どちらも観察結果を報告する。JavaScript と TypeScript のファイルには同時に変更した場合も自動テストが必要。`pnpm josh test:declared` はこの場合だけ理由を添えて `exempt` と表示する。
112
112
  - **The commit stage answers this mechanically**: `pnpm josh test:declared` prints `required` / `exempt` / `satisfied` from the changed paths, and a runtime change with no test is refused at `pnpm josh git -y` on `required` — add the declared test or declare the non-runtime exception, then reissue (`prompts/collaboration-workflow/rule-delivery.md`).
113
113
  - **Read a target's line headroom before editing: `pnpm josh lines <path>`** — near the limit, `Target` carries the splitting plan.
114
114
 
@@ -122,7 +122,7 @@ For every code modification, in order:
122
122
  Run the full verification set **in order**; do not skip, reorder, or report completion on a failed or skipped step without the user agreeing. Inside a `fullrun` / `backlogrun` the gate runs beside the review and the merge chain (`workflow-commands` skill → §2, `prompts/review.md`).
123
123
 
124
124
  0. **Test gate** — no tests added? Continue only under the non-runtime exception (Step 0) or explicit approval; otherwise stop and add tests.
125
- static プロファイルの HTML/CSS だけの変更には、Step 0 の手動ブラウザー確認を適用できる。
125
+ basic プロファイルで kit がテストできない言語のファイルだけの変更には、Step 0 の手動確認を適用できる。
126
126
  1. **Refactor** — `prompts/refactoring.md`, until no high/medium items remain.
127
127
  2. **`pnpm josh gate`** — lint, type check, spell check and unit tests concurrently. One gate per run; while implementing re-run a single check by name (`pnpm josh lint:related` / `pnpm josh cspell:dot` / `pnpm josh test:related`).
128
128
  3. **Self-review** — a subagent runs `/code-review` per `prompts/review.md` (never a main-line `Skill` load); level from the changed paths, at most two rounds, high/medium findings resolved. `prompts/review.md` → "Review round cap".
package/README.md CHANGED
@@ -1,52 +1,62 @@
1
1
  # @joshuafolkken/kit
2
2
 
3
- A development toolkit for AI-assisted work. `josh init` gives an AI assistant (Claude Code, Codex, Gemini, Cursor) the project's rules, formatting and checks in one command. With `kickoff`, `fullrun` and `backlogrun`, the agent then takes a GitHub Issue through plan → implement → verify → PR → merge, the same way in every project. Why kit exists: [why.md](./docs/why.md) (Japanese).
3
+ A development toolkit for AI-assisted work. `josh start` (or `josh init`, for a project that will not use the GitHub Issue workflow) gives an AI assistant (Claude Code, Codex, Gemini, Cursor) the project's rules, formatting and checks in one command. With `kickoff`, `fullrun` and `backlogrun`, the agent then takes a GitHub Issue through plan → implement → verify → PR → merge, the same way in every project. Why kit exists: [why.md](./docs/why.md) (Japanese).
4
4
 
5
5
  ## What your project gets
6
6
 
7
7
  kit picks a [profile](./docs/init.md#project-profiles) from one question — does the project use Node tooling?
8
8
 
9
- | Your project | Profile | What you get |
10
- | ---------------------------------------- | -------- | ----------------------------------------------------------------- |
11
- | Node project (JavaScript / TypeScript) | `node` | The full set: ESLint, type check, unit and E2E tests, Git hooks |
12
- | HTML / CSS (browser JavaScript included) | `static` | Formatting (Prettier), AI assistant files, Git / VS Code settings |
13
- | Another language (Python, Rust, Go, …) | `static` | AI assistant files and Git / VS Code settings only |
9
+ | Your project | Profile | What you get |
10
+ | ---------------------------------------- | ------- | ----------------------------------------------------------------- |
11
+ | Node project (JavaScript / TypeScript) | `full` | The full set: ESLint, type check, unit and E2E tests, Git hooks |
12
+ | HTML / CSS (browser JavaScript included) | `basic` | Formatting (Prettier), AI assistant files, Git / VS Code settings |
13
+ | Another language (Python, Rust, Go, …) | `basic` | AI assistant files and Git / VS Code settings only |
14
14
 
15
- In a `static` project, `josh` skips each check that has nothing to run and says why.
15
+ In a `basic` project, `josh` skips each check that has nothing to run and says why.
16
16
 
17
17
  ## Quick start
18
18
 
19
- Requires [Node.js](https://nodejs.org/) 22.19.0+ and [pnpm](https://pnpm.io/) for every profile ([getting-started.md](./docs/getting-started.md)); the [gh CLI](https://cli.github.com/) for `josh version` and the Issue workflow is required by `josh start` and optional otherwise. Run in your project directory.
19
+ Requires [Node.js](https://nodejs.org/) 22.19.0+ and [pnpm](https://pnpm.io/) 12+ for every profile ([how to install them](./docs/setup/basic.md#1-check-the-prerequisites)); the [gh CLI](https://cli.github.com/) for `josh version` and the Issue workflow is required by `josh start` and optional otherwise. Run in your project directory.
20
20
 
21
- ### The project is already on GitHub, or will not use GitHub
21
+ One question picks the command: will the project use the GitHub Issue workflow (`kickoff`, `fullrun`, `backlogrun`)? The [profile](./docs/init.md#project-profiles) is chosen the same way either way.
22
+
23
+ ### The project will use the GitHub Issue workflow
22
24
 
23
25
  ```bash
24
- pnpm --allow-build=esbuild dlx @joshuafolkken/kit init
25
- pnpm josh gate
26
+ pnpm add -D --allow-build=esbuild --allow-build=unrs-resolver @joshuafolkken/kit
27
+ pnpm exec josh start
26
28
  ```
27
29
 
28
- ### The project has no GitHub repository yet, and will use the Issue workflow
30
+ With or without Git and a GitHub repository: `josh start` creates what is missing, and when `main` already has commits it opens a pull request with only kit's files for you to merge.
31
+
32
+ ### The project will not use the GitHub Issue workflow
29
33
 
30
34
  ```bash
31
- pnpm add -D --allow-build=esbuild --allow-build=unrs-resolver @joshuafolkken/kit
32
- pnpm exec josh start
35
+ pnpm --allow-build=esbuild dlx @joshuafolkken/kit init
36
+ pnpm josh gate
33
37
  ```
34
38
 
35
- `josh start` also runs `git init` when needed and creates and pushes the GitHub repository. Details: [init.md → `josh init` or `josh start`](./docs/init.md#josh-init-or-josh-start).
39
+ What each command does in each starting state: [init.md → `josh init` or `josh start`](./docs/init.md#josh-init-or-josh-start).
40
+
41
+ The step-by-step version of these commands, with what each one creates: [Set up the basic profile](./docs/setup/basic.md) · [Set up the full profile](./docs/setup/full.md).
36
42
 
37
43
  ## Documentation
38
44
 
39
- **Get started**
45
+ **Set up**
46
+
47
+ - [setup/basic.md](./docs/setup/basic.md) — a `basic` project, from an empty machine
48
+ - [setup/full.md](./docs/setup/full.md) — a Node project, with `josh init` or `josh start`
49
+ - [cli.md](./docs/cli.md) — the global `josh` command
50
+ - [troubleshooting.md](./docs/troubleshooting.md) — install and auth errors
51
+
52
+ **Use**
40
53
 
41
- - [getting-started.md](./docs/getting-started.md) — first install for a `static` project
42
- - [package.md](./docs/package.md) — add kit to a Node project
54
+ - [overview.md](./docs/overview.md) — what kit sets up and how it works
43
55
  - [tutorial.md](./docs/tutorial.md) — your first change with an agent, from Issue to merge
44
56
  - [how-to.md](./docs/how-to.md) — guides by task
45
- - [overview.md](./docs/overview.md) — what kit sets up and how it works
46
57
 
47
58
  **Commands and configuration**
48
59
 
49
- - [cli.md](./docs/cli.md) — the global `josh` command
50
60
  - [josh-commands.md](./docs/josh-commands.md) — every `josh` command ([catalog](./docs/josh-command-catalog.md))
51
61
  - [init.md](./docs/init.md) — what `josh init` creates
52
62
  - [sync.md](./docs/sync.md) — what `josh sync` updates
@@ -58,7 +68,6 @@ pnpm exec josh start
58
68
  - [scripts-ai.md](./docs/scripts-ai.md) — Issue workflow commands and Telegram notifications
59
69
  - [cloud-session.md](./docs/cloud-session.md) — running in an agent container
60
70
  - [eval.md](./docs/eval.md) — measuring rule adherence
61
- - [troubleshooting.md](./docs/troubleshooting.md) — install and auth errors
62
71
  - [authentication.md](./docs/authentication.md) — existing GitHub Packages installs only
63
72
 
64
73
  ## Contributing
package/dist/CLAUDE.md CHANGED
@@ -108,7 +108,7 @@ For every code modification, in order:
108
108
 
109
109
  - **Tests are required for ALL code changes** (bug fixes, timing/animation fixes and refactors included): bug fix → regression test; UI/animation/timing → E2E for the observable change; logic/utility → unit; refactor → tests pinning existing behavior BEFORE the change (`node_modules/@joshuafolkken/kit/prompts/refactoring.md`).
110
110
  - **Non-runtime updates (pre-approved manual-only exception)**: a change touching no executable runtime code path may proceed with manual verification — declare it in Step 0 and state why. It covers docs, non-executable config, editor/IDE files, and cosmetic asset swaps with no selector/path change; the mechanically exempt (`*.md`, `.editorconfig`, `.idea/**`, `.vscode/**`, `prompts/**`) are recognized by the command below, and the rest stay the exemption a person declares. A test infeasible for a runtime change needs its reason stated and user approval.
111
- - **static の HTML/CSS 例外:** `package.json` に `josh.profile: static` が記録され、変更が HTML/CSS だけなら自動テストの代わりにブラウザーで表示を確認する。対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認し、観察結果を報告する。HTML/CSS と同時に変更した場合も、JavaScript と TypeScript のファイルには自動テストが必要。`pnpm josh test:declared` はこの場合だけ理由を添えて `exempt` と表示する。
111
+ - **basic の手動確認例外:** `package.json` に `josh.profile: basic`(改名前の `static` も同じ)が記録され、変更が kit がテストを実行できない言語のファイル(HTML/CSS や Lua などのソース)だけなら、自動テストの代わりに手で確認する。HTML/CSS はブラウザーで対象ページを開き、想定する画面幅でレイアウト・リンク・HTML 内の操作を確認する。そのほかのソースは変更した処理を実際に動かす。どちらも観察結果を報告する。JavaScript と TypeScript のファイルには同時に変更した場合も自動テストが必要。`pnpm josh test:declared` はこの場合だけ理由を添えて `exempt` と表示する。
112
112
  - **The commit stage answers this mechanically**: `pnpm josh test:declared` prints `required` / `exempt` / `satisfied` from the changed paths, and a runtime change with no test is refused at `pnpm josh git -y` on `required` — add the declared test or declare the non-runtime exception, then reissue (`node_modules/@joshuafolkken/kit/prompts/collaboration-workflow/rule-delivery.md`).
113
113
  - **Read a target's line headroom before editing: `pnpm josh lines <path>`** — near the limit, `Target` carries the splitting plan.
114
114
 
@@ -122,7 +122,7 @@ For every code modification, in order:
122
122
  Run the full verification set **in order**; do not skip, reorder, or report completion on a failed or skipped step without the user agreeing. Inside a `fullrun` / `backlogrun` the gate runs beside the review and the merge chain (`workflow-commands` skill → §2, `node_modules/@joshuafolkken/kit/prompts/review.md`).
123
123
 
124
124
  0. **Test gate** — no tests added? Continue only under the non-runtime exception (Step 0) or explicit approval; otherwise stop and add tests.
125
- static プロファイルの HTML/CSS だけの変更には、Step 0 の手動ブラウザー確認を適用できる。
125
+ basic プロファイルで kit がテストできない言語のファイルだけの変更には、Step 0 の手動確認を適用できる。
126
126
  1. **Refactor** — `node_modules/@joshuafolkken/kit/prompts/refactoring.md`, until no high/medium items remain.
127
127
  2. **`pnpm josh gate`** — lint, type check, spell check and unit tests concurrently. One gate per run; while implementing re-run a single check by name (`pnpm josh lint:related` / `pnpm josh cspell:dot` / `pnpm josh test:related`).
128
128
  3. **Self-review** — a subagent runs `/code-review` per `node_modules/@joshuafolkken/kit/prompts/review.md` (never a main-line `Skill` load); level from the changed paths, at most two rounds, high/medium findings resolved. `node_modules/@joshuafolkken/kit/prompts/review.md` → "Review round cap".
@@ -9,10 +9,10 @@ import {
9
9
  load_environment_file,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-P3UX7SFN.js";
13
- import "./chunk-ASUZGZFT.js";
14
- import "./chunk-APVOACVT.js";
15
- import "./chunk-47SPMGOD.js";
12
+ } from "./chunk-A2H5I2VD.js";
13
+ import "./chunk-56LGMJJV.js";
14
+ import "./chunk-GBJUERYK.js";
15
+ import "./chunk-PAXMLGSS.js";
16
16
  import "./chunk-WPALEIRX.js";
17
17
  import "./chunk-RKUAD3I6.js";
18
18
  export {
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-RFPHKU7C.js";
3
+ } from "./chunk-WMIR5SNX.js";
4
4
  import {
5
5
  lane_guard_policy
6
- } from "./chunk-ASUZGZFT.js";
6
+ } from "./chunk-56LGMJJV.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-APVOACVT.js";
9
+ } from "./chunk-GBJUERYK.js";
10
10
  import {
11
11
  json_value,
12
12
  time_spans
13
- } from "./chunk-47SPMGOD.js";
13
+ } from "./chunk-PAXMLGSS.js";
14
14
 
15
15
  // scripts/delegation/duplicate-read-guard.ts
16
16
  import { statSync } from "node:fs";
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  lane_child_marker
3
- } from "./chunk-APVOACVT.js";
3
+ } from "./chunk-GBJUERYK.js";
4
4
  import {
5
5
  time_bundle_call,
6
6
  time_format,
7
7
  time_round_trips,
8
8
  time_spans,
9
9
  time_transcript_line
10
- } from "./chunk-47SPMGOD.js";
10
+ } from "./chunk-PAXMLGSS.js";
11
11
 
12
12
  // scripts/lane/lane-guard-policy.ts
13
13
  var DEFAULT_MODE = "refuse";