@event4u/agent-config 9.7.0 → 9.9.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-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +314 -190
- package/CONTRIBUTING.md +23 -7
- package/MIGRATION.md +20 -0
- package/README.md +57 -11
- package/dist/agent-src/commands/agents/audit.md +1 -1
- package/dist/agent-src/commands/agents/optimize.md +2 -2
- package/dist/agent-src/commands/agents/user.md +1 -1
- package/dist/agent-src/commands/agents.md +1 -1
- package/dist/agent-src/commands/check-current-md.md +3 -3
- package/dist/agent-src/commands/commit/in-chunks.md +8 -0
- package/dist/agent-src/commands/commit.md +17 -0
- package/dist/agent-src/commands/fix/portability.md +2 -2
- package/dist/agent-src/commands/fix/pr-comments-loop.md +136 -0
- package/dist/agent-src/commands/fix/refs.md +2 -2
- package/dist/agent-src/commands/fix/route.md +4 -3
- package/dist/agent-src/commands/fix.md +9 -6
- package/dist/agent-src/commands/ghostwriter.md +1 -1
- package/dist/agent-src/commands/image.md +1 -1
- package/dist/agent-src/commands/optimize/augmentignore.md +1 -1
- package/dist/agent-src/commands/optimize/skills.md +2 -2
- package/dist/agent-src/commands/post-as.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -0
- package/dist/agent-src/commands/research.md +1 -1
- package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/team/delegate.md +4 -0
- package/dist/agent-src/commands/video.md +1 -1
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +1 -1
- package/dist/agent-src/contexts/contracts/emergency-triage-block.md +2 -2
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +48 -2
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -0
- package/dist/agent-src/contexts/execution/subagent-modes-detail.md +109 -8
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +20 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +53 -3
- package/dist/agent-src/contexts/override-system.md +75 -5
- package/dist/agent-src/rules/code-provenance.md +112 -0
- package/dist/agent-src/rules/context-hygiene.md +2 -0
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
- package/dist/agent-src/rules/git-history-discipline.md +2 -0
- package/dist/agent-src/rules/history-discipline.md +80 -0
- package/dist/agent-src/rules/language-and-tone.md +2 -0
- package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
- package/dist/agent-src/rules/media-governance-routing.md +2 -0
- package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
- package/dist/agent-src/rules/no-roadmap-references.md +4 -1
- package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
- package/dist/agent-src/rules/onboarding-gate.md +2 -0
- package/dist/agent-src/rules/output-discipline.md +2 -0
- package/dist/agent-src/rules/persona-governance.md +2 -0
- package/dist/agent-src/rules/php-coding.md +1 -0
- package/dist/agent-src/rules/preservation-guard.md +3 -0
- package/dist/agent-src/rules/reviewer-awareness.md +1 -0
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +9 -0
- package/dist/agent-src/rules/scale-discipline.md +92 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +11 -1
- package/dist/agent-src/rules/session-canary.md +77 -0
- package/dist/agent-src/rules/skill-quality.md +2 -0
- package/dist/agent-src/rules/source-confidentiality.md +2 -0
- package/dist/agent-src/rules/source-of-truth.md +2 -0
- package/dist/agent-src/rules/telegraph-speak.md +2 -0
- package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -1
- package/dist/agent-src/rules/tool-safety.md +4 -1
- package/dist/agent-src/rules/untrusted-input-defense.md +10 -0
- package/dist/agent-src/rules/verify-before-complete.md +2 -0
- package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +97 -0
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +0 -3
- package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
- package/dist/agent-src/skills/design-review/SKILL.md +5 -6
- package/dist/agent-src/skills/design-tokens/SKILL.md +0 -1
- package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
- package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
- package/dist/agent-src/skills/history-design/SKILL.md +101 -0
- package/dist/agent-src/skills/history-design/evals/triggers.json +17 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +3 -3
- package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
- package/dist/agent-src/skills/image-editing/SKILL.md +2 -1
- package/dist/agent-src/skills/image-generation/SKILL.md +2 -1
- package/dist/agent-src/skills/image-provider-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +161 -0
- package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +145 -0
- package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +97 -0
- package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +52 -0
- package/dist/agent-src/skills/md-language-check/SKILL.md +1 -1
- package/dist/agent-src/skills/override-management/SKILL.md +1 -1
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +7 -7
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -2
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +2 -2
- package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -0
- package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -3
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -0
- package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +31 -12
- package/dist/agent-src/skills/rule-refactor/SKILL.md +3 -3
- package/dist/agent-src/skills/schema-review/SKILL.md +92 -0
- package/dist/agent-src/skills/schema-review/evals/triggers.json +17 -0
- package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
- package/dist/agent-src/skills/secrets-management/SKILL.md +43 -1
- package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +1 -1
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -3
- package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +5 -5
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +45 -85
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +5 -4
- package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
- package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -3
- package/dist/agent-src/skills/token-optimizer/SKILL.md +4 -4
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +2 -3
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agents/.gitattributes.fragment +25 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/command.md +3 -3
- package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
- package/dist/agent-src/templates/persona.md +2 -2
- package/dist/agent-src/templates/rule.md +2 -2
- package/dist/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
- package/dist/agent-src/templates/scripts/telemetry_record.ts +33 -1
- package/dist/cli/commands/doctorShell.js +20 -0
- package/dist/cli/commands/doctorShell.js.map +1 -1
- package/dist/cli/commands/rtkDetect.js +58 -0
- package/dist/cli/commands/rtkDetect.js.map +1 -0
- package/dist/cli/configRoot.js +112 -0
- package/dist/cli/configRoot.js.map +1 -0
- package/dist/cli/configRoot.test.js +97 -0
- package/dist/cli/configRoot.test.js.map +1 -0
- package/dist/cli/firstRunNotice.js +70 -0
- package/dist/cli/firstRunNotice.js.map +1 -0
- package/dist/cli/help.js +4 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +54 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +8 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +502 -101
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +6 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +95 -8
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +36 -7
- package/dist/hooks/dispatch.js +19475 -0
- package/dist/install/agentSwitchDetection.js +75 -0
- package/dist/install/agentSwitchDetection.js.map +1 -0
- package/dist/install/agentSwitchProfile.js +117 -0
- package/dist/install/agentSwitchProfile.js.map +1 -0
- package/dist/install/atomic.js +1 -1
- package/dist/install/detect.js +1 -1
- package/dist/install/install.mjs +791 -486
- package/dist/install/rtkDetection.js +213 -0
- package/dist/install/rtkDetection.js.map +1 -0
- package/dist/install/rule_scope.js +2 -1
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/types.js +2 -2
- package/dist/install/wizard-plan.js +1 -1
- package/dist/install/wizardDismissals.js +58 -0
- package/dist/install/wizardDismissals.js.map +1 -0
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
- package/dist/mcp/registry-manifest.json +15 -4
- package/dist/mcp/server.json +20 -0
- package/dist/mcp/server.mjs +44292 -0
- package/dist/router.json +1 -1
- package/dist/scripts/condense.js +14 -7
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/app.js +12 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/io/sharedWriteCheck.js +101 -0
- package/dist/server/io/sharedWriteCheck.js.map +1 -0
- package/dist/server/routes/ping.js +32 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/routes/settings.js +21 -4
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/userMd.js +21 -4
- package/dist/server/routes/userMd.js.map +1 -1
- package/dist/server/routes/wizard.js +68 -25
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/schemas/settings.js +12 -2
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/server/serverInfo.js +6 -2
- package/dist/server/serverInfo.js.map +1 -1
- package/dist/server/token.js +11 -4
- package/dist/server/token.js.map +1 -1
- package/dist/server/writeRoot.js +15 -1
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/shared/capabilities.js +33 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/capabilities.test.js +39 -0
- package/dist/shared/capabilities.test.js.map +1 -0
- package/dist/ui/assets/index-BpSQt5vm.js +40 -0
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -0
- package/dist/ui/assets/index-jSfMW8_t.css +1 -0
- package/dist/ui/index.html +15 -6
- package/docs/MIGRATION.md +16 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +4 -2
- package/package.json +22 -9
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
- package/src/agent-src/templates/scripts/telemetry_record.ts +33 -1
- package/src/config/agent-settings.template.yml +94 -13
- package/src/config/discovery/packs.yml +22 -0
- package/src/config/discovery/workspaces.yml +1 -1
- package/src/config/evaluator-budgets.json +47 -0
- package/src/config/hook-latency-budget.json +20 -0
- package/src/config/reach-channels.yml +217 -0
- package/src/config/reach-prescriptions-intake.yml +200 -0
- package/src/install/agentSwitchDetection.ts +90 -0
- package/src/install/agentSwitchProfile.ts +131 -0
- package/src/install/atomic.ts +1 -1
- package/src/install/detect.ts +1 -1
- package/src/install/rtkDetection.ts +274 -0
- package/src/install/rule_scope.ts +9 -2
- package/src/install/types.ts +2 -2
- package/src/install/wizard-plan.ts +1 -1
- package/src/install/wizardDismissals.ts +60 -0
- package/src/scripts/_cli/cmd_doctor.ts +62 -1
- package/src/scripts/_cli/cmd_memory_get.ts +197 -0
- package/src/scripts/_cli/cmd_refresh.ts +30 -0
- package/src/scripts/_dispatch.bash +96 -0
- package/src/scripts/_lib/auto_dispatch.corpus.test.ts +64 -1
- package/src/scripts/_lib/auto_dispatch.ts +76 -0
- package/src/scripts/_lib/detect_target_license.ts +714 -0
- package/src/scripts/_lib/exec_evidence.ts +251 -0
- package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +15 -0
- package/src/scripts/_lib/fixtures/secret-detector/positives.txt +15 -0
- package/src/scripts/_lib/install_drift.ts +194 -0
- package/src/scripts/_lib/kernel_rules.ts +46 -0
- package/src/scripts/_lib/memory_fts_index.ts +390 -0
- package/src/scripts/_lib/orchestration_record.ts +91 -2
- package/src/scripts/_lib/persistence/adapter_raw_sql.ts +443 -0
- package/src/scripts/_lib/persistence/detect_audit_coverage.ts +423 -0
- package/src/scripts/_lib/persistence/detect_bounded_reads.ts +154 -0
- package/src/scripts/_lib/persistence/detect_index_parity.ts +576 -0
- package/src/scripts/_lib/persistence/detect_n1_eloquent.ts +226 -0
- package/src/scripts/_lib/persistence/detect_offload.ts +441 -0
- package/src/scripts/_lib/persistence/detect_prisma_growth.ts +74 -0
- package/src/scripts/_lib/persistence/offload_catalog.ts +73 -0
- package/src/scripts/_lib/persistence/types.ts +109 -0
- package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
- package/src/scripts/_lib/risk_paths.ts +160 -0
- package/src/scripts/_lib/rtk_allowlist.ts +44 -0
- package/src/scripts/_lib/secret_detector.test.ts +108 -0
- package/src/scripts/_lib/secret_detector.ts +328 -0
- package/src/scripts/_lib/secret_detector_adversarial.test.ts +116 -0
- package/src/scripts/_lib/spawn_env.ts +7 -0
- package/src/scripts/_lib/sqlite_guard.ts +191 -0
- package/src/scripts/_lib/subagent_spawn.ts +53 -0
- package/src/scripts/_lib/tool_probe.ts +359 -0
- package/src/scripts/_lib/worker_budget.ts +107 -0
- package/src/scripts/adr/regenerate_index.ts +81 -6
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/config.ts +12 -6
- package/src/scripts/ai_council/orchestrator.ts +73 -3
- package/src/scripts/ai_team/review_gate.ts +8 -10
- package/src/scripts/ai_team/team_dispatch.ts +48 -0
- package/src/scripts/audit_adr_coverage.ts +33 -0
- package/src/scripts/audit_initial_context.ts +1 -1
- package/src/scripts/bench_cross_source_eval.ts +400 -0
- package/src/scripts/bench_honesty_score.ts +1093 -0
- package/src/scripts/bench_hook_latency.ts +218 -0
- package/src/scripts/build_mcp_catalog.ts +275 -0
- package/src/scripts/build_mcp_registry_manifest.ts +46 -0
- package/src/scripts/build_proof.ts +207 -0
- package/src/scripts/chat_history.ts +8 -5
- package/src/scripts/check_adr_frontmatter.ts +195 -0
- package/src/scripts/check_artefact_count_messaging.ts +4 -0
- package/src/scripts/check_backstop_debt.ts +210 -0
- package/src/scripts/check_bundle_path_leakage.ts +343 -0
- package/src/scripts/check_claims.ts +188 -8
- package/src/scripts/check_comparison.ts +12 -0
- package/src/scripts/check_enforcement_coverage.ts +592 -0
- package/src/scripts/check_evaluator_budgets.ts +99 -0
- package/src/scripts/check_kernel_rule_bundle.ts +16 -12
- package/src/scripts/check_knowledge_sharing.ts +12 -1
- package/src/scripts/check_no_external_sources.ts +2 -2
- package/src/scripts/check_reach_channels.ts +407 -0
- package/src/scripts/check_reach_staleness.ts +364 -0
- package/src/scripts/check_secret_leak.test.ts +47 -0
- package/src/scripts/check_secret_leak.ts +290 -0
- package/src/scripts/check_source_pointer_freshness.ts +28 -3
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/code_graph/cli.ts +379 -0
- package/src/scripts/code_graph/detect.ts +186 -0
- package/src/scripts/code_graph/extract.ts +386 -0
- package/src/scripts/code_graph/intent.ts +45 -0
- package/src/scripts/code_graph/loader.ts +123 -0
- package/src/scripts/code_graph/query.ts +290 -0
- package/src/scripts/code_graph/sanitize.ts +30 -0
- package/src/scripts/code_graph/sqlite_store.ts +174 -0
- package/src/scripts/code_graph/types.ts +83 -0
- package/src/scripts/code_graph/validate.ts +63 -0
- package/src/scripts/condense.ts +14 -6
- package/src/scripts/context_hygiene_hook.ts +8 -5
- package/src/scripts/council_cli.ts +126 -12
- package/src/scripts/detect_target_license.ts +203 -0
- package/src/scripts/evaluator_umbrella.sh +145 -0
- package/src/scripts/external_sources_denylist.json +8 -4
- package/src/scripts/first_run_gate_hook.ts +9 -5
- package/src/scripts/generate_subagent_floor.ts +194 -0
- package/src/scripts/hermetic-install.sh +3 -3
- package/src/scripts/hook_manifest.yaml +65 -16
- package/src/scripts/hooks/block_kernel_rule_writes.ts +212 -0
- package/src/scripts/hooks/block_no_verify.ts +9 -9
- package/src/scripts/hooks/code_graph_nudge_hook.ts +191 -0
- package/src/scripts/hooks/concern_registry.ts +75 -0
- package/src/scripts/hooks/design_slop_hook.ts +8 -5
- package/src/scripts/hooks/dispatch_entry.ts +37 -0
- package/src/scripts/hooks/dispatch_hook.ts +176 -3
- package/src/scripts/hooks/hook_stdin.ts +42 -0
- package/src/scripts/hooks/rtk_wrap_hook.ts +26 -12
- package/src/scripts/hot_context_hook.ts +7 -6
- package/src/scripts/injection_scan_hook.ts +9 -1
- package/src/scripts/install +6 -6
- package/src/scripts/install-hooks.sh +4 -4
- package/src/scripts/install.sh +5 -4
- package/src/scripts/install.ts +264 -23
- package/src/scripts/iron_law_sha.ts +3 -12
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_budget_ownership.ts +89 -0
- package/src/scripts/lint_command_routing.ts +35 -5
- package/src/scripts/lint_command_verbs.ts +42 -9
- package/src/scripts/lint_consumer_internal_refs.ts +211 -0
- package/src/scripts/lint_discovery_vocabulary.ts +2 -0
- package/src/scripts/lint_documented_commands.ts +670 -0
- package/src/scripts/lint_framework_leakage.ts +17 -3
- package/src/scripts/lint_framework_leakage_allowlist.json +32 -0
- package/src/scripts/lint_governed_writes.ts +335 -0
- package/src/scripts/lint_hidden_unicode.ts +6 -0
- package/src/scripts/lint_mcp_registry_manifest.ts +26 -1
- package/src/scripts/lint_memory_tripwire.ts +186 -0
- package/src/scripts/lint_override_kernel_guard.ts +267 -0
- package/src/scripts/lint_persistence.ts +171 -0
- package/src/scripts/lint_pre_migration_refs.ts +106 -0
- package/src/scripts/lint_provenance.ts +547 -0
- package/src/scripts/lint_provenance_vocabulary.ts +437 -0
- package/src/scripts/lint_spawn_payload.ts +283 -0
- package/src/scripts/lint_store_boundary.ts +152 -0
- package/src/scripts/lint_versioned_cache.ts +7 -1
- package/src/scripts/mcp_server/__main__.ts +7 -2
- package/src/scripts/mcp_server/catalog.ts +23 -1
- package/src/scripts/mcp_server/consumer_tool_catalog.json +563 -193
- package/src/scripts/mcp_server/prompts.ts +6 -0
- package/src/scripts/mcp_server/tool_catalog_source.ts +332 -0
- package/src/scripts/mcp_server/tools.ts +56 -5
- package/src/scripts/mcp_telemetry_query.ts +2 -33
- package/src/scripts/mcp_telemetry_store.ts +64 -34
- package/src/scripts/measure_rule_budget.ts +3 -12
- package/src/scripts/memory_learn_hook.ts +126 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/memory_replay_24.ts +312 -0
- package/src/scripts/memory_report.ts +16 -3
- package/src/scripts/memory_signal.ts +48 -0
- package/src/scripts/memory_status.ts +6 -0
- package/src/scripts/minimal_safe_diff_hook.ts +8 -5
- package/src/scripts/onboarding_gate_hook.ts +8 -5
- package/src/scripts/orchestration_record.ts +16 -0
- package/src/scripts/pr_url_reminder_hook.ts +8 -1
- package/src/scripts/prepack-check.mjs +17 -0
- package/src/scripts/prepack_lifecycle_check.d.mts +8 -0
- package/src/scripts/prepack_lifecycle_check.mjs +82 -0
- package/src/scripts/profile_staleness_hook.ts +8 -7
- package/src/scripts/reach_doctor.ts +1651 -0
- package/src/scripts/release.ts +24 -3
- package/src/scripts/report_install_drift.ts +109 -0
- package/src/scripts/risk_escalation_shadow.ts +160 -0
- package/src/scripts/roadmap_progress_hook.ts +8 -5
- package/src/scripts/schemas/agent-settings.schema.json +23 -0
- package/src/scripts/schemas/license-policy.schema.json +89 -0
- package/src/scripts/schemas/provenance-borrow.schema.json +46 -0
- package/src/scripts/schemas/reach-channels.schema.json +134 -0
- package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
- package/src/scripts/schemas/rule.schema.json +20 -0
- package/src/scripts/self_review_gate.test.ts +173 -1
- package/src/scripts/self_review_gate.ts +155 -15
- package/src/scripts/session_canary_hook.ts +182 -0
- package/src/scripts/skill_linter.ts +55 -0
- package/src/scripts/smoke_quickstart.ts +2 -2
- package/src/scripts/surface_probe_hook.ts +8 -7
- package/src/scripts/sync_gitattributes.ts +310 -0
- package/src/scripts/team_review_gate_hook.ts +13 -16
- package/src/scripts/validate_reach_prescriptions.ts +751 -0
- package/src/scripts/verify_before_complete_hook.ts +8 -5
- package/src/scripts/wrapper_freshness_hook.ts +8 -7
- package/src/server/schemas/settings.ts +24 -2
- package/src/shared/capabilities.test.ts +43 -0
- package/src/shared/capabilities.ts +75 -0
- package/src/templates/minimal/agents-overrides-readme.md +20 -0
- package/dist/ui/assets/index-BPFMZWUs.css +0 -1
- package/dist/ui/assets/index-BiEZiZ31.js +0 -40
- package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
- package/docs/CLAIMS.md +0 -261
- package/docs/DISTRIBUTION_CHECKLIST.md +0 -170
- package/docs/RELEASE_STORY_TEMPLATE.md +0 -37
- package/docs/SKILL_CENSUS.md +0 -352
- package/docs/adrs/cost/0001-hard-stop-hook.md +0 -114
- package/docs/adrs/cost/README.md +0 -9
- package/docs/adrs/memory/0001-consumer-side-snapshot.md +0 -119
- package/docs/adrs/memory/README.md +0 -10
- package/docs/adrs/router/0001-three-tier-routing.md +0 -119
- package/docs/adrs/router/README.md +0 -9
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +0 -102
- package/docs/adrs/schema/README.md +0 -9
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +0 -99
- package/docs/adrs/smoke/README.md +0 -9
- package/docs/adrs/telegraph/0001-default-off-until-bench.md +0 -93
- package/docs/adrs/telegraph/README.md +0 -9
- package/docs/announcements/2026-05-non-dev-launch.md +0 -79
- package/docs/announcements/2026-07-honest-cost-sweep-launch.md +0 -84
- package/docs/anti-reskin-gate.md +0 -60
- package/docs/architecture/augment-projection.md +0 -70
- package/docs/architecture/claude-bundle.md +0 -77
- package/docs/architecture/current-onboard-baseline.md +0 -126
- package/docs/architecture/current-safety-behavior.md +0 -137
- package/docs/architecture/multi-tool-projection.md +0 -125
- package/docs/architecture/setup-vs-settings-shared-surface.md +0 -114
- package/docs/architecture/source-projection.md +0 -85
- package/docs/architecture.md +0 -390
- package/docs/archive/CHANGELOG-6.0.0-overview.md +0 -953
- package/docs/archive/CHANGELOG-7.0.0.md +0 -419
- package/docs/archive/CHANGELOG-pre-2.11.0.md +0 -141
- package/docs/archive/CHANGELOG-pre-2.15.0.md +0 -244
- package/docs/archive/CHANGELOG-pre-2.16.0.md +0 -48
- package/docs/archive/CHANGELOG-pre-2.17.0.md +0 -63
- package/docs/archive/CHANGELOG-pre-2.2.0.md +0 -2138
- package/docs/archive/CHANGELOG-pre-2.20.0.md +0 -159
- package/docs/archive/CHANGELOG-pre-2.25.0.md +0 -191
- package/docs/archive/CHANGELOG-pre-2.7.0.md +0 -185
- package/docs/archive/CHANGELOG-pre-3.0.0.md +0 -130
- package/docs/archive/CHANGELOG-pre-3.1.0.md +0 -167
- package/docs/archive/CHANGELOG-pre-3.2.0.md +0 -268
- package/docs/archive/CHANGELOG-pre-4.0.0.md +0 -80
- package/docs/archive/CHANGELOG-pre-4.5.0.md +0 -289
- package/docs/archive/CHANGELOG-pre-5.4.0.md +0 -260
- package/docs/archive/CHANGELOG-pre-5.9.0.md +0 -270
- package/docs/archive/CHANGELOG-pre-6.0.0.md +0 -473
- package/docs/archive/CHANGELOG-pre-7.0.0.md +0 -126
- package/docs/archive/CHANGELOG-pre-8.0.0.md +0 -301
- package/docs/archive/CHANGELOG-pre-8.1.0.md +0 -316
- package/docs/archive/CHANGELOG-pre-8.12.0.md +0 -304
- package/docs/archive/CHANGELOG-pre-8.9.0.md +0 -306
- package/docs/archive/CHANGELOG-pre-9.2.0.md +0 -276
- package/docs/artefact-census.md +0 -71
- package/docs/benchmark.md +0 -648
- package/docs/benchmark.pinned.yml +0 -31
- package/docs/benchmarks.md +0 -85
- package/docs/capability-matrix.md +0 -33
- package/docs/case-studies/_template.md +0 -60
- package/docs/case-studies/frontend-design-positioning.md +0 -86
- package/docs/catalog.md +0 -721
- package/docs/command-flows.md +0 -272
- package/docs/command-naming-audit.md +0 -60
- package/docs/comparison.yaml +0 -45
- package/docs/contracts/CHANGELOG-conventions.md +0 -149
- package/docs/contracts/STABILITY.md +0 -188
- package/docs/contracts/adoption-signal-floor.md +0 -127
- package/docs/contracts/adr-architectural-consensus-mechanism.md +0 -68
- package/docs/contracts/adr-chat-history-split.md +0 -140
- package/docs/contracts/adr-command-suggestion.md +0 -144
- package/docs/contracts/adr-forecast-construction-shape.md +0 -90
- package/docs/contracts/adr-gtm-context-spine.md +0 -116
- package/docs/contracts/adr-implement-ticket-runtime.md +0 -121
- package/docs/contracts/adr-install-user-type-axis.md +0 -107
- package/docs/contracts/adr-layout.md +0 -107
- package/docs/contracts/adr-level-6-productization.md +0 -145
- package/docs/contracts/adr-mcp-runtime.md +0 -128
- package/docs/contracts/adr-product-ui-track.md +0 -381
- package/docs/contracts/adr-prompt-driven-execution.md +0 -186
- package/docs/contracts/adr-settings-sync-engine.md +0 -128
- package/docs/contracts/adr-user-types-axis.md +0 -127
- package/docs/contracts/adr-wing4-context-spine.md +0 -126
- package/docs/contracts/agent-user-schema.md +0 -170
- package/docs/contracts/agents-layout.md +0 -148
- package/docs/contracts/agents-md-tech-stack.md +0 -75
- package/docs/contracts/ai-council-config.md +0 -829
- package/docs/contracts/ai-team-config.md +0 -224
- package/docs/contracts/analysis-memory-loop.md +0 -149
- package/docs/contracts/at-rest-encryption.md +0 -191
- package/docs/contracts/audit-log-v1.md +0 -150
- package/docs/contracts/auto-orchestration-v1.md +0 -70
- package/docs/contracts/benchmark-ab-contract.md +0 -106
- package/docs/contracts/benchmark-corpus-spec.md +0 -125
- package/docs/contracts/benchmark-report-schema.md +0 -113
- package/docs/contracts/branch-protection-policy.md +0 -139
- package/docs/contracts/brand-token-consumption.md +0 -74
- package/docs/contracts/capability-boundary.md +0 -69
- package/docs/contracts/capability-packs.md +0 -217
- package/docs/contracts/ci-cost-budget.md +0 -111
- package/docs/contracts/ci-green-floor.md +0 -141
- package/docs/contracts/command-category-governance.md +0 -84
- package/docs/contracts/command-clusters.md +0 -399
- package/docs/contracts/command-surface-tiers.md +0 -176
- package/docs/contracts/command-taxonomy.md +0 -137
- package/docs/contracts/condensation-default-kill-criterion.md +0 -116
- package/docs/contracts/config-presets.md +0 -144
- package/docs/contracts/conformance.md +0 -84
- package/docs/contracts/consumer-bridge.md +0 -73
- package/docs/contracts/context-paths.md +0 -101
- package/docs/contracts/context-spine.md +0 -179
- package/docs/contracts/cost-dashboard.md +0 -143
- package/docs/contracts/cost-enforcement.md +0 -134
- package/docs/contracts/cost-profile-defaults.md +0 -110
- package/docs/contracts/cost-summary-schema.md +0 -107
- package/docs/contracts/creative-pack-boundary.md +0 -63
- package/docs/contracts/cross-repo-retrieval.md +0 -64
- package/docs/contracts/cross-wing-handoff.md +0 -134
- package/docs/contracts/daily-workspace.md +0 -147
- package/docs/contracts/decision-engine-gates.md +0 -120
- package/docs/contracts/decision-trace-v1.md +0 -177
- package/docs/contracts/design-artifact-lifecycle.md +0 -93
- package/docs/contracts/design-artifact-verification.md +0 -153
- package/docs/contracts/discovery-manifest.md +0 -209
- package/docs/contracts/discovery-manifest.schema.json +0 -254
- package/docs/contracts/evidence-based-pruning.md +0 -102
- package/docs/contracts/explain-modes.md +0 -187
- package/docs/contracts/explain-trace.schema.json +0 -144
- package/docs/contracts/file-ownership-matrix.json +0 -13941
- package/docs/contracts/file-ownership-matrix.md +0 -135
- package/docs/contracts/frontmatter-contract.md +0 -140
- package/docs/contracts/ghostwriter-schema.md +0 -337
- package/docs/contracts/governance-enforcement-projection.md +0 -159
- package/docs/contracts/gui-wizard.md +0 -350
- package/docs/contracts/harness-expectations.md +0 -128
- package/docs/contracts/hook-architecture-v1.md +0 -325
- package/docs/contracts/host-agent-protocol.md +0 -110
- package/docs/contracts/implement-ticket-flow.md +0 -625
- package/docs/contracts/init-telemetry.md +0 -132
- package/docs/contracts/injected-block-authenticity-model.md +0 -66
- package/docs/contracts/install-layout.md +0 -249
- package/docs/contracts/install-scopes.md +0 -82
- package/docs/contracts/installed-tools-lockfile.md +0 -144
- package/docs/contracts/installer-agent-mode.md +0 -137
- package/docs/contracts/iron-law-overrides.txt +0 -26
- package/docs/contracts/kernel-membership.md +0 -339
- package/docs/contracts/linear-ai-rules-inclusion.md +0 -143
- package/docs/contracts/linear-ai-three-layers.md +0 -130
- package/docs/contracts/linter-structural-model.md +0 -181
- package/docs/contracts/load-context-budget-model.md +0 -259
- package/docs/contracts/load-context-schema.md +0 -220
- package/docs/contracts/local-analytics.md +0 -160
- package/docs/contracts/local-knowledge-ingestion.md +0 -96
- package/docs/contracts/local-server-api.md +0 -134
- package/docs/contracts/low-impact-corpus-format.md +0 -95
- package/docs/contracts/mcp-beta-criteria.md +0 -130
- package/docs/contracts/mcp-cloud-scope.md +0 -355
- package/docs/contracts/mcp-discovery-phase-notice.md +0 -60
- package/docs/contracts/mcp-phase-1-scope.md +0 -272
- package/docs/contracts/mcp-registry-manifest.schema.json +0 -129
- package/docs/contracts/mcp-tool-inventory.md +0 -64
- package/docs/contracts/mcp-tool-stub-envelope.md +0 -78
- package/docs/contracts/measurement-baseline.md +0 -103
- package/docs/contracts/memory-visibility-v1.md +0 -160
- package/docs/contracts/mental-models.md +0 -336
- package/docs/contracts/migrate-command.md +0 -233
- package/docs/contracts/multi-tool-projection-fidelity.md +0 -134
- package/docs/contracts/namespace.md +0 -125
- package/docs/contracts/no-runtime-boundary.md +0 -61
- package/docs/contracts/one-off-script-lifecycle.md +0 -110
- package/docs/contracts/orchestration-dsl-v1.md +0 -153
- package/docs/contracts/package-self-orientation.md +0 -163
- package/docs/contracts/pilot/agent-authority.md +0 -24
- package/docs/contracts/pilot/direct-answers.md +0 -70
- package/docs/contracts/pilot/language-and-tone.md +0 -63
- package/docs/contracts/plain-language-surface.md +0 -117
- package/docs/contracts/prelaunch-diagnostics.md +0 -151
- package/docs/contracts/profile-system.md +0 -167
- package/docs/contracts/reasoning-discipline-protocol.md +0 -83
- package/docs/contracts/release-pr-gating.md +0 -151
- package/docs/contracts/release-sizing.md +0 -107
- package/docs/contracts/release-trunk-sync.md +0 -105
- package/docs/contracts/review-lens-schema.md +0 -64
- package/docs/contracts/roadmap-complexity-standard.md +0 -138
- package/docs/contracts/role-experience.md +0 -125
- package/docs/contracts/router-blending.md +0 -71
- package/docs/contracts/rule-classification.md +0 -171
- package/docs/contracts/rule-interactions.md +0 -132
- package/docs/contracts/rule-interactions.yml +0 -260
- package/docs/contracts/rule-priority-hierarchy.md +0 -88
- package/docs/contracts/rule-router.md +0 -287
- package/docs/contracts/safety-model.md +0 -129
- package/docs/contracts/session-profile-overlay.md +0 -157
- package/docs/contracts/settings-api.md +0 -264
- package/docs/contracts/settings-gui-agent-mode.schema.json +0 -128
- package/docs/contracts/settings-sync-yaml-subset.md +0 -139
- package/docs/contracts/skill-bundled-assets.md +0 -62
- package/docs/contracts/skill-discovery.md +0 -80
- package/docs/contracts/skill-distribution-channels.md +0 -66
- package/docs/contracts/skill-domains.md +0 -144
- package/docs/contracts/skill-dry-run.md +0 -47
- package/docs/contracts/skill-family-map.yml +0 -915
- package/docs/contracts/smoke-contracts.md +0 -144
- package/docs/contracts/subagent-boundary.md +0 -59
- package/docs/contracts/surface-agent-contracts.md +0 -153
- package/docs/contracts/surface-matrix.md +0 -108
- package/docs/contracts/surface-tiers.md +0 -81
- package/docs/contracts/telegraph-telemetry.md +0 -83
- package/docs/contracts/ticket-bundle-format.md +0 -233
- package/docs/contracts/tier-3-contrib-plugin.md +0 -137
- package/docs/contracts/trust-and-safety.md +0 -144
- package/docs/contracts/ui-stack-extension.md +0 -237
- package/docs/contracts/ui-track-flow.md +0 -329
- package/docs/contracts/universal-skills.md +0 -91
- package/docs/contracts/user-type-schema.md +0 -146
- package/docs/contracts/value-dashboard-spec.md +0 -378
- package/docs/contracts/value-report-schema.md +0 -168
- package/docs/contracts/workflow-packs.md +0 -121
- package/docs/contracts/workspace-boundary.md +0 -84
- package/docs/contracts/workspace-documents.md +0 -144
- package/docs/contracts/write-engine.md +0 -182
- package/docs/cookbook.md +0 -152
- package/docs/customization.md +0 -685
- package/docs/decisions/ADR-001-kernel-swap-deferred.md +0 -109
- package/docs/decisions/ADR-002-kernel-bucket-overrides.md +0 -135
- package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +0 -137
- package/docs/decisions/ADR-004-rule-governance-pruning.md +0 -240
- package/docs/decisions/ADR-005-subagent-worktrees.md +0 -120
- package/docs/decisions/ADR-006-skill-tools-python-pilot.md +0 -114
- package/docs/decisions/ADR-007-agent-discovery-scopes.md +0 -371
- package/docs/decisions/ADR-008-installed-tools-manifest.md +0 -160
- package/docs/decisions/ADR-009-event4u-namespace.md +0 -188
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +0 -168
- package/docs/decisions/ADR-011-domain-pack-readiness.md +0 -213
- package/docs/decisions/ADR-012-typescript-cli-shell.md +0 -162
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +0 -342
- package/docs/decisions/ADR-014-gui-framework-choice.md +0 -136
- package/docs/decisions/ADR-015-discovery-manifest-contract.md +0 -146
- package/docs/decisions/ADR-016-installer-architecture.md +0 -189
- package/docs/decisions/ADR-017-monorepo-physical-layout.md +0 -261
- package/docs/decisions/ADR-018-trust-and-safety-layer.md +0 -159
- package/docs/decisions/ADR-019-router-json-dist-location.md +0 -124
- package/docs/decisions/ADR-020-global-only-consumer-scope.md +0 -213
- package/docs/decisions/ADR-021-deployment-shape.md +0 -153
- package/docs/decisions/ADR-022-daily-workspace-decomposition.md +0 -140
- package/docs/decisions/ADR-023-host-agent-protocol.md +0 -129
- package/docs/decisions/ADR-024-workspace-v0-feature-floor.md +0 -126
- package/docs/decisions/ADR-025-workspace-chrome.md +0 -119
- package/docs/decisions/ADR-026-explain-mode-translation.md +0 -117
- package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +0 -129
- package/docs/decisions/ADR-028-root-layout.md +0 -147
- package/docs/decisions/ADR-029-multi-workspace-deferred.md +0 -122
- package/docs/decisions/ADR-030-claude-code-command-projection.md +0 -147
- package/docs/decisions/ADR-031-validation-severity-tiers-and-projection-roundtrip.md +0 -97
- package/docs/decisions/ADR-032-linked-projects-scope.md +0 -122
- package/docs/decisions/ADR-033-distribution-identity-npm-primary.md +0 -81
- package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +0 -63
- package/docs/decisions/ADR-035-model-capability-tiers.md +0 -104
- package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +0 -106
- package/docs/decisions/ADR-037-cost-profile-untangle.md +0 -117
- package/docs/decisions/ADR-038-canonical-settings-path.md +0 -96
- package/docs/decisions/ADR-039-claude-skills-untracked.md +0 -139
- package/docs/decisions/ADR-040-execution-model-projection-time-filtering.md +0 -244
- package/docs/decisions/ADR-041-controlled-command-verbs.md +0 -133
- package/docs/decisions/ADR-042-runtime-resolver-decision-gate.md +0 -113
- package/docs/decisions/ADR-043-monorepo-collapse-to-src-domains.md +0 -128
- package/docs/decisions/ADR-044-command-naming-scheme-hyphenated.md +0 -250
- package/docs/decisions/ADR-045-src-source-layout-and-profiles-as-views.md +0 -111
- package/docs/decisions/ADR-046-thin-command-principle.md +0 -93
- package/docs/decisions/ADR-047-framework-neutral-stack-adaptive-commands.md +0 -94
- package/docs/decisions/ADR-048-command-justification-rule.md +0 -106
- package/docs/decisions/ADR-049-configuration-trust-boundary.md +0 -132
- package/docs/decisions/ADR-050-workspace-vs-package-root-boundary.md +0 -121
- package/docs/decisions/ADR-051-uncondensed-source-container-relocation.md +0 -114
- package/docs/decisions/ADR-052-packages-removal-and-pack-home-migration.md +0 -86
- package/docs/decisions/ADR-053-agents-namespace-dual-role-resolution.md +0 -132
- package/docs/decisions/ADR-054-rule-adherence-decay-triggered-restate.md +0 -143
- package/docs/decisions/ADR-055-flow-layer-data-model.md +0 -235
- package/docs/decisions/ADR-056-unvalidated-video-adapters-disposition.md +0 -124
- package/docs/decisions/ADR-057-consolidation-evidence-gate-outcomes.md +0 -135
- package/docs/decisions/ADR-058-condensed-output-relocation-to-dist.md +0 -94
- package/docs/decisions/ADR-059-render-resume-filesystem-as-state.md +0 -161
- package/docs/decisions/ADR-060-comfyui-sandbox-model.md +0 -154
- package/docs/decisions/ADR-061-corpus-grounding-layer.md +0 -230
- package/docs/decisions/ADR-062-encrypt-at-rest-store-architecture.md +0 -121
- package/docs/decisions/ADR-063-append-jsonl-encryption-deferred.md +0 -83
- package/docs/decisions/ADR-064-append-jsonl-per-record-encryption.md +0 -113
- package/docs/decisions/ADR-065-tier3-inbox-handoff-v0.md +0 -86
- package/docs/decisions/ADR-066-skill-body-prerendering.md +0 -93
- package/docs/decisions/ADR-067-glama-registry-listing.md +0 -259
- package/docs/decisions/ADR-068-host-tier-detection.md +0 -90
- package/docs/decisions/ADR-069-prompt-renderer.md +0 -97
- package/docs/decisions/ADR-070-tier1-drive-loop.md +0 -94
- package/docs/decisions/ADR-071-launch-drive-integration.md +0 -95
- package/docs/decisions/ADR-072-codex-gemini-drive-configs.md +0 -90
- package/docs/decisions/ADR-073-drive-health-kill-switch.md +0 -81
- package/docs/decisions/ADR-074-drive-kill-switch-auto-recovery.md +0 -84
- package/docs/decisions/ADR-075-workspace-gui-drive.md +0 -83
- package/docs/decisions/ADR-076-workspace-multi-turn.md +0 -92
- package/docs/decisions/ADR-077-workspace-followup-gui.md +0 -70
- package/docs/decisions/ADR-078-drive-health-panel.md +0 -70
- package/docs/decisions/ADR-079-workspace-host-picker.md +0 -81
- package/docs/decisions/ADR-080-host-session-expired-410.md +0 -92
- package/docs/decisions/ADR-081-drive-health-reset-and-410-affordance.md +0 -71
- package/docs/decisions/ADR-082-410-one-click-relaunch.md +0 -58
- package/docs/decisions/ADR-083-session-thread-and-arbitrary-continuation.md +0 -85
- package/docs/decisions/ADR-084-drive-health-refresh-on-drive.md +0 -52
- package/docs/decisions/ADR-085-mcp-stdio-end-user-distribution-shape.md +0 -158
- package/docs/decisions/ADR-086-read-only-cross-agent-mcp-discovery-helper.md +0 -171
- package/docs/decisions/ADR-087-installer-e2e-test-strategy.md +0 -111
- package/docs/decisions/ADR-088-no-external-runtime-federation.md +0 -144
- package/docs/decisions/ADR-089-lean-local-plugin-install.md +0 -111
- package/docs/decisions/ADR-090-visibility-command-frontmatter-field.md +0 -95
- package/docs/decisions/ADR-091-split-meta-capability-packs.md +0 -113
- package/docs/decisions/ADR-092-defer-command-tier-alias-removal.md +0 -117
- package/docs/decisions/ADR-093-ai-council-config-user-global.md +0 -117
- package/docs/decisions/ADR-094-agent-memory-layer-removal.md +0 -94
- package/docs/decisions/ADR-095-workspace-boundary-contract.md +0 -108
- package/docs/decisions/ADR-096-analysis-workbench.md +0 -110
- package/docs/decisions/ADR-097-mission-recipe-privilege-boundary.md +0 -121
- package/docs/decisions/ADR-098-evidence-first-structure-discovery.md +0 -154
- package/docs/decisions/ADR-099-file-first-pattern-library.md +0 -87
- package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +0 -140
- package/docs/decisions/ADR-101-ticket-bundle-emission.md +0 -109
- package/docs/decisions/ADR-102-ticket-handoff-paste-and-mcp.md +0 -72
- package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +0 -92
- package/docs/decisions/ADR-104-ai-council-config-global-only.md +0 -119
- package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +0 -108
- package/docs/decisions/ADR-106-recursive-verification-benchmark-gate.md +0 -126
- package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +0 -70
- package/docs/decisions/ADR-108-open-source-forever-no-commercial-tier.md +0 -46
- package/docs/decisions/ADR-109-subagent-v1-contract.md +0 -246
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +0 -110
- package/docs/decisions/ADR-111-canonical-glama-listing.md +0 -97
- package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +0 -92
- package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +0 -201
- package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +0 -85
- package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +0 -91
- package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +0 -144
- package/docs/decisions/ADR-117-subagents-auto-default-on.md +0 -89
- package/docs/decisions/ADR-118-loop-engineering-boundaries.md +0 -162
- package/docs/decisions/ADR-119-global-knowledge-default-on.md +0 -104
- package/docs/decisions/ADR-120-council-chairman-mode.md +0 -70
- package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +0 -90
- package/docs/decisions/ADR-122-adversarial-verification-council.md +0 -166
- package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +0 -142
- package/docs/decisions/ADR-200-python-to-typescript-migration.md +0 -203
- package/docs/decisions/ADR-rule-kernel-and-router.md +0 -133
- package/docs/decisions/INDEX.md +0 -136
- package/docs/deploy/connector-setup.md +0 -129
- package/docs/deploy/env-vars.md +0 -70
- package/docs/deploy/policy-cookbook.md +0 -130
- package/docs/deploy/quickstart.md +0 -112
- package/docs/deploy/small-team-recipe.md +0 -148
- package/docs/deploy/team-deployment-posture.md +0 -111
- package/docs/design/adversarial-council-eval.md +0 -106
- package/docs/design/council-vs-solo-baseline.md +0 -92
- package/docs/design/cross-model-parity-eval.md +0 -82
- package/docs/design/length-neutral-judge-rerun.md +0 -92
- package/docs/design/utilization-window-criteria.md +0 -51
- package/docs/development.md +0 -230
- package/docs/distribution/awesome-list-submission.md +0 -46
- package/docs/distribution/consumer-matrix.md +0 -96
- package/docs/distribution/launch-story-draft.md +0 -58
- package/docs/distribution/mcp-submission-checklist.md +0 -95
- package/docs/distribution/public-install-smoke.md +0 -68
- package/docs/distribution/registries.md +0 -117
- package/docs/distribution/registry-submissions.md +0 -85
- package/docs/distribution/telemetry-privacy.md +0 -128
- package/docs/distribution/telemetry-schema.md +0 -174
- package/docs/distribution/topics-equivalents-decay-policy.md +0 -51
- package/docs/end-to-end-walkthroughs.md +0 -165
- package/docs/enforcement-by-host.md +0 -44
- package/docs/examples/agent-user.example.md +0 -22
- package/docs/experiences/agency.md +0 -49
- package/docs/experiences/content_creator.md +0 -49
- package/docs/experiences/developer.md +0 -49
- package/docs/experiences/finance.md +0 -50
- package/docs/experiences/founder.md +0 -49
- package/docs/experiences/ops.md +0 -49
- package/docs/featured-commands.md +0 -27
- package/docs/featured-skills.md +0 -95
- package/docs/flows.md +0 -67
- package/docs/getting-started-by-role.md +0 -190
- package/docs/getting-started-laravel.md +0 -72
- package/docs/getting-started-local-stdio.md +0 -77
- package/docs/getting-started.md +0 -254
- package/docs/github-topics.md +0 -93
- package/docs/governance-advantage.md +0 -72
- package/docs/governance.md +0 -96
- package/docs/guides/cross-repo-linked-projects.md +0 -93
- package/docs/guides/cross-repo-retrieval.md +0 -61
- package/docs/guides/frontend-design-corpus-refresh.md +0 -83
- package/docs/guides/local-analytics.md +0 -125
- package/docs/guides/local-knowledge.md +0 -127
- package/docs/guides/skill-discovery.md +0 -71
- package/docs/guides/skill-preview.md +0 -71
- package/docs/hook-payload-capture.md +0 -221
- package/docs/install-friction-report.md +0 -66
- package/docs/installation.md +0 -959
- package/docs/maintainers/branch-protection.md +0 -105
- package/docs/maintainers/dev-mode.md +0 -106
- package/docs/maintainers/optional-media-deps.md +0 -50
- package/docs/maintainers/system-map.md +0 -85
- package/docs/mcp-registries.md +0 -94
- package/docs/mcp-server.md +0 -175
- package/docs/mcp.md +0 -147
- package/docs/media/proof-demo.cast +0 -14
- package/docs/media/proof-demo.gif +0 -0
- package/docs/migration/consumer-template-consumption-model.md +0 -145
- package/docs/migration/divergences/README.md +0 -55
- package/docs/migration/divergences/_template.md +0 -50
- package/docs/migration/divergences/bench-stats-float-precision.md +0 -72
- package/docs/migration/divergences/mcp-telemetry-node-sqlite.md +0 -61
- package/docs/migration/divergences/pack-mcp-content-gzip-body.md +0 -53
- package/docs/migration/divergences/src-scripts-build_cloud_bundle.md +0 -63
- package/docs/migration/divergences/src-scripts-check_memory.md +0 -91
- package/docs/migration/divergences/src-scripts-inventory_abstraction_budget.md +0 -65
- package/docs/migration/divergences/src-scripts-lint_marketplace.md +0 -57
- package/docs/migration/divergences/src-scripts-lint_mcp_registry_manifest.md +0 -70
- package/docs/migration/divergences/src-scripts-spotcheck_thin_root.md +0 -60
- package/docs/migration/divergences/src-scripts-validate_agent_settings.md +0 -58
- package/docs/migration/node-floor.md +0 -86
- package/docs/migration/v1-to-v2.md +0 -156
- package/docs/migration/yaml-roundtrip-spike.md +0 -163
- package/docs/migrations/commands-1.15.0.md +0 -117
- package/docs/parity/bench-external.json +0 -58
- package/docs/parity/bench.json +0 -41
- package/docs/parity/command-frontmatter.md +0 -60
- package/docs/parity/external-runtime.md +0 -46
- package/docs/personas.md +0 -178
- package/docs/positioning-evidence.md +0 -86
- package/docs/profiles.md +0 -108
- package/docs/proof.md +0 -176
- package/docs/quality.md +0 -98
- package/docs/readme-split-plan.md +0 -102
- package/docs/recruits/_template.md +0 -81
- package/docs/release-runbook.md +0 -141
- package/docs/role-experiences.md +0 -19
- package/docs/safety.md +0 -30
- package/docs/second-brain-scope.md +0 -116
- package/docs/self-review-gate.md +0 -65
- package/docs/setup/enterprise-and-offline.md +0 -201
- package/docs/setup/mcp-client-config.md +0 -358
- package/docs/setup/mcp-cloud-endpoints.md +0 -116
- package/docs/setup/mcp-cloud-registry-listing.md +0 -99
- package/docs/setup/mcp-cloud-setup.md +0 -183
- package/docs/setup/mcp-r2-bootstrap.md +0 -82
- package/docs/setup/mcp-server-docker.md +0 -101
- package/docs/setup/per-ide/aider.md +0 -48
- package/docs/setup/per-ide/antigravity.md +0 -68
- package/docs/setup/per-ide/augment.md +0 -89
- package/docs/setup/per-ide/claude-code.md +0 -97
- package/docs/setup/per-ide/claude-desktop.md +0 -207
- package/docs/setup/per-ide/cline.md +0 -43
- package/docs/setup/per-ide/codebuddy.md +0 -63
- package/docs/setup/per-ide/codex.md +0 -46
- package/docs/setup/per-ide/continue.md +0 -68
- package/docs/setup/per-ide/copilot.md +0 -80
- package/docs/setup/per-ide/cursor.md +0 -125
- package/docs/setup/per-ide/droid.md +0 -65
- package/docs/setup/per-ide/gemini-cli.md +0 -45
- package/docs/setup/per-ide/jetbrains.md +0 -76
- package/docs/setup/per-ide/kilocode.md +0 -66
- package/docs/setup/per-ide/kiro.md +0 -72
- package/docs/setup/per-ide/opencode.md +0 -62
- package/docs/setup/per-ide/qoder.md +0 -63
- package/docs/setup/per-ide/roocode.md +0 -68
- package/docs/setup/per-ide/trae.md +0 -63
- package/docs/setup/per-ide/warp.md +0 -63
- package/docs/setup/per-ide/windsurf.md +0 -109
- package/docs/setup/per-ide/zed.md +0 -73
- package/docs/showcase.md +0 -209
- package/docs/skill-duplication-findings.md +0 -91
- package/docs/skills-catalog.md +0 -265
- package/docs/skills-taxonomy.md +0 -90
- package/docs/spawn-site-policy.md +0 -72
- package/docs/succession.md +0 -80
- package/docs/threat-model.md +0 -29
- package/docs/troubleshooting.md +0 -155
- package/docs/ui-track-mental-model.md +0 -121
- package/docs/us-vs-the-category.md +0 -38
- package/docs/value.md +0 -86
- package/docs/walkthroughs/assets/workspace-role-grid.png +0 -0
- package/docs/walkthroughs/assets/workspace-session-started.png +0 -0
- package/docs/walkthroughs/assets/workspace-task-picker.png +0 -0
- package/docs/walkthroughs/daily-workspace-a11y.md +0 -87
- package/docs/walkthroughs/daily-workspace.md +0 -127
- package/docs/wedge/production-validator/README.md +0 -81
- package/docs/wedge/production-validator/first-run-check.sh +0 -42
- package/docs/wedge/production-validator/production-validator.md +0 -83
- package/docs/wizard.md +0 -173
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* PreToolUse code-graph nudge (ADR-124 Phase 4) — deterministic, warn-only.
|
|
4
|
+
*
|
|
5
|
+
* When a code-graph source is available and the agent is about to search or
|
|
6
|
+
* read source files, surface a one-line reminder to query the graph first.
|
|
7
|
+
* NEVER blocks (dispatcher contract: 0 allow · 2 warn) — Source G's strict
|
|
8
|
+
* block-the-first-read mode is deliberately NOT ported (blocking reads on a
|
|
9
|
+
* possibly-stale index violates the minimal-safe-diff posture). Once per
|
|
10
|
+
* session (a latch keyed by session id), so it cannot nag.
|
|
11
|
+
*
|
|
12
|
+
* Default-OFF. Fires only when `hooks.code_graph.enabled: true`. Disabled /
|
|
13
|
+
* missing / already-latched → no-op exit 0. fail_closed: false — any error
|
|
14
|
+
* returns allow; a token optimisation must never break a tool call.
|
|
15
|
+
*
|
|
16
|
+
* Branches (first eligible search/read this session):
|
|
17
|
+
* present + fresh → "query the graph first"
|
|
18
|
+
* present + stale → "index N commits behind — rebuild"
|
|
19
|
+
* absent → "no graph — build one?"
|
|
20
|
+
*/
|
|
21
|
+
import fs from 'node:fs';
|
|
22
|
+
import path from 'node:path';
|
|
23
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
24
|
+
|
|
25
|
+
import { detectSources, pickSource } from '../code_graph/detect.js';
|
|
26
|
+
import { readHookStdin } from './hook_stdin.js';
|
|
27
|
+
|
|
28
|
+
const SETTINGS_FILE = '.agent-settings.yml';
|
|
29
|
+
const EXIT_ALLOW = 0;
|
|
30
|
+
const EXIT_WARN = 2;
|
|
31
|
+
const CODE_EXT = /\.(php|ts|tsx|mts|cts|js|jsx|mjs|cjs)$/i;
|
|
32
|
+
|
|
33
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
34
|
+
type JsonObject = { [k: string]: JsonValue };
|
|
35
|
+
|
|
36
|
+
function isObject(v: unknown): v is JsonObject {
|
|
37
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** `hooks.code_graph.enabled: true` mini-parser (mirrors rtk_wrap_hook). */
|
|
41
|
+
export function enabled(root: string): boolean {
|
|
42
|
+
const f = path.join(root, SETTINGS_FILE);
|
|
43
|
+
let text: string;
|
|
44
|
+
try {
|
|
45
|
+
if (!fs.statSync(f).isFile()) return false;
|
|
46
|
+
text = fs.readFileSync(f, 'utf-8');
|
|
47
|
+
} catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
let inHooks = false;
|
|
51
|
+
let inCg = false;
|
|
52
|
+
for (const raw of text.split(/\r\n|\r|\n/)) {
|
|
53
|
+
const line = raw.replace(/\s+$/, '');
|
|
54
|
+
if (!line || line.replace(/^\s+/, '').startsWith('#')) continue;
|
|
55
|
+
if (!(line.startsWith(' ') || line.startsWith('\t'))) {
|
|
56
|
+
inHooks = /^hooks\s*:\s*$/.test(line);
|
|
57
|
+
inCg = false;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (inHooks) {
|
|
61
|
+
if (/^\s+code_graph\s*:\s*$/.test(line)) {
|
|
62
|
+
inCg = true;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (inCg && /^\s{0,3}\S/.test(line)) inCg = false;
|
|
66
|
+
}
|
|
67
|
+
if (inCg && /^\s+enabled\s*:\s*true\b/.test(line)) return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface ToolIntent {
|
|
73
|
+
isSearch: boolean;
|
|
74
|
+
isCodeRead: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Best-effort read of the intercepted tool + its target from the envelope. */
|
|
78
|
+
export function classifyTool(envelope: JsonObject): ToolIntent {
|
|
79
|
+
const payload = isObject(envelope['payload']) ? envelope['payload'] : envelope;
|
|
80
|
+
const nameVal =
|
|
81
|
+
payload['tool_name'] ?? payload['toolName'] ?? payload['tool'] ?? envelope['tool_name'] ?? envelope['tool'];
|
|
82
|
+
const name = typeof nameVal === 'string' ? nameVal : '';
|
|
83
|
+
const ti = (isObject(payload['tool_input']) ? payload['tool_input'] : envelope['tool_input']) as
|
|
84
|
+
| JsonObject
|
|
85
|
+
| undefined;
|
|
86
|
+
const isSearch = name === 'Grep' || name === 'Glob';
|
|
87
|
+
let isCodeRead = false;
|
|
88
|
+
if (name === 'Read' && isObject(ti)) {
|
|
89
|
+
const fp = ti['file_path'] ?? ti['path'];
|
|
90
|
+
if (typeof fp === 'string') isCodeRead = CODE_EXT.test(fp);
|
|
91
|
+
}
|
|
92
|
+
return { isSearch, isCodeRead };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function sessionId(envelope: JsonObject): string {
|
|
96
|
+
const s = envelope['session_id'] ?? envelope['sessionId'];
|
|
97
|
+
return typeof s === 'string' && s ? s : 'default';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function latchFile(root: string): string {
|
|
101
|
+
return path.join(root, 'agents', 'runtime', 'state', 'code-graph-nudge.json');
|
|
102
|
+
}
|
|
103
|
+
function alreadyNudged(root: string, session: string): boolean {
|
|
104
|
+
try {
|
|
105
|
+
const state = JSON.parse(fs.readFileSync(latchFile(root), 'utf-8')) as Record<string, boolean>;
|
|
106
|
+
return state[session] === true;
|
|
107
|
+
} catch {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function latch(root: string, session: string): void {
|
|
112
|
+
try {
|
|
113
|
+
const p = latchFile(root);
|
|
114
|
+
let state: Record<string, boolean> = {};
|
|
115
|
+
try {
|
|
116
|
+
state = JSON.parse(fs.readFileSync(p, 'utf-8')) as Record<string, boolean>;
|
|
117
|
+
} catch {
|
|
118
|
+
/* fresh */
|
|
119
|
+
}
|
|
120
|
+
state[session] = true;
|
|
121
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
122
|
+
fs.writeFileSync(p, JSON.stringify(state));
|
|
123
|
+
} catch {
|
|
124
|
+
/* fail-open: a persistence failure must not break the tool call */
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const NATIVE_CACHE = path.join('agents', 'runtime', 'state', 'code-graph-v1.json');
|
|
129
|
+
|
|
130
|
+
/** The nudge line for the current source state (≤40 tokens, one line). */
|
|
131
|
+
export function nudgeReason(root: string): string {
|
|
132
|
+
const verdicts = detectSources(root, path.join(root, NATIVE_CACHE));
|
|
133
|
+
const picked = pickSource(verdicts);
|
|
134
|
+
if (!picked) {
|
|
135
|
+
return 'No code-graph found. For "who calls / where used / impact" run `agent-config code-graph refresh` once, then `agent-config code-graph query <symbol>` instead of grepping blind.';
|
|
136
|
+
}
|
|
137
|
+
if (picked.stale) {
|
|
138
|
+
return `code-graph is ${picked.commits_behind ?? 'N'} commit(s) behind — rebuild with \`agent-config code-graph refresh\` before trusting relationship answers.`;
|
|
139
|
+
}
|
|
140
|
+
return 'A fresh code-graph is present — for structure questions run `agent-config code-graph query|affected <symbol>` first; grep is the fallback (say which answered).';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function main(): number {
|
|
144
|
+
let envelope: JsonValue;
|
|
145
|
+
try {
|
|
146
|
+
const raw = readHookStdin();
|
|
147
|
+
envelope = raw.trim() ? (JSON.parse(raw) as JsonValue) : {};
|
|
148
|
+
} catch {
|
|
149
|
+
return EXIT_ALLOW;
|
|
150
|
+
}
|
|
151
|
+
if (!isObject(envelope)) return EXIT_ALLOW;
|
|
152
|
+
|
|
153
|
+
const cwd = envelope['cwd'];
|
|
154
|
+
const pr = envelope['workspace_root'] ?? envelope['project_root'];
|
|
155
|
+
const root = typeof cwd === 'string' && cwd ? cwd : typeof pr === 'string' && pr ? pr : '.';
|
|
156
|
+
if (!enabled(root)) return EXIT_ALLOW;
|
|
157
|
+
|
|
158
|
+
const { isSearch, isCodeRead } = classifyTool(envelope);
|
|
159
|
+
if (!isSearch && !isCodeRead) return EXIT_ALLOW;
|
|
160
|
+
|
|
161
|
+
const session = sessionId(envelope);
|
|
162
|
+
if (alreadyNudged(root, session)) return EXIT_ALLOW; // once per session
|
|
163
|
+
|
|
164
|
+
let reason: string;
|
|
165
|
+
try {
|
|
166
|
+
reason = nudgeReason(root);
|
|
167
|
+
} catch {
|
|
168
|
+
return EXIT_ALLOW;
|
|
169
|
+
}
|
|
170
|
+
latch(root, session);
|
|
171
|
+
process.stdout.write(`${JSON.stringify({ decision: 'warn', reason })}\n`);
|
|
172
|
+
return EXIT_WARN;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
176
|
+
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
177
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
178
|
+
function isCliEntry(): boolean {
|
|
179
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (process.argv[1] === undefined) return false;
|
|
183
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
184
|
+
if (import.meta.url === argvUrl) return true;
|
|
185
|
+
try {
|
|
186
|
+
return fs.realpathSync(fileURLToPath(import.meta.url)) === fs.realpathSync(path.resolve(process.argv[1]));
|
|
187
|
+
} catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (isCliEntry()) process.exit(main());
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* concern_registry — in-process concern table for the single-process
|
|
3
|
+
* hook dispatcher (road-to-credible-install Phase 1).
|
|
4
|
+
*
|
|
5
|
+
* Maps every `hook_manifest.yaml` concern script path to its statically
|
|
6
|
+
* imported module so the dispatcher can run concerns IN-PROCESS instead of
|
|
7
|
+
* re-spawning tsx per concern (the verified ~1.6 s p50 hot path). Static
|
|
8
|
+
* imports are deliberate: esbuild folds the whole table into
|
|
9
|
+
* `dist/hooks/dispatch.js`, so one `node` start covers dispatcher + every
|
|
10
|
+
* concern.
|
|
11
|
+
*
|
|
12
|
+
* Parity is CI-enforced (tests/hooks/concern_registry_parity.test.ts):
|
|
13
|
+
* every concern in the manifest MUST have a registry entry — a new concern
|
|
14
|
+
* that forgets the registry line falls back to the spawn path and silently
|
|
15
|
+
* reintroduces the latency class this table removed.
|
|
16
|
+
*
|
|
17
|
+
* Invocation contract (mirrors the historical child process exactly):
|
|
18
|
+
* - stdin → hook_stdin override (concerns read via readHookStdin())
|
|
19
|
+
* - argv → process.argv swapped to [node, <script>, ...args] for the call
|
|
20
|
+
* - cwd → process.chdir(workspace) for the call, restored after
|
|
21
|
+
* - stdout/stderr → captured via write-swap, returned to the dispatcher
|
|
22
|
+
* - rc → the concern's `main()` return value (undefined → 0)
|
|
23
|
+
* - crash → caught by the dispatcher and mapped to rc 3 (fail-open /
|
|
24
|
+
* fail-closed reduction unchanged)
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { main as chatHistoryMain } from '../chat_history.js';
|
|
28
|
+
import { main as hotContextMain } from '../hot_context_hook.js';
|
|
29
|
+
import { main as roadmapProgressMain } from '../roadmap_progress_hook.js';
|
|
30
|
+
import { main as onboardingGateMain } from '../onboarding_gate_hook.js';
|
|
31
|
+
import { main as contextHygieneMain } from '../context_hygiene_hook.js';
|
|
32
|
+
import { main as verifyBeforeCompleteMain } from '../verify_before_complete_hook.js';
|
|
33
|
+
import { main as minimalSafeDiffMain } from '../minimal_safe_diff_hook.js';
|
|
34
|
+
import { main as injectionScanMain } from '../injection_scan_hook.js';
|
|
35
|
+
import { main as memoryLearnMain } from '../memory_learn_hook.js';
|
|
36
|
+
import { main as firstRunGateMain } from '../first_run_gate_hook.js';
|
|
37
|
+
import { main as profileStalenessMain } from '../profile_staleness_hook.js';
|
|
38
|
+
import { main as wrapperFreshnessMain } from '../wrapper_freshness_hook.js';
|
|
39
|
+
import { main as surfaceProbeMain } from '../surface_probe_hook.js';
|
|
40
|
+
import { main as teamReviewGateMain } from '../team_review_gate_hook.js';
|
|
41
|
+
import { main as prUrlReminderMain } from '../pr_url_reminder_hook.js';
|
|
42
|
+
import { main as sessionCanaryMain } from '../session_canary_hook.js';
|
|
43
|
+
import { main as blockNoVerifyMain } from './block_no_verify.js';
|
|
44
|
+
import { main as blockKernelRuleWritesMain } from './block_kernel_rule_writes.js';
|
|
45
|
+
import { main as rtkWrapMain } from './rtk_wrap_hook.js';
|
|
46
|
+
import { main as designSlopMain } from './design_slop_hook.js';
|
|
47
|
+
import { main as codeGraphNudgeMain } from './code_graph_nudge_hook.js';
|
|
48
|
+
|
|
49
|
+
/** A concern `main` — argv-taking or not; both shapes exist. */
|
|
50
|
+
export type ConcernMain = (argv?: string[]) => number | undefined | void;
|
|
51
|
+
|
|
52
|
+
/** Keyed by the manifest's `script:` value (repo-relative path). */
|
|
53
|
+
export const CONCERN_REGISTRY: Readonly<Record<string, ConcernMain>> = {
|
|
54
|
+
'src/scripts/chat_history.ts': chatHistoryMain as ConcernMain,
|
|
55
|
+
'src/scripts/hot_context_hook.ts': hotContextMain as ConcernMain,
|
|
56
|
+
'src/scripts/roadmap_progress_hook.ts': roadmapProgressMain as ConcernMain,
|
|
57
|
+
'src/scripts/onboarding_gate_hook.ts': onboardingGateMain as ConcernMain,
|
|
58
|
+
'src/scripts/context_hygiene_hook.ts': contextHygieneMain as ConcernMain,
|
|
59
|
+
'src/scripts/verify_before_complete_hook.ts': verifyBeforeCompleteMain as ConcernMain,
|
|
60
|
+
'src/scripts/minimal_safe_diff_hook.ts': minimalSafeDiffMain as ConcernMain,
|
|
61
|
+
'src/scripts/injection_scan_hook.ts': injectionScanMain as ConcernMain,
|
|
62
|
+
'src/scripts/memory_learn_hook.ts': memoryLearnMain as ConcernMain,
|
|
63
|
+
'src/scripts/first_run_gate_hook.ts': firstRunGateMain as ConcernMain,
|
|
64
|
+
'src/scripts/profile_staleness_hook.ts': profileStalenessMain as ConcernMain,
|
|
65
|
+
'src/scripts/wrapper_freshness_hook.ts': wrapperFreshnessMain as ConcernMain,
|
|
66
|
+
'src/scripts/surface_probe_hook.ts': surfaceProbeMain as ConcernMain,
|
|
67
|
+
'src/scripts/team_review_gate_hook.ts': teamReviewGateMain as ConcernMain,
|
|
68
|
+
'src/scripts/pr_url_reminder_hook.ts': prUrlReminderMain as ConcernMain,
|
|
69
|
+
'src/scripts/session_canary_hook.ts': sessionCanaryMain as ConcernMain,
|
|
70
|
+
'src/scripts/hooks/block_no_verify.ts': blockNoVerifyMain as ConcernMain,
|
|
71
|
+
'src/scripts/hooks/block_kernel_rule_writes.ts': blockKernelRuleWritesMain as ConcernMain,
|
|
72
|
+
'src/scripts/hooks/rtk_wrap_hook.ts': rtkWrapMain as ConcernMain,
|
|
73
|
+
'src/scripts/hooks/design_slop_hook.ts': designSlopMain as ConcernMain,
|
|
74
|
+
'src/scripts/hooks/code_graph_nudge_hook.ts': codeGraphNudgeMain as ConcernMain,
|
|
75
|
+
};
|
|
@@ -24,6 +24,7 @@ import path from "node:path";
|
|
|
24
24
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
25
25
|
import { type DesignContext } from "../design_slop_rules.js";
|
|
26
26
|
import { loadDesignContext, scanFile } from "../lint_design_slop.js";
|
|
27
|
+
import { readHookStdin } from "./hook_stdin.js";
|
|
27
28
|
|
|
28
29
|
const SETTINGS_FILE = ".agent-settings.yml";
|
|
29
30
|
const EXIT_ALLOW = 0;
|
|
@@ -109,11 +110,7 @@ function writeState(root: string, state: Record<string, number>): void {
|
|
|
109
110
|
}
|
|
110
111
|
|
|
111
112
|
function readStdin(): string {
|
|
112
|
-
|
|
113
|
-
return fs.readFileSync(0, "utf-8");
|
|
114
|
-
} catch {
|
|
115
|
-
return "";
|
|
116
|
-
}
|
|
113
|
+
return readHookStdin();
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
export function main(): number {
|
|
@@ -175,7 +172,13 @@ export function main(): number {
|
|
|
175
172
|
return EXIT_WARN;
|
|
176
173
|
}
|
|
177
174
|
|
|
175
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
176
|
+
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
177
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
178
178
|
function _isCliEntry(): boolean {
|
|
179
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
179
182
|
if (process.argv[1] === undefined) {
|
|
180
183
|
return false;
|
|
181
184
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dispatch_entry — bundle entry point for the precompiled hook dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* road-to-credible-install Phase 1: `npm run build:hooks` bundles this file
|
|
5
|
+
* (dispatcher + concern registry + every concern module) into
|
|
6
|
+
* `dist/hooks/dispatch.js` so a hook event costs ONE node start — no tsx,
|
|
7
|
+
* no per-concern re-spawn. Invoked either
|
|
8
|
+
* - directly: `node dist/hooks/dispatch.js --platform … --event …`, or
|
|
9
|
+
* - in-process from the CLI's native `dispatch:hook` route (dynamic
|
|
10
|
+
* import; the CLI process itself then runs the whole dispatch).
|
|
11
|
+
*/
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
|
|
15
|
+
import { main } from './dispatch_hook.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Direct-invocation detection. Under the esbuild bundle, EVERY inlined
|
|
19
|
+
* module's `import.meta.url` is the bundle file — so a plain
|
|
20
|
+
* argv[1]-vs-self comparison would make the CLI-entry guards of ALL
|
|
21
|
+
* inlined modules (lint scripts, sidecars, …) false-fire at import time
|
|
22
|
+
* and hijack the dispatch argv. The build banner therefore detects
|
|
23
|
+
* `node dist/hooks/dispatch.js` BEFORE any module code runs, sets the
|
|
24
|
+
* global marker, and rewrites argv[1] to a sentinel so no inlined guard
|
|
25
|
+
* can match. Only this entry consults the marker. The plain comparison
|
|
26
|
+
* below covers the unbundled path (`tsx src/scripts/hooks/dispatch_entry.ts`).
|
|
27
|
+
*/
|
|
28
|
+
const _selfPath = fileURLToPath(import.meta.url);
|
|
29
|
+
const _invokedDirectly =
|
|
30
|
+
(globalThis as { __AC_HOOKS_BUNDLE_DIRECT?: boolean }).__AC_HOOKS_BUNDLE_DIRECT === true ||
|
|
31
|
+
(process.argv[1] !== undefined && path.resolve(process.argv[1]) === path.resolve(_selfPath));
|
|
32
|
+
|
|
33
|
+
if (_invokedDirectly) {
|
|
34
|
+
process.exitCode = main(process.argv.slice(2));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { main };
|
|
@@ -42,6 +42,11 @@ import {
|
|
|
42
42
|
is_replay_mode,
|
|
43
43
|
} from "./state_io.js";
|
|
44
44
|
import { log_dispatch_issue, fix_hint } from "./dispatch_issues.js";
|
|
45
|
+
import { CONCERN_REGISTRY, type ConcernMain } from "./concern_registry.js";
|
|
46
|
+
import {
|
|
47
|
+
setHookStdinOverride,
|
|
48
|
+
clearHookStdinOverride,
|
|
49
|
+
} from "./hook_stdin.js";
|
|
45
50
|
|
|
46
51
|
// Free-form JSON values flow through every helper here; a documented
|
|
47
52
|
// alias keeps the surface honest without `any` (ADR-200 § strict TS).
|
|
@@ -55,11 +60,14 @@ export type JsonValue =
|
|
|
55
60
|
export type JsonObject = { [key: string]: JsonValue };
|
|
56
61
|
|
|
57
62
|
// src/scripts/hooks/dispatch_hook.ts → parents[3] is the repo root.
|
|
63
|
+
// Bundled (dist/hooks/dispatch.js) the module sits two levels below the repo
|
|
64
|
+
// root; under tsx (src/scripts/hooks/) it sits three. The `__AGENT_CONFIG_BUNDLE__`
|
|
65
|
+
// sentinel (esbuild --define) picks the right depth (see cmd_migrate.ts).
|
|
66
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
67
|
+
const _IN_BUNDLE = typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__;
|
|
58
68
|
const REPO_ROOT = path.resolve(
|
|
59
69
|
path.dirname(fileURLToPath(import.meta.url)),
|
|
60
|
-
"..",
|
|
61
|
-
"..",
|
|
62
|
-
"..",
|
|
70
|
+
...(_IN_BUNDLE ? ["..", ".."] : ["..", "..", ".."]),
|
|
63
71
|
);
|
|
64
72
|
const MANIFEST_PATH = path.join(REPO_ROOT, "src", "scripts", "hook_manifest.yaml");
|
|
65
73
|
|
|
@@ -471,7 +479,115 @@ function _resolve_tsx_invocation(
|
|
|
471
479
|
* through `tsx` (resolved from the package's `node_modules/.bin`, falling
|
|
472
480
|
* back to `npx tsx`), mirroring how `run.ts` runs its `.ts` twins.
|
|
473
481
|
*/
|
|
482
|
+
/**
|
|
483
|
+
* Single-process dispatch (road-to-credible-install Phase 1): run a concern
|
|
484
|
+
* IN-PROCESS via the static registry instead of re-spawning a per-concern
|
|
485
|
+
* interpreter. Mirrors the child-process contract exactly — stdin via the
|
|
486
|
+
* hook_stdin override, argv swap, cwd = workspace, hardened env, captured
|
|
487
|
+
* stdout/stderr, crash → rc 3 (the caller applies the fail-open /
|
|
488
|
+
* fail-closed reduction unchanged).
|
|
489
|
+
*
|
|
490
|
+
* Escape hatch: AGENT_CONFIG_HOOKS_ISOLATED=1 forces the historical
|
|
491
|
+
* spawn-per-concern path (also used by the bench harness for A/B numbers).
|
|
492
|
+
*
|
|
493
|
+
* Known trade-off vs the spawn path: the 30 s kill-timeout cannot preempt
|
|
494
|
+
* in-process synchronous code. Concerns are repo-owned, budget-capped and
|
|
495
|
+
* fail-open; the latency budget gate (hook-latency-budget.json) is the
|
|
496
|
+
* standing regression net.
|
|
497
|
+
*/
|
|
498
|
+
function _run_concern_inproc(
|
|
499
|
+
main_fn: ConcernMain,
|
|
500
|
+
concern: ConcernDef,
|
|
501
|
+
envelope: JsonObject,
|
|
502
|
+
): RunResult {
|
|
503
|
+
const scriptAbs = path.join(REPO_ROOT, String(concern["script"]));
|
|
504
|
+
const argsList = Array.isArray(concern["args"])
|
|
505
|
+
? concern["args"].map((a) => String(a))
|
|
506
|
+
: [];
|
|
507
|
+
argsList.push("--platform", String(envelope["platform"] || "generic"));
|
|
508
|
+
const workspace = String(envelope["workspace_root"] || process.cwd());
|
|
509
|
+
|
|
510
|
+
let out = "";
|
|
511
|
+
let err = "";
|
|
512
|
+
type WriteFn = typeof process.stdout.write;
|
|
513
|
+
const makeCapture =
|
|
514
|
+
(sink: (s: string) => void): WriteFn =>
|
|
515
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
516
|
+
((chunk: any, enc?: any, cb?: any): boolean => {
|
|
517
|
+
sink(typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf-8"));
|
|
518
|
+
const callback = typeof enc === "function" ? enc : cb;
|
|
519
|
+
if (typeof callback === "function") callback();
|
|
520
|
+
return true;
|
|
521
|
+
}) as WriteFn;
|
|
522
|
+
|
|
523
|
+
const prevStdoutWrite = process.stdout.write;
|
|
524
|
+
const prevStderrWrite = process.stderr.write;
|
|
525
|
+
const prevArgv = process.argv;
|
|
526
|
+
const prevCwd = process.cwd();
|
|
527
|
+
const prevEnv = { ...process.env };
|
|
528
|
+
|
|
529
|
+
const started = performance.now();
|
|
530
|
+
let rc = 0;
|
|
531
|
+
setHookStdinOverride(_compactJsonDumps(envelope));
|
|
532
|
+
process.stdout.write = makeCapture((s) => {
|
|
533
|
+
out += s;
|
|
534
|
+
});
|
|
535
|
+
process.stderr.write = makeCapture((s) => {
|
|
536
|
+
err += s;
|
|
537
|
+
});
|
|
538
|
+
try {
|
|
539
|
+
process.argv = [prevArgv[0] as string, scriptAbs, ...argsList];
|
|
540
|
+
// Same env-hardening the spawn path applied — concerns may spawn their
|
|
541
|
+
// own children (dashboard regen, git), which inherit process.env.
|
|
542
|
+
const hardened = hardenedSpawnEnv({ AGENT_CONFIG_PACKAGE_ROOT: REPO_ROOT });
|
|
543
|
+
for (const k of Object.keys(process.env)) {
|
|
544
|
+
if (!(k in hardened)) delete process.env[k];
|
|
545
|
+
}
|
|
546
|
+
Object.assign(process.env, hardened);
|
|
547
|
+
if (workspace !== prevCwd && _isDir(workspace)) {
|
|
548
|
+
process.chdir(workspace);
|
|
549
|
+
}
|
|
550
|
+
const result = main_fn(argsList);
|
|
551
|
+
rc = typeof result === "number" ? result : 0;
|
|
552
|
+
} catch (exc) {
|
|
553
|
+
rc = 3;
|
|
554
|
+
const msg = exc instanceof Error ? (exc.stack ?? exc.message) : String(exc);
|
|
555
|
+
err += `${String(concern["name"])}: ${msg}\n`;
|
|
556
|
+
log_dispatch_issue(
|
|
557
|
+
workspace,
|
|
558
|
+
String(concern["name"] || "unknown"),
|
|
559
|
+
"execution_failed",
|
|
560
|
+
`in-process concern crashed: ${exc instanceof Error ? exc.message : String(exc)}`,
|
|
561
|
+
fix_hint(),
|
|
562
|
+
);
|
|
563
|
+
} finally {
|
|
564
|
+
process.stdout.write = prevStdoutWrite;
|
|
565
|
+
process.stderr.write = prevStderrWrite;
|
|
566
|
+
process.argv = prevArgv;
|
|
567
|
+
for (const k of Object.keys(process.env)) {
|
|
568
|
+
if (!(k in prevEnv)) delete process.env[k];
|
|
569
|
+
}
|
|
570
|
+
Object.assign(process.env, prevEnv);
|
|
571
|
+
try {
|
|
572
|
+
if (process.cwd() !== prevCwd) process.chdir(prevCwd);
|
|
573
|
+
} catch {
|
|
574
|
+
/* original cwd vanished — keep going, fail-open */
|
|
575
|
+
}
|
|
576
|
+
clearHookStdinOverride();
|
|
577
|
+
}
|
|
578
|
+
const elapsed = Math.floor(performance.now() - started);
|
|
579
|
+
return { rc, stderr: err, stdout: out, duration_ms: elapsed };
|
|
580
|
+
}
|
|
581
|
+
|
|
474
582
|
function _run_concern(concern: ConcernDef, envelope: JsonObject): RunResult {
|
|
583
|
+
// In-process fast path — the default whenever the concern is in the
|
|
584
|
+
// static registry (all manifest concerns; parity is CI-enforced).
|
|
585
|
+
if (process.env["AGENT_CONFIG_HOOKS_ISOLATED"] !== "1") {
|
|
586
|
+
const inproc = CONCERN_REGISTRY[String(concern["script"])];
|
|
587
|
+
if (inproc !== undefined) {
|
|
588
|
+
return _run_concern_inproc(inproc, concern, envelope);
|
|
589
|
+
}
|
|
590
|
+
}
|
|
475
591
|
const script = path.join(REPO_ROOT, String(concern["script"]));
|
|
476
592
|
const argsList = Array.isArray(concern["args"])
|
|
477
593
|
? concern["args"].map((a) => String(a))
|
|
@@ -654,6 +770,57 @@ function _write_feedback(
|
|
|
654
770
|
}
|
|
655
771
|
}
|
|
656
772
|
|
|
773
|
+
/**
|
|
774
|
+
* Checkable-rule trip counting (road-to-credible-install Phase 6, scoped P3
|
|
775
|
+
* cut): every concern that returns BLOCK (1) or WARN (2) — a violation the
|
|
776
|
+
* gate actually caught — increments a per-concern counter in
|
|
777
|
+
* `agents/runtime/state/rule-trips.json`. Extends the existing dispatcher
|
|
778
|
+
* feedback machinery only; the evaluator/umbrella surfaces read this file.
|
|
779
|
+
*
|
|
780
|
+
* PII-exclusion-by-construction: the schema carries ONLY concern ids,
|
|
781
|
+
* integer counters, and ISO dates — no field capable of holding free-form
|
|
782
|
+
* content, prompt text, or file bodies. Never widen it.
|
|
783
|
+
*
|
|
784
|
+
* Fail-open (a broken counter must never affect dispatch), skipped in
|
|
785
|
+
* replay mode like the feedback dir.
|
|
786
|
+
*/
|
|
787
|
+
function _record_rule_trips(envelope: JsonObject, entries: FeedbackEntry[]): void {
|
|
788
|
+
if (is_replay_mode()) return;
|
|
789
|
+
const tripped = entries.filter(
|
|
790
|
+
(e) => e["exit_code"] === EXIT_BLOCK || e["exit_code"] === EXIT_WARN,
|
|
791
|
+
);
|
|
792
|
+
if (tripped.length === 0) return;
|
|
793
|
+
try {
|
|
794
|
+
const workspace = String(envelope["workspace_root"] || process.cwd());
|
|
795
|
+
const state_dir = path.join(workspace, "agents", "runtime", "state");
|
|
796
|
+
const target = path.join(state_dir, "rule-trips.json");
|
|
797
|
+
fs.mkdirSync(state_dir, { recursive: true });
|
|
798
|
+
let doc: JsonObject = { schema_version: 1, concerns: {} };
|
|
799
|
+
try {
|
|
800
|
+
const parsed = JSON.parse(fs.readFileSync(target, "utf-8")) as JsonObject;
|
|
801
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) doc = parsed;
|
|
802
|
+
} catch {
|
|
803
|
+
/* absent or corrupt → fresh counter file */
|
|
804
|
+
}
|
|
805
|
+
const concerns = (doc["concerns"] ?? {}) as Record<string, JsonObject>;
|
|
806
|
+
const today = _now_iso().slice(0, 10);
|
|
807
|
+
for (const e of tripped) {
|
|
808
|
+
const name = String(e["concern"]);
|
|
809
|
+
const prev = (concerns[name] ?? { block: 0, warn: 0 }) as JsonObject;
|
|
810
|
+
concerns[name] = {
|
|
811
|
+
block: (Number(prev["block"]) || 0) + (e["exit_code"] === EXIT_BLOCK ? 1 : 0),
|
|
812
|
+
warn: (Number(prev["warn"]) || 0) + (e["exit_code"] === EXIT_WARN ? 1 : 0),
|
|
813
|
+
last_trip: today,
|
|
814
|
+
};
|
|
815
|
+
}
|
|
816
|
+
doc["schema_version"] = 1;
|
|
817
|
+
doc["concerns"] = concerns;
|
|
818
|
+
atomic_write_json(target, doc);
|
|
819
|
+
} catch {
|
|
820
|
+
/* fail-open — counters are observability, never dispatch-critical */
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
|
|
657
824
|
function _parse_args(argv: string[]): Args {
|
|
658
825
|
const args: Args = {
|
|
659
826
|
platform: "",
|
|
@@ -850,6 +1017,7 @@ export function main(argv?: string[]): number {
|
|
|
850
1017
|
}
|
|
851
1018
|
const final_rc = _reduce(rcs);
|
|
852
1019
|
_write_feedback(envelope, session_id, feedback_entries, final_rc, started_at);
|
|
1020
|
+
_record_rule_trips(envelope, feedback_entries);
|
|
853
1021
|
if (context_blocks.length > 0 && final_rc === EXIT_ALLOW) {
|
|
854
1022
|
process.stdout.write(context_blocks.join("\n\n") + "\n");
|
|
855
1023
|
}
|
|
@@ -877,7 +1045,12 @@ function _readStdin(): string {
|
|
|
877
1045
|
}
|
|
878
1046
|
}
|
|
879
1047
|
|
|
1048
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
1049
|
+
// every module shares the bundle's `import.meta.url` (declare at top of file).
|
|
880
1050
|
function _isCliEntry(): boolean {
|
|
1051
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
1052
|
+
return false;
|
|
1053
|
+
}
|
|
881
1054
|
if (process.argv[1] === undefined) {
|
|
882
1055
|
return false;
|
|
883
1056
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hook_stdin — the single stdin seam for hook concern scripts.
|
|
3
|
+
*
|
|
4
|
+
* road-to-credible-install Phase 1 (single-process dispatch): concern
|
|
5
|
+
* scripts historically read their JSON envelope with `fs.readFileSync(0)`.
|
|
6
|
+
* That only works when each concern is its own child process. Under the
|
|
7
|
+
* in-process dispatcher (dist/hooks bundle) all concerns run inside ONE
|
|
8
|
+
* node process whose fd 0 carries the PLATFORM payload, already consumed
|
|
9
|
+
* by the dispatcher — so the dispatcher injects the per-concern envelope
|
|
10
|
+
* here instead.
|
|
11
|
+
*
|
|
12
|
+
* Contract:
|
|
13
|
+
* - Standalone invocation (a concern run directly as its own process —
|
|
14
|
+
* the historical path, still supported): no override is set, and
|
|
15
|
+
* `readHookStdin()` falls through to `fs.readFileSync(0, 'utf-8')`.
|
|
16
|
+
* - In-process invocation: the dispatcher calls
|
|
17
|
+
* `setHookStdinOverride(raw)` before the concern's `main()` and
|
|
18
|
+
* `clearHookStdinOverride()` after. Nesting is not supported (concerns
|
|
19
|
+
* never dispatch concerns).
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
|
|
23
|
+
let _override: string | null = null;
|
|
24
|
+
|
|
25
|
+
export function setHookStdinOverride(raw: string): void {
|
|
26
|
+
_override = raw;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function clearHookStdinOverride(): void {
|
|
30
|
+
_override = null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** TTY-safe stdin read: injected override first, else fd 0, else "". */
|
|
34
|
+
export function readHookStdin(): string {
|
|
35
|
+
if (_override !== null) return _override;
|
|
36
|
+
try {
|
|
37
|
+
if (process.stdin.isTTY) return '';
|
|
38
|
+
return fs.readFileSync(0, 'utf-8');
|
|
39
|
+
} catch {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
}
|