@joshuafolkken/kit 1.1178.0 → 1.1229.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/.claude-plugin/plugin.json +1 -1
- package/.claude/settings.json +2 -2
- package/.claude/skills/dependency-update/SKILL.md +4 -8
- package/.claude/skills/epic-commands/SKILL.md +2 -2
- package/.claude/skills/epic-commands/epic-bundle.md +1 -1
- package/.claude/skills/workflow-commands/SKILL.md +2 -4
- package/.claude/skills/workflow-commands/backlogrun-child.md +6 -4
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +6 -2
- package/.claude/skills/workflow-commands/backlogrun-park.md +23 -2
- package/.claude/skills/workflow-commands/backlogrun-progress.md +7 -2
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +4 -3
- package/.claude/skills/workflow-commands/backlogrun-steps.md +21 -13
- package/.claude/skills/workflow-commands/chain-rule.md +1 -1
- package/.claude/skills/workflow-commands/delegation.md +2 -2
- package/.claude/skills/workflow-commands/followup.md +5 -0
- package/.claude/skills/workflow-commands/fullrun-steps.md +1 -1
- package/.claude/skills/workflow-commands/halfrun.md +1 -1
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +1 -1
- package/.claude/skills/workflow-commands/observation-ledger.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +6 -1
- package/.claude/skills/workflow-commands/prerequisite.md +2 -2
- package/.claude/skills/workflow-commands/progress-watcher.md +1 -1
- package/.claude/skills/workflow-commands/working-tree-hold.md +1 -1
- package/.codex/hooks.json +2 -2
- package/.cursorrules +6 -41
- package/.github/actions/setup-node/action.yml +1 -1
- package/.github/workflows/auto-tag.yml +3 -4
- package/.github/workflows/ci.yml +32 -31
- package/.github/workflows/dependabot-auto-merge.yml +13 -6
- package/.github/workflows/publish.yml +48 -4
- package/.github/workflows/sonar-qube.yml +3 -0
- package/.pnpmfile.mjs +4 -3
- package/.prettierignore +8 -2
- package/CLAUDE.md +18 -20
- package/README.md +26 -19
- package/SECURITY.md +15 -1
- package/dist/CLAUDE.md +18 -20
- package/dist/commands/document-section-cli.js +734 -0
- package/dist/hooks/audit-provision.js +346 -0
- package/dist/hooks/batch-guard.js +5 -4
- package/dist/hooks/{chunk-S6X6WYKR.js → chunk-55HHG5PX.js} +1210 -711
- package/dist/hooks/{chunk-ZAL3NRGL.js → chunk-5VMKCCC4.js} +25 -10
- package/dist/hooks/chunk-5VNDSNG3.js +12 -0
- package/dist/hooks/{chunk-32GQTL4F.js → chunk-6HJJXRBX.js} +4 -2
- package/dist/hooks/chunk-CDY4NFQG.js +15 -0
- package/dist/hooks/chunk-ELCN5LCH.js +135 -0
- package/dist/hooks/{chunk-VESKRQOF.js → chunk-F56MFS4B.js} +3 -3
- package/dist/hooks/{chunk-UAGLLIGZ.js → chunk-FIVDHQGT.js} +7 -6
- package/dist/hooks/{chunk-3V37IID6.js → chunk-JBBMAPC4.js} +23 -14
- package/dist/hooks/{chunk-G6KRCKEC.js → chunk-JUDKDCDP.js} +496 -378
- package/dist/hooks/{chunk-GDS5N2KB.js → chunk-NV2JRZZO.js} +718 -681
- package/dist/hooks/{chunk-VQLLNFNT.js → chunk-RNWHN5BP.js} +3 -3
- package/dist/hooks/{chunk-DO6NWWHU.js → chunk-TQNPDZNH.js} +4 -4
- package/dist/hooks/{chunk-I4XSL4TT.js → chunk-VC3PZPZO.js} +1 -1
- package/dist/hooks/codex-hook-adapter.js +14 -12
- package/dist/hooks/duplicate-read-guard.js +6 -5
- package/dist/hooks/format-edited.js +4 -3
- package/dist/hooks/inputs.json +217 -195
- package/dist/hooks/investigation-guard.js +6 -5
- package/dist/hooks/pretool-guard.js +12 -10
- package/dist/hooks/session-lang.js +2 -4
- package/dist/hooks/stop-guard.js +66 -58
- package/dist/josh.js +868 -74
- package/dist/version/index.d.ts +7 -2
- package/dist/version/index.js +152 -75
- package/eslint/base.js +23 -1
- package/eslint/rules/code-quality.js +3 -0
- package/eslint/rules/early-return-one-liner.js +98 -0
- package/eslint/rules/unicorn.js +16 -1
- package/package.json +7 -6
- package/pnpm-workspace.yaml +9 -4
- package/prettier/basic.d.ts +3 -1
- package/prettier/index.d.ts +3 -1
- package/prettier/static.d.ts +3 -1
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +4 -4
- package/prompts/collaboration-workflow/glossary.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +17 -9
- package/prompts/collaboration-workflow/overview.md +2 -2
- package/prompts/collaboration-workflow/principles.md +14 -12
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +1 -1
- package/prompts/collaboration-workflow/rule-delivery.md +6 -6
- package/prompts/collaboration-workflow/shell-body.md +6 -6
- package/prompts/collaboration-workflow/turn-batching.md +1 -1
- package/prompts/collaboration-workflow/upstream-interrupt.md +12 -2
- package/prompts/collaboration-workflow/wip-cap.md +10 -10
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +1 -1
- package/scripts/agent/agent-headless.ts +29 -0
- package/scripts/agent/agent-launch-environment.ts +6 -2
- package/scripts/agent/codex-agent-argv.ts +2 -1
- package/scripts/auto-ok/auto-ok-cli.ts +1 -1
- package/scripts/backlog/backlog-arrival.ts +3 -3
- package/scripts/backlog/backlog-budget.ts +1 -1
- package/scripts/backlog/backlog-drive-args.ts +135 -0
- package/scripts/backlog/backlog-drive-cli.ts +11 -137
- package/scripts/backlog/backlog-drive-launch.ts +39 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +3 -5
- package/scripts/backlog/backlog-drive-named.ts +3 -3
- package/scripts/backlog/backlog-drive-offer-argv.ts +1 -1
- package/scripts/backlog/backlog-drive-owner.ts +1 -1
- package/scripts/backlog/backlog-drive-restore.ts +1 -1
- package/scripts/backlog/backlog-drive-retrospective.ts +1 -1
- package/scripts/backlog/backlog-drive.ts +1 -1
- package/scripts/backlog/backlog-next.ts +16 -5
- package/scripts/backlog/backlog-offer-cli.ts +6 -6
- package/scripts/backlog/backlog-offer.ts +1 -1
- package/scripts/backlog/backlog-plan-cli.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +57 -11
- package/scripts/backlog/backlog-ready.ts +1 -1
- package/scripts/backlog/backlog-scope.ts +1 -1
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +3 -1
- package/scripts/build/build-commands.ts +66 -0
- package/scripts/build/build-hooks.ts +2 -1
- package/scripts/build/build-library.ts +12 -3
- package/scripts/build/build.ts +70 -0
- package/scripts/build/local-bin.ts +3 -13
- package/scripts/delegation/investigation-reads.ts +3 -1
- package/scripts/discovery/repo-origin.ts +5 -5
- package/scripts/doctor/doctor-consumer.ts +2 -2
- package/scripts/doctor/doctor-io.ts +2 -3
- package/scripts/document/capped-print-part.ts +30 -0
- package/scripts/document/capped-print.ts +3 -4
- package/scripts/document/document-byte-budget.ts +11 -2
- package/scripts/document/document-scan.ts +117 -0
- package/scripts/document/document-section.ts +143 -16
- package/scripts/document/entry-read-budget.ts +5 -3
- package/scripts/document/entry-read-set.ts +10 -89
- package/scripts/document/read-set-cost.ts +98 -0
- package/scripts/epic/epic-add-body.ts +1 -0
- package/scripts/epic/epic-audit-checks.ts +1 -1
- package/scripts/epic/epic-audit-rationale.ts +4 -3
- package/scripts/epic/epic-bundle-cli.ts +14 -3
- package/scripts/epic/epic-bundle-poll.ts +41 -0
- package/scripts/epic/epic-busy.ts +1 -1
- package/scripts/epic/epic-candidate-confirm.ts +3 -2
- package/scripts/epic/epic-classify.ts +1 -1
- package/scripts/epic/epic-cli-argv.ts +78 -46
- package/scripts/epic/epic-cli-remove.ts +11 -19
- package/scripts/epic/epic-cli.ts +74 -73
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +1 -1
- package/scripts/epic/epic-cross-repo.ts +5 -5
- package/scripts/epic/epic-graph.ts +1 -1
- package/scripts/epic/epic-index.ts +1 -1
- package/scripts/epic/epic-issue.ts +2 -6
- package/scripts/epic/epic-lane-offer.ts +2 -2
- package/scripts/epic/epic-next.ts +29 -42
- package/scripts/epic/epic-solo-stale.ts +1 -1
- package/scripts/epic/epic-triage.ts +8 -4
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/followup/git-followup-finish.ts +2 -2
- package/scripts/followup/git-followup-label.ts +2 -2
- package/scripts/followup/git-followup-merged.ts +2 -2
- package/scripts/followup/git-pr-followup-checks.ts +142 -0
- package/scripts/followup/git-pr-followup.ts +4 -129
- package/scripts/gate/core-budget.ts +69 -1
- package/scripts/gate/gate-plan.ts +47 -7
- package/scripts/gate/gate-skip.ts +38 -7
- package/scripts/gate/hook-gate-reuse.ts +12 -10
- package/scripts/gate/pre-commit-type-check.ts +4 -1
- package/scripts/gate/project-checks.ts +6 -9
- package/scripts/gate/type-check-step.ts +2 -3
- package/scripts/gate/verification-gate.ts +27 -8
- package/scripts/gh/git-gh-api-path.ts +2 -2
- package/scripts/gh/git-gh-issue-rest.ts +3 -3
- package/scripts/gh/git-gh-issue-write.ts +53 -7
- package/scripts/gh/git-gh-pr-read.ts +64 -19
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr.ts +5 -1
- package/scripts/gh/git-pr-ai-review.ts +1 -1
- package/scripts/gh/git-pr-checks-eval.ts +1 -3
- package/scripts/gh/git-pr-checks-parse.ts +1 -1
- package/scripts/gh/git-pr-checks-watch.ts +6 -5
- package/scripts/gh/git-pr-checks.ts +7 -5
- package/scripts/gh/git-pr-coderabbit.ts +1 -1
- package/scripts/gh/git-pr-error.ts +1 -3
- package/scripts/gh/git-pr.ts +9 -13
- package/scripts/gh/github-issue-url.ts +2 -2
- package/scripts/git/constants.ts +2 -6
- package/scripts/git/git-command.ts +20 -218
- package/scripts/git/git-diff-reads.ts +225 -0
- package/scripts/git/git-error.ts +4 -12
- package/scripts/git/git-pre-push-hook.ts +139 -0
- package/scripts/git/git-prompt.ts +2 -6
- package/scripts/git/git-spawn-sync.ts +3 -1
- package/scripts/git/git-spawn.ts +1 -1
- package/scripts/git/git-staging.ts +4 -6
- package/scripts/git/git-status.ts +3 -9
- package/scripts/hooks/codex-hook-adapter.ts +1 -1
- package/scripts/hooks/edited-cspell.ts +2 -4
- package/scripts/hooks/format-edited-file.ts +3 -12
- package/scripts/hooks/pre-push-unit.ts +31 -9
- package/scripts/hooks/reserved-run.ts +2 -2
- package/scripts/hooks/run-hook.sh +5 -4
- package/scripts/hooks/stop-guard.ts +5 -3
- package/scripts/init/init-actions.ts +0 -5
- package/scripts/init/init-ai-copy.ts +13 -2
- package/scripts/init/init-logic-json-merge.ts +19 -0
- package/scripts/init/init-logic-secretlint.ts +7 -7
- package/scripts/init/init-logic-workspace.ts +41 -2
- package/scripts/init/init-logic.ts +16 -26
- package/scripts/init/init.ts +5 -15
- package/scripts/init/initial-commit.ts +4 -4
- package/scripts/init/kit-development-versions.ts +40 -0
- package/scripts/init/kit-setup-state.ts +2 -2
- package/scripts/init/start-exec.ts +68 -19
- package/scripts/init/start-setup-pr.ts +9 -9
- package/scripts/init/start-steps.ts +6 -10
- package/scripts/issue/defect-rate-cli.ts +1 -1
- package/scripts/issue/git-next-issues.ts +1 -1
- package/scripts/issue/issue-auto-ok.ts +1 -1
- package/scripts/issue/issue-backlinks-cli.ts +2 -2
- package/scripts/issue/issue-backlinks.ts +9 -9
- package/scripts/issue/issue-comment-cli.ts +19 -13
- package/scripts/issue/issue-file-cli.ts +45 -18
- package/scripts/issue/issue-file.ts +24 -1
- package/scripts/issue/issue-scout-closed.ts +1 -1
- package/scripts/issue/issue-state-cli.ts +30 -74
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-command-types.ts +11 -0
- package/scripts/josh/josh-commands-ai.ts +4 -4
- package/scripts/josh/josh-commands-backlog.ts +4 -1
- package/scripts/josh/josh-commands-development.ts +10 -0
- package/scripts/josh/josh-commands-document.ts +1 -0
- package/scripts/josh/josh-commands-lane.ts +22 -0
- package/scripts/josh/josh-commands-maintenance.ts +4 -4
- package/scripts/josh/josh-commands-run.ts +12 -7
- package/scripts/josh/josh-in-process.ts +28 -9
- package/scripts/josh/josh-logic.ts +33 -15
- package/scripts/josh/process-identity.ts +1 -3
- package/scripts/josh/session-language-cli.ts +3 -4
- package/scripts/lane/lane-await.ts +5 -1
- package/scripts/lane/lane-child-invocation.ts +2 -2
- package/scripts/lane/lane-cli.ts +3 -3
- package/scripts/lane/lane-dispatch.ts +14 -10
- package/scripts/lane/lane-environment.ts +5 -1
- package/scripts/lane/lane-handoff.ts +1 -1
- package/scripts/lane/lane-install.ts +2 -13
- package/scripts/lane/lane-launch-cli.ts +15 -1
- package/scripts/lane/lane-ledger.ts +145 -0
- package/scripts/lane/lane-leftover.ts +1 -1
- package/scripts/lane/lane-load.ts +108 -0
- package/scripts/lane/lane-measure-cli.ts +149 -0
- package/scripts/lane/lane-occupancy.ts +3 -0
- package/scripts/lane/lane-reap.ts +1 -3
- package/scripts/lane/lane-relaunch.ts +1 -1
- package/scripts/lane/lane-stats.ts +224 -0
- package/scripts/lane/lane-vacant.ts +36 -0
- package/scripts/lane/openai-lane-ship.ts +2 -2
- package/scripts/lane/openai-lane-supervisor-owner.ts +180 -0
- package/scripts/lane/openai-lane-supervisor.ts +7 -165
- package/scripts/lane/openai-review-broker.ts +2 -4
- package/scripts/lib/ancestor-directories.ts +35 -0
- package/scripts/lib/animation-helpers.ts +2 -2
- package/scripts/lib/buffered-process.ts +3 -7
- package/scripts/lib/cli-flags.ts +71 -1
- package/scripts/lib/spawn-exit.ts +2 -2
- package/scripts/lib/timeouts.ts +35 -2
- package/scripts/lines/line-budget.ts +4 -6
- package/scripts/notify/telegram-test.ts +6 -0
- package/scripts/observations/observation-ledger-line.ts +6 -6
- package/scripts/observations/observation-ledger-migrate.ts +55 -4
- package/scripts/observations/observation-ledger.ts +26 -7
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/propagate/propagate-git.ts +1 -1
- package/scripts/propagate/propagate-publish.ts +2 -2
- package/scripts/propagate/propagate-steps.ts +20 -15
- package/scripts/propagate/propagate.ts +36 -27
- package/scripts/refactor/import-graph.ts +18 -1
- package/scripts/refactor/refactor-lint.ts +4 -4
- package/scripts/repo/repository-labels.ts +2 -2
- package/scripts/repo/required-checks-logic.ts +1 -3
- package/scripts/review/live-evidence.ts +2 -4
- package/scripts/review/review-brief-cli.ts +1 -1
- package/scripts/review/review-finding-ledger.ts +1 -1
- package/scripts/review/review-findings-cli.ts +1 -3
- package/scripts/rules/decision-oracle-batch.ts +128 -0
- package/scripts/rules/decision-oracle-tokens.ts +21 -0
- package/scripts/rules/decision-oracle.ts +8 -120
- package/scripts/rules/delivered-rules.ts +26 -182
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +3 -3
- package/scripts/rules/git-argv.ts +1 -1
- package/scripts/rules/git-force.ts +1 -1
- package/scripts/rules/implementation-cut.ts +2 -2
- package/scripts/rules/index-guard.ts +1 -1
- package/scripts/rules/issue-comments.ts +118 -0
- package/scripts/rules/{issue-fold.ts → issue-fold-rule.ts} +2 -2
- package/scripts/rules/lane-background.ts +2 -2
- package/scripts/rules/lane-park.ts +18 -0
- package/scripts/rules/lane-split-park.ts +128 -0
- package/scripts/rules/oracle-firing.ts +1 -1
- package/scripts/rules/poll-loop.ts +1 -1
- package/scripts/rules/pre-gate-cut.ts +1 -1
- package/scripts/rules/protected-files.ts +59 -4
- package/scripts/rules/{run-tail.ts → run-tail-rule.ts} +2 -2
- package/scripts/rules/shell-body-trigger.ts +1 -1
- package/scripts/rules/stop-rules.ts +18 -7
- package/scripts/rules/test-declared-commit.ts +4 -4
- package/scripts/rules/wip-cap.ts +63 -0
- package/scripts/run/{run-carry-args.ts → carry/run-carry-args.ts} +37 -13
- package/scripts/run/{run-carry-change.ts → carry/run-carry-change.ts} +29 -7
- package/scripts/run/{run-carry-cli.ts → carry/run-carry-cli.ts} +4 -6
- package/scripts/run/{run-carry.ts → carry/run-carry.ts} +1 -1
- package/scripts/run/{run-cut-args.ts → cut/run-cut-args.ts} +1 -1
- package/scripts/run/{run-cut-cli.ts → cut/run-cut-cli.ts} +2 -2
- package/scripts/run/{run-cut.ts → cut/run-cut.ts} +1 -1
- package/scripts/run/{run-entry-cli.ts → entry/run-entry-cli.ts} +11 -11
- package/scripts/run/{run-entry.ts → entry/run-entry.ts} +2 -2
- package/scripts/run/{run-event-scope.ts → event/run-event-scope.ts} +1 -1
- package/scripts/run/{run-event-stream-emit.ts → event/run-event-stream-emit.ts} +1 -1
- package/scripts/run/{run-event-stream.ts → event/run-event-stream.ts} +16 -2
- package/scripts/run/{run-hold-cli.ts → hold/run-hold-cli.ts} +5 -5
- package/scripts/run/{run-merge-cli.ts → merge/run-merge-cli.ts} +10 -5
- package/scripts/run/{run-merge-steps.ts → merge/run-merge-steps.ts} +53 -5
- package/scripts/run/{run-merge.ts → merge/run-merge.ts} +1 -1
- package/scripts/run/{run-progress-cli.ts → progress/run-progress-cli.ts} +1 -1
- package/scripts/run/{run-progress-config.ts → progress/run-progress-config.ts} +2 -17
- package/scripts/run/{run-progress-read.ts → progress/run-progress-read.ts} +5 -5
- package/scripts/run/{run-progress.ts → progress/run-progress.ts} +1 -1
- package/scripts/run/{run-review-steps.ts → review/run-review-steps.ts} +2 -3
- package/scripts/run/run-ending.ts +2 -2
- package/scripts/run/run-halfrun-resume.ts +6 -1
- package/scripts/run/run-headless.ts +1 -1
- package/scripts/run/run-invocation.ts +85 -84
- package/scripts/run/run-liveness.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +1 -1
- package/scripts/run/run-preflight.ts +6 -6
- package/scripts/run/run-prep-cli.ts +1 -1
- package/scripts/run/run-prrun-resume.ts +1 -1
- package/scripts/run/run-report-cli.ts +4 -4
- package/scripts/run/run-report.ts +2 -2
- package/scripts/run/run-status-cli.ts +1 -1
- package/scripts/run/run-step-cli.ts +3 -3
- package/scripts/run/run-step.ts +2 -2
- package/scripts/run/run-stop-notify.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +4 -4
- package/scripts/run/run-stranded.ts +2 -2
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +5 -3
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/run/{run-ship-cli.ts → ship/run-ship-cli.ts} +2 -2
- package/scripts/run/{run-ship-detach.ts → ship/run-ship-detach.ts} +3 -3
- package/scripts/run/ship/run-ship-lock.ts +50 -0
- package/scripts/run/{run-ship-preflight.ts → ship/run-ship-preflight.ts} +6 -2
- package/scripts/run/{run-ship-probe.ts → ship/run-ship-probe.ts} +2 -2
- package/scripts/run/{run-ship-return.ts → ship/run-ship-return.ts} +4 -3
- package/scripts/run/{run-ship-review-steps.ts → ship/run-ship-review-steps.ts} +3 -3
- package/scripts/run/{run-ship-scoped.ts → ship/run-ship-scoped.ts} +10 -1
- package/scripts/run/{run-ship-steps.ts → ship/run-ship-steps.ts} +11 -12
- package/scripts/run/ship/run-ship-stop-text.ts +13 -0
- package/scripts/run/{run-ship-sync.ts → ship/run-ship-sync.ts} +25 -11
- package/scripts/run/{run-tidy-lanes.ts → tidy/run-tidy-lanes.ts} +1 -1
- package/scripts/run/{run-wake-cli.ts → wake/run-wake-cli.ts} +23 -8
- package/scripts/run/{run-wake-describe.ts → wake/run-wake-describe.ts} +3 -3
- package/scripts/run/{run-wake-driver.ts → wake/run-wake-driver.ts} +59 -8
- package/scripts/run/{run-wake-handoff.ts → wake/run-wake-handoff.ts} +1 -1
- package/scripts/run/{run-wake-loop.ts → wake/run-wake-loop.ts} +8 -2
- package/scripts/run/wake/run-wake-restart.ts +58 -0
- package/scripts/run/{run-wake-session.ts → wake/run-wake-session.ts} +3 -3
- package/scripts/run/{run-wake.ts → wake/run-wake.ts} +1 -1
- package/scripts/safe-chain/preinstall-command.ts +20 -21
- package/scripts/safe-chain/project-config.ts +19 -15
- package/scripts/sync/sync-ai-files.ts +1 -1
- package/scripts/sync/sync-configs.ts +2 -1
- package/scripts/sync/sync.ts +15 -2
- package/scripts/test/unit-worker-share.ts +1 -0
- package/scripts/time-runtime/time-background.ts +5 -1
- package/scripts/time-runtime/time-instant.ts +3 -1
- package/scripts/time-runtime/time-spans.ts +6 -139
- package/scripts/time-runtime/time-tool-call.ts +160 -0
- package/scripts/version/effective-upstream.ts +2 -20
- package/scripts/version/latest-corepack.ts +17 -17
- package/scripts/version/latest-regression.ts +1 -1
- package/scripts/version/latest-update.ts +4 -4
- package/scripts/version/npm-registry.ts +20 -5
- package/scripts/version/publishable-range-check.ts +2 -2
- package/scripts/version/publishable-range.ts +1 -1
- package/scripts/version/release-age.ts +48 -38
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +40 -0
- package/scripts/version/upgrade-shell-command.ts +48 -8
- package/scripts/version/version-check-logic.ts +23 -14
- package/scripts/version/version-commands.ts +23 -11
- package/scripts/version/version-remote.ts +28 -13
- package/templates/pnpm-workspace.basic.yaml +4 -0
- package/templates/workflows/dependabot-auto-merge.yml +5 -5
- package/templates/workflows/github-release.yml +2 -0
- package/scripts/build/build-config-merge.ts +0 -27
- package/scripts/build/build-managed-marker.ts +0 -27
- package/scripts/build/build-self-sync-guard.ts +0 -27
- package/scripts/build/build-version.ts +0 -26
- package/scripts/version/preinstall-version-update.ts +0 -86
- /package/scripts/git/{schemas.ts → git-schemas.ts} +0 -0
- /package/scripts/overrides/{schemas.ts → overrides-schemas.ts} +0 -0
- /package/scripts/run/{run-carry-conversation.ts → carry/run-carry-conversation.ts} +0 -0
- /package/scripts/run/{run-carry-reclaim.ts → carry/run-carry-reclaim.ts} +0 -0
- /package/scripts/run/{run-carry-stash.ts → carry/run-carry-stash.ts} +0 -0
- /package/scripts/run/{run-carry-streak.ts → carry/run-carry-streak.ts} +0 -0
- /package/scripts/run/{run-cut-handoff.ts → cut/run-cut-handoff.ts} +0 -0
- /package/scripts/run/{run-cut-report.ts → cut/run-cut-report.ts} +0 -0
- /package/scripts/run/{run-entry-stop.ts → entry/run-entry-stop.ts} +0 -0
- /package/scripts/run/{run-event-cli.ts → event/run-event-cli.ts} +0 -0
- /package/scripts/run/{run-event-follow.ts → event/run-event-follow.ts} +0 -0
- /package/scripts/run/{run-event-render.ts → event/run-event-render.ts} +0 -0
- /package/scripts/run/{run-event-watch.ts → event/run-event-watch.ts} +0 -0
- /package/scripts/run/{run-hold.ts → hold/run-hold.ts} +0 -0
- /package/scripts/run/{run-progress-args.ts → progress/run-progress-args.ts} +0 -0
- /package/scripts/run/{run-progress-clock.ts → progress/run-progress-clock.ts} +0 -0
- /package/scripts/run/{run-review-cli.ts → review/run-review-cli.ts} +0 -0
- /package/scripts/run/{run-review.ts → review/run-review.ts} +0 -0
- /package/scripts/run/{run-ship-next.ts → ship/run-ship-next.ts} +0 -0
- /package/scripts/run/{run-ship-pre-detach.ts → ship/run-ship-pre-detach.ts} +0 -0
- /package/scripts/run/{run-ship-review.ts → ship/run-ship-review.ts} +0 -0
- /package/scripts/run/{run-ship-stage.ts → ship/run-ship-stage.ts} +0 -0
- /package/scripts/run/{run-ship.ts → ship/run-ship.ts} +0 -0
- /package/scripts/run/{run-tidy-cli.ts → tidy/run-tidy-cli.ts} +0 -0
- /package/scripts/run/{run-tidy-stashes.ts → tidy/run-tidy-stashes.ts} +0 -0
- /package/scripts/run/{run-tidy.ts → tidy/run-tidy.ts} +0 -0
package/.cursorrules
CHANGED
|
@@ -1,45 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
# Agent Instructions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> **All rules for this repository live in [`CLAUDE.md`](./CLAUDE.md). Read it in full before doing
|
|
4
|
+
> any work here, and follow every rule in it.** This file exists only to point at it.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
**No hooks are configured for Cursor** — apply every hook-delivered rule yourself, per `prompts/collaboration-workflow/principles.md` → "Claude Code 以外のエージェントでの読み替え". Do not copy rules back into this file.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
When asked about Svelte or SvelteKit topics, ALWAYS use this tool at the start of the chat to find relevant sections.
|
|
8
|
+
## Svelte MCP
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Retrieves full documentation content for specific sections. Accepts single or multiple sections.
|
|
13
|
-
After calling the list-sections tool, you MUST analyze the returned documentation sections (especially the use_cases field) and then use the get-documentation tool to fetch ALL documentation sections that are relevant for the user's task.
|
|
14
|
-
|
|
15
|
-
### 3. svelte-autofixer
|
|
16
|
-
|
|
17
|
-
Analyzes Svelte code and returns issues and suggestions.
|
|
18
|
-
You MUST use this tool whenever writing Svelte code before sending it to the user. Keep calling it until no issues or suggestions are returned.
|
|
19
|
-
|
|
20
|
-
### 4. playground-link
|
|
21
|
-
|
|
22
|
-
Generates a Svelte Playground link with the provided code.
|
|
23
|
-
After completing the code, ask the user if they want a playground link. Only call this tool after user confirmation and NEVER if code was written to files in their project.
|
|
24
|
-
|
|
25
|
-
## Code Change Rules
|
|
26
|
-
|
|
27
|
-
Whenever modifying, adding, or deleting any code:
|
|
28
|
-
|
|
29
|
-
1. **Verify the gate**: Run `pnpm josh gate` — lint, type check, spell check and unit tests, run concurrently, with every failing check reported in one pass. Re-run one on its own by copying the command from its output header while fixing — `pnpm josh lint`, `pnpm josh check`, `pnpm josh cspell:dot`, `pnpm josh test:unit` for a project with no application toolkit.
|
|
30
|
-
2. **Verify IDE Feedback**: ALWAYS run the **ReadLints** tool on every modified file (and any file that might be affected) before finishing. Fix all reported errors and warnings. IDE/ReadLints can report issues that terminal `pnpm josh lint` does not (e.g. type resolution for generated or gitignored paths).
|
|
31
|
-
3. **Fix Issues**: If any check fails (terminal or IDE feedback, or ReadLints), fix all reported issues immediately.
|
|
32
|
-
4. **Repeat**: Repeat the checks until **all** pass and **ReadLints shows no errors** for the modified files.
|
|
33
|
-
5. **Completion**: Only finish the task or response after ALL checks pass and ReadLints reports **zero errors** on modified files (warnings only are acceptable only when documented as a known exception, e.g. unused eslint-disable for Paraglide).
|
|
34
|
-
6. **Full test gate (code or E2E-impacting work):** `pnpm josh gate` already covers the spell check and the unit tests; E2E is closed on top of it, and **never by asking the user to run it**. With a pull request open, the CI E2E job is the authority and `pnpm josh followup` refuses to merge while any check is non-passing. With no pull request, run **`pnpm josh test:e2e`** yourself and read what it prints — it exits 0 without running when Playwright or the `*.e2e.{ts,js}` files are absent, and that printed skip is the answer for a project with no E2E suite. **Do not** claim completion using only `pnpm josh test:unit --run` when E2E applies, and **do not** fall back to **`pnpm build`** or **`CI=true`** to get past a Playwright run that will not finish — report that it did not run instead. Run it with `CI` unset so Playwright uses **DEV** (`pnpm run dev`, on the port `playwright.config.ts` resolves from `PORT_SEED`), matching the VS Code Test extension. Details: **Completion gate** in `CLAUDE.md` and `prompts/testing-guide.md` → "Closing the E2E gate without a human run".
|
|
35
|
-
|
|
36
|
-
**Constraint**: Never state "it should pass" without actually having run the commands and confirmed the output. Do not end a task while **errors** exist. Before completing, you MUST run **ReadLints** on every modified file and fix every **error** (not just rely on terminal check/lint). If verification commands fail (e.g., system error), you MUST rely on ReadLints to ensure correctness. If **`pnpm josh test:e2e`** cannot complete in your environment, say so in the completion report and name the E2E result as missing — with a pull request open the CI E2E job is that result, and with no pull request there is none, so the gate is **not** closed. Never switch to build/CI flags to make it finish, and never hand the run to the user instead.
|
|
37
|
-
|
|
38
|
-
## Refactoring Rules
|
|
39
|
-
|
|
40
|
-
- **Prompt Reference**: When performing any refactoring, ALWAYS read and follow the instructions in `prompts/refactoring.md` before starting.
|
|
41
|
-
|
|
42
|
-
## Git Rules
|
|
43
|
-
|
|
44
|
-
- **No Commits**: DO NOT commit changes unless explicitly requested by the user.
|
|
45
|
-
- **Workflow Awareness**: Use `pnpm josh git` when the user asks for git operations.
|
|
10
|
+
For Svelte 5 / SvelteKit work, use the Svelte MCP server: call `list-sections` first, then `get-documentation` for every section whose use_cases match the task, and run `svelte-autofixer` on any Svelte code you write until it reports nothing. Offer `playground-link` only when asked, and never for code written to project files.
|
|
@@ -5,7 +5,7 @@ description: >
|
|
|
5
5
|
|
|
6
6
|
# The one place the Node.js version of kit's workflows is written (joshuafolkken/kit#3084). Every
|
|
7
7
|
# job used to call actions/setup-node with its own `node-version` literal, so a version move had to
|
|
8
|
-
# find all of them. A job that needs a different runtime says so explicitly — `node-
|
|
8
|
+
# find all of them. A job that needs a different runtime says so explicitly — `node-compat` in
|
|
9
9
|
# `ci.yml` passes its own runtime to `.github/actions/setup-pnpm` instead of calling this.
|
|
10
10
|
#
|
|
11
11
|
# Distributed: `josh sync` writes this file into a consumer beside the workflows that call it, the
|
|
@@ -19,9 +19,8 @@ jobs:
|
|
|
19
19
|
ref: ${{ github.event.client_payload.sha }}
|
|
20
20
|
fetch-depth: 2
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
# No Node.js setup: this job installs nothing and reads package.json with jq, which the runner
|
|
23
|
+
# image ships, so a Node.js version step would only add time (joshuafolkken/kit#3326).
|
|
25
24
|
- name: Check if package.json changed
|
|
26
25
|
id: pkg_changed
|
|
27
26
|
run: |
|
|
@@ -37,7 +36,7 @@ jobs:
|
|
|
37
36
|
id: current_version
|
|
38
37
|
if: steps.pkg_changed.outputs.changed == 'true'
|
|
39
38
|
run: |
|
|
40
|
-
VERSION=$(
|
|
39
|
+
VERSION=$(jq -r '.version' package.json)
|
|
41
40
|
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
42
41
|
echo "Current version: $VERSION"
|
|
43
42
|
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -32,19 +32,41 @@ env:
|
|
|
32
32
|
# pnpm version resolution, the store cache, the safe-chain installer pin and the install
|
|
33
33
|
# (joshuafolkken/kit#2982).
|
|
34
34
|
jobs:
|
|
35
|
-
node
|
|
36
|
-
|
|
35
|
+
# Every other job runs on the Node.js version `.github/actions/setup-node` names, while `engines`
|
|
36
|
+
# and the esbuild target accept Node 22 and a consumer may already be on 26. This job builds the
|
|
37
|
+
# package and starts the bundled CLI on both ends of that range, so a syntax or API the oldest
|
|
38
|
+
# supported Node lacks fails here instead of in a consumer (joshuafolkken/kit#3326). The runtime
|
|
39
|
+
# comes from pnpm's `runtime` input, not setup-node, so the one Node.js version stays written once.
|
|
40
|
+
# The oldest entry is the exact `engines` floor, not a bare major that resolves to the newest 22.x;
|
|
41
|
+
# `scripts/ci/ci-yml-pnpm-setup.test.ts` holds it equal to the floor `package.json` declares.
|
|
42
|
+
node-compat:
|
|
43
|
+
name: Node ${{ matrix.node }} build
|
|
44
|
+
strategy:
|
|
45
|
+
fail-fast: false
|
|
46
|
+
matrix:
|
|
47
|
+
node: ['22.19.0', 26]
|
|
37
48
|
runs-on: ubuntu-latest
|
|
38
|
-
timeout-minutes:
|
|
49
|
+
timeout-minutes: 10
|
|
39
50
|
permissions:
|
|
40
51
|
contents: read
|
|
41
52
|
steps:
|
|
42
53
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
43
|
-
|
|
54
|
+
|
|
55
|
+
- name: Setup pnpm and install dependencies
|
|
56
|
+
uses: ./.github/actions/setup-pnpm
|
|
44
57
|
with:
|
|
45
|
-
runtime: node
|
|
46
|
-
|
|
47
|
-
-
|
|
58
|
+
runtime: node@${{ matrix.node }}
|
|
59
|
+
|
|
60
|
+
- name: Verify Node.js version
|
|
61
|
+
env:
|
|
62
|
+
NODE_VERSION: ${{ matrix.node }}
|
|
63
|
+
run: node --version | tee /dev/stderr | grep -qE "^v${NODE_VERSION}(\.|$)" && pnpm --version
|
|
64
|
+
|
|
65
|
+
- name: Build package
|
|
66
|
+
run: pnpm build
|
|
67
|
+
|
|
68
|
+
- name: Run CLI smoke
|
|
69
|
+
run: node dist/josh.js help
|
|
48
70
|
|
|
49
71
|
playwright-image:
|
|
50
72
|
name: Resolve Playwright image
|
|
@@ -519,19 +541,9 @@ jobs:
|
|
|
519
541
|
packages: read
|
|
520
542
|
container: ${{ fromJSON(needs.playwright-image.outputs.container) }}
|
|
521
543
|
timeout-minutes: 10
|
|
522
|
-
#
|
|
523
|
-
#
|
|
524
|
-
#
|
|
525
|
-
# personal offset `playwright.config.ts` resolves the preview port from — is not committed (it
|
|
526
|
-
# lives in a gitignored `.env`) and is not set anywhere in this workflow, so the port resolves
|
|
527
|
-
# to its base on every CI run. That is the invariant, not a constant in `playwright.config.ts`:
|
|
528
|
-
# the port there is seed-derived. The one setting that would move the port and leave this URL
|
|
529
|
-
# behind is an `env` entry for the seed in this file, at workflow or job level. A repository or
|
|
530
|
-
# organization variable would not: it reaches a step only through an explicit `vars.PORT_SEED`
|
|
531
|
-
# expression, and nothing here writes one. For a seeded CI job, derive this URL from
|
|
532
|
-
# `josh port preview` in the same job instead.
|
|
533
|
-
env:
|
|
534
|
-
BETTER_AUTH_URL: http://localhost:4173
|
|
544
|
+
# kit is not a SvelteKit app, so this job carries neither the `.svelte-kit` build cache nor the
|
|
545
|
+
# Better Auth `BETTER_AUTH_URL` pin; both belong to the consumer's copy in
|
|
546
|
+
# `templates/workflows/ci.yml`, which keeps them (joshuafolkken/kit#3326).
|
|
535
547
|
steps:
|
|
536
548
|
- name: Checkout code
|
|
537
549
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
@@ -541,17 +553,6 @@ jobs:
|
|
|
541
553
|
with:
|
|
542
554
|
registry-url: 'https://npm.pkg.github.com'
|
|
543
555
|
|
|
544
|
-
- name: Setup build cache
|
|
545
|
-
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
|
546
|
-
id: build-cache
|
|
547
|
-
with:
|
|
548
|
-
path: |
|
|
549
|
-
.svelte-kit
|
|
550
|
-
key: ${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('svelte.config.js', 'vite.config.ts', 'tsconfig.json', 'src/lib/server/auth.ts') }}
|
|
551
|
-
restore-keys: |
|
|
552
|
-
${{ runner.os }}-build-cache-e2e-${{ hashFiles('pnpm-lock.yaml') }}-
|
|
553
|
-
${{ runner.os }}-build-cache-e2e-
|
|
554
|
-
|
|
555
556
|
- name: Setup pnpm and install dependencies
|
|
556
557
|
uses: ./.github/actions/setup-pnpm
|
|
557
558
|
with:
|
|
@@ -11,18 +11,24 @@ concurrency:
|
|
|
11
11
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
12
|
cancel-in-progress: true
|
|
13
13
|
|
|
14
|
-
permissions:
|
|
15
|
-
contents: write
|
|
16
|
-
pull-requests: write
|
|
17
|
-
|
|
18
14
|
jobs:
|
|
15
|
+
# Gated on who opened the pull request rather than on who triggered the run, the same job gate as
|
|
16
|
+
# the distributed copy; arming stays restricted to Dependabot's own events, on the step below. The
|
|
17
|
+
# write rights are granted to this job alone (joshuafolkken/kit#3268).
|
|
19
18
|
auto-merge:
|
|
20
19
|
runs-on: ubuntu-latest
|
|
21
20
|
timeout-minutes: 10
|
|
22
|
-
if: github.
|
|
21
|
+
if: github.event.pull_request.user.login == 'dependabot[bot]'
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
pull-requests: write
|
|
23
25
|
steps:
|
|
26
|
+
# The author gate also runs the job on a maintainer's push to a Dependabot branch, where this
|
|
27
|
+
# action fails because the first commit is no longer Dependabot's. Contained as in the
|
|
28
|
+
# distributed copy: the outputs stay empty, so the arming step below is simply not reached.
|
|
24
29
|
- name: Fetch Dependabot metadata
|
|
25
30
|
id: metadata
|
|
31
|
+
continue-on-error: true
|
|
26
32
|
uses: dependabot/fetch-metadata@25dd0e34f4fe68f24cc83900b1fe3fe149efef98 # v3.1.0
|
|
27
33
|
with:
|
|
28
34
|
github-token: '${{ secrets.GITHUB_TOKEN }}'
|
|
@@ -47,7 +53,8 @@ jobs:
|
|
|
47
53
|
# CI only proves that kit still builds. Major bumps never auto-merge in either ecosystem.
|
|
48
54
|
- name: Enable auto-merge for github-actions patch and minor updates
|
|
49
55
|
if: >-
|
|
50
|
-
|
|
56
|
+
github.actor == 'dependabot[bot]'
|
|
57
|
+
&& steps.metadata.outputs.package-ecosystem == 'github_actions'
|
|
51
58
|
&& (steps.metadata.outputs.update-type == 'version-update:semver-patch'
|
|
52
59
|
|| steps.metadata.outputs.update-type == 'version-update:semver-minor')
|
|
53
60
|
env:
|
|
@@ -12,7 +12,37 @@ on:
|
|
|
12
12
|
# cache is off here: a cache entry another run saved never reaches a job with publish credentials.
|
|
13
13
|
|
|
14
14
|
jobs:
|
|
15
|
+
# The package is built once, here, and both registries receive this one tarball: a job that built
|
|
16
|
+
# its own copy could publish different bytes under the same version (joshuafolkken/kit#3268). The
|
|
17
|
+
# job holds no publish credentials, so the build runs without any.
|
|
18
|
+
pack:
|
|
19
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
timeout-minutes: 10
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
26
|
+
|
|
27
|
+
- uses: ./.github/actions/setup-node
|
|
28
|
+
|
|
29
|
+
- uses: ./.github/actions/setup-pnpm
|
|
30
|
+
with:
|
|
31
|
+
cache: 'false'
|
|
32
|
+
|
|
33
|
+
- run: pnpm pack --out "$RUNNER_TEMP/kit.tgz"
|
|
34
|
+
|
|
35
|
+
# Kept as long as GitHub lets a run be re-run, so re-running a failed publish job still finds
|
|
36
|
+
# the tarball instead of forcing a full re-run that republishes an existing version.
|
|
37
|
+
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
38
|
+
with:
|
|
39
|
+
name: kit-package
|
|
40
|
+
path: ${{ runner.temp }}/kit.tgz
|
|
41
|
+
if-no-files-found: error
|
|
42
|
+
retention-days: 30
|
|
43
|
+
|
|
15
44
|
publish-github:
|
|
45
|
+
needs: pack
|
|
16
46
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
17
47
|
concurrency:
|
|
18
48
|
group: package-publish
|
|
@@ -53,14 +83,22 @@ jobs:
|
|
|
53
83
|
env:
|
|
54
84
|
LATEST: ${{ steps.registry-latest.outputs.latest }}
|
|
55
85
|
|
|
86
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
87
|
+
with:
|
|
88
|
+
name: kit-package
|
|
89
|
+
path: ${{ runner.temp }}
|
|
90
|
+
|
|
56
91
|
# The tag reaches the command through the environment rather than expanded into it, so a step
|
|
57
|
-
# output is never parsed as shell (joshuafolkken/kit#3084).
|
|
58
|
-
|
|
92
|
+
# output is never parsed as shell (joshuafolkken/kit#3084). setup-node's user config carries
|
|
93
|
+
# the GitHub Packages token, so it is kept here.
|
|
94
|
+
- name: Publish to GitHub Packages
|
|
95
|
+
run: cd "$RUNNER_TEMP" && npm publish kit.tgz --tag "$PUBLISH_TAG" --registry https://npm.pkg.github.com
|
|
59
96
|
env:
|
|
60
97
|
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
61
98
|
PUBLISH_TAG: ${{ steps.publish-tag.outputs.tag }}
|
|
62
99
|
|
|
63
100
|
publish-npm:
|
|
101
|
+
needs: pack
|
|
64
102
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
65
103
|
concurrency:
|
|
66
104
|
group: package-publish
|
|
@@ -88,7 +126,10 @@ jobs:
|
|
|
88
126
|
with:
|
|
89
127
|
cache: 'false'
|
|
90
128
|
|
|
91
|
-
-
|
|
129
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
130
|
+
with:
|
|
131
|
+
name: kit-package
|
|
132
|
+
path: ${{ runner.temp }}
|
|
92
133
|
|
|
93
134
|
- name: Select npm tag
|
|
94
135
|
id: publish-tag
|
|
@@ -115,6 +156,9 @@ jobs:
|
|
|
115
156
|
create-release:
|
|
116
157
|
needs: [publish-github, publish-npm, update-production]
|
|
117
158
|
runs-on: ubuntu-latest
|
|
159
|
+
# `josh release:github` waits up to 60 minutes (120 polls, 30 seconds apart) for lower tags'
|
|
160
|
+
# releases, which can sit queued behind `package-publish`; the extra 5 minutes cover the setup
|
|
161
|
+
# before it. Lower this only together with that wait budget.
|
|
118
162
|
timeout-minutes: 65
|
|
119
163
|
permissions:
|
|
120
164
|
actions: read
|
|
@@ -138,4 +182,4 @@ jobs:
|
|
|
138
182
|
RELEASE_TAG: ${{ github.ref_name }}
|
|
139
183
|
RELEASE_START_TAG: v1.887.0
|
|
140
184
|
RELEASE_WORKFLOW: publish.yml
|
|
141
|
-
RELEASE_JOBS: publish-github,publish-npm,update-production
|
|
185
|
+
RELEASE_JOBS: pack,publish-github,publish-npm,update-production
|
|
@@ -3,7 +3,10 @@ on:
|
|
|
3
3
|
push:
|
|
4
4
|
branches:
|
|
5
5
|
- main
|
|
6
|
+
# Limited to main like ci.yml: a pull request into another branch is never merged to main as is,
|
|
7
|
+
# so its scan would spend a run and SonarCloud analysis on code that does not ship.
|
|
6
8
|
pull_request:
|
|
9
|
+
branches: [main]
|
|
7
10
|
types: [opened, synchronize, reopened]
|
|
8
11
|
# A push run is grouped by the commit it carries, so a later push to main never cancels an earlier
|
|
9
12
|
# one; without the sha every push to main shares one group and the run for the commit that changed
|
package/.pnpmfile.mjs
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
// `josh init` / `josh sync` copy this file into every project that publishes (joshuafolkken/kit#3110)
|
|
3
3
|
// and overwrite it while this first line stays; edit it in kit, not here.
|
|
4
4
|
// Strips the Safe Chain `preinstall` from the packed manifest only (joshuafolkken/kit#2693).
|
|
5
|
-
// kit writes it to
|
|
6
|
-
// a build script every consumer's pnpm refuses to run
|
|
7
|
-
// anyway — their install has already started by the time
|
|
5
|
+
// kit writes it to warn the repository's own development installs when Safe Chain is not active
|
|
6
|
+
// (joshuafolkken/kit#3269); shipped, it becomes a build script every consumer's pnpm refuses to run
|
|
7
|
+
// unapproved, and it could not protect them anyway — their install has already started by the time
|
|
8
|
+
// a dependency's `preinstall` runs. The
|
|
8
9
|
// repository's package.json keeps it; `pnpm pack` and `pnpm publish` call this hook on the copy they
|
|
9
10
|
// write. Any other lifecycle script — a native build, a binary download — is the package's own and
|
|
10
11
|
// ships untouched.
|
package/.prettierignore
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
# Claude Code
|
|
2
|
-
.claude
|
|
1
|
+
# Claude Code — local runtime state stays out; the distributed parts are formatted like any source
|
|
2
|
+
.claude/*
|
|
3
|
+
!.claude/settings.json
|
|
4
|
+
!.claude/skills/
|
|
5
|
+
!.claude/agents/
|
|
6
|
+
!.claude/.claude-plugin/
|
|
7
|
+
# Prettier pads every Markdown table column, which grows the skills past their byte budgets (joshuafolkken/kit#3325)
|
|
8
|
+
.claude/**/*.md
|
|
3
9
|
|
|
4
10
|
# Package Managers
|
|
5
11
|
package-lock.json
|
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Claude Code Instructions
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> The entry point for every agent rule — `AGENTS.md`, `GEMINI.md` and `.cursorrules` point here; each rule has a single source (`prompts/collaboration-workflow/residency.md`).
|
|
4
4
|
|
|
5
5
|
## Project
|
|
6
6
|
|
|
@@ -10,29 +10,29 @@ Stack: TypeScript · pnpm · SvelteKit · Vitest · Playwright · TailwindCSS ·
|
|
|
10
10
|
|
|
11
11
|
- **Answer opinion-seeking questions from a neutral standpoint.** A leading question is not a cue to agree — recommend the option you genuinely judge best.
|
|
12
12
|
- **Fix root causes, not symptoms.** Where the proper fix is out of scope, surface the root cause instead of papering over it.
|
|
13
|
-
- **Cross-package problems → file the upstream Issue, then stop.** A defect in another package (a dependency, or `josh` / kit tooling) is never worked around locally — **weakening a verification gate is a workaround too**. File it (first-party Tier A, third-party Tier C) and stop. `prompts/collaboration-workflow/upstream-interrupt.md`.
|
|
13
|
+
- **Cross-package problems → file the upstream Issue, then stop.** A defect in another package (a dependency, or `josh` / kit tooling) is never worked around locally — **weakening a verification gate is a workaround too**. File it (first-party Tier A, third-party Tier C) and stop. `prompts/collaboration-workflow/upstream-interrupt.md`. Your own repository's run tooling is not another package: `upstream-interrupt.md` → "実行中のリポジトリ自身のラン機構の不具合".
|
|
14
14
|
- **Third-party repositories are Tier C.** Decide the party with `pnpm josh repo:party`; every write to a tracker we do not own needs explicit current-turn instruction. `prompts/collaboration-workflow/upstream-interrupt.md`.
|
|
15
|
-
- **No clones — single-source, even across package boundaries.** Duplicate non-trivial logic only after presenting the alternative and getting explicit approval. `prompts/collaboration-workflow/principles.md` → "
|
|
16
|
-
- **Design for elegance and simplicity first.** Before adding a hook, guard, rule or abstraction, ask whether fixing the cause makes it unnecessary. `prompts/collaboration-workflow/principles.md` → "
|
|
17
|
-
- **Distinguish consultation from execution.** A question or goal statement asks for analysis only — act on an explicit imperative or a workflow keyword. `prompts/collaboration-workflow/principles.md` → "
|
|
18
|
-
- **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config (`josh sync` overwrites them); in kit you are the source. `prompts/collaboration-workflow/principles.md` → "
|
|
19
|
-
- **Latest-first, fix forward — pin back only as a last resort.** `prompts/collaboration-workflow/principles.md` → "
|
|
15
|
+
- **No clones — single-source, even across package boundaries.** Duplicate non-trivial logic only after presenting the alternative and getting explicit approval. `prompts/collaboration-workflow/principles.md` → "no-clones".
|
|
16
|
+
- **Design for elegance and simplicity first.** Before adding a hook, guard, rule or abstraction, ask whether fixing the cause makes it unnecessary. `prompts/collaboration-workflow/principles.md` → "elegant-design".
|
|
17
|
+
- **Distinguish consultation from execution.** A question or goal statement asks for analysis only — act on an explicit imperative or a workflow keyword. `prompts/collaboration-workflow/principles.md` → "consult-vs-execute".
|
|
18
|
+
- **Route distributed-doc / config changes upstream to kit.** In a consumer repo never edit kit-distributed docs/config (`josh sync` overwrites them); in kit you are the source. `prompts/collaboration-workflow/principles.md` → "upstream-to-kit".
|
|
19
|
+
- **Latest-first, fix forward — pin back only as a last resort.** `prompts/collaboration-workflow/principles.md` → "latest-first".
|
|
20
20
|
- **Output language follows `JOSH_SESSION_LANG`** (default `ja`) for session output and artifact prose; English for Issue/PR titles, code comments, test titles, commit messages and script strings. `prompts/collaboration-workflow/overview.md`.
|
|
21
21
|
- **Cite an Issue with a number-link and a short title in the session language.** `prompts/collaboration-workflow/issue-citation.md`.
|
|
22
|
-
- **Durable rules belong in prompts/docs, not local MEMORY.** `prompts/collaboration-workflow/principles.md` → "
|
|
22
|
+
- **Durable rules belong in prompts/docs, not local MEMORY.** `prompts/collaboration-workflow/principles.md` → "durable-rules".
|
|
23
23
|
- **Never carry a file's new text inside a shell command.** Use the Edit tool, not a heredoc. `prompts/collaboration-workflow/file-edits.md`.
|
|
24
24
|
- **Never put a body in shell double quotes** — a backtick or `$` there is _executed_; pass the body by path. `prompts/collaboration-workflow/shell-body.md`.
|
|
25
25
|
- **Put every call that does not depend on another's result in the same turn.** **The criterion is whether this call's input needs another call's result, not what kind of call it is** — edits are covered exactly as reads are. `pnpm josh batch:guard` enforces it; `prompts/collaboration-workflow/rule-delivery.md`.
|
|
26
26
|
|
|
27
|
-
### Decision autonomy
|
|
27
|
+
### Decision autonomy
|
|
28
28
|
|
|
29
|
-
Classify each decision point and act; stop **only**
|
|
29
|
+
Classify each decision point and act; stop **only** where the user's judgment is genuinely needed. `prompts/collaboration-workflow/operating-rules.md` → "decision-autonomy".
|
|
30
30
|
|
|
31
31
|
- **Tier A — reversible implementation / design choices** (library, naming, layout, tests, refactor shape; placing a filed Issue into an epic; self-correction). Pick the clearly-better option, proceed, log it.
|
|
32
32
|
- **Tier B — genuine toss-up.** The only tier that stops — ask with the candidates and trade-offs.
|
|
33
33
|
- **Tier C — irreversible / shared-state / out-of-scope actions** (merge, branch delete, force push, destructive ops, repo settings, out-of-scope work, `devEngines` / overrides edits): explicit user instruction only, never auto-decided. Deleting a git-tracked file is reversible, so it is not a destructive op — inspect the target first and surface any contradiction.
|
|
34
34
|
|
|
35
|
-
Log auto-decisions: an Issue comment
|
|
35
|
+
Log auto-decisions: an Issue comment in an Issue workflow, else a one-line "Auto-decided: `<choice>` over `<alt>` because `<reason>`" in the reply.
|
|
36
36
|
|
|
37
37
|
## Environment Variables
|
|
38
38
|
|
|
@@ -40,7 +40,7 @@ Log auto-decisions: an Issue comment inside an Issue workflow, otherwise a one-l
|
|
|
40
40
|
|
|
41
41
|
## Critical Conventions (non-standard — always apply)
|
|
42
42
|
|
|
43
|
-
Most are lint-enforced
|
|
43
|
+
Most are lint-enforced. Craft guidance: `prompts/coding-standards.md`.
|
|
44
44
|
|
|
45
45
|
### Naming
|
|
46
46
|
|
|
@@ -69,7 +69,7 @@ Svelte `PascalCase.svelte(.ts)` · TypeScript `kebab-case.ts` · tests `*.test.t
|
|
|
69
69
|
|
|
70
70
|
- Effective overrides live in `pnpm-workspace.yaml`; check both files.
|
|
71
71
|
- **NEVER** remove or modify entries in **either** location without explicit user approval.
|
|
72
|
-
- **NEVER** modify the `devEngines` field in `package.json` without explicit user confirmation.
|
|
72
|
+
- **NEVER** modify the `devEngines` field in `package.json` without explicit user confirmation — except the `josh latest` lockstep pnpm bump, kept per the `dependency-update` skill.
|
|
73
73
|
- After any dependency-update command, load the `dependency-update` skill before reporting anything about the pins.
|
|
74
74
|
|
|
75
75
|
## Package-First Development
|
|
@@ -78,7 +78,7 @@ Before building a feature, check for a well-maintained package — measure with
|
|
|
78
78
|
|
|
79
79
|
## Code Change Rules
|
|
80
80
|
|
|
81
|
-
0. **Work summary + test declaration** — before writing any implementation code, once per Issue (required in fullrun/halfrun/backlogrun; `kickoff` exempt), never wrapped in a code fence, never a confirmation stop. `prompts/collaboration-workflow/report-format.md`; `pnpm josh report:lint`.
|
|
81
|
+
0. **Work summary + test declaration** — before writing any implementation code, once per Issue (required in fullrun/halfrun/prrun/backlogrun; `kickoff` exempt), never wrapped in a code fence, never a confirmation stop. `prompts/collaboration-workflow/report-format.md`; `pnpm josh report:lint`.
|
|
82
82
|
- **Overview** — **Now / Change / Check**, one sentence each in the session language that a non-programmer can follow; name the concrete subject in each line — subject-less prose is not acceptable. Use no file paths, function or type names, or CLI option flags — only internal identifiers are banned.
|
|
83
83
|
- **Details** — every change with its test: `<what changes> — Test: <Unit|E2E> — <file path> — <what it verifies>`. Completion reports lead with **Cause / Fix / Result**.
|
|
84
84
|
- **Tests are required for ALL changes** — zero tests without explicit approval is a violation. Exceptions (non-runtime and basic-profile manual checks): `prompts/testing-guide.md`. `pnpm josh test:declared` answers from the changed paths; a runtime change with no test is refused at `pnpm josh git -y` on `required`.
|
|
@@ -103,18 +103,18 @@ When `josh bump` changes the version, update `docs/` for any changed behavior be
|
|
|
103
103
|
## Git Rules
|
|
104
104
|
|
|
105
105
|
- **No commits** unless explicitly requested. **No merges, branch deletions, force pushes or other shared-state mutations** unless requested in the current turn — except invoking `fullrun` or `backlogrun` authorizes the merge via `pnpm josh followup`; `prrun` does not. `.claude/settings.json` denies these, but the deny is narrower than the rule — never read "the tool let me" as permission.
|
|
106
|
-
- **Never stage or mutate the git index on your own** — only on explicit instruction or via `pnpm josh git`. `prompts/collaboration-workflow/operating-rules.md` → "
|
|
106
|
+
- **Never stage or mutate the git index on your own** — only on explicit instruction or via `pnpm josh git`. `prompts/collaboration-workflow/operating-rules.md` → "no-self-staging".
|
|
107
107
|
- **Use `pnpm josh git`; open a PR with `pnpm josh pr`** — `pnpm josh rule:guard` refuses a direct `gh pr create`.
|
|
108
108
|
- **Run `git status` (and `git stash list`) live** before acting on any tree assumption.
|
|
109
109
|
|
|
110
110
|
## Collaboration Workflow
|
|
111
111
|
|
|
112
|
-
- The issue-driven flow: `prompts/collaboration-workflow.md
|
|
113
|
-
- **File through `pnpm josh issue:file
|
|
112
|
+
- The issue-driven flow: `prompts/collaboration-workflow.md`; where a new rule goes: `prompts/collaboration-workflow/residency.md` (computable answers → `pnpm josh oracle:list`, ordering → `pnpm josh run:step`).
|
|
113
|
+
- **File through `pnpm josh issue:file`, never a hand count; above the WIP cap, close one first.** Exempt: a filing the run is blocked by, and an **interrupt** — a verification answers wrongly, a documented workflow cannot complete, or data is lost or written outside the repository; both proceed, stating the overage, and anything else stays discretionary. `pnpm josh rule:guard` states the rest at the call that files. `prompts/collaboration-workflow/wip-cap.md`.
|
|
114
114
|
|
|
115
115
|
### Shorthand Commands
|
|
116
116
|
|
|
117
|
-
`kickoff`, `fullrun`, `prrun`, `halfrun`, `backlogrun` (with `#N` / `new`) are procedures in the `workflow-commands` skill — read it before any part of a command, including the first `gh` call.
|
|
117
|
+
`kickoff`, `fullrun`, `prrun`, `halfrun`, `backlogrun` (with `#N` / `new`) are procedures in the `workflow-commands` skill — read it before any part of a command, including the first `gh` call.
|
|
118
118
|
|
|
119
119
|
**`queue` and `epicrun` were removed** — point `queue` to `backlogrun #N1 #N2 …` and `epicrun` to `backlogrun #E --only`.
|
|
120
120
|
|
|
@@ -135,5 +135,3 @@ Before pausing **any** run for the user — a command's stop, an upstream-Issue
|
|
|
135
135
|
```bash
|
|
136
136
|
pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'<one-line reason>\n<what is needed from the user>'
|
|
137
137
|
```
|
|
138
|
-
|
|
139
|
-
Keep `--body=...` one token when the body starts with `-`, otherwise `parseArgs` rejects it.
|
package/README.md
CHANGED
|
@@ -12,32 +12,39 @@
|
|
|
12
12
|
[](https://github.com/joshuafolkken/kit/actions/workflows/ci.yml)
|
|
13
13
|
[](https://sonarcloud.io/summary/new_code?id=joshuafolkken_kit)
|
|
14
14
|
|
|
15
|
-
**
|
|
15
|
+
**AI assistant setup, plus an optional GitHub workflow.**
|
|
16
16
|
|
|
17
|
-
kit gives Claude Code or Codex
|
|
17
|
+
kit gives Claude Code or Codex your project's rules and checks. With the workflow, the agent takes each change from Issue to merged PR.
|
|
18
|
+
|
|
19
|
+
**Only want the AI assistant, without the GitHub workflow?** Set it up here: [Node projects](./docs/setup/full.md#2-install-and-initialize-with-josh-init) · [Other projects](./docs/setup/basic.md)
|
|
18
20
|
|
|
19
21
|
## Sound familiar?
|
|
20
22
|
|
|
21
23
|
Each pain links to how it is solved — or read [the whole story](./docs/why.md).
|
|
22
24
|
|
|
25
|
+
kit solves these in every project — and so do [app-kit] and [game-kit], which build on it:
|
|
26
|
+
|
|
27
|
+
- [Done doesn't mean done](./docs/why.md#done-doesnt-mean-done)
|
|
28
|
+
- [Quality slips with every change](./docs/why.md#quality-slips-with-every-change)
|
|
29
|
+
- [I keep repeating the same instructions](./docs/why.md#i-keep-repeating-the-same-instructions)
|
|
30
|
+
- [The agent does things I never asked for](./docs/why.md#the-agent-does-things-i-never-asked-for)
|
|
31
|
+
- [Reviewing every change is a chore](./docs/why.md#reviewing-every-change-is-a-chore)
|
|
32
|
+
- [Some changes need a human eye](./docs/why.md#some-changes-need-a-human-eye)
|
|
33
|
+
- [I spend all day talking to the agent](./docs/why.md#i-spend-all-day-talking-to-the-agent)
|
|
34
|
+
- [Big requests come back sloppy](./docs/why.md#big-requests-come-back-sloppy)
|
|
35
|
+
- [I want many Issues solved at once](./docs/why.md#i-want-many-issues-solved-at-once)
|
|
36
|
+
- [AI costs keep climbing](./docs/why.md#ai-costs-keep-climbing)
|
|
37
|
+
- [Writing Issues is a chore](./docs/why.md#writing-issues-is-a-chore)
|
|
38
|
+
- [Wiring AI up to GitHub is a chore](./docs/why.md#wiring-ai-up-to-github-is-a-chore)
|
|
39
|
+
- [I can't tell if the agent is stuck or done](./docs/why.md#i-cant-tell-if-the-agent-is-stuck-or-done)
|
|
40
|
+
- [One task overwrote another's work](./docs/why.md#one-task-overwrote-anothers-work)
|
|
41
|
+
- [A session cut off and I lost track](./docs/why.md#a-session-cut-off-and-i-lost-track)
|
|
42
|
+
- [The backlog fills with duplicate Issues](./docs/why.md#the-backlog-fills-with-duplicate-issues)
|
|
43
|
+
|
|
44
|
+
The app and game kits add:
|
|
45
|
+
|
|
23
46
|
| Your pain | kit | [app-kit] | [game-kit] |
|
|
24
47
|
| -------------------------------------------------------------------------------------------------------------------------- | :-: | :-------: | :--------: |
|
|
25
|
-
| [Done doesn't mean done](./docs/why.md#done-doesnt-mean-done) | ✅ | ✅ | ✅ |
|
|
26
|
-
| [Quality slips with every change](./docs/why.md#quality-slips-with-every-change) | ✅ | ✅ | ✅ |
|
|
27
|
-
| [I keep repeating the same instructions](./docs/why.md#i-keep-repeating-the-same-instructions) | ✅ | ✅ | ✅ |
|
|
28
|
-
| [The agent does things I never asked for](./docs/why.md#the-agent-does-things-i-never-asked-for) | ✅ | ✅ | ✅ |
|
|
29
|
-
| [Reviewing every change is a chore](./docs/why.md#reviewing-every-change-is-a-chore) | ✅ | ✅ | ✅ |
|
|
30
|
-
| [Some changes need a human eye](./docs/why.md#some-changes-need-a-human-eye) | ✅ | ✅ | ✅ |
|
|
31
|
-
| [I spend all day talking to the agent](./docs/why.md#i-spend-all-day-talking-to-the-agent) | ✅ | ✅ | ✅ |
|
|
32
|
-
| [Big requests come back sloppy](./docs/why.md#big-requests-come-back-sloppy) | ✅ | ✅ | ✅ |
|
|
33
|
-
| [I want many Issues solved at once](./docs/why.md#i-want-many-issues-solved-at-once) | ✅ | ✅ | ✅ |
|
|
34
|
-
| [AI costs keep climbing](./docs/why.md#ai-costs-keep-climbing) | ✅ | ✅ | ✅ |
|
|
35
|
-
| [Writing Issues is a chore](./docs/why.md#writing-issues-is-a-chore) | ✅ | ✅ | ✅ |
|
|
36
|
-
| [Wiring AI up to GitHub is a chore](./docs/why.md#wiring-ai-up-to-github-is-a-chore) | ✅ | ✅ | ✅ |
|
|
37
|
-
| [I can't tell if the agent is stuck or done](./docs/why.md#i-cant-tell-if-the-agent-is-stuck-or-done) | ✅ | ✅ | ✅ |
|
|
38
|
-
| [One task overwrote another's work](./docs/why.md#one-task-overwrote-anothers-work) | ✅ | ✅ | ✅ |
|
|
39
|
-
| [A session cut off and I lost track](./docs/why.md#a-session-cut-off-and-i-lost-track) | ✅ | ✅ | ✅ |
|
|
40
|
-
| [The backlog fills with duplicate Issues](./docs/why.md#the-backlog-fills-with-duplicate-issues) | ✅ | ✅ | ✅ |
|
|
41
48
|
| [Setting up SvelteKit on Cloudflare takes a day](https://github.com/joshuafolkken/app-kit/blob/main/docs/setup/install.md) | — | ✅ | ✅ |
|
|
42
49
|
| [I'm not sure the app is secure](https://github.com/joshuafolkken/app-kit/blob/main/docs/security-headers.md) | — | ✅ | ✅ |
|
|
43
50
|
| [Nobody looked at the screen](https://github.com/joshuafolkken/app-kit/blob/main/docs/shot.md) | — | ✅ | ✅ |
|
|
@@ -80,7 +87,7 @@ Add the two Telegram credentials to `.env` so a run that needs you can reach you
|
|
|
80
87
|
|
|
81
88
|
Then open your agent and follow the [tutorial](./docs/tutorial.md).
|
|
82
89
|
|
|
83
|
-
|
|
90
|
+
AI assistant only, no GitHub workflow? [Node projects](./docs/setup/full.md#2-install-and-initialize-with-josh-init) · [Other projects](./docs/setup/basic.md)
|
|
84
91
|
|
|
85
92
|
## Docs
|
|
86
93
|
|
package/SECURITY.md
CHANGED
|
@@ -29,7 +29,7 @@ The `files` field of `package.json` decides what the published `@joshuafolkken/k
|
|
|
29
29
|
- `.codex/` — the same hooks for Codex (`hooks.json`) and its project settings (`config.toml`).
|
|
30
30
|
- `.github/` — GitHub Actions workflows (CI, tagging, pull request classification, Dependabot auto-merge, SonarQube and production), composite actions, `dependabot.yml`, the pull request template and the release-notes config. `josh sync` overwrites the distributed workflows; their action references are pinned to commit SHAs. kit's own `publish.yml` ships in the package but is never copied into a project.
|
|
31
31
|
- `lefthook/` — Git hook presets: lint before commit, checks before push.
|
|
32
|
-
- The `preinstall` script `josh init` adds to `package.json`
|
|
32
|
+
- The `preinstall` script `josh init` adds to `package.json` is a `node -e` check that fetches nothing and only prints a warning — outside CI, when safe-chain is not scanning the install (see [Installing safe-chain](#installing-safe-chain)). The `prepare` script it adds runs `lefthook install` when Lefthook is present, then, when tsx is present, kit's `fix-gh-packages` script: only when the project `.npmrc` routes a scope to GitHub Packages, it reads a GitHub token (`NODE_AUTH_TOKEN`, a token in the project `.npmrc`, or `gh auth token`), queries GitHub Packages and rewrites tarball URLs in `pnpm-lock.yaml`.
|
|
33
33
|
- `.pnpmfile.mjs` — a pnpm `beforePacking` hook that removes that safe-chain `preinstall` from the manifest `pnpm pack` and `pnpm publish` write, and changes nothing else. `josh init` and `josh sync` copy it only into a project whose `package.json` is not `private: true`, and never over a pnpmfile of the project's own.
|
|
34
34
|
|
|
35
35
|
**Agent instructions and skills**
|
|
@@ -47,6 +47,20 @@ The `files` field of `package.json` decides what the published `@joshuafolkken/k
|
|
|
47
47
|
- `.vscode/`, `.gitattributes`, `.ncurc.json`, `.prettierignore`, `pnpm-workspace.yaml` — editor, Git and package-manager settings.
|
|
48
48
|
- `CODE_OF_CONDUCT.md`, `SECURITY.md` — community files.
|
|
49
49
|
|
|
50
|
+
## Installing safe-chain
|
|
51
|
+
|
|
52
|
+
[safe-chain](https://github.com/AikidoSec/safe-chain) scans a local `pnpm install` for malware once its shell integration is active. The `preinstall` script only warns when it is not; it never installs safe-chain itself. Install it from a release whose installer hash you have checked — the same release and SHA-256 kit's CI uses, pinned as `SAFE_CHAIN_INSTALLER_VERSION` and `SAFE_CHAIN_INSTALLER_SHA256` in [`.github/actions/setup-pnpm/action.yml`](https://github.com/joshuafolkken/kit/blob/main/.github/actions/setup-pnpm/action.yml):
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
version=<SAFE_CHAIN_INSTALLER_VERSION>
|
|
56
|
+
sha256=<SAFE_CHAIN_INSTALLER_SHA256>
|
|
57
|
+
curl --proto '=https' -fsSL "https://github.com/AikidoSec/safe-chain/releases/download/$version/install-safe-chain.sh" -o install-safe-chain.sh
|
|
58
|
+
echo "$sha256 install-safe-chain.sh" | shasum -a 256 -c -
|
|
59
|
+
sh install-safe-chain.sh
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Stop if `shasum` does not print `install-safe-chain.sh: OK`. Then restart your terminal; if the warning still appears, run `safe-chain setup` and restart it again.
|
|
63
|
+
|
|
50
64
|
## Secrets
|
|
51
65
|
|
|
52
66
|
kit never stores a secret in a file it ships or commits. The ones it uses:
|