@joshuafolkken/kit 1.929.0 → 1.953.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 (83) hide show
  1. package/.claude/skills/workflow-commands/background-commands.md +6 -0
  2. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  3. package/.claude/skills/workflow-commands/backlogrun-lanes.md +4 -3
  4. package/.claude/skills/workflow-commands/observation-filing.md +3 -3
  5. package/.claude/skills/workflow-commands/prerequisite.md +1 -1
  6. package/.github/workflows/ci.yml +26 -8
  7. package/.github/workflows/pr-classification.yml +76 -0
  8. package/README.md +44 -22
  9. package/dist/hooks/batch-guard.js +4 -4
  10. package/dist/hooks/{chunk-GQ3EVWHY.js → chunk-452OKRQX.js} +421 -195
  11. package/dist/hooks/{chunk-2PGRQ62K.js → chunk-EYFJ74MJ.js} +11 -6
  12. package/dist/hooks/{chunk-LCJZE42I.js → chunk-IA7WC4NS.js} +1 -1
  13. package/dist/hooks/{chunk-BNFG2IFK.js → chunk-IBFC25IX.js} +4 -4
  14. package/dist/hooks/{chunk-I3JP3D4A.js → chunk-M4U4YNRE.js} +3 -3
  15. package/dist/hooks/{chunk-NJZSO7BK.js → chunk-NKVLBB65.js} +3 -3
  16. package/dist/hooks/{chunk-SXPTRFPG.js → chunk-O3PEDF3M.js} +1 -1
  17. package/dist/hooks/{chunk-7XQ6TK3R.js → chunk-OM5VDM6F.js} +2 -2
  18. package/dist/hooks/{chunk-ROULPSQC.js → chunk-V7RH56HU.js} +2 -2
  19. package/dist/hooks/{chunk-YO43HEPY.js → chunk-Z5TVZ4AP.js} +237 -235
  20. package/dist/hooks/codex-hook-adapter.js +10 -10
  21. package/dist/hooks/duplicate-read-guard.js +5 -5
  22. package/dist/hooks/format-edited.js +2 -2
  23. package/dist/hooks/investigation-guard.js +5 -5
  24. package/dist/hooks/pretool-guard.js +9 -9
  25. package/dist/hooks/stop-guard.js +9 -3
  26. package/dist/josh.js +11 -6
  27. package/dist/version/index.js +7 -4
  28. package/package.json +13 -1
  29. package/prompts/collaboration-workflow/issue-template.md +1 -1
  30. package/scripts/ci/pr-classification.ts +27 -6
  31. package/scripts/document/document-byte-budget.ts +1 -1
  32. package/scripts/gate/hook-gate-reuse.ts +1 -1
  33. package/scripts/gate/project-checks.ts +45 -15
  34. package/scripts/gate/type-check-command.ts +43 -0
  35. package/scripts/git/constants.ts +4 -0
  36. package/scripts/git/git-command.ts +11 -5
  37. package/scripts/git/git-gh-pr-rollup.ts +56 -16
  38. package/scripts/git/git-staging.ts +6 -4
  39. package/scripts/git/git-stash.ts +73 -1
  40. package/scripts/git/git-worktree.ts +35 -4
  41. package/scripts/git/repository-lock.ts +138 -0
  42. package/scripts/git/stash-orphans.ts +24 -2
  43. package/scripts/git/stash-sweep-lock.ts +30 -0
  44. package/scripts/hooks/stop-guard.ts +2 -0
  45. package/scripts/init/init-actions.ts +3 -2
  46. package/scripts/init/init-logic-migrate.ts +10 -1
  47. package/scripts/init/init-logic-templates.ts +27 -7
  48. package/scripts/init/init-logic-workspace.ts +52 -1
  49. package/scripts/init/init-logic.ts +6 -1
  50. package/scripts/init/init.ts +60 -19
  51. package/scripts/issue/issue-merged.ts +75 -0
  52. package/scripts/issue/measure-rerun-cli.ts +2 -2
  53. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +10 -0
  54. package/scripts/josh/josh-command-map.ts +1 -0
  55. package/scripts/josh/josh-command-types.ts +0 -3
  56. package/scripts/josh/josh-commands-ai.ts +6 -0
  57. package/scripts/josh/josh-commands-development.ts +5 -5
  58. package/scripts/lint/lint-parallel.ts +19 -18
  59. package/scripts/observations/observation-ledger-home.ts +22 -2
  60. package/scripts/observations/observation-ledger-line.ts +11 -0
  61. package/scripts/observations/observation-ledger-migrate.ts +146 -0
  62. package/scripts/observations/observation-ledger.ts +51 -3
  63. package/scripts/observations/observations-flush.ts +38 -7
  64. package/scripts/review/review-finding-ledger.ts +1 -1
  65. package/scripts/review/review-record-cli.ts +1 -7
  66. package/scripts/rules/delivered-rules.ts +10 -0
  67. package/scripts/rules/lane-background.ts +111 -0
  68. package/scripts/rules/stop-rules.ts +15 -2
  69. package/scripts/run/run-carry-flush.ts +2 -7
  70. package/scripts/run/run-hold-cli.ts +10 -2
  71. package/scripts/run/run-tidy-cli.ts +50 -0
  72. package/scripts/run/run-tidy-lanes.ts +110 -0
  73. package/scripts/run/run-tidy-stashes.ts +160 -0
  74. package/scripts/run/run-tidy.ts +101 -0
  75. package/scripts/safe-chain/ci-installer-pin.ts +90 -0
  76. package/scripts/safe-chain/preinstall-command.ts +39 -0
  77. package/scripts/safe-chain/project-config.ts +55 -10
  78. package/scripts/sync/sync.ts +8 -3
  79. package/scripts/test/pilot-files.ts +0 -1
  80. package/scripts/version/preinstall-version-update.ts +2 -0
  81. package/scripts/version/release-age.ts +11 -6
  82. package/templates/workflows/ci.yml +21 -7
  83. package/tsconfig/base.json +4 -1
