@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,210 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Debt ratchet for rule backstops that are red on arrival.
|
|
4
|
+
*
|
|
5
|
+
* Wiring the `enforced_by:` validators into CI (`rule-backstops.yml`) surfaced
|
|
6
|
+
* something the coverage number could not: **five of them were already failing**,
|
|
7
|
+
* and had been, invisibly, because no workflow ran them. A rule declared a
|
|
8
|
+
* backstop; the backstop existed; the backstop was red; nothing said so.
|
|
9
|
+
*
|
|
10
|
+
* So the established pattern applies — the one the decision-homing work already
|
|
11
|
+
* uses and the council endorsed: **baseline the legacy, enforce the boundary.**
|
|
12
|
+
* Each gate's current finding count is committed. The count may fall freely; it
|
|
13
|
+
* may not rise. New violations fail, existing debt is visible and counted, and
|
|
14
|
+
* nothing is silently tolerated.
|
|
15
|
+
*
|
|
16
|
+
* **The baseline is now 0 across all five gates.** The 37 findings were cleared
|
|
17
|
+
* in a follow-up pass, so this file no longer records debt — it holds the line at
|
|
18
|
+
* zero. Keeping the ratchet after the cleanup is the point: it is what stops the
|
|
19
|
+
* counts creeping back, and the mechanism is identical whether the baseline is 37
|
|
20
|
+
* or 0.
|
|
21
|
+
*
|
|
22
|
+
* Worth recording, because it changes how the next such number should be read:
|
|
23
|
+
* roughly two thirds of the 37 were never violations. `CREDITS.md` was flagged
|
|
24
|
+
* for the license-required attribution that `source-confidentiality` explicitly
|
|
25
|
+
* exempts. A checklist row naming five ecosystems on ONE line read as
|
|
26
|
+
* PHP-specific because only the PHP family carried a plain-language window hint.
|
|
27
|
+
* An archived acceptance criterion was flagged for the source names it quotes in
|
|
28
|
+
* order to assert their absence. Wiring a gate proves that it runs; it does not
|
|
29
|
+
* prove its findings are real. That takes reading them one at a time.
|
|
30
|
+
*
|
|
31
|
+
* What this deliberately is NOT: a `continue-on-error` step. That is a WARN
|
|
32
|
+
* wearing a gate's clothes, and removing exactly that confusion is why this
|
|
33
|
+
* workflow exists.
|
|
34
|
+
*
|
|
35
|
+
* Usage:
|
|
36
|
+
* ./scripts-run src/scripts/check_backstop_debt # ratchet (CI)
|
|
37
|
+
* ./scripts-run src/scripts/check_backstop_debt --write-baseline
|
|
38
|
+
* ./scripts-run src/scripts/check_backstop_debt --json
|
|
39
|
+
*
|
|
40
|
+
* Exit codes: 0 held or improved · 1 a count rose · 2 usage/env error.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import { spawnSync } from 'node:child_process';
|
|
44
|
+
import * as fs from 'node:fs';
|
|
45
|
+
import * as path from 'node:path';
|
|
46
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
47
|
+
|
|
48
|
+
const _HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
49
|
+
const REPO_ROOT = path.resolve(_HERE, '..', '..');
|
|
50
|
+
const BASELINE = path.join(REPO_ROOT, 'internal', 'reports', 'rule-backstop-debt.json');
|
|
51
|
+
|
|
52
|
+
export interface Gate {
|
|
53
|
+
/** Script stem under `src/scripts/`. */
|
|
54
|
+
script: string;
|
|
55
|
+
/** The rule whose `enforced_by:` names it — so a reader knows what is unguarded. */
|
|
56
|
+
rule: string;
|
|
57
|
+
/**
|
|
58
|
+
* Extracts the finding count from the gate's own output.
|
|
59
|
+
*
|
|
60
|
+
* Explicit per gate rather than a shared heuristic: these five print their
|
|
61
|
+
* totals in five different shapes, and a regex that guesses would silently
|
|
62
|
+
* read 0 the day a gate changes its wording — turning a rising count into a
|
|
63
|
+
* passing build, which is the failure mode this file exists to prevent.
|
|
64
|
+
*/
|
|
65
|
+
count: RegExp;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const GATES: readonly Gate[] = [
|
|
69
|
+
{ script: 'lint_framework_leakage', rule: 'framework-neutrality-in-generic-skills', count: /^(\d+) hits across \d+ files/m },
|
|
70
|
+
{ script: 'check_no_roadmap_refs', rule: 'no-roadmap-references', count: /Found (\d+) roadmap reference\(s\)/ },
|
|
71
|
+
{ script: 'check_council_references', rule: 'no-roadmap-references', count: /(\d+) forbidden council reference\(s\)/ },
|
|
72
|
+
{ script: 'check_no_external_sources', rule: 'source-confidentiality', count: /(\d+) external-source reference\(s\)/ },
|
|
73
|
+
{ script: 'check_token_optimizer_freshness', rule: 'token-optimizer-maintenance', count: /(\d+) drift signal\(s\)/ },
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
export interface Measured {
|
|
77
|
+
script: string;
|
|
78
|
+
rule: string;
|
|
79
|
+
findings: number;
|
|
80
|
+
exit_code: number;
|
|
81
|
+
/** True when the gate ran but its count pattern did not match — never read as 0. */
|
|
82
|
+
unparsed: boolean;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function measure(gate: Gate, repo: string = REPO_ROOT): Measured {
|
|
86
|
+
const r = spawnSync('./scripts-run', [`src/scripts/${gate.script}`], {
|
|
87
|
+
cwd: repo,
|
|
88
|
+
encoding: 'utf-8',
|
|
89
|
+
env: { ...process.env, NO_COLOR: '1' },
|
|
90
|
+
});
|
|
91
|
+
const out = `${r.stdout ?? ''}\n${r.stderr ?? ''}`;
|
|
92
|
+
const m = gate.count.exec(out);
|
|
93
|
+
// A clean gate legitimately prints no total. Only treat a MISSING count as
|
|
94
|
+
// unparsed when the gate actually failed — otherwise a green run reads as
|
|
95
|
+
// broken instrumentation.
|
|
96
|
+
const failed = (r.status ?? 0) !== 0;
|
|
97
|
+
return {
|
|
98
|
+
script: gate.script,
|
|
99
|
+
rule: gate.rule,
|
|
100
|
+
findings: m ? Number(m[1]) : 0,
|
|
101
|
+
exit_code: r.status ?? 0,
|
|
102
|
+
unparsed: failed && m === null,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function main(argv: string[]): number {
|
|
107
|
+
const as_json = argv.includes('--json');
|
|
108
|
+
const write = argv.includes('--write-baseline');
|
|
109
|
+
|
|
110
|
+
const measured = GATES.map((g) => measure(g));
|
|
111
|
+
|
|
112
|
+
if (as_json) {
|
|
113
|
+
process.stdout.write(JSON.stringify({ gates: measured }, null, 2) + '\n');
|
|
114
|
+
return 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (write) {
|
|
118
|
+
fs.mkdirSync(path.dirname(BASELINE), { recursive: true });
|
|
119
|
+
fs.writeFileSync(
|
|
120
|
+
BASELINE,
|
|
121
|
+
JSON.stringify(
|
|
122
|
+
{
|
|
123
|
+
_doc:
|
|
124
|
+
'Per-gate finding counts for the rule backstops wired into CI by ' +
|
|
125
|
+
'rule-backstops.yml. Counts may FALL freely; a rise fails the build. These ' +
|
|
126
|
+
'gates were red on arrival (37 findings) because no workflow had ever run ' +
|
|
127
|
+
'them; that debt is now cleared and the baseline holds the line at 0. A ' +
|
|
128
|
+
'non-zero number here is a rule whose declared backstop is not currently ' +
|
|
129
|
+
'clean. Regenerate with --write-baseline only when the change is deliberate.',
|
|
130
|
+
gates: Object.fromEntries(measured.map((m) => [m.script, { rule: m.rule, findings: m.findings }])),
|
|
131
|
+
total: measured.reduce((a, m) => a + m.findings, 0),
|
|
132
|
+
},
|
|
133
|
+
null,
|
|
134
|
+
2,
|
|
135
|
+
) + '\n',
|
|
136
|
+
);
|
|
137
|
+
process.stdout.write(`✅ wrote baseline → ${path.relative(REPO_ROOT, BASELINE)}\n`);
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!fs.existsSync(BASELINE)) {
|
|
142
|
+
process.stderr.write(
|
|
143
|
+
`❌ check_backstop_debt: no baseline at ${path.relative(REPO_ROOT, BASELINE)}; run --write-baseline\n`,
|
|
144
|
+
);
|
|
145
|
+
return 2;
|
|
146
|
+
}
|
|
147
|
+
const base = JSON.parse(fs.readFileSync(BASELINE, 'utf-8')).gates as Record<string, { findings: number }>;
|
|
148
|
+
|
|
149
|
+
const regressions: string[] = [];
|
|
150
|
+
const improvements: string[] = [];
|
|
151
|
+
for (const m of measured) {
|
|
152
|
+
if (m.unparsed) {
|
|
153
|
+
regressions.push(
|
|
154
|
+
`${m.script}: failed (exit ${m.exit_code}) but its finding count could not be read — ` +
|
|
155
|
+
`the count pattern no longer matches its output. Fix the pattern; do not assume 0.`,
|
|
156
|
+
);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const was = base[m.script]?.findings;
|
|
160
|
+
if (was === undefined) {
|
|
161
|
+
regressions.push(`${m.script}: not in the baseline — add it with --write-baseline`);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (m.findings > was) {
|
|
165
|
+
regressions.push(`${m.script} (${m.rule}): findings rose ${was} → ${m.findings}`);
|
|
166
|
+
} else if (m.findings < was) {
|
|
167
|
+
improvements.push(`${m.script} (${m.rule}): ${was} → ${m.findings}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const total = measured.reduce((a, m) => a + m.findings, 0);
|
|
172
|
+
process.stdout.write(
|
|
173
|
+
`rule-backstop debt · ${total} finding(s) across ${measured.filter((m) => m.findings > 0).length} red gate(s)\n`,
|
|
174
|
+
);
|
|
175
|
+
for (const m of measured) {
|
|
176
|
+
if (m.findings > 0) process.stdout.write(` · ${m.script} (${m.rule}): ${m.findings}\n`);
|
|
177
|
+
}
|
|
178
|
+
for (const i of improvements) process.stdout.write(` ✅ improved — ${i}\n`);
|
|
179
|
+
|
|
180
|
+
if (regressions.length > 0) {
|
|
181
|
+
process.stderr.write('❌ rule-backstop debt ratchet:\n');
|
|
182
|
+
for (const r of regressions) process.stderr.write(` · ${r}\n`);
|
|
183
|
+
process.stderr.write(
|
|
184
|
+
' The baseline is 0 — these gates are clean, so a rise is a NEW violation, not inherited debt.\n' +
|
|
185
|
+
' Fix the finding, or re-baseline with --write-baseline if the change is deliberate.\n',
|
|
186
|
+
);
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
if (improvements.length > 0) {
|
|
190
|
+
process.stdout.write(' Baseline is now loose — regenerate with --write-baseline to lock the improvement.\n');
|
|
191
|
+
}
|
|
192
|
+
process.stdout.write('✅ rule-backstop debt ratchet holds\n');
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Main-guard (realpath-compared, mirrors the repo convention).
|
|
197
|
+
if (process.argv[1] !== undefined) {
|
|
198
|
+
try {
|
|
199
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
200
|
+
const argv1 = fs.realpathSync(path.resolve(process.argv[1]));
|
|
201
|
+
if (here === argv1) {
|
|
202
|
+
process.exit(main(process.argv.slice(2)));
|
|
203
|
+
}
|
|
204
|
+
} catch {
|
|
205
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
206
|
+
if (import.meta.url === argvUrl) {
|
|
207
|
+
process.exit(main(process.argv.slice(2)));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Guard against build-machine path leakage in the tracked install bundle.
|
|
4
|
+
*
|
|
5
|
+
* road-to-feedback-9.2.0-followups Phase 4.1. Three 9.1 commits
|
|
6
|
+
* (f8752443b, 5933bf1a9, f30adb5a1) each rebuilt `dist/install/install.mjs`
|
|
7
|
+
* solely to strip a leaked build-environment path esbuild had baked into its
|
|
8
|
+
* per-module `// <path>` boundary comments: a worktree-relative `../../../
|
|
9
|
+
* node_modules/...` hop, a repo-relative `../agent-config/node_modules/...`
|
|
10
|
+
* hop, and a full `/Users/<name>/.../node_modules/...` absolute path. Each
|
|
11
|
+
* fix was a manual rebuild-and-diff after the fact; this guard makes the
|
|
12
|
+
* class fail the build instead, so a future leak cannot merge silently.
|
|
13
|
+
*
|
|
14
|
+
* Every pattern below is scoped to avoid flagging legitimate bundle content:
|
|
15
|
+
* the bundle's own emitted runtime strings use relative forms only (e.g.
|
|
16
|
+
* `"./node_modules/@event4u/agent-config/plugin/agent-config"`, a real
|
|
17
|
+
* consumer-facing plugin-manifest path), and esbuild's per-module registry
|
|
18
|
+
* keys are bare `node_modules/<pkg>/...` (no leading `/` or `../`) — neither
|
|
19
|
+
* shape trips any pattern here.
|
|
20
|
+
*
|
|
21
|
+
* - `macos-linux-home` — absolute `/Users/<name>/…` or
|
|
22
|
+
* `/home/<name>/…`, i.e. a real machine's home directory. Requires at
|
|
23
|
+
* least one path segment after the username so a bare `/Users/` or
|
|
24
|
+
* `/home/` mention (unlikely, but not impossible in prose) does not
|
|
25
|
+
* match on its own.
|
|
26
|
+
* - `private-or-opt-root` — an absolute `/private/…` (macOS's
|
|
27
|
+
* `/var` → `/private/var` realpath) or `/opt/…` (common CI-runner tool
|
|
28
|
+
* root, e.g. GitHub Actions' hostedtoolcache) path.
|
|
29
|
+
* - `windows-drive` — an absolute Windows path (`C:\…`).
|
|
30
|
+
* - `worktree-path` — a `.claude/worktrees/…` path. This
|
|
31
|
+
* package's own git-worktree convention (`worktree-lifecycle` skill) —
|
|
32
|
+
* it can never legitimately appear in a shipped consumer artifact.
|
|
33
|
+
* - `parent-relative-node-modules` — any `../`-escaping path that reaches
|
|
34
|
+
* a `node_modules/` directory, however many hops or intermediate
|
|
35
|
+
* segments (`../../../node_modules/…`, `../agent-config/node_modules/…`).
|
|
36
|
+
* A legitimate bundled module reference never needs to climb out of the
|
|
37
|
+
* repo root via string literals — node's own resolution algorithm
|
|
38
|
+
* handles that internally, not via baked-in `../` path text.
|
|
39
|
+
* - `absolute-node-modules` — any OTHER absolute path (not already
|
|
40
|
+
* caught by the three rules above) reaching a `node_modules/` directory.
|
|
41
|
+
* The negative lookbehind excludes `./node_modules/…` and mid-identifier
|
|
42
|
+
* slashes so a legitimate relative reference is never flagged.
|
|
43
|
+
* - `absolute-sourcemap` — a `sourceMappingURL=` comment pointing
|
|
44
|
+
* at an absolute path instead of a bundle-relative filename (the shape
|
|
45
|
+
* `.map` files should always use — see `dist/install/*.js.map`, whose
|
|
46
|
+
* `sources` field is repo-relative, e.g. `../../src/install/atomic.ts`).
|
|
47
|
+
*
|
|
48
|
+
* Usage:
|
|
49
|
+
* tsx src/scripts/check_bundle_path_leakage.ts
|
|
50
|
+
* tsx src/scripts/check_bundle_path_leakage.ts --quiet
|
|
51
|
+
* tsx src/scripts/check_bundle_path_leakage.ts <file> [<file> ...]
|
|
52
|
+
*
|
|
53
|
+
* Exit codes: 0 = clean, 1 = leak found, 2 = usage error.
|
|
54
|
+
*/
|
|
55
|
+
import { spawnSync } from 'node:child_process';
|
|
56
|
+
import * as fs from 'node:fs';
|
|
57
|
+
import * as path from 'node:path';
|
|
58
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
59
|
+
|
|
60
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
61
|
+
const REPO = path.resolve(path.dirname(_HERE), '..', '..');
|
|
62
|
+
|
|
63
|
+
// Tracked directories that may hold a build-generated bundle. Only
|
|
64
|
+
// `dist/install/` is force-included in `.gitignore` today (`!/dist/install/`);
|
|
65
|
+
// `dist/hooks/` and `dist/mcp/` are listed defensively in case a future
|
|
66
|
+
// change tracks them too — `git ls-files` on an untracked directory returns
|
|
67
|
+
// nothing, so listing an as-yet-untracked root here is always safe.
|
|
68
|
+
const BUNDLE_ROOTS: readonly string[] = ['dist/install', 'dist/hooks', 'dist/mcp'];
|
|
69
|
+
|
|
70
|
+
interface LeakPattern {
|
|
71
|
+
readonly name: string;
|
|
72
|
+
readonly re: RegExp;
|
|
73
|
+
readonly hint: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Every regex carries the `g` flag (all hits scanned, not just the first)
|
|
77
|
+
// and excludes `\s'"` )` from its "rest of the path" class so a match never
|
|
78
|
+
// swallows past the end of a quoted string / comment / parenthesized call.
|
|
79
|
+
const LEAK_PATTERNS: readonly LeakPattern[] = [
|
|
80
|
+
{
|
|
81
|
+
name: 'macos-linux-home',
|
|
82
|
+
re: /\/(?:Users|home)\/[^/\s'"`)]+\/[^\s'"`)]*/g,
|
|
83
|
+
hint: 'rebuild from a clean, non-worktree checkout after a fresh `npm ci`',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'private-or-opt-root',
|
|
87
|
+
re: /(?:^|[^\w.])\/(?:private|opt)\/[^\s'"`)]*/g,
|
|
88
|
+
hint: 'rebuild in a plain (non-macOS-symlinked, non-CI-tool-cache) tree',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'windows-drive',
|
|
92
|
+
re: /\b[A-Za-z]:\\[^\s'"`)]*/g,
|
|
93
|
+
hint: 'rebuild on a POSIX runner — the published bundle must not carry a Windows path',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'worktree-path',
|
|
97
|
+
re: /\.claude\/worktrees\/[^\s'"`)]*/g,
|
|
98
|
+
hint: 'rebuild from the primary checkout, not a `.claude/worktrees/` git worktree',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'parent-relative-node-modules',
|
|
102
|
+
re: /\.\.\/(?:[^\s'"`)]*\/)*node_modules\//g,
|
|
103
|
+
hint: 'esbuild resolved a dependency outside the repo root (foreign/symlinked node_modules) — rebuild after `npm ci` inside the repo',
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'absolute-node-modules',
|
|
107
|
+
re: /(?<![.\w/])\/(?:[^\s'"`)]*\/)*node_modules\//g,
|
|
108
|
+
hint: 'an absolute path reached a node_modules directory — rebuild from a repo-relative tree',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'absolute-sourcemap',
|
|
112
|
+
re: /sourceMappingURL=(?:\/|[A-Za-z]:\\)[^\s'"`)]*/g,
|
|
113
|
+
hint: 'the sourcemap comment must reference a bundle-relative filename, not an absolute path',
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
|
|
117
|
+
interface Hit {
|
|
118
|
+
readonly file: string;
|
|
119
|
+
readonly pattern: string;
|
|
120
|
+
readonly line: number;
|
|
121
|
+
readonly snippet: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const MAX_SNIPPET = 140;
|
|
125
|
+
const MAX_HITS_SHOWN_PER_GROUP = 5;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Redact the username segment of a `/Users/<name>/…`, `/home/<name>/…`, or
|
|
129
|
+
* `C:\Users\<name>\…` match before it reaches a log line — the machine
|
|
130
|
+
* username is incidental PII, not the point of the finding (the finding is
|
|
131
|
+
* "an absolute path leaked", not "whose machine it was").
|
|
132
|
+
*/
|
|
133
|
+
function mask_snippet(raw: string): string {
|
|
134
|
+
const masked = raw
|
|
135
|
+
.replace(/(\/(?:Users|home)\/)[^/\s'"`)]+/, '$1<masked>')
|
|
136
|
+
.replace(/(:\\Users\\)[^\\'"`)]+/i, '$1<masked>');
|
|
137
|
+
return masked.length > MAX_SNIPPET ? `${masked.slice(0, MAX_SNIPPET)}…` : masked;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** 1-based line number of a character offset, mirroring the other check_* scripts' style. */
|
|
141
|
+
function line_of(text: string, index: number): number {
|
|
142
|
+
let line = 1;
|
|
143
|
+
for (let i = 0; i < index; i += 1) {
|
|
144
|
+
if (text.charCodeAt(i) === 0x0a) line += 1;
|
|
145
|
+
}
|
|
146
|
+
return line;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Pure scan core: every pattern hit in `content`, tagged with the (already
|
|
151
|
+
* relative) file path the caller supplies. No filesystem or git access —
|
|
152
|
+
* tests drive this directly with synthetic strings.
|
|
153
|
+
*/
|
|
154
|
+
function scan_content(relPath: string, content: string): Hit[] {
|
|
155
|
+
const hits: Hit[] = [];
|
|
156
|
+
for (const pattern of LEAK_PATTERNS) {
|
|
157
|
+
pattern.re.lastIndex = 0;
|
|
158
|
+
let m: RegExpExecArray | null;
|
|
159
|
+
while ((m = pattern.re.exec(content))) {
|
|
160
|
+
hits.push({
|
|
161
|
+
file: relPath,
|
|
162
|
+
pattern: pattern.name,
|
|
163
|
+
line: line_of(content, m.index),
|
|
164
|
+
snippet: mask_snippet(m[0]),
|
|
165
|
+
});
|
|
166
|
+
// Zero-width safety net (none of the patterns above can match
|
|
167
|
+
// empty, but this mirrors the other check_* scripts' loop guard).
|
|
168
|
+
if (pattern.re.lastIndex === m.index) pattern.re.lastIndex += 1;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return hits;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function _git(args: readonly string[]): string {
|
|
175
|
+
const res = spawnSync('git', [...args], {
|
|
176
|
+
cwd: REPO,
|
|
177
|
+
encoding: 'utf-8',
|
|
178
|
+
maxBuffer: 256 * 1024 * 1024,
|
|
179
|
+
});
|
|
180
|
+
return res.stdout ?? '';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function _splitlines(text: string): string[] {
|
|
184
|
+
return text.split('\n').filter((l) => l.length > 0);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Every tracked path under the bundle roots, deduped and sorted. */
|
|
188
|
+
function tracked_bundle_files(): string[] {
|
|
189
|
+
const seen = new Set<string>();
|
|
190
|
+
for (const root of BUNDLE_ROOTS) {
|
|
191
|
+
for (const rel of _splitlines(_git(['ls-files', root]))) {
|
|
192
|
+
seen.add(rel);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return [...seen].sort();
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Scan one file from disk. Binary / non-UTF-8 content is skipped (a bundle
|
|
200
|
+
* artifact is always text; a decode failure means this isn't one).
|
|
201
|
+
*/
|
|
202
|
+
function scan_file(relPath: string): Hit[] {
|
|
203
|
+
// `--file` args accept both repo-relative (the `git ls-files` default
|
|
204
|
+
// target list) and absolute paths (ad hoc / test use) — never silently
|
|
205
|
+
// resolve an already-absolute path underneath REPO.
|
|
206
|
+
const abs = path.isAbsolute(relPath) ? relPath : path.join(REPO, relPath);
|
|
207
|
+
let text: string;
|
|
208
|
+
try {
|
|
209
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(fs.readFileSync(abs));
|
|
210
|
+
} catch {
|
|
211
|
+
return [];
|
|
212
|
+
}
|
|
213
|
+
return scan_content(relPath, text);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function scan_files(relPaths: readonly string[]): Hit[] {
|
|
217
|
+
const hits: Hit[] = [];
|
|
218
|
+
for (const rel of relPaths) hits.push(...scan_file(rel));
|
|
219
|
+
return hits;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function format_report(hits: readonly Hit[]): string {
|
|
223
|
+
const groups = new Map<string, Hit[]>();
|
|
224
|
+
for (const hit of hits) {
|
|
225
|
+
const key = `${hit.file}::${hit.pattern}`;
|
|
226
|
+
const group = groups.get(key);
|
|
227
|
+
if (group) group.push(hit);
|
|
228
|
+
else groups.set(key, [hit]);
|
|
229
|
+
}
|
|
230
|
+
const lines: string[] = [
|
|
231
|
+
'❌ check_bundle_path_leakage: build-machine path leakage in the tracked bundle:',
|
|
232
|
+
];
|
|
233
|
+
for (const [key, group] of groups) {
|
|
234
|
+
const [file, patternName] = key.split('::') as [string, string];
|
|
235
|
+
const pattern = LEAK_PATTERNS.find((p) => p.name === patternName);
|
|
236
|
+
lines.push(` ${file} [${patternName}] (${group.length} occurrence(s))`);
|
|
237
|
+
for (const hit of group.slice(0, MAX_HITS_SHOWN_PER_GROUP)) {
|
|
238
|
+
lines.push(` line ${hit.line}: ${hit.snippet}`);
|
|
239
|
+
}
|
|
240
|
+
if (group.length > MAX_HITS_SHOWN_PER_GROUP) {
|
|
241
|
+
lines.push(` (+${group.length - MAX_HITS_SHOWN_PER_GROUP} more)`);
|
|
242
|
+
}
|
|
243
|
+
if (pattern) lines.push(` → ${pattern.hint}`);
|
|
244
|
+
}
|
|
245
|
+
return lines.join('\n');
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
interface Options {
|
|
249
|
+
quiet: boolean;
|
|
250
|
+
files: string[];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/** Thrown instead of calling `process.exit` directly, so `main()` stays testable. */
|
|
254
|
+
class ExitCode extends Error {
|
|
255
|
+
code: number;
|
|
256
|
+
constructor(code: number) {
|
|
257
|
+
super(`exit ${code}`);
|
|
258
|
+
this.code = code;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function parse_args(argv: readonly string[]): Options {
|
|
263
|
+
const opts: Options = { quiet: false, files: [] };
|
|
264
|
+
for (const arg of argv) {
|
|
265
|
+
if (arg === '--quiet') {
|
|
266
|
+
opts.quiet = true;
|
|
267
|
+
} else if (arg === '-h' || arg === '--help') {
|
|
268
|
+
process.stdout.write(
|
|
269
|
+
'usage: check_bundle_path_leakage.ts [--quiet] [<file> ...]\n',
|
|
270
|
+
);
|
|
271
|
+
throw new ExitCode(0);
|
|
272
|
+
} else if (arg.startsWith('--')) {
|
|
273
|
+
process.stderr.write(
|
|
274
|
+
`❌ check_bundle_path_leakage: unrecognized argument: ${arg}\n`,
|
|
275
|
+
);
|
|
276
|
+
throw new ExitCode(2);
|
|
277
|
+
} else {
|
|
278
|
+
opts.files.push(arg);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return opts;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
285
|
+
const opts = parse_args(argv);
|
|
286
|
+
const targets = opts.files.length > 0 ? opts.files : tracked_bundle_files();
|
|
287
|
+
const hits = scan_files(targets);
|
|
288
|
+
|
|
289
|
+
if (hits.length > 0) {
|
|
290
|
+
process.stderr.write(`${format_report(hits)}\n`);
|
|
291
|
+
return 1;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (!opts.quiet) {
|
|
295
|
+
process.stdout.write(
|
|
296
|
+
`✅ check_bundle_path_leakage: no build-machine path leakage ` +
|
|
297
|
+
`(${targets.length} tracked bundle file(s) scanned).\n`,
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
return 0;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function _isCliEntry(): boolean {
|
|
304
|
+
if (process.argv[1] === undefined) return false;
|
|
305
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
306
|
+
if (import.meta.url === argvUrl) return true;
|
|
307
|
+
try {
|
|
308
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
309
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
310
|
+
return here === argv;
|
|
311
|
+
} catch {
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
317
|
+
try {
|
|
318
|
+
process.exit(main());
|
|
319
|
+
} catch (exc) {
|
|
320
|
+
if (exc instanceof ExitCode) {
|
|
321
|
+
process.exit(exc.code);
|
|
322
|
+
}
|
|
323
|
+
throw exc;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export {
|
|
328
|
+
REPO,
|
|
329
|
+
BUNDLE_ROOTS,
|
|
330
|
+
LEAK_PATTERNS,
|
|
331
|
+
MAX_SNIPPET,
|
|
332
|
+
MAX_HITS_SHOWN_PER_GROUP,
|
|
333
|
+
mask_snippet,
|
|
334
|
+
scan_content,
|
|
335
|
+
scan_file,
|
|
336
|
+
scan_files,
|
|
337
|
+
tracked_bundle_files,
|
|
338
|
+
format_report,
|
|
339
|
+
parse_args,
|
|
340
|
+
main,
|
|
341
|
+
ExitCode,
|
|
342
|
+
};
|
|
343
|
+
export type { Hit, LeakPattern, Options };
|