@workerstack/repo 0.0.0-stage → 0.1.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/CHANGELOG.md +45 -0
- package/LICENSE +21 -0
- package/README.md +0 -3
- package/agents/global-settings/antigravity.json +3 -0
- package/agents/global-settings/claude.json +6 -0
- package/agents/global-settings/codex.toml +2 -0
- package/agents/global-settings/cursor.json +3 -0
- package/agents/global-settings/grok.toml +36 -0
- package/agents/global-settings/manifest.json +36 -0
- package/agents/grok/hooks/orchestrate-parent.json +60 -0
- package/agents/grok/hooks/rtk.json +16 -0
- package/agents/grok/hooks/rulesync.json +3 -0
- package/agents/grok/roles/scout.toml +5 -0
- package/agents/hooks.jsonc +67 -0
- package/agents/mcp-policy.jsonc +16 -0
- package/agents/rules/overview.md +21 -0
- package/agents/settings/claude.json +5 -0
- package/agents/skills/ask/SKILL.md +13 -0
- package/agents/skills/auto/SKILL.md +13 -0
- package/agents/skills/away/SKILL.md +19 -0
- package/agents/skills/blast-radius/SKILL.md +54 -0
- package/agents/skills/bro/SKILL.md +9 -0
- package/agents/skills/browser/SKILL.md +16 -0
- package/agents/skills/clasp/SKILL.md +11 -0
- package/agents/skills/commit/SKILL.md +35 -0
- package/agents/skills/commit-and-push/SKILL.md +9 -0
- package/agents/skills/commit-push/SKILL.md +59 -0
- package/agents/skills/commit-push-deploy/SKILL.md +74 -0
- package/agents/skills/commit-push-release/SKILL.md +75 -0
- package/agents/skills/correct/SKILL.md +39 -0
- package/agents/skills/do/SKILL.md +21 -0
- package/agents/skills/explain/SKILL.md +13 -0
- package/agents/skills/google-workspace/SKILL.md +12 -0
- package/agents/skills/handoff/SKILL.md +81 -0
- package/agents/skills/implement-plan/SKILL.md +29 -0
- package/agents/skills/implement-roadmap/SKILL.md +27 -0
- package/agents/skills/jev/SKILL.md +17 -0
- package/agents/skills/listen/SKILL.md +15 -0
- package/agents/skills/pickup/SKILL.md +58 -0
- package/agents/skills/principle-attack-the-premise/SKILL.md +24 -0
- package/agents/skills/principle-boundary-discipline/SKILL.md +38 -0
- package/agents/skills/principle-build-the-lever/SKILL.md +28 -0
- package/agents/skills/principle-encode-lessons-in-structure/SKILL.md +15 -0
- package/agents/skills/principle-exhaust-the-design-space/SKILL.md +12 -0
- package/agents/skills/principle-experience-first/SKILL.md +22 -0
- package/agents/skills/principle-explain-the-number/SKILL.md +21 -0
- package/agents/skills/principle-fix-root-causes/SKILL.md +24 -0
- package/agents/skills/principle-foundational-thinking/SKILL.md +25 -0
- package/agents/skills/principle-guard-the-context-window/SKILL.md +16 -0
- package/agents/skills/principle-laziness-protocol/SKILL.md +13 -0
- package/agents/skills/principle-make-operations-idempotent/SKILL.md +25 -0
- package/agents/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +18 -0
- package/agents/skills/principle-minimize-reader-load/SKILL.md +22 -0
- package/agents/skills/principle-model-the-domain/SKILL.md +26 -0
- package/agents/skills/principle-never-block-on-the-human/SKILL.md +17 -0
- package/agents/skills/principle-outcome-oriented-execution/SKILL.md +25 -0
- package/agents/skills/principle-prove-it-works/SKILL.md +25 -0
- package/agents/skills/principle-redesign-from-first-principles/SKILL.md +18 -0
- package/agents/skills/principle-separate-before-serializing-shared-state/SKILL.md +20 -0
- package/agents/skills/principle-sequence-verifiable-units/SKILL.md +22 -0
- package/agents/skills/principle-subtract-before-you-add/SKILL.md +21 -0
- package/agents/skills/principle-test-behavior-not-implementation/SKILL.md +24 -0
- package/agents/skills/principle-type-system-discipline/SKILL.md +17 -0
- package/agents/skills/review-plan/SKILL.md +28 -0
- package/agents/skills/review-roadmap/SKILL.md +28 -0
- package/agents/skills/show-me/SKILL.md +21 -0
- package/agents/skills/speak/SKILL.md +15 -0
- package/agents/skills/su/SKILL.md +11 -0
- package/agents/skills/teach/SKILL.md +25 -0
- package/agents/skills/tmp/SKILL.md +54 -0
- package/agents/skills/typescript-best-practices/SKILL.md +32 -0
- package/agents/skills/typescript-best-practices/references/patterns.md +328 -0
- package/agents/skills/unslop/SKILL.md +62 -0
- package/agents/skills/write-plan/SKILL.md +33 -0
- package/agents/skills/write-roadmap/SKILL.md +66 -0
- package/agents/subagents/implementer-deep.md +57 -0
- package/agents/subagents/implementer-fast.md +57 -0
- package/agents/subagents/orchestrator.md +43 -0
- package/agents/subagents/researcher.md +47 -0
- package/agents/subagents/scout.md +44 -0
- package/bin/repo.ts +4 -0
- package/cli/actionlint-default.test.ts +38 -0
- package/cli/actionlint-download.test.ts +162 -0
- package/cli/actionlint-real.test.ts +33 -0
- package/cli/actionlint.constants.ts +43 -0
- package/cli/actionlint.test.ts +108 -0
- package/cli/actionlint.ts +178 -0
- package/cli/bin.test.ts +54 -0
- package/cli/bin.ts +40 -0
- package/cli/check-changelog.test.ts +40 -0
- package/cli/check-changelog.ts +12 -0
- package/cli/check-comments.test.ts +157 -0
- package/cli/check-comments.ts +123 -0
- package/cli/check-env-modules.test.ts +85 -0
- package/cli/check-env-modules.ts +56 -0
- package/cli/check-magic.test.ts +139 -0
- package/cli/check-magic.ts +120 -0
- package/cli/check-manifests.constants.ts +4 -0
- package/cli/check-manifests.test.ts +210 -0
- package/cli/check-manifests.ts +71 -0
- package/cli/check-nightly.test.ts +103 -0
- package/cli/check-nightly.ts +37 -0
- package/cli/check-ratchets-missing.test.ts +46 -0
- package/cli/check-ratchets-mutation.test.ts +49 -0
- package/cli/check-ratchets.constants.ts +20 -0
- package/cli/check-ratchets.test.ts +190 -0
- package/cli/check-ratchets.ts +193 -0
- package/cli/check-rejections.test.ts +220 -0
- package/cli/check-rejections.ts +153 -0
- package/cli/check-reports.ts +37 -0
- package/cli/check-tsconfig.test.ts +507 -0
- package/cli/check-tsconfig.ts +205 -0
- package/cli/commands.test.ts +114 -0
- package/cli/commands.ts +218 -0
- package/cli/commit-changelog.ts +27 -0
- package/cli/commit-msg-changelog.test.ts +93 -0
- package/cli/commit-msg-range.test.ts +126 -0
- package/cli/commit-msg-red-proof.test.ts +147 -0
- package/cli/commit-msg-repo.test.ts +153 -0
- package/cli/commit-msg.test.ts +101 -0
- package/cli/commit-msg.ts +194 -0
- package/cli/commit-range.constants.ts +17 -0
- package/cli/commit-range.ts +57 -0
- package/cli/config-knip.test.ts +70 -0
- package/cli/config-nightly.test.ts +84 -0
- package/cli/config-tdd.test.ts +46 -0
- package/cli/config.test.ts +576 -0
- package/cli/config.ts +261 -0
- package/cli/conventional.ts +9 -0
- package/cli/coverage-config.ts +62 -0
- package/cli/coverage.constants.ts +6 -0
- package/cli/coverage.test.ts +199 -0
- package/cli/coverage.ts +127 -0
- package/cli/env.constants.ts +10 -0
- package/cli/env.test.ts +56 -0
- package/cli/env.ts +72 -0
- package/cli/fixtures/base-config.ts +13 -0
- package/cli/fixtures/gate-world.ts +48 -0
- package/cli/fixtures/knip-run.ts +38 -0
- package/cli/fixtures/mutate-fakes.ts +137 -0
- package/cli/fixtures/planted-repo.ts +50 -0
- package/cli/fixtures/publish-world.ts +71 -0
- package/cli/fixtures/red-proof-repo.ts +72 -0
- package/cli/fixtures/release-context.ts +15 -0
- package/cli/fixtures/release-world.ts +111 -0
- package/cli/fixtures/stub-bin.ts +40 -0
- package/cli/guard-diagnostics.test.ts +157 -0
- package/cli/guard-diagnostics.ts +195 -0
- package/cli/init.test.ts +487 -0
- package/cli/init.ts +275 -0
- package/cli/knip-check-ignores.test.ts +106 -0
- package/cli/knip-check-real.test.ts +65 -0
- package/cli/knip-check.constants.ts +46 -0
- package/cli/knip-check.test.ts +114 -0
- package/cli/knip-check.ts +169 -0
- package/cli/knip-schema.ts +67 -0
- package/cli/known-failures.constants.ts +22 -0
- package/cli/known-failures.test.ts +138 -0
- package/cli/known-failures.ts +131 -0
- package/cli/lint/as-needs-reason.ts +41 -0
- package/cli/lint/boundaries.ts +73 -0
- package/cli/lint/class-file.ts +39 -0
- package/cli/lint/config-file.ts +32 -0
- package/cli/lint/entry-file.ts +54 -0
- package/cli/lint/env-in-config.ts +66 -0
- package/cli/lint/filename-matches-export.ts +63 -0
- package/cli/lint/index-file.ts +22 -0
- package/cli/lint/index.ts +47 -0
- package/cli/lint/is-reason.ts +6 -0
- package/cli/lint/manifest.ts +46 -0
- package/cli/lint/names.ts +59 -0
- package/cli/lint/no-commented-out-code.ts +105 -0
- package/cli/lint/no-mock-of-subject.ts +64 -0
- package/cli/lint/no-module-side-effects.ts +94 -0
- package/cli/lint/no-module-state.ts +58 -0
- package/cli/lint/no-side-effect-import.ts +17 -0
- package/cli/lint/no-v8-ignore.ts +18 -0
- package/cli/lint/script-rules.ts +9 -0
- package/cli/lint/skip-on-platform.constants.ts +8 -0
- package/cli/lint/skip-on-platform.ts +118 -0
- package/cli/lint/todo-needs-id.ts +63 -0
- package/cli/lint/types-file.ts +28 -0
- package/cli/lint-schema.ts +32 -0
- package/cli/magic/fixtures/magic-repo.ts +64 -0
- package/cli/magic/magic-hit.ts +2 -0
- package/cli/magic/magic-nodes.ts +44 -0
- package/cli/magic/magic-numbers.test.ts +99 -0
- package/cli/magic/magic-numbers.ts +117 -0
- package/cli/magic/magic-strings.test.ts +38 -0
- package/cli/magic/magic-strings.ts +81 -0
- package/cli/main.test.ts +853 -0
- package/cli/main.ts +292 -0
- package/cli/mutate-args.ts +79 -0
- package/cli/mutate-check.test.ts +147 -0
- package/cli/mutate-deps.ts +42 -0
- package/cli/mutate-edges.test.ts +150 -0
- package/cli/mutate-files.test.ts +100 -0
- package/cli/mutate-files.ts +31 -0
- package/cli/mutate-floors.test.ts +91 -0
- package/cli/mutate-floors.ts +104 -0
- package/cli/mutate-real-deps.ts +57 -0
- package/cli/mutate-real.test.ts +96 -0
- package/cli/mutate-report.ts +96 -0
- package/cli/mutate-run.ts +128 -0
- package/cli/mutate-shards.ts +64 -0
- package/cli/mutate.constants.ts +67 -0
- package/cli/mutate.test.ts +182 -0
- package/cli/mutate.ts +64 -0
- package/cli/nested-vitest-flags.ts +8 -0
- package/cli/nightly-config.constants.ts +14 -0
- package/cli/nightly-config.ts +62 -0
- package/cli/prompt.test.ts +202 -0
- package/cli/prompt.ts +1 -0
- package/cli/red-proof-edges.test.ts +78 -0
- package/cli/red-proof-failures.test.ts +82 -0
- package/cli/red-proof-tree.test.ts +157 -0
- package/cli/red-proof-verdict.test.ts +44 -0
- package/cli/red-proof.constants.ts +14 -0
- package/cli/red-proof.ts +202 -0
- package/cli/release/changelog-parse.ts +83 -0
- package/cli/release/changelog.test.ts +141 -0
- package/cli/release/changelog.ts +106 -0
- package/cli/release/gate-refusals.test.ts +85 -0
- package/cli/release/gate.test.ts +63 -0
- package/cli/release/gate.ts +70 -0
- package/cli/release/git.ts +66 -0
- package/cli/release/github.test.ts +128 -0
- package/cli/release/github.ts +46 -0
- package/cli/release/list-dir.test.ts +11 -0
- package/cli/release/list-dir.ts +6 -0
- package/cli/release/main.test.ts +48 -0
- package/cli/release/main.ts +51 -0
- package/cli/release/manifest.test.ts +24 -0
- package/cli/release/manifest.ts +34 -0
- package/cli/release/pack.test.ts +107 -0
- package/cli/release/pack.ts +76 -0
- package/cli/release/plan.ts +127 -0
- package/cli/release/publish-run.test.ts +98 -0
- package/cli/release/publish.test.ts +127 -0
- package/cli/release/publish.ts +125 -0
- package/cli/release/refuse.ts +5 -0
- package/cli/release/release-messages.constants.ts +96 -0
- package/cli/release/release-refusals.test.ts +149 -0
- package/cli/release/release.constants.ts +128 -0
- package/cli/release/release.test.ts +199 -0
- package/cli/release/release.ts +145 -0
- package/cli/release/version.test.ts +118 -0
- package/cli/release/version.ts +69 -0
- package/cli/release/wait.test.ts +101 -0
- package/cli/release/wait.ts +95 -0
- package/cli/script-diagnostics.test.ts +76 -0
- package/cli/script-diagnostics.ts +62 -0
- package/cli/scripts/board.ts +519 -0
- package/cli/scripts/browser.ts +994 -0
- package/cli/scripts/change-set.ts +105 -0
- package/cli/scripts/check-globals.ts +199 -0
- package/cli/scripts/ci-skips.constants.ts +17 -0
- package/cli/scripts/ci-skips.ts +118 -0
- package/cli/scripts/ci-wait-run.ts +28 -0
- package/cli/scripts/ci-wait.constants.ts +44 -0
- package/cli/scripts/ci-wait.ts +175 -0
- package/cli/scripts/ci.constants.ts +15 -0
- package/cli/scripts/ci.ts +208 -0
- package/cli/scripts/clean.ts +363 -0
- package/cli/scripts/comments-step.ts +15 -0
- package/cli/scripts/doctor.ts +828 -0
- package/cli/scripts/emit-agent-shell-tools.ts +91 -0
- package/cli/scripts/emit-mcp-policy.ts +402 -0
- package/cli/scripts/folder-map.ts +353 -0
- package/cli/scripts/gate-fat-tools.ts +1095 -0
- package/cli/scripts/gitignore-guard.ts +338 -0
- package/cli/scripts/google-workspace.ts +779 -0
- package/cli/scripts/hook-command.ts +72 -0
- package/cli/scripts/hook-input.ts +178 -0
- package/cli/scripts/hook-io.constants.ts +5 -0
- package/cli/scripts/hook-io.ts +46 -0
- package/cli/scripts/hooks-union.ts +469 -0
- package/cli/scripts/interactive.ts +30 -0
- package/cli/scripts/jev.ts +420 -0
- package/cli/scripts/job.ts +934 -0
- package/cli/scripts/jsonc.ts +9 -0
- package/cli/scripts/lessons.ts +564 -0
- package/cli/scripts/lint-baseline.ts +233 -0
- package/cli/scripts/lint-main.ts +24 -0
- package/cli/scripts/lint-skips.ts +139 -0
- package/cli/scripts/lint.constants.ts +6 -0
- package/cli/scripts/lint.ts +142 -0
- package/cli/scripts/listen.ts +962 -0
- package/cli/scripts/managed-text.ts +47 -0
- package/cli/scripts/orchestrate-parent.ts +1155 -0
- package/cli/scripts/parse-need.ts +81 -0
- package/cli/scripts/persist-handoff.ts +228 -0
- package/cli/scripts/persist-implementation.ts +276 -0
- package/cli/scripts/persist-plan.ts +888 -0
- package/cli/scripts/persist-roadmap.ts +478 -0
- package/cli/scripts/persist-tmp.ts +177 -0
- package/cli/scripts/persist.ts +54 -0
- package/cli/scripts/phase-files.ts +121 -0
- package/cli/scripts/prompt.ts +38 -0
- package/cli/scripts/purge-global-mcps.ts +313 -0
- package/cli/scripts/rejections-step.ts +37 -0
- package/cli/scripts/rtk-grok.ts +102 -0
- package/cli/scripts/scrub-spawn-prompt.ts +103 -0
- package/cli/scripts/scrub-text-lib.ts +58 -0
- package/cli/scripts/session-map.ts +69 -0
- package/cli/scripts/setup.ts +862 -0
- package/cli/scripts/skill-conflicts.ts +82 -0
- package/cli/scripts/speak.ts +370 -0
- package/cli/scripts/strategy.ts +168 -0
- package/cli/scripts/sync-global-settings.ts +316 -0
- package/cli/scripts/turn-steps.ts +249 -0
- package/cli/scripts/turn.ts +157 -0
- package/cli/scripts/typecheck-step.ts +43 -0
- package/cli/scripts/vscode-tasks.ts +175 -0
- package/cli/scripts/workspace-root.ts +160 -0
- package/cli/scripts/worktree.ts +806 -0
- package/cli/spawn.test.ts +34 -0
- package/cli/spawn.ts +27 -0
- package/cli/staged-change.constants.ts +11 -0
- package/cli/staged-change.ts +79 -0
- package/cli/stryker-preload.test.ts +50 -0
- package/cli/stryker-preload.ts +9 -0
- package/cli/sync/agents/frontmatter.test.ts +197 -0
- package/cli/sync/agents/frontmatter.ts +140 -0
- package/cli/sync/agents/hooks.test.ts +517 -0
- package/cli/sync/agents/hooks.ts +401 -0
- package/cli/sync/agents/rules.test.ts +229 -0
- package/cli/sync/agents/rules.ts +84 -0
- package/cli/sync/agents/sources.test.ts +375 -0
- package/cli/sync/agents/sources.ts +244 -0
- package/cli/sync/agents/subagents.test.ts +149 -0
- package/cli/sync/agents/subagents.ts +158 -0
- package/cli/sync/agents-text.test.ts +31 -0
- package/cli/sync/agents-text.ts +36 -0
- package/cli/sync/fixtures/copied.README.md +35 -0
- package/cli/sync/fixtures/copied.tgz +0 -0
- package/cli/sync/fixtures/maps/golden/INDEX.md +22 -0
- package/cli/sync/fixtures/maps-ws.tgz +0 -0
- package/cli/sync/git-files.test.ts +340 -0
- package/cli/sync/git-files.ts +197 -0
- package/cli/sync/git-hooks.test.ts +94 -0
- package/cli/sync/golden.test.ts +15 -0
- package/cli/sync/hooks-mode.test.ts +99 -0
- package/cli/sync/hosts.ts +28 -0
- package/cli/sync/knip-config.constants.ts +4 -0
- package/cli/sync/knip-config.test.ts +147 -0
- package/cli/sync/knip-config.ts +108 -0
- package/cli/sync/manifest.test.ts +78 -0
- package/cli/sync/manifest.ts +60 -0
- package/cli/sync/maps.test.ts +304 -0
- package/cli/sync/maps.ts +297 -0
- package/cli/sync/migrate.test.ts +2000 -0
- package/cli/sync/migrate.ts +1104 -0
- package/cli/sync/nightly-jobs.test.ts +63 -0
- package/cli/sync/nightly.constants.ts +48 -0
- package/cli/sync/nightly.test.ts +100 -0
- package/cli/sync/nightly.ts +75 -0
- package/cli/sync/outputs.test.ts +351 -0
- package/cli/sync/outputs.ts +168 -0
- package/cli/sync/oxlint-config.test.ts +178 -0
- package/cli/sync/oxlint-config.ts +168 -0
- package/cli/sync/release-jobs.test.ts +29 -0
- package/cli/sync/release-reports.test.ts +31 -0
- package/cli/sync/release-workflow.constants.ts +61 -0
- package/cli/sync/release-workflow.test.ts +192 -0
- package/cli/sync/release-workflow.ts +86 -0
- package/cli/sync/release.constants.ts +93 -0
- package/cli/sync/release.test.ts +187 -0
- package/cli/sync/release.ts +112 -0
- package/cli/sync/repo-dir.test.ts +371 -0
- package/cli/sync/repo-dir.ts +205 -0
- package/cli/sync/standards.constants.ts +8 -0
- package/cli/sync/standards.test.ts +206 -0
- package/cli/sync/standards.ts +179 -0
- package/cli/sync/stock-history.json +2796 -0
- package/cli/sync/stock-history.test.ts +66 -0
- package/cli/sync/stock-history.ts +84 -0
- package/cli/sync/stock.test.ts +47 -0
- package/cli/sync/stock.ts +24 -0
- package/cli/sync/trees.test.ts +621 -0
- package/cli/sync/trees.ts +280 -0
- package/cli/sync/validate.test.ts +299 -0
- package/cli/sync/validate.ts +402 -0
- package/cli/sync/workspace.test.ts +180 -0
- package/cli/sync/workspace.ts +138 -0
- package/cli/sync/write.test.ts +341 -0
- package/cli/sync/write.ts +231 -0
- package/cli/sync.test.ts +1495 -0
- package/cli/sync.ts +360 -0
- package/cli/tdd-scope.test.ts +36 -0
- package/cli/tdd-scope.ts +41 -0
- package/cli/test-files.ts +16 -0
- package/cli/ts-program.ts +69 -0
- package/cli/tsconfig.constants.ts +8 -0
- package/cli/workerstack-config.types.ts +21 -0
- package/dist/cli/env.d.ts +10 -0
- package/dist/cli/env.js +64 -0
- package/dist/presets/temp-root-env.d.ts +10 -0
- package/dist/presets/temp-root-env.js +20 -0
- package/dist/presets/temp-root.constants.d.ts +6 -0
- package/dist/presets/temp-root.constants.js +6 -0
- package/dist/presets/temp-root.d.ts +2 -0
- package/dist/presets/temp-root.js +60 -0
- package/dist/presets/vitest.constants.d.ts +16 -0
- package/dist/presets/vitest.constants.js +16 -0
- package/dist/presets/vitest.d.ts +11 -0
- package/dist/presets/vitest.js +67 -0
- package/dist/presets/workers-plugin.d.ts +10 -0
- package/dist/presets/workers-plugin.js +54 -0
- package/package.json +141 -4
- package/references/INDEX.md +100 -0
- package/references/browser.md +66 -0
- package/references/cascade.md +15 -0
- package/references/clasp.md +21 -0
- package/references/cloudflare.md +36 -0
- package/references/google-workspace.md +79 -0
- package/references/hooks.md +103 -0
- package/references/implementation-format.md +119 -0
- package/references/jev.md +56 -0
- package/references/lessons.md +73 -0
- package/references/listen.md +80 -0
- package/references/map.md +107 -0
- package/references/output.md +47 -0
- package/references/plan-format.md +264 -0
- package/references/review-loop.md +48 -0
- package/references/roadmap-format.md +104 -0
- package/references/rtk.md +27 -0
- package/references/scope.md +76 -0
- package/references/setup.md +42 -0
- package/references/speak.md +59 -0
- package/tsconfig/base.json +28 -0
- package/tsconfig/bun.d.ts +1 -0
- package/tsconfig/bun.json +8 -0
- package/tsconfig/reset.d.ts +1 -0
- package/tsconfig/strict.json +12 -0
- package/tsconfig/web.json +7 -0
- package/tsconfig/worker.d.ts +1 -0
- package/tsconfig/worker.json +8 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/** PreToolUse: intent-scrub spawn `prompt`. Fail-open: unchanged/error → empty stdout, exit 0. */
|
|
3
|
+
import type { HookInput } from "./hook-input.ts";
|
|
4
|
+
import { processHookIo, readHookInput, type HookIo } from "./hook-io.ts";
|
|
5
|
+
import { resolveRoots } from "./workspace-root.ts";
|
|
6
|
+
import { scrubText } from "./scrub-text-lib.ts";
|
|
7
|
+
import { answerDeny, answerRewrite, type HookOutput } from "./gate-fat-tools.ts";
|
|
8
|
+
|
|
9
|
+
/** What the hook prints: a deny or a rewrite, in whichever shape the harness takes. */
|
|
10
|
+
export type SpawnAnswer = HookOutput;
|
|
11
|
+
|
|
12
|
+
export const MAX_PROMPT_CHARS = 100000;
|
|
13
|
+
export const TRUNCATE_SUFFIX = "…[truncated]";
|
|
14
|
+
const TRANSCRIPT_PREFIX = /^\s*(?:\[(?:orchestrator|scout)\]:|Human:|Assistant:)\s*/i;
|
|
15
|
+
const YOU_ARE_SUBAGENT = /^\s*You are scout subagent\b/;
|
|
16
|
+
|
|
17
|
+
export function stripTranscripts(text: string): string {
|
|
18
|
+
const lines = String(text).split(/\n/);
|
|
19
|
+
const out: string[] = [];
|
|
20
|
+
let keptYouAre = false;
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
if (TRANSCRIPT_PREFIX.test(line)) continue;
|
|
23
|
+
if (YOU_ARE_SUBAGENT.test(line)) {
|
|
24
|
+
if (keptYouAre) continue;
|
|
25
|
+
keptYouAre = true;
|
|
26
|
+
}
|
|
27
|
+
out.push(line);
|
|
28
|
+
}
|
|
29
|
+
return out.join("\n");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function spawnCapReason(workspaceRoot?: string) {
|
|
33
|
+
const root = workspaceRoot || resolveRoots().root;
|
|
34
|
+
return `spawn prompt exceeds ${MAX_PROMPT_CHARS} chars after scrub; write it under ${root}/.tmp/repo/plans/ and re-spawn with that abs path`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const INLINE_TRANSCRIPT = /\s*(?:\[(?:orchestrator|scout)\]:|Human:|Assistant:)\s*/gi;
|
|
38
|
+
const EXTRA_YOU_ARE = /\s*You are scout subagent\b[^.]*\.?/g;
|
|
39
|
+
|
|
40
|
+
export function stripInlineTranscripts(text: string): string {
|
|
41
|
+
let s = String(text);
|
|
42
|
+
const first = s.match(/^\s*You are scout subagent\b[^.]*\.?\s*/);
|
|
43
|
+
const prefix = first ? first[0] : "";
|
|
44
|
+
let rest = first ? s.slice(first[0].length) : s;
|
|
45
|
+
rest = rest.replace(INLINE_TRANSCRIPT, " ");
|
|
46
|
+
rest = rest.replace(EXTRA_YOU_ARE, " ");
|
|
47
|
+
return (prefix + rest).replace(/[ \t]{2,}/g, " ").trim();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function capSpawnPrompt(prompt: string): string {
|
|
51
|
+
let s = stripTranscripts(String(prompt));
|
|
52
|
+
s = scrubText(s);
|
|
53
|
+
s = stripTranscripts(s);
|
|
54
|
+
s = stripInlineTranscripts(s);
|
|
55
|
+
return s.trim();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function rewriteSpawnToolInput(toolInput: unknown): Record<string, unknown> | null {
|
|
59
|
+
if (!isRecord(toolInput)) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const next: Record<string, unknown> = Object.assign({}, toolInput);
|
|
64
|
+
let changed = false;
|
|
65
|
+
|
|
66
|
+
if (typeof next.prompt === "string") {
|
|
67
|
+
const scrubbed = capSpawnPrompt(next.prompt);
|
|
68
|
+
if (scrubbed !== next.prompt) {
|
|
69
|
+
next.prompt = scrubbed;
|
|
70
|
+
changed = true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return changed ? next : null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function processHookPayload(data: HookInput | null | undefined): SpawnAnswer | null {
|
|
78
|
+
if (!data || typeof data !== "object" || Array.isArray(data)) return null;
|
|
79
|
+
let toolInput: unknown = data.toolInput;
|
|
80
|
+
if (toolInput == null) toolInput = data.tool_input;
|
|
81
|
+
const updated = rewriteSpawnToolInput(toolInput);
|
|
82
|
+
// A rewrite only happens for a string prompt, so `updated.prompt` is that string.
|
|
83
|
+
const prompt = updated?.prompt ?? (isRecord(toolInput) ? toolInput.prompt : undefined);
|
|
84
|
+
if (typeof prompt === "string" && prompt.length > MAX_PROMPT_CHARS) {
|
|
85
|
+
return answerDeny(data, spawnCapReason(resolveRoots(data).root));
|
|
86
|
+
}
|
|
87
|
+
return updated ? answerRewrite(data, updated) : null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function main(_argv: string[] = [], io: HookIo = processHookIo()): number {
|
|
91
|
+
try {
|
|
92
|
+
const data = readHookInput(io);
|
|
93
|
+
const answer = processHookPayload(data);
|
|
94
|
+
if (answer) io.write(JSON.stringify(answer));
|
|
95
|
+
return 0;
|
|
96
|
+
} catch {
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function isRecord(v: unknown): v is Record<string, unknown> {
|
|
102
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
103
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const INTENT_PREFIXES = [
|
|
2
|
+
"can you please",
|
|
3
|
+
"could you please",
|
|
4
|
+
"would you please",
|
|
5
|
+
"can you",
|
|
6
|
+
"could you",
|
|
7
|
+
"would you",
|
|
8
|
+
"please",
|
|
9
|
+
"i want you to",
|
|
10
|
+
"i need you to",
|
|
11
|
+
"i would like you to",
|
|
12
|
+
"i'd like you to",
|
|
13
|
+
];
|
|
14
|
+
const INTENT_MID: [string, string][] = [
|
|
15
|
+
[String.raw`\bmake me an\b`, "make"],
|
|
16
|
+
[String.raw`\bmake me a\b`, "make"],
|
|
17
|
+
[String.raw`\bmake me\b`, "make"],
|
|
18
|
+
[String.raw`\bi want the\b`, ""],
|
|
19
|
+
[String.raw`\bi need the\b`, ""],
|
|
20
|
+
[String.raw`\bi want a\b`, ""],
|
|
21
|
+
[String.raw`\bi need a\b`, ""],
|
|
22
|
+
[String.raw`\bi want\b`, ""],
|
|
23
|
+
[String.raw`\bi need\b`, ""],
|
|
24
|
+
[String.raw`\bto\s*,`, ","],
|
|
25
|
+
];
|
|
26
|
+
const FILLER_PREFIX = new RegExp("^(?:" + INTENT_PREFIXES.join("|") + ")\\s+", "i");
|
|
27
|
+
const FILLER_SUFFIX = /\s+(?:thank you|thanks|please)[.!]*\s*$/i;
|
|
28
|
+
const COMMA_WS = /\s*,\s*/g;
|
|
29
|
+
const WS_RUN = /[ \t]+/g;
|
|
30
|
+
|
|
31
|
+
function normalizeNewlines(text: string): string {
|
|
32
|
+
return text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** One line with the intent filler cut: polite prefixes, trailing thanks, and "make me a" style phrases. */
|
|
36
|
+
export function stripFiller(text: string): string {
|
|
37
|
+
let prev: string | null = null;
|
|
38
|
+
while (prev !== text) {
|
|
39
|
+
prev = text;
|
|
40
|
+
text = text.replace(FILLER_PREFIX, "").trim();
|
|
41
|
+
text = text.replace(FILLER_SUFFIX, "").trim();
|
|
42
|
+
for (const [pat, repl] of INTENT_MID) {
|
|
43
|
+
text = text.replace(new RegExp(pat, "gi"), repl);
|
|
44
|
+
}
|
|
45
|
+
text = text.replace(COMMA_WS, " ");
|
|
46
|
+
text = text.replace(WS_RUN, " ").trim();
|
|
47
|
+
}
|
|
48
|
+
return text;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Joins the non-empty lines of `raw` into one line and strips intent filler from it. */
|
|
52
|
+
export function scrubText(raw: string): string {
|
|
53
|
+
const lines = normalizeNewlines(raw)
|
|
54
|
+
.split("\n")
|
|
55
|
+
.map((ln) => ln.trim())
|
|
56
|
+
.filter(Boolean);
|
|
57
|
+
return stripFiller(lines.join(" ").replace(WS_RUN, " ").trim());
|
|
58
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* SessionStart hook: inject the code-only folder map as additionalContext.
|
|
4
|
+
* Logs { rows, tokens } to .tmp/repo/sessions/<sid>/map.json for tuning.
|
|
5
|
+
* Fail-open: any error, no git, or an empty map → empty stdout, exit 0.
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import type { HookInput } from "./hook-input.ts";
|
|
10
|
+
import { processHookIo, readHookInput, type HookIo } from "./hook-io.ts";
|
|
11
|
+
import { resolveRoots } from "./workspace-root.ts";
|
|
12
|
+
import { recordHook } from "./board.ts";
|
|
13
|
+
import { folderMap, type FolderMapResult } from "./folder-map.ts";
|
|
14
|
+
import { resolveRepoBin } from "./gate-fat-tools.ts";
|
|
15
|
+
import { readEnv } from "../env.ts";
|
|
16
|
+
|
|
17
|
+
/** First line of the injected map; `depth` = levels per package, null when nothing was cut. */
|
|
18
|
+
export function header(depth: number | null | undefined): string {
|
|
19
|
+
const scope = depth == null ? "complete" : `${depth} levels per package`;
|
|
20
|
+
return `Folder map (code folders, ${scope}; \`…\` = deeper, run \`bun repo map <dir>\`):`;
|
|
21
|
+
}
|
|
22
|
+
/** Claude Code caps each hook's additionalContext at 10,000 chars; above it, only a 2KB preview stays inline. */
|
|
23
|
+
export const HOOK_CONTEXT_CHARS = 10000;
|
|
24
|
+
// Covers the header (depth is one or two digits) plus slack.
|
|
25
|
+
const RESERVE = header(99).length + 1 + 100;
|
|
26
|
+
|
|
27
|
+
function logSize(root: string, data: HookInput, out: FolderMapResult): void {
|
|
28
|
+
const sid = String(data.session_id || data.sessionId || "").replace(/[^\w-]/g, "");
|
|
29
|
+
if (!sid) return;
|
|
30
|
+
const dir = path.join(root, ".tmp", "repo", "sessions", sid);
|
|
31
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
32
|
+
const size = { rows: out.rows, tokens: out.tokens, depth: out.depth };
|
|
33
|
+
fs.writeFileSync(path.join(dir, "map.json"), `${JSON.stringify(size)}\n`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The one line a person reads when an uninstalled worktree runs the main checkout's hooks; "" otherwise. */
|
|
37
|
+
export function fallbackNotice(checkout: string): string {
|
|
38
|
+
const { bin, fallback } = resolveRepoBin(checkout);
|
|
39
|
+
return fallback
|
|
40
|
+
? `repo: hooks run ${bin} (this worktree has no install); run \`bun install\` here to use its own code\n`
|
|
41
|
+
: "";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The SessionStart context: the fallback notice, then the folder map; "" when there is neither. */
|
|
45
|
+
export function sessionContext(notice: string, out: FolderMapResult | null): string {
|
|
46
|
+
if (!out?.text) return notice;
|
|
47
|
+
return `${notice}${header(/ {2}…$/m.test(out.text) ? out.depth : null)}\n${out.text}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function main(_argv: string[] = [], io: HookIo = processHookIo()): number {
|
|
51
|
+
const data = readHookInput(io) ?? {};
|
|
52
|
+
recordHook(data, readEnv());
|
|
53
|
+
try {
|
|
54
|
+
const roots = resolveRoots(data);
|
|
55
|
+
const notice = fallbackNotice(roots.checkout);
|
|
56
|
+
const out = folderMap({ root: roots.checkout, maxChars: HOOK_CONTEXT_CHARS - RESERVE - notice.length });
|
|
57
|
+
const additionalContext = sessionContext(notice, out);
|
|
58
|
+
if (!additionalContext) return 0;
|
|
59
|
+
try {
|
|
60
|
+
if (out?.text) logSize(roots.root, data, out);
|
|
61
|
+
} catch {
|
|
62
|
+
// Logging is best-effort; the map still ships.
|
|
63
|
+
}
|
|
64
|
+
io.write(JSON.stringify({ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext } }));
|
|
65
|
+
} catch {
|
|
66
|
+
// Fail open.
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
}
|