@@ -126,5 +126,11 @@ act, so the run continues rather than stalling — the sanctioned boundary disti
126
126
  turn-end this section forbids. The boundary, its two commands and the resume verification are the
127
127
  `pre-gate-cut.md` skill document, its single source.
128
128
 
129
+ **A headless lane child (`claude -p`) is where "a background command re-invokes the run" does not
130
+ hold: its background Bash tasks are killed when its turn ends** (joshuafolkken/kit#2704). It hands the
131
+ gate-to-merge region to `pnpm josh ship --detach` instead (`chain-rule.md` step 0); `pnpm josh
132
+ rule:guard` refuses a backgrounded `josh gate` / `git` / `followup` there, and the `Stop` hook sends a
133
+ child with a task still running back to wait rather than to notify.
134
+
129
135
  The operational section above is the single source of the rule. `followup.md`, `chain-rule.md` and
130
136
  `backlogrun-progress.md` → "Progress while the run is quiet" route here for it rather than restating it.
@@ -125,7 +125,7 @@ brief hands them to the unit.
125
125
  discretionary observation has**: a child files `route:tier-a` and `route:interrupt` only, and the
126
126
  parent files what survives — `SKILL.md` → §2i, the single source. **What the parent does with the
127
127
  rest is append it, not drop it**: an observation that cannot cite the depth-0 work it blocked
128
- becomes one line in `docs/observations.md`, and a second line under the same key files it. **The
128
+ becomes one line in the observation ledger, and a second line under the same key files it. **The
129
129
  child never writes that file** — it cannot tell its observation from the sibling lane's.
130
130
  4. **Decisions taken and why**, where the decision was not already logged as an Issue comment.
131
131
  5. **What was left undone**, and under whose authority.
@@ -111,16 +111,17 @@ written.
111
111
  **Running unattended gets harder, not easier, and that is the honest trade.** Many lanes make the
112
112
  overlap between children real, and every overlap that becomes a conflict costs the child that loses the
113
113
  race a resolution, a re-run gate and a review ("Conflicts are not predicted" below), and parks it
114
- outright under that section's four conditions. The run finishes more work per hour **and** spends more
115
- of each child's budget on merge races. Do not report the first without the second.
114
+ outright under that section's four conditions. Report the throughput gain only with its merge-race
115
+ cost.
116
116
 
117
117
  ### Once per repository, before the first lane opens
118
118
 
119
119
  In the **primary checkout**, in this order, and never again per lane:
120
120
 
121
- 1. `git switch main && git pull` — every lane is branched from this ref.
121
+ 1. `git switch main && git pull` — every lane branches from this ref.
122
122
  2. `pnpm josh latest:scope`, and the update on `required` — "`josh latest` runs once per session" above.
123
123
  3. `pnpm josh lane:prune` — closes the lanes an interruption left registered without a work tree.
124
+ 4. `pnpm josh run:tidy` — sweeps merged lanes and stashes (as `run:hold` does).
124
125
 
125
126
  **`pnpm josh latest` is never run inside a lane, whatever `latest:scope` answers there** — the command
126
127
  enforces it: `latest:scope` answers `skip` in a lane and `pnpm josh latest` refuses outright, fronted
@@ -176,7 +176,7 @@ joshuafolkken/kit#1726 is the worked case: its own body says the depth test woul
176
176
  and it was filed anyway, because **discarding it was the only alternative on offer**
177
177
  (joshuafolkken/kit#1728).
178
178
 
179
- - **The destination is `docs/observations.md` in the repository the observation is about** — the same
179
+ - **The destination is `docs/maintainers/observations.md` in the repository the observation is about** — the same
180
180
  repository the Issue would have been filed into. **The count and the append are both run in that
181
181
  repository's checkout**, resolved the way §2c (`target-repository.md`) resolves any cross-repository target, and the file is
182
182
  created on the first append where that repository has none. **The subject decides, never the
@@ -230,7 +230,7 @@ watched. **A missing file is not a count of zero, though** — there `grep` exit
230
230
  number at all, so an empty answer means create the ledger, never that this is a first sighting.
231
231
 
232
232
  ```bash
233
- grep -c '^- k:<slug> |' <that repository's checkout>/docs/observations.md || true
233
+ grep -c '^- k:<slug> |' <that repository's checkout>/docs/maintainers/observations.md || true
234
234
  ```
235
235
 
236
236
  Free-text comparison is what the key exists to replace, so two lines that read alike under different
@@ -255,7 +255,7 @@ that is empty on every other machine**, and every sighting was a first one, whic
255
255
  joshuafolkken/kit#1728 created the ledger to end.
256
256
 
257
257
  - **An ordinary run never commits the ledger, and that is enforced rather than remembered.**
258
- `pnpm josh git` stages with `docs/observations.md` excluded, in the one staging step every entry
258
+ `pnpm josh git` stages with `docs/maintainers/observations.md` excluded, in the one staging step every entry
259
259
  point goes through (`scripts/git/git-staging.ts`), so a `fullrun` in the primary checkout **cannot**
260
260
  carry a ledger line into an Issue that has nothing to do with it. It is not a rule a run has to
261
261
  remember at the commit — a run that had to would be the run that forgets.
@@ -18,7 +18,7 @@ another is the failure this section exists to prevent:
18
18
  | A defect originating in **another package** | File the upstream Issue and **stop** — Tier A for a first-party target; a third-party one is Tier C, recorded and drafted rather than filed (`CLAUDE.md` → "Cross-package problems"; `prompts/collaboration-workflow/upstream-interrupt.md`) |
19
19
  | This Issue was really **several** (a split) | File the children and the epic and **stop** — except under `backlogrun`, whose authorization already covers a batch, so the children are filed and run through (`split-assessment.md`) |
20
20
  | Another Issue in **this** repository has to land first (**a prerequisite**) | This section |
21
- | Something worth filing that is **none of the three** (**an observation**) | File it **without asking** — Tier A for a first-party target — and **carry the run straight on**: nothing is stashed, nothing is parked (§2i). **A delegated child does not file here**, and a filing at depth 1 or deeper cites the depth-0 work it blocked; one that cannot cite it goes to `docs/observations.md` and is filed on its second sighting — all of them §2i's |
21
+ | Something worth filing that is **none of the three** (**an observation**) | File it **without asking** — Tier A for a first-party target — and **carry the run straight on**: nothing is stashed, nothing is parked (§2i). **A delegated child does not file here**, and a filing at depth 1 or deeper cites the depth-0 work it blocked; one that cannot cite it goes to `docs/maintainers/observations.md` and is filed on its second sighting — all of them §2i's |
22
22
 
23
23
  **File the prerequisite with the `route:tier-a` label**, so a Tier A filing made during implementation
24
24
  stays countable by filing route afterwards. **This paragraph belongs to the prerequisite row, not to
@@ -4,9 +4,13 @@ on:
4
4
  push:
5
5
  branches: [main]
6
6
 
7
+ # No `labeled` / `unlabeled`: a label added right after the pull request opens started a second
8
+ # run on the same commit, the concurrency block below cancelled one of the two, and a cancelled
9
+ # run left in the newer check suite blocked the merge (joshuafolkken/kit#2712). The one check that
10
+ # reads labels runs in `pr-classification.yml` instead.
7
11
  pull_request:
8
12
  branches: [main]
9
- types: [opened, synchronize, reopened, labeled, unlabeled]
13
+ types: [opened, synchronize, reopened]
10
14
 
11
15
  # A push run is grouped by the commit it carries, so a later push to main never cancels an earlier
12
16
  # one. Without the sha every push to main shares one group — `github.ref` is `refs/heads/main` for
@@ -23,6 +27,12 @@ concurrency:
23
27
  # set the JOSH_PLAYWRIGHT_BROWSERS repository variable to a space-separated list to widen it.
24
28
  env:
25
29
  JOSH_PLAYWRIGHT_BROWSERS: ${{ vars.JOSH_PLAYWRIGHT_BROWSERS || 'chromium' }}
30
+ # The safe-chain release every "Setup safe-chain" step installs, and the SHA-256 of that release's
31
+ # install-safe-chain.sh. The installer puts the safe-chain binary under ~/.safe-chain/bin and
32
+ # adds it to PATH beside the shims; `pnpm dlx … setup-ci` left only the shims, which then let
33
+ # every install through without a scan (joshuafolkken/kit#2711). `josh latest` moves both together.
34
+ SAFE_CHAIN_INSTALLER_VERSION: 1.5.20
35
+ SAFE_CHAIN_INSTALLER_SHA256: 0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd
26
36
 
27
37
  jobs:
28
38
  node-26-pnpm:
@@ -308,7 +318,11 @@ jobs:
308
318
  ${{ runner.os }}-cspell-cache-
309
319
 
310
320
  - name: Setup safe-chain
311
- run: pnpm dlx @aikidosec/safe-chain@1.5.20 setup-ci
321
+ run: |
322
+ installer="$RUNNER_TEMP/install-safe-chain.sh"
323
+ curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$SAFE_CHAIN_INSTALLER_VERSION/install-safe-chain.sh" -o "$installer"
324
+ echo "$SAFE_CHAIN_INSTALLER_SHA256 $installer" | sha256sum -c -
325
+ sh "$installer" --ci
312
326
 
313
327
  - name: Install dependencies
314
328
  env:
@@ -352,10 +366,6 @@ jobs:
352
366
  - name: Run verification gate
353
367
  run: pnpm josh gate --verbose --no-unit
354
368
 
355
- - name: Check release classification
356
- if: github.event_name == 'pull_request'
357
- run: pnpm josh pr:classification
358
-
359
369
  # The other half of the gate, on a runner of its own. It carries the same setup steps as
360
370
  # `static-checks` rather than sharing them: a GitHub job is its own machine, so every job that
361
371
  # needs Node sets Node up, and this workflow already writes that preamble once per job. The
@@ -411,7 +421,11 @@ jobs:
411
421
  ${{ runner.os }}-pnpm-store-
412
422
 
413
423
  - name: Setup safe-chain
414
- run: pnpm dlx @aikidosec/safe-chain@1.5.20 setup-ci
424
+ run: |
425
+ installer="$RUNNER_TEMP/install-safe-chain.sh"
426
+ curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$SAFE_CHAIN_INSTALLER_VERSION/install-safe-chain.sh" -o "$installer"
427
+ echo "$SAFE_CHAIN_INSTALLER_SHA256 $installer" | sha256sum -c -
428
+ sh "$installer" --ci
415
429
 
416
430
  - name: Install dependencies
417
431
  env:
@@ -623,7 +637,11 @@ jobs:
623
637
  ${{ runner.os }}-build-cache-e2e-
624
638
 
625
639
  - name: Setup safe-chain
626
- run: pnpm dlx @aikidosec/safe-chain@1.5.20 setup-ci
640
+ run: |
641
+ installer="$RUNNER_TEMP/install-safe-chain.sh"
642
+ curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$SAFE_CHAIN_INSTALLER_VERSION/install-safe-chain.sh" -o "$installer"
643
+ echo "$SAFE_CHAIN_INSTALLER_SHA256 $installer" | sha256sum -c -
644
+ sh "$installer" --ci
627
645
 
628
646
  - name: Install dependencies
629
647
  env:
@@ -0,0 +1,76 @@
1
+ name: Release classification
2
+
3
+ # The release-classification check, on its own because it is the one check that reads labels
4
+ # (joshuafolkken/kit#2712). While it lived in CI, CI had to rerun on `labeled` / `unlabeled`; `josh pr`
5
+ # labels a pull request the moment it opens, so every pull request started two CI runs on one commit,
6
+ # and CI's per-ref concurrency cancelled one of them. GitHub judges a check name by its newest check
7
+ # suite, and which of the two runs sat in the newer suite was a race — when it was the cancelled one,
8
+ # the pull request stayed BLOCKED until someone reran it.
9
+ on:
10
+ pull_request:
11
+ branches: [main]
12
+ types: [opened, synchronize, reopened, labeled, unlabeled]
13
+
14
+ # Deliberately no `concurrency` block. Cancelling is exactly what left the blocking suite behind, and
15
+ # nothing here needs it: every run reads the pull request's labels as they stand when it runs, not as
16
+ # its event carried them, so whichever suite GitHub counts as newest holds a current verdict.
17
+
18
+ jobs:
19
+ classification:
20
+ name: Release classification
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 5
23
+ permissions:
24
+ contents: read
25
+ packages: read
26
+ pull-requests: read
27
+ steps:
28
+ - name: Checkout code
29
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
30
+ with:
31
+ persist-credentials: false
32
+
33
+ - name: Setup Node.js
34
+ uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
35
+ with:
36
+ node-version: '24'
37
+
38
+ - name: Configure GitHub Packages authentication for existing projects
39
+ run: printf '//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}\n' >> "$HOME/.npmrc"
40
+
41
+ - name: Resolve pnpm version
42
+ id: pnpm-version
43
+ run: |
44
+ version=$(node -p "const m = require('./package.json'); m.packageManager?.match(/^pnpm@([^+]+)/)?.[1] ?? (m.devEngines?.packageManager?.name === 'pnpm' ? m.devEngines.packageManager.version?.split('+')[0] : 'latest') ?? 'latest'")
45
+ test -n "$version"
46
+ echo "version=$version" >> "$GITHUB_OUTPUT"
47
+
48
+ - name: Setup pnpm
49
+ uses: pnpm/setup@fbda4c85fc2e1e08721cd8763afea8f48d60f024 # v3.0.0
50
+ with:
51
+ version: ${{ steps.pnpm-version.outputs.version }}
52
+ install: false
53
+
54
+ - name: Resolve pnpm store path
55
+ run: echo "PNPM_STORE_PATH=$(pnpm store path)" >> "$GITHUB_ENV"
56
+
57
+ - name: Setup pnpm store cache
58
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
59
+ with:
60
+ path: ${{ env.PNPM_STORE_PATH }}
61
+ key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml') }}
62
+ restore-keys: |
63
+ ${{ runner.os }}-pnpm-store-
64
+
65
+ - name: Setup safe-chain
66
+ run: pnpm dlx @aikidosec/safe-chain@1.5.20 setup-ci
67
+
68
+ - name: Install dependencies
69
+ env:
70
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
71
+ run: pnpm install --frozen-lockfile --ignore-scripts
72
+
73
+ - name: Check release classification
74
+ env:
75
+ GH_TOKEN: ${{ github.token }}
76
+ run: pnpm josh pr:classification
package/README.md CHANGED
@@ -1,42 +1,64 @@
1
1
  # @joshuafolkken/kit
2
2
 
3
- Shared toolchain config and CLI for TypeScript projects — ESLint, Prettier, TypeScript, Lefthook, cspell, VS Code, and AI assistant files (CLAUDE.md, plus AGENTS.md / GEMINI.md pointing at it), wired together. It is framework-agnostic; the SvelteKit-specific layer lives in the separate [`@joshuafolkken/app-kit`](https://github.com/joshuafolkken/app-kit) package.
3
+ A development toolkit that sets up a repository for AI-assisted work with one command. `josh init` gives an AI assistant (Claude Code, Codex, Gemini, Cursor) the project's rules, and the `josh` CLI runs the checks and the Git / GitHub Issue workflow the same way in every project. You stop copying config between repositories and re-explaining conventions to the assistant. For the problems kit exists to solve, see [why.md](./docs/why.md) (Japanese).
4
4
 
5
- - **`josh` CLI** — lint, format, type-check, git workflow, versioning, and security auditing from any directory.
6
- - **Project config package** — ESLint / Prettier / tsconfig presets, prompts, and scripts consumed as a devDependency.
5
+ ## What your project gets
7
6
 
8
- ## Prerequisites
7
+ kit does not branch by language. It asks one question — does the project use Node tooling? — and picks a [profile](./docs/init.md#project-profiles):
9
8
 
10
- - [Node.js](https://nodejs.org/) 22.19.0 or later with [pnpm](https://pnpm.io/) — [getting-started.md](./docs/getting-started.md) covers installing both
11
- - [gh CLI](https://cli.github.com/) for `josh version` and existing GitHub Packages consumers. It is not required to install kit from public npm; see [authentication.md](./docs/authentication.md) for setup when needed.
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 |
14
+
15
+ kit adds no linter or test runner for languages other than JavaScript and TypeScript; in a `static` project, `josh` skips each check that has nothing to run and says why.
12
16
 
13
17
  ## Quick start
14
18
 
19
+ In your project directory:
20
+
15
21
  ```bash
16
- pnpm add -g @joshuafolkken/kit # install the josh CLI globally
17
- josh help
22
+ pnpm add -D --allow-build=esbuild @joshuafolkken/kit
23
+ pnpm exec josh init
24
+ pnpm install
25
+ pnpm josh format
26
+ pnpm josh gate
18
27
  ```
19
28
 
20
- Using the kit inside a project? See [docs/package.md](./docs/package.md).
29
+ It needs [Node.js](https://nodejs.org/) 22.19.0 or later with [pnpm](https://pnpm.io/), even for a `static` project; [getting-started.md](./docs/getting-started.md) installs both. The global `josh` command ([cli.md](./docs/cli.md)) and the [gh CLI](https://cli.github.com/) for `josh version` and the GitHub Issue workflow are optional.
21
30
 
22
31
  ## Documentation
23
32
 
24
- | Guide | What it covers |
25
- | ----------------------------------------------- | -------------------------------------------------------------------------------- |
26
- | [why.md](./docs/why.md) | Why kit exists — the AI-development problems it solves, for practitioners |
27
- | [getting-started.md](./docs/getting-started.md) | First install for an `index.html` site or a non-Node project, without Git |
28
- | [authentication.md](./docs/authentication.md) | GitHub Packages auth for existing projects |
29
- | [cli.md](./docs/cli.md) | Install and use the global `josh` CLI |
30
- | [package.md](./docs/package.md) | Use the kit as a project devDependency — configs, prompts, scripts, `josh init` |
31
- | [publishing.md](./docs/publishing.md) | First public npm release and trusted publishing setup |
32
- | [josh-commands.md](./docs/josh-commands.md) | Full `josh` CLI command reference |
33
- | [overview.md](./docs/overview.md) | What the kit provides and how it works |
34
- | [troubleshooting.md](./docs/troubleshooting.md) | `401`/`404` auth errors, `josh: command not found`, stale shim, version mismatch |
33
+ **Get started**
34
+
35
+ - [getting-started.md](./docs/getting-started.md) — first install for an `index.html` site or a non-Node project (`static`)
36
+ - [package.md](./docs/package.md) — add kit to a Node project (`node`)
37
+ - [tutorial.md](./docs/tutorial.md) — your first change with an agent, from Issue to merge
38
+ - [how-to.md](./docs/how-to.md) — step-by-step guides by task: update, release, run Issues, fix a failing gate
39
+ - [overview.md](./docs/overview.md) — what kit sets up and how it works
40
+
41
+ **Commands and configuration**
42
+
43
+ - [cli.md](./docs/cli.md) — install the global `josh` command
44
+ - [josh-commands.md](./docs/josh-commands.md) — every `josh` command ([catalog](./docs/josh-command-catalog.md))
45
+ - [init.md](./docs/init.md) — what `josh init` creates, per profile
46
+ - [sync.md](./docs/sync.md) — what `josh sync` updates after an upgrade
47
+ - [manual-config.md](./docs/manual-config.md) — use the presets without `josh init`
48
+ - [package-api.md](./docs/package-api.md) — the config presets and libraries the package exports
49
+
50
+ **AI workflow and operations**
51
+
52
+ - [scripts-ai.md](./docs/scripts-ai.md) — Telegram notifications and the Issue workflow commands
53
+ - [cloud-session.md](./docs/cloud-session.md) — running in an agent container
54
+ - [eval.md](./docs/eval.md) — measuring whether the agent rules are followed
55
+ - [troubleshooting.md](./docs/troubleshooting.md) — install and auth errors
56
+ - [authentication.md](./docs/authentication.md) — existing GitHub Packages installs only
35
57
 
36
58
  ## Contributing
37
59
 
38
- Community standards live in [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md); security reports go through [SECURITY.md](./SECURITY.md). Development conventions are documented in `CLAUDE.md`; `AGENTS.md` and `GEMINI.md` are pointers to it.
60
+ Community standards live in [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md); security reports go through [SECURITY.md](./SECURITY.md). Development conventions are in [CLAUDE.md](./CLAUDE.md); releases are in [publishing.md](./docs/publishing.md), and maintainer records in [docs/maintainers/](./docs/maintainers/).
39
61
 
40
62
  ## License
41
63
 
42
- MIT
64
+ [MIT](./LICENSE)
@@ -9,10 +9,10 @@ import {
9
9
  load_environment_file,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-ROULPSQC.js";
13
- import "./chunk-7XQ6TK3R.js";
14
- import "./chunk-SXPTRFPG.js";
15
- import "./chunk-2PGRQ62K.js";
12
+ } from "./chunk-V7RH56HU.js";
13
+ import "./chunk-OM5VDM6F.js";
14
+ import "./chunk-O3PEDF3M.js";
15
+ import "./chunk-EYFJ74MJ.js";
16
16
  import "./chunk-WPALEIRX.js";
17
17
  import "./chunk-RKUAD3I6.js";
18
18
  export {