@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.
- package/.claude/skills/workflow-commands/background-commands.md +6 -0
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +4 -3
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.github/workflows/ci.yml +26 -8
- package/.github/workflows/pr-classification.yml +76 -0
- package/README.md +44 -22
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-GQ3EVWHY.js → chunk-452OKRQX.js} +421 -195
- package/dist/hooks/{chunk-2PGRQ62K.js → chunk-EYFJ74MJ.js} +11 -6
- package/dist/hooks/{chunk-LCJZE42I.js → chunk-IA7WC4NS.js} +1 -1
- package/dist/hooks/{chunk-BNFG2IFK.js → chunk-IBFC25IX.js} +4 -4
- package/dist/hooks/{chunk-I3JP3D4A.js → chunk-M4U4YNRE.js} +3 -3
- package/dist/hooks/{chunk-NJZSO7BK.js → chunk-NKVLBB65.js} +3 -3
- package/dist/hooks/{chunk-SXPTRFPG.js → chunk-O3PEDF3M.js} +1 -1
- package/dist/hooks/{chunk-7XQ6TK3R.js → chunk-OM5VDM6F.js} +2 -2
- package/dist/hooks/{chunk-ROULPSQC.js → chunk-V7RH56HU.js} +2 -2
- package/dist/hooks/{chunk-YO43HEPY.js → chunk-Z5TVZ4AP.js} +237 -235
- package/dist/hooks/codex-hook-adapter.js +10 -10
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/stop-guard.js +9 -3
- package/dist/josh.js +11 -6
- package/dist/version/index.js +7 -4
- package/package.json +13 -1
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/scripts/ci/pr-classification.ts +27 -6
- package/scripts/document/document-byte-budget.ts +1 -1
- package/scripts/gate/hook-gate-reuse.ts +1 -1
- package/scripts/gate/project-checks.ts +45 -15
- package/scripts/gate/type-check-command.ts +43 -0
- package/scripts/git/constants.ts +4 -0
- package/scripts/git/git-command.ts +11 -5
- package/scripts/git/git-gh-pr-rollup.ts +56 -16
- package/scripts/git/git-staging.ts +6 -4
- package/scripts/git/git-stash.ts +73 -1
- package/scripts/git/git-worktree.ts +35 -4
- package/scripts/git/repository-lock.ts +138 -0
- package/scripts/git/stash-orphans.ts +24 -2
- package/scripts/git/stash-sweep-lock.ts +30 -0
- package/scripts/hooks/stop-guard.ts +2 -0
- package/scripts/init/init-actions.ts +3 -2
- package/scripts/init/init-logic-migrate.ts +10 -1
- package/scripts/init/init-logic-templates.ts +27 -7
- package/scripts/init/init-logic-workspace.ts +52 -1
- package/scripts/init/init-logic.ts +6 -1
- package/scripts/init/init.ts +60 -19
- package/scripts/issue/issue-merged.ts +75 -0
- package/scripts/issue/measure-rerun-cli.ts +2 -2
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +10 -0
- package/scripts/josh/josh-command-map.ts +1 -0
- package/scripts/josh/josh-command-types.ts +0 -3
- package/scripts/josh/josh-commands-ai.ts +6 -0
- package/scripts/josh/josh-commands-development.ts +5 -5
- package/scripts/lint/lint-parallel.ts +19 -18
- package/scripts/observations/observation-ledger-home.ts +22 -2
- package/scripts/observations/observation-ledger-line.ts +11 -0
- package/scripts/observations/observation-ledger-migrate.ts +146 -0
- package/scripts/observations/observation-ledger.ts +51 -3
- package/scripts/observations/observations-flush.ts +38 -7
- package/scripts/review/review-finding-ledger.ts +1 -1
- package/scripts/review/review-record-cli.ts +1 -7
- package/scripts/rules/delivered-rules.ts +10 -0
- package/scripts/rules/lane-background.ts +111 -0
- package/scripts/rules/stop-rules.ts +15 -2
- package/scripts/run/run-carry-flush.ts +2 -7
- package/scripts/run/run-hold-cli.ts +10 -2
- package/scripts/run/run-tidy-cli.ts +50 -0
- package/scripts/run/run-tidy-lanes.ts +110 -0
- package/scripts/run/run-tidy-stashes.ts +160 -0
- package/scripts/run/run-tidy.ts +101 -0
- package/scripts/safe-chain/ci-installer-pin.ts +90 -0
- package/scripts/safe-chain/preinstall-command.ts +39 -0
- package/scripts/safe-chain/project-config.ts +55 -10
- package/scripts/sync/sync.ts +8 -3
- package/scripts/test/pilot-files.ts +0 -1
- package/scripts/version/preinstall-version-update.ts +2 -0
- package/scripts/version/release-age.ts +11 -6
- package/templates/workflows/ci.yml +21 -7
- 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
|
|
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.
|
|
115
|
-
|
|
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
|
|
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
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
6
|
-
- **Project config package** — ESLint / Prettier / tsconfig presets, prompts, and scripts consumed as a devDependency.
|
|
5
|
+
## What your project gets
|
|
7
6
|
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
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 -
|
|
17
|
-
josh
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
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 {
|