@joshuafolkken/kit 1.978.0 → 1.998.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/epic-commands/SKILL.md +6 -5
- package/.claude/skills/workflow-commands/SKILL.md +9 -9
- package/.claude/skills/workflow-commands/background-commands.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
- package/.claude/skills/workflow-commands/fullrun-steps.md +8 -8
- package/.claude/skills/workflow-commands/halfrun.md +4 -5
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-scout.md +21 -22
- package/.claude/skills/workflow-commands/kickoff.md +8 -9
- package/.claude/skills/workflow-commands/observation-filing.md +9 -10
- package/.claude/skills/workflow-commands/prerequisite.md +7 -6
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/rule-residency.md +2 -2
- package/.claude/skills/workflow-commands/split-assessment.md +4 -3
- package/.claude/skills/workflow-commands/target-repository.md +7 -6
- package/.github/workflows/sonar-qube.yml +12 -2
- package/CLAUDE.md +2 -2
- package/README.md +30 -21
- package/dist/CLAUDE.md +2 -2
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-ZYYSBNR6.js → chunk-4GDR2YTV.js} +4 -4
- package/dist/hooks/{chunk-2K52BRWV.js → chunk-56LGMJJV.js} +2 -2
- package/dist/hooks/{chunk-BNGGEY3Z.js → chunk-762BDXDU.js} +266 -327
- package/dist/hooks/{chunk-Q7LE77CO.js → chunk-7WAOP42A.js} +34 -30
- package/dist/hooks/{chunk-NXL3SBXY.js → chunk-A2H5I2VD.js} +2 -2
- package/dist/hooks/{chunk-CRGJTD6E.js → chunk-AWTFKKFW.js} +1 -1
- package/dist/hooks/{chunk-KQG4776P.js → chunk-GBJUERYK.js} +1 -1
- package/dist/hooks/{chunk-BVMSPG3M.js → chunk-KPZN42RT.js} +3 -3
- package/dist/hooks/{chunk-ZPLXLJ7O.js → chunk-PAXMLGSS.js} +42 -8
- package/dist/hooks/{chunk-F6OM6SIG.js → chunk-WMIR5SNX.js} +12 -12
- 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 +99 -27
- package/dist/josh.js +21 -6
- package/package.json +5 -1
- package/prettier/basic.d.ts +3 -0
- package/prettier/basic.js +10 -0
- package/prettier/index.js +2 -2
- package/prettier/static.js +3 -10
- package/prompts/collaboration-workflow/epic-bundle.md +8 -8
- package/prompts/collaboration-workflow/issue-template.md +5 -5
- package/prompts/collaboration-workflow/rule-delivery.md +43 -30
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +3 -3
- package/prompts/review.md +11 -9
- package/prompts/sonar-hotspot-handling.md +6 -0
- package/prompts/testing-guide.md +1 -1
- package/scripts/agent/agent-diagnostics.ts +1 -0
- package/scripts/agent/agent-role-profile.ts +1 -1
- package/scripts/behavior/behavior-rules.ts +8 -1
- package/scripts/build/build-claude-md.ts +13 -4
- package/scripts/delegation/delegation-policy.ts +9 -9
- package/scripts/document/document-byte-budget.ts +1 -1
- package/scripts/gate/gate-steps.ts +1 -1
- package/scripts/gate/project-checks.ts +12 -11
- package/scripts/gate/type-check-command.ts +1 -1
- package/scripts/git/git-branch.ts +14 -3
- package/scripts/git/git-issue.ts +13 -5
- package/scripts/git/git-pr.ts +16 -10
- package/scripts/git/git-preflight.ts +138 -0
- package/scripts/git/telegram-notify.ts +21 -0
- package/scripts/hooks/stop-guard.ts +2 -0
- package/scripts/init/basic-path-migration.ts +24 -0
- package/scripts/init/distributed-paths.ts +22 -0
- package/scripts/init/init-actions.ts +27 -19
- package/scripts/init/init-ai-copy.ts +86 -28
- package/scripts/init/{init-static.ts → init-basic.ts} +6 -6
- package/scripts/init/init-bootstrap.ts +4 -3
- package/scripts/init/init-install.ts +1 -1
- package/scripts/init/init-logic-templates.ts +1 -1
- package/scripts/init/init-logic.ts +1 -1
- package/scripts/init/init.ts +41 -19
- package/scripts/init/kit-setup-state.ts +30 -0
- package/scripts/init/kit-written-paths.ts +33 -0
- package/scripts/init/project-profile-cli.ts +15 -1
- package/scripts/init/project-profile.ts +41 -12
- package/scripts/init/session-language-environment.ts +83 -0
- package/scripts/init/start-exec.ts +28 -0
- package/scripts/init/start-plan.ts +35 -13
- package/scripts/init/start-prompt.ts +22 -8
- package/scripts/init/start-setup-pr.ts +138 -0
- package/scripts/init/start-steps.ts +30 -30
- package/scripts/init/start.ts +7 -3
- package/scripts/issue/issue-file-cli.ts +188 -0
- package/scripts/issue/issue-file.ts +192 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-scout-cli.ts +41 -97
- package/scripts/issue/issue-scout-closed.ts +102 -0
- package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +12 -4
- package/scripts/josh/josh-command-map.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +3 -3
- package/scripts/josh/josh-commands-issue.ts +11 -0
- package/scripts/josh/josh-commands-project.ts +7 -3
- package/scripts/lint/cspell-cached.ts +3 -3
- package/scripts/lint/format.ts +1 -1
- package/scripts/lint/lint-parallel.ts +2 -2
- package/scripts/propagate/propagate-run.ts +1 -0
- package/scripts/propagate/propagate-select.ts +72 -0
- package/scripts/propagate/propagate-targets.ts +5 -3
- package/scripts/propagate/propagate.ts +86 -24
- package/scripts/rules/bash-triggers.ts +19 -6
- package/scripts/rules/delivered-rules.ts +28 -32
- package/scripts/rules/direct-filing.ts +38 -0
- package/scripts/rules/filing-cap.ts +12 -8
- package/scripts/rules/issue-citation.ts +30 -1
- package/scripts/rules/issue-fold.ts +4 -4
- package/scripts/rules/last-prompt.ts +79 -0
- package/scripts/rules/oracle-consulted.ts +4 -4
- package/scripts/rules/oracle-firing.ts +13 -16
- package/scripts/rules/rule-body-guard.ts +6 -9
- package/scripts/rules/stop-rules.ts +8 -5
- package/scripts/safe-chain/ci-installer-pin.ts +19 -12
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/sync/sync-ai-files.ts +204 -0
- package/scripts/sync/sync.ts +48 -184
- package/scripts/test/josh-harness-environment.ts +1 -1
- package/scripts/test/pilot-files.ts +0 -2
- package/scripts/test/test-declared-changed.ts +1 -1
- package/scripts/test/test-declared-logic.ts +55 -14
- package/scripts/test/test-declared.ts +23 -11
- package/scripts/test/test-unit-guard.ts +6 -6
- package/scripts/time-runtime/time-shell.ts +36 -2
- package/scripts/version/fresh-metadata-cache.ts +36 -0
- package/scripts/version/latest-update.ts +2 -1
- package/scripts-ai/git-workflow.ts +10 -0
- package/templates/CLAUDE.basic.md +8 -0
- package/templates/workflows/ci.yml +27 -0
- package/scripts/rules/issue-bug-label.ts +0 -85
- package/scripts/rules/issue-filing-args.ts +0 -50
- package/scripts/rules/issue-scout.ts +0 -64
- /package/{templates/CLAUDE.static.md → dist/CLAUDE.basic.md} +0 -0
- /package/templates/{cursorrules.static → cursorrules.basic} +0 -0
- /package/templates/{pnpm-workspace.static.yaml → pnpm-workspace.basic.yaml} +0 -0
- /package/templates/{prettierignore.static → prettierignore.basic} +0 -0
|
@@ -350,8 +350,9 @@ a publish that predates the change.
|
|
|
350
350
|
|
|
351
351
|
## `josh epic:bundle <N>` — does this new issue belong with one already filed?
|
|
352
352
|
|
|
353
|
-
|
|
354
|
-
mid-implementation, including inside a `backlogrun`.
|
|
353
|
+
It runs right after an issue is filed: by `kickoff` / `fullrun` / `halfrun`, or by any Tier A filing
|
|
354
|
+
mid-implementation, including inside a `backlogrun`. **`pnpm josh issue:file` runs it as its last step**;
|
|
355
|
+
run it by hand only when that step printed `⚠`. **It recommends; it writes nothing.**
|
|
355
356
|
|
|
356
357
|
"Two or more always means an epic" only fires when one request is split on the spot. Two issues filed
|
|
357
358
|
days apart that turn out to be the front and back of one job are executed separately, in whatever
|
|
@@ -454,9 +455,9 @@ decisions" section above says what to do instead.
|
|
|
454
455
|
answers the same epic question for an issue that does not exist yet — this decision, called rather
|
|
455
456
|
than restated — and beside it the one thing this one deliberately refuses: whether the work has
|
|
456
457
|
already been filed, from a title comparison (joshuafolkken/kit#1252). **Both run**, and neither
|
|
457
|
-
replaces the other:
|
|
458
|
-
`epic:bundle`
|
|
459
|
-
Full behavior: `docs/josh-commands.md` → "`josh issue:
|
|
458
|
+
replaces the other: `pnpm josh issue:file` runs the scout before it creates the issue, and
|
|
459
|
+
`epic:bundle` afterwards, from the real number and the relations recorded against it.
|
|
460
|
+
Full behavior: `docs/josh-commands.md` → "`josh issue:file`".
|
|
460
461
|
|
|
461
462
|
**When the relation carries an order, record it** in `blocked-by` and in the epic's `Dependencies` —
|
|
462
463
|
on an addition as much as on a new epic. Without it the batch survives and the reason for it does
|
|
@@ -193,15 +193,15 @@ third of four mid-run discoveries, distinct from an upstream defect, a split (`s
|
|
|
193
193
|
and an observation (§2i). The full table, the filing command, the `-u`/`stash:pop` steps and the
|
|
194
194
|
10-per-run cap are `prerequisite.md`, its single source, read at that trigger. **When the prerequisite
|
|
195
195
|
is the run's second filing, `pnpm josh issue:fold` runs first** (§2e), and `pnpm josh rule:guard`
|
|
196
|
-
refuses the second `
|
|
196
|
+
refuses the second `pnpm josh issue:file` call until it has.
|
|
197
197
|
|
|
198
198
|
## 2e. Before filing a new Issue — `pnpm josh issue:scout`
|
|
199
199
|
|
|
200
|
-
**
|
|
201
|
-
answers.** This applies inside every workflow, including observations and review
|
|
202
|
-
guard refuses
|
|
203
|
-
and epic decisions
|
|
204
|
-
→ "`josh issue:
|
|
200
|
+
**Every new Issue is filed with `pnpm josh issue:file`, which runs the `issue:scout` scan first — read
|
|
201
|
+
its duplicate and epic answers.** This applies inside every workflow, including observations and review
|
|
202
|
+
follow-ups. The guard refuses any other filing call. Read `issue-scout.md` at that point for the
|
|
203
|
+
duplicate, closed-Issue and epic decisions and for `--distinct`; `issue-fold-existing.md` handles a
|
|
204
|
+
compatible duplicate. `docs/josh-commands.md` → "`josh issue:file`" defines the command.
|
|
205
205
|
|
|
206
206
|
## 2f. The working-tree hold — one run per tree
|
|
207
207
|
|
|
@@ -239,14 +239,14 @@ parent-wake half at `backlogrun-progress.md` → "The parent keeps no clock of i
|
|
|
239
239
|
**When a first-party observation is worth filing, file it without asking and continue the run.**
|
|
240
240
|
Read `observation-filing.md` in full before filing: it decides the depth test, filing ceilings, labels,
|
|
241
241
|
second-filing fold, ledger fallback and delegated-child handoff. Use `pnpm josh repo:party` to decide
|
|
242
|
-
first-party status, then
|
|
242
|
+
first-party status, then file with `pnpm josh issue:file` (§2e). A third-party target remains
|
|
243
243
|
Tier C (`CLAUDE.md`).
|
|
244
244
|
|
|
245
245
|
## 2j. The end-of-run retrospective — read when `run:step` prints it
|
|
246
246
|
|
|
247
247
|
**When `pnpm josh run:step` prints the retrospective step, read `retrospective.md` in full and run the
|
|
248
|
-
digest it names once.** File up to two worthwhile improvements through `issue:
|
|
249
|
-
`epic:bundle
|
|
248
|
+
digest it names once.** File up to two worthwhile improvements through `issue:file` (scout and
|
|
249
|
+
`epic:bundle` included), stack the rest in the observation ledger, and close the step with the command described
|
|
250
250
|
there. A dispatched lane child never runs the retrospective.
|
|
251
251
|
|
|
252
252
|
## 3. What stays resident, and what is read from here
|
|
@@ -110,7 +110,7 @@ with. Applied to the three waits a run actually has:
|
|
|
110
110
|
| --------------- | ----------------- |
|
|
111
111
|
| `pnpm josh gate` | a subagent running `/code-review` with the brief `pnpm josh review:brief` prints |
|
|
112
112
|
| `pnpm josh git -y` | Write the completion notification body to a file for `--notify-message-file`, and settle the three-way disposition of any remaining non-High finding |
|
|
113
|
-
| CI, after the push | The second review round where one is due, the branch-2 filing
|
|
113
|
+
| CI, after the push | The second review round where one is due, the branch-2 filing through `pnpm josh issue:file`, which runs `epic:bundle` itself (`prompts/review.md` → "Review round cap") |
|
|
114
114
|
| `pnpm josh followup` | Nothing — it is foreground and holds the session. **The post-merge tail is what overlaps here, and it is taken before the call rather than beside it**: compose the epic progress counters first, and leave after the merge only the steps that read its result, plus `pnpm josh cost --cut` |
|
|
115
115
|
|
|
116
116
|
**The turn never ends at the push.** The completion notification for `pnpm josh git -y` is what
|
|
@@ -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.
|
|
@@ -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
|
|
@@ -7,7 +7,7 @@ the run is at, and the sections below carry that step in full.
|
|
|
7
7
|
|
|
8
8
|
## The `fullrun #N` step list
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
File Issues with `pnpm josh issue:file` (it applies the classification labels); see `prompts/collaboration-workflow/issue-template.md`.
|
|
11
11
|
|
|
12
12
|
**Add `in-progress` the moment `run:hold` answered `hold`** (create if missing:
|
|
13
13
|
`gh api repos/{owner}/{repo}/labels -f name=in-progress -f color=0075ca -f description="Work is
|
|
@@ -29,7 +29,7 @@ with the brief `pnpm josh review:brief` prints on `git diff main`, join the gate
|
|
|
29
29
|
iterate to no high/medium findings, at most two reviews → **the clean path folds the ship region into
|
|
30
30
|
one call**, `pnpm josh ship "<title> #<N>"` (gate → commit/push/PR → the CI-wait `followup` → the
|
|
31
31
|
`run:tail` report bookkeeping, stopping at the first failed step; joshuafolkken/kit#2398), with any
|
|
32
|
-
branch-2 filing
|
|
32
|
+
branch-2 filing (`pnpm josh issue:file`, which runs `epic:bundle` itself) run before it → **when a second round is due `ship` does not
|
|
33
33
|
fit**: open the PR between the rounds with `pnpm josh git -y "<title> #<N>"`, run round 2 beside CI, then
|
|
34
34
|
`pnpm josh followup` and `pnpm josh run:tail <N>`). Issue plan comments are written in the session language (`JOSH_SESSION_LANG`,
|
|
35
35
|
default `ja`). Before implementing, run `git switch main && git pull`, then `pnpm josh latest:scope`
|
|
@@ -49,10 +49,10 @@ completion notification, then merges; if blockers are found it exits non-zero
|
|
|
49
49
|
## The `fullrun new` step list
|
|
50
50
|
|
|
51
51
|
`kickoff new` + `fullrun #N` in one run. Steps: (1) Derive an English title, or use the provided one.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
(2) Create Issue: `pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>` (per
|
|
53
|
+
`prompts/collaboration-workflow/issue-template.md`) — its duplicate scan runs first, and a candidate
|
|
54
|
+
that covers the same work stops the run rather than filing a second Issue (`SKILL.md` → §2e). Capture
|
|
55
|
+
`<N>`. (3) Add
|
|
56
56
|
`in-progress` (as above). (4) Post the agreed plan in the session language: fill the body if blank,
|
|
57
57
|
otherwise add a comment. (5) If the working tree already has staged or modified files,
|
|
58
58
|
`git stash push -m "fullrun new: pre-existing changes"` first. (6) `git switch main && git pull`. (7)
|
|
@@ -65,8 +65,8 @@ round 1's fixes are in and before the commit. (10) Where the tree was edited aft
|
|
|
65
65
|
started, re-run `pnpm josh gate` and join it. (11) `pnpm josh git -y "<title> #<N>"` — the pull request
|
|
66
66
|
opens here, between the two rounds. (11a) Run the **second round** now beside the CI, where (9a)
|
|
67
67
|
answered `required` (brief `pnpm josh review:brief --round 2`); a finding it fixes in place is pushed
|
|
68
|
-
before its gate. (12) File whatever the review round cap routed to branch 2
|
|
69
|
-
|
|
68
|
+
before its gate. (12) File whatever the review round cap routed to branch 2 with `pnpm josh issue:file`
|
|
69
|
+
(it runs `epic:bundle` on each), and where (9a) answered `skip` record the skip on the Issue. (13) **Where no second
|
|
70
70
|
round was due** (9a `skip`), fold steps (10)–(13) and the release bookkeeping into one call — `pnpm josh
|
|
71
71
|
ship "<title> #<N>" --notify-message "..."` (gate → commit/push/PR → the CI-wait `followup` → `run:tail`,
|
|
72
72
|
stopping at the first failed step; joshuafolkken/kit#2398); **where a second round ran**, the PR opened
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `halfrun` — the manifest (implement + verify, stop before commit)
|
|
2
2
|
|
|
3
|
-
When this run files a new Issue,
|
|
3
|
+
When this run files a new Issue, file it with `pnpm josh issue:file`, which lints the body and applies the classification labels it declares beside the `--depth` and `--route` labels; `prompts/collaboration-workflow/issue-template.md` is the single source for this classification.
|
|
4
4
|
|
|
5
5
|
`halfrun` sits between `kickoff` (plan only) and `fullrun` (full execution with auto-merge). It
|
|
6
6
|
implements the change and runs the full verification gate, then **stops before commit** — nothing is
|
|
@@ -56,10 +56,9 @@ back with fixes, treat each as a new round: implement, re-run `pnpm josh gate`,
|
|
|
56
56
|
`confirmation` Telegram, stop again.
|
|
57
57
|
|
|
58
58
|
`halfrun new` or `halfrun new "<title>"`: `kickoff new` + `halfrun #<N>` (no Issue exists yet). Steps
|
|
59
|
-
mirror `fullrun new` (1)–(8): derive an English title (or use the provided one) →
|
|
60
|
-
issue:
|
|
61
|
-
|
|
62
|
-
body per `prompts/collaboration-workflow/issue-template.md`) → add `in-progress` → post the agreed plan → stash
|
|
59
|
+
mirror `fullrun new` (1)–(8): derive an English title (or use the provided one) → create the Issue
|
|
60
|
+
(`pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>`, body per
|
|
61
|
+
`prompts/collaboration-workflow/issue-template.md`; its duplicate scan is read per `SKILL.md` → §2e) → add `in-progress` → post the agreed plan → stash
|
|
63
62
|
any pre-existing changes with `git stash push -m "halfrun new: pre-existing changes"`, popped by
|
|
64
63
|
message with `pnpm josh stash:pop "halfrun new: pre-existing changes"`, never a positional `git stash pop` →
|
|
65
64
|
`git switch main && git pull` → `pnpm josh latest:scope` → implement → run the gate (as above, `pnpm
|
|
@@ -104,6 +104,6 @@ never the comment text.
|
|
|
104
104
|
|
|
105
105
|
**`pnpm josh rule:guard` refuses the body-only read** and hands over the reissue and the conflict rule
|
|
106
106
|
at the moment they bind (`prompts/collaboration-workflow/rule-delivery.md`,
|
|
107
|
-
`scripts/rules/delivered-rules.test.ts`). The refusal reaches Claude Code alone and
|
|
107
|
+
`scripts/rules/delivered-rules.test.ts`). The refusal reaches Claude Code alone and repeats until the comments are read,
|
|
108
108
|
so **this file is the rule and the hook is what makes it hard to walk past** — a session that runs
|
|
109
109
|
no hooks still owes the read.
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Filing an Issue — `SKILL.md` §2e's procedure
|
|
2
2
|
|
|
3
|
-
Read this file when an Issue title exists and before the `
|
|
4
|
-
filing asks whether the work already exists and which epic owns it;
|
|
3
|
+
Read this file when an Issue title exists and before the `pnpm josh issue:file` call that files it.
|
|
4
|
+
Every filing asks whether the work already exists and which epic owns it; the command runs the
|
|
5
|
+
`issue:scout` scan on the title and body first and holds the filing until every printed candidate is
|
|
6
|
+
named in `--distinct`:
|
|
5
7
|
|
|
6
8
|
```bash
|
|
7
|
-
pnpm josh issue:
|
|
8
|
-
pnpm josh issue:
|
|
9
|
-
pnpm josh issue:scout "<title>" --body-file <complete-draft.md>
|
|
9
|
+
pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> [--route <route>]
|
|
10
|
+
pnpm josh issue:file "<title>" --body-file <complete-draft.md> --depth <n> --distinct 2801,2795
|
|
10
11
|
```
|
|
11
12
|
|
|
12
13
|
- **`Duplicates:` is read, not skimmed.** Open each candidate and apply `issue-fold-existing.md`
|
|
@@ -14,32 +15,30 @@ pnpm josh issue:scout "<title>" --body-file <complete-draft.md>
|
|
|
14
15
|
Telegram and "Please run `fullrun #<existing>` to execute this Issue." A compatible addition follows
|
|
15
16
|
that file's fold path; a separate deliverable follows the ordinary filing path. A title match alone
|
|
16
17
|
never authorizes an edit.
|
|
18
|
+
- **`--distinct` records that each candidate was read.** Reissue the call listing every candidate you
|
|
19
|
+
read and judged separate; never list one you have not read.
|
|
17
20
|
- **A candidate marked `(closed)` is a different answer.** The scan covers what closed recently as
|
|
18
21
|
well as what is open, because the work most likely to be filed twice is the work that just finished.
|
|
19
22
|
A closed candidate that covers the same work means **the work is already done** — so there is nothing
|
|
20
23
|
to run. Verify it against the merged code, then take the exit in `issue-comments.md` → "When the work
|
|
21
24
|
turns out to be already merged". A closed candidate that does *not* cover the work is noted in one
|
|
22
|
-
line and the filing carries on.
|
|
25
|
+
line, named in `--distinct`, and the filing carries on.
|
|
23
26
|
- **`none` is an answer.** The command reports no candidate rather than the closest miss.
|
|
24
27
|
- **`Epic:` front-loads the placement.** Its recommendation is `epic:bundle`'s, which makes
|
|
25
28
|
`add_to_epic` / `create_epic` Tier A and `ask` a stop, in exactly the reading `SKILL.md` → §2a's
|
|
26
29
|
`into <target>` suffix would have given by hand. Where the user typed `into <target>`, that naming wins.
|
|
27
|
-
- **`Epic: not asked` is not `Epic: none`.** The epic half decides from the issue numbers the
|
|
28
|
-
names
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
the `gh api … issues` call, never which keyword started the run, so `SKILL.md` → §2d's prerequisite,
|
|
37
|
-
§2i's observation and the review round cap's branch-2 filing all go through it.
|
|
38
|
-
- **A `#N` entry point does not run it *for the Issue it was handed*.** `fullrun #N` / `halfrun #N` /
|
|
30
|
+
- **`Epic: not asked` is not `Epic: none`.** The epic half decides from the issue numbers the body
|
|
31
|
+
names. **Cite `#N` in the body whenever the work follows an existing Issue** — one line is enough,
|
|
32
|
+
and naming the epic itself (`part of epic #<E>`) is answered with that epic.
|
|
33
|
+
- **`epic:bundle` then runs on the new Issue, in the same call.** Act on its printed answer; a `⚠`
|
|
34
|
+
means rerun `pnpm josh epic:bundle <N>` — the Issue exists, so never refile.
|
|
35
|
+
- **Every filing route goes through it** — §2d's prerequisite, §2i's observation and the review round
|
|
36
|
+
cap's branch-2 filing alike; the guard refuses any other filing call
|
|
37
|
+
(`prompts/collaboration-workflow/rule-delivery.md`).
|
|
38
|
+
- **A `#N` entry point does not file *the Issue it was handed*.** `fullrun #N` / `halfrun #N` /
|
|
39
39
|
`kickoff #N` are given an Issue that already exists. That says nothing about an Issue such a run goes
|
|
40
40
|
on to file later, which the bullet above covers.
|
|
41
|
-
- **The split path files each child through the same
|
|
42
|
-
|
|
41
|
+
- **The split path files each child through the same command.** The epic is created with
|
|
42
|
+
`pnpm josh epic` over children that were scanned.
|
|
43
43
|
|
|
44
|
-
Full behavior
|
|
45
|
-
`docs/josh-commands.md` → "`josh issue:scout`".
|
|
44
|
+
Full behavior: `docs/josh-commands.md` → "`josh issue:file`" and "`josh issue:scout`".
|
|
@@ -44,16 +44,15 @@ split is found.
|
|
|
44
44
|
- `kickoff new` or `kickoff new "<title>"`: No Issue exists yet. Steps: (0) **Scope assessment** per
|
|
45
45
|
`split-assessment.md`. If multiple → the **multi-issue split path**; if single → the **single-issue
|
|
46
46
|
path**. **Single-issue path**: (1) Derive an English title from the conversation, or use the provided
|
|
47
|
-
title.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
title. (2) Create Issue: `pnpm josh issue:file "<title>" --body-file <body-file> --depth <n>` (body
|
|
48
|
+
per `prompts/collaboration-workflow/issue-template.md`) — its duplicate scan runs first, and a
|
|
49
|
+
candidate that covers the same work stops the run rather than filing a second Issue (`SKILL.md` →
|
|
50
|
+
§2e). Capture `<N>`. (3)
|
|
51
51
|
Post the plan in the session language, using the same body/comment logic as `kickoff #<N>`. (4) Send
|
|
52
52
|
Telegram notification. (5) **Stop** — do not implement. **Multi-issue split path**: (1) For each
|
|
53
|
-
independent deliverable, derive a focused English title
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
-F body=@<body-file>`. Capture each Issue number. **When the split is filed into a repository other than
|
|
53
|
+
independent deliverable, derive a focused English title and create a separate Issue with the
|
|
54
|
+
`route:split` label (its duplicate scan is read per `SKILL.md` → §2e): `pnpm josh issue:file
|
|
55
|
+
"<sub-title>" --body-file <body-file> --depth <n> --route split`. Capture each Issue number. **When the split is filed into a repository other than
|
|
57
56
|
the one this session is running in**, every child body gets the `## Origin` backlink described in the
|
|
58
57
|
cross-package rule the AI documents keep resident, the epic body carries the same link as prose or a
|
|
59
58
|
plain bullet (never as a checkbox row, which would disable its auto-close), and the originating Issue
|
|
@@ -81,4 +80,4 @@ split is found.
|
|
|
81
80
|
creation call. (3) Send Telegram notification listing all created issues. (4) Present the command
|
|
82
81
|
`backlogrun #<E> --only`. (5) **Stop** — do not implement.
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
`pnpm josh issue:file` lints the body and applies the classification labels it declares, following `prompts/collaboration-workflow/issue-template.md` for classification (`docs/josh-commands.md` → `josh issue:file`).
|
|
@@ -20,17 +20,16 @@ on is dropped rather than filed.
|
|
|
20
20
|
|
|
21
21
|
**The filing ceilings still apply.** Count this filing in the ten-Issue limit for the run. An
|
|
22
22
|
observation is discretionary, so above 30 open Issues in the target repository, close one first or do
|
|
23
|
-
not file (`prompts/collaboration-workflow/wip-cap.md`).
|
|
24
|
-
|
|
23
|
+
not file (`prompts/collaboration-workflow/wip-cap.md`). File it with `pnpm josh issue:file`
|
|
24
|
+
(`issue-scout.md`), which lints the body against `prompts/collaboration-workflow/issue-template.md`,
|
|
25
|
+
applies the classification labels it declares, runs the duplicate scan, and runs `epic:bundle` on the
|
|
26
|
+
new Issue so it is offered by its epic; an `auto-ok` epic adds it to the backlog pool
|
|
27
|
+
(`backlogrun-steps.md` → "What one invocation approves"). When it is the second filing of the run, run
|
|
25
28
|
`pnpm josh issue:fold` first; the guard refuses that filing without the fold
|
|
26
|
-
(`split-assessment.md` → "The same two questions decide the filing-time fold").
|
|
27
|
-
`pnpm josh epic:bundle <new>` so the Issue is offered by its epic; an `auto-ok` epic adds it to the
|
|
28
|
-
backlog pool (`backlogrun-steps.md` → "What one invocation approves").
|
|
29
|
+
(`split-assessment.md` → "The same two questions decide the filing-time fold").
|
|
29
30
|
|
|
30
31
|
The detail below is read at the filing decision, and the marker suite pins the rules here.
|
|
31
32
|
|
|
32
|
-
Before filing an observation, run `pnpm josh issue:lint <body-file>` and apply every label in its `labels:` answer at creation; `prompts/collaboration-workflow/issue-template.md` is the single source. Keep the depth label.
|
|
33
|
-
|
|
34
33
|
### The depth test — a discretionary filing cites the product work it blocked
|
|
35
34
|
|
|
36
35
|
**A run that has just spent an hour inside the workflow tooling files findings about the workflow
|
|
@@ -53,11 +52,11 @@ it — read off the subject rather than judged**:
|
|
|
53
52
|
single source**, and a label description that paraphrased it would be a second copy of the rule.
|
|
54
53
|
**Every filing route applies one**, this route and the other three of §2d's table alike: a `new`
|
|
55
54
|
entry point, a `route:tier-a` prerequisite, a `route:interrupt`, a split child and a review round
|
|
56
|
-
cap's branch-2 filing all pass through a `
|
|
57
|
-
beside whatever `
|
|
55
|
+
cap's branch-2 filing all pass through a `pnpm josh issue:file` call, and the depth goes in it as
|
|
56
|
+
`--depth <n>` beside whatever `--route` that call already carries.
|
|
58
57
|
|
|
59
58
|
```bash
|
|
60
|
-
|
|
59
|
+
pnpm josh issue:file "<title>" --body-file <body-file> --depth 1
|
|
61
60
|
gh api repos/{owner}/{repo}/issues/<N>/labels -f 'labels[]=depth:1' # an Issue already filed
|
|
62
61
|
```
|
|
63
62
|
|
|
@@ -25,16 +25,17 @@ stays countable by filing route afterwards. **This paragraph belongs to the prer
|
|
|
25
25
|
the table** — the label means a filing the run is *blocked by*, so the observation row carries no
|
|
26
26
|
`route:` label of its own (§2i):
|
|
27
27
|
|
|
28
|
-
Before that call, run `pnpm josh issue:lint <body-file>` and apply every label in its `labels:` answer at creation; `prompts/collaboration-workflow/issue-template.md` is the single source. Keep `route:tier-a` and `depth`.
|
|
29
|
-
|
|
30
28
|
```bash
|
|
31
|
-
|
|
29
|
+
pnpm josh issue:file "<title>" --body-file <body-file> --depth <n> --route tier-a
|
|
32
30
|
```
|
|
33
31
|
|
|
32
|
+
The command lints the body against `prompts/collaboration-workflow/issue-template.md`, applies the
|
|
33
|
+
classification labels it declares, and runs the duplicate scan and `epic:bundle` itself
|
|
34
|
+
(`docs/josh-commands.md` → `josh issue:file`).
|
|
35
|
+
|
|
34
36
|
Every "file the prerequisite" below means that labelled filing, and it always happens **first**: the
|
|
35
|
-
steps after it name a number that does not exist until it is.
|
|
36
|
-
|
|
37
|
-
most likely to duplicate something.
|
|
37
|
+
steps after it name a number that does not exist until it is. **Its duplicate scan is read exactly as
|
|
38
|
+
it is for a `new` entry** (§2e): a filing made mid-run is the one most likely to duplicate something.
|
|
38
39
|
|
|
39
40
|
**Each entry point's own branch stays in that entry's file:**
|
|
40
41
|
|
|
@@ -53,11 +53,11 @@ ceiling on what may be recorded. **File nothing when nothing passes** — a run
|
|
|
53
53
|
improvement worth carrying files zero Issues, and that is what makes the "file → drain → file again"
|
|
54
54
|
loop converge.
|
|
55
55
|
|
|
56
|
-
**Exclude what is already filed or already done, through the existing scout** (`SKILL.md` → §2e).
|
|
57
|
-
`pnpm josh issue:
|
|
58
|
-
same work means do not file it, and a `(closed)` candidate covering it means the work is
|
|
59
|
-
Neither exclusion is a new mechanism.
|
|
60
|
-
after any filing.
|
|
56
|
+
**Exclude what is already filed or already done, through the existing scout** (`SKILL.md` → §2e). File
|
|
57
|
+
each with `pnpm josh issue:file`, which runs the scout before creating anything: an **open** candidate
|
|
58
|
+
covering the same work means do not file it, and a `(closed)` candidate covering it means the work is
|
|
59
|
+
already merged. Neither exclusion is a new mechanism. The same call runs `epic:bundle` on each new
|
|
60
|
+
Issue, as after any filing.
|
|
61
61
|
|
|
62
62
|
## `auto-ok`, and closing the step
|
|
63
63
|
|
|
@@ -165,8 +165,8 @@ again (joshuafolkken/kit#1525).
|
|
|
165
165
|
- **The Issue's comments** — `pnpm josh rule:guard` refuses the `Bash` call that reads an Issue's
|
|
166
166
|
body without them (`gh issue view <N>`, or a `GET` of a path ending `…/issues/<N>`) and hands over
|
|
167
167
|
the reissue that carries them plus the rule for a comment that contradicts the body. It is the one
|
|
168
|
-
row whose trigger `batch:guard` also considers,
|
|
169
|
-
|
|
168
|
+
row whose trigger `batch:guard` also considers, yet it refuses on that guard's turn too, since it
|
|
169
|
+
repeats until the comments are read. §2g is the procedure and stays here, because a session that runs no hooks still
|
|
170
170
|
owes the read (`prompts/collaboration-workflow/rule-delivery.md`,
|
|
171
171
|
`scripts/rules/delivered-rules.test.ts`).
|
|
172
172
|
- **The prohibition on putting a body inside shell double quotes** — `pnpm josh rule:guard` refuses
|
|
@@ -31,7 +31,7 @@ same conjunction**: separability, and whether the whole clearly exceeds one gate
|
|
|
31
31
|
`pnpm josh split:assess`, called not recomputed, and `separate` needs both halves exactly as `split`
|
|
32
32
|
does. **There is no second criterion.** §2i's observation, the review round cap's branch 2 and §2d's
|
|
33
33
|
prerequisite each route a second filing through it, delivered by `pnpm josh rule:guard` at the run's
|
|
34
|
-
second `
|
|
34
|
+
second `pnpm josh issue:file` call, never the first.
|
|
35
35
|
|
|
36
36
|
## Why the default is not to split
|
|
37
37
|
|
|
@@ -88,8 +88,9 @@ the whole point of one definition is that where the split was noticed cannot cha
|
|
|
88
88
|
The epic is the non-closing home for the split rationale. A comment on the first child is buried the
|
|
89
89
|
moment that child merges and closes.
|
|
90
90
|
|
|
91
|
-
**Each split child is filed with the `route:split` label
|
|
92
|
-
|
|
91
|
+
**Each split child is filed with the `route:split` label** —
|
|
92
|
+
`pnpm josh issue:file "<sub-title>" --body-file <body-file> --depth <n> --route split` — so the
|
|
93
|
+
backlog's composition stays countable by filing route rather than by grepping issue bodies.
|
|
93
94
|
|
|
94
95
|
## Promote, or create a new epic
|
|
95
96
|
|
|
@@ -37,12 +37,13 @@ backlogrun joshuafolkken/kit#858 --only
|
|
|
37
37
|
explicit instruction that rule requires. **Send a `confirmation` Telegram and stop** — nothing has
|
|
38
38
|
been produced yet, so there is no finding to record and no draft to prepare.
|
|
39
39
|
- **No prefix leaves the behavior exactly as it was** — the target is the session's repository.
|
|
40
|
-
- **`kickoff` needs no checkout**: name the target repository
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
- **`kickoff` needs no checkout**: name the target repository with `--repo <owner/repo>` on every
|
|
41
|
+
`pnpm josh issue:file` call and in the path of every `gh api` call, and never clone. The one exception
|
|
42
|
+
is the split path's epic, since `pnpm josh epic` only writes the repository it runs in — run it in
|
|
43
|
+
that repository's checkout. With no checkout there, file the children, report that the epic could
|
|
44
|
+
not be created, and stop — a hand-built `gh api …/issues` filing of the epic is refused by the
|
|
45
|
+
`direct-filing` guard, and `pnpm josh issue:file` lints an epic body against the Issue template. The
|
|
46
|
+
promote arm stops the same way.
|
|
46
47
|
- **The implementing entries require a checkout and never create one — when the target is another
|
|
47
48
|
repository.** A prefix naming the session's own repository changes nothing (`fullrun kit#412` in the
|
|
48
49
|
kit checkout behaves exactly as `fullrun #412`). Otherwise resolve the checkout from `pnpm josh
|
|
@@ -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
|
-
- **
|
|
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
|
-
|
|
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
|
|
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
|
|
10
|
-
| ---------------------------------------- |
|
|
11
|
-
| Node project (JavaScript / TypeScript) | `
|
|
12
|
-
| HTML / CSS (browser JavaScript included) | `
|
|
13
|
-
| Another language (Python, Rust, Go, …) | `
|
|
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 `
|
|
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 ([
|
|
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
|
-
|
|
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
|
|
25
|
-
pnpm josh
|
|
26
|
+
pnpm add -D --allow-build=esbuild --allow-build=unrs-resolver @joshuafolkken/kit
|
|
27
|
+
pnpm exec josh start
|
|
26
28
|
```
|
|
27
29
|
|
|
28
|
-
|
|
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
|
|
32
|
-
pnpm
|
|
35
|
+
pnpm --allow-build=esbuild dlx @joshuafolkken/kit init
|
|
36
|
+
pnpm josh gate
|
|
33
37
|
```
|
|
34
38
|
|
|
35
|
-
|
|
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
|
-
**
|
|
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
|
-
- [
|
|
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
|