@event4u/agent-config 9.8.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 +278 -298
- package/CONTRIBUTING.md +23 -7
- package/MIGRATION.md +20 -0
- package/README.md +55 -9
- 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/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/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/rules/code-provenance.md +112 -0
- package/dist/agent-src/rules/external-code-graph-interop.md +4 -4
- package/dist/agent-src/rules/history-discipline.md +80 -0
- package/dist/agent-src/rules/no-roadmap-references.md +1 -1
- package/dist/agent-src/rules/php-coding.md +1 -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 +7 -0
- package/dist/agent-src/rules/scale-discipline.md +92 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +10 -0
- package/dist/agent-src/rules/session-canary.md +77 -0
- package/dist/agent-src/rules/token-optimizer-maintenance.md +1 -1
- package/dist/agent-src/rules/tool-safety.md +3 -1
- package/dist/agent-src/rules/untrusted-input-defense.md +10 -0
- package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
- package/dist/agent-src/skills/code-intelligence/SKILL.md +17 -14
- 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/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-editing/SKILL.md +1 -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/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/secrets-management/SKILL.md +3 -4
- 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/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 +1 -1
- 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/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/firstRunNotice.js +70 -0
- package/dist/cli/firstRunNotice.js.map +1 -0
- package/dist/cli/main.js +35 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +7 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +362 -78
- 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 +90 -8
- package/dist/discovery/trust-report.md +11 -11
- package/dist/discovery/workspaces.json +31 -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 +775 -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 +4 -2
- 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 +14 -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 +4 -2
- package/dist/server/schemas/settings.js.map +1 -1
- 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 +2 -2
- package/docs/MIGRATION.md +16 -0
- package/docs/guidelines/component-oriented-and-oop-development.md +4 -2
- package/package.json +21 -11
- 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 +52 -14
- 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/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 +81 -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/fixtures/secret-detector/negatives.txt +5 -0
- package/src/scripts/_lib/fixtures/secret-detector/positives.txt +4 -0
- package/src/scripts/_lib/install_drift.ts +194 -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/rtk_allowlist.ts +44 -0
- package/src/scripts/_lib/secret_detector.test.ts +5 -0
- package/src/scripts/_lib/secret_detector.ts +9 -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/worker_budget.ts +107 -0
- 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_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 +45 -0
- package/src/scripts/chat_history.ts +8 -5
- package/src/scripts/check_backstop_debt.ts +23 -13
- package/src/scripts/check_bundle_path_leakage.ts +343 -0
- package/src/scripts/check_evaluator_budgets.ts +99 -0
- package/src/scripts/check_knowledge_sharing.ts +12 -1
- package/src/scripts/check_no_external_sources.ts +2 -2
- 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 +181 -9
- package/src/scripts/code_graph/detect.ts +52 -0
- package/src/scripts/code_graph/intent.ts +45 -0
- package/src/scripts/code_graph/query.ts +143 -29
- package/src/scripts/code_graph/sqlite_store.ts +174 -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 +5 -3
- package/src/scripts/first_run_gate_hook.ts +9 -5
- package/src/scripts/hermetic-install.sh +3 -3
- package/src/scripts/hook_manifest.yaml +55 -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 +11 -4
- 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/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 +74 -26
- 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/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/report_install_drift.ts +109 -0
- package/src/scripts/roadmap_progress_hook.ts +8 -5
- package/src/scripts/schemas/license-policy.schema.json +89 -0
- package/src/scripts/schemas/provenance-borrow.schema.json +46 -0
- package/src/scripts/schemas/rule.schema.json +10 -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/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/verify_before_complete_hook.ts +8 -5
- package/src/scripts/wrapper_freshness_hook.ts +8 -7
- package/src/server/schemas/settings.ts +8 -2
- package/dist/ui/assets/index-BPFMZWUs.css +0 -1
- package/dist/ui/assets/index-CrmZ34Rg.js +0 -40
- package/dist/ui/assets/index-CrmZ34Rg.js.map +0 -1
- package/docs/CLAIMS.md +0 -286
- 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 -785
- 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 -726
- package/docs/command-flows.md +0 -272
- package/docs/command-naming-audit.md +0 -60
- package/docs/comparison.yaml +0 -87
- 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/local-server-ports.md +0 -53
- 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 -74
- 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 -696
- 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 -191
- 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 -248
- package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +0 -112
- 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 -209
- 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-124-embedded-engine-doctrine.md +0 -255
- package/docs/decisions/ADR-125-doc-screenshot-anonymization.md +0 -131
- package/docs/decisions/ADR-126-internet-reach-operator-tooling.md +0 -254
- package/docs/decisions/ADR-127-enforcement-claims-must-resolve.md +0 -150
- package/docs/decisions/ADR-128-executable-evidence-and-measured-escalation.md +0 -201
- 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 -157
- package/docs/decisions/engine-reclassification-2026-07.md +0 -104
- 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 -126
- 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 -51
- 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/gated-platform-reads.md +0 -221
- 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 -252
- 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 -30
- 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
- package/src/scripts/postinstall_gui.ts +0 -129
|
@@ -1,11 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
|
|
6
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
2
7
|
|
|
3
8
|
import {
|
|
4
9
|
LARGE_DIFF_LINES,
|
|
10
|
+
buildPlan,
|
|
5
11
|
classifyBlocking,
|
|
12
|
+
detectReleaseVersion,
|
|
6
13
|
escalationReasons,
|
|
7
14
|
gateVerdict,
|
|
8
15
|
isReviewablePath,
|
|
16
|
+
pickPreviousTag,
|
|
9
17
|
renderReview,
|
|
10
18
|
type Finding,
|
|
11
19
|
} from './self_review_gate.js';
|
|
@@ -122,3 +130,167 @@ describe('renderReview — escalation banner', () => {
|
|
|
122
130
|
expect(out).toContain('Escalation warranted');
|
|
123
131
|
});
|
|
124
132
|
});
|
|
133
|
+
|
|
134
|
+
// ── Release-PR review mode (road-to-feedback-9.2.0-followups Phase 3) ──
|
|
135
|
+
// See docs/design/release-pr-review-mode.md — anchored to the PR #957
|
|
136
|
+
// false-advisory case (release features reading as "not in the diff").
|
|
137
|
+
|
|
138
|
+
describe('detectReleaseVersion', () => {
|
|
139
|
+
const changelogAdd = (v: string) =>
|
|
140
|
+
`+## [${v}](https://github.com/event4u-app/agent-config/compare/9.1.0...${v}) (2026-07-14)`;
|
|
141
|
+
const packageAdd = (v: string) => `+ "version": "${v}",`;
|
|
142
|
+
|
|
143
|
+
it('detects a release PR when the changelog heading and the package.json bump agree', () => {
|
|
144
|
+
const patch = [
|
|
145
|
+
'diff --git a/CHANGELOG.md b/CHANGELOG.md',
|
|
146
|
+
'@@ -14,6 +14,8 @@',
|
|
147
|
+
' ## [Unreleased]',
|
|
148
|
+
'+',
|
|
149
|
+
changelogAdd('9.2.0'),
|
|
150
|
+
'diff --git a/package.json b/package.json',
|
|
151
|
+
'@@ -1,6 +1,6 @@',
|
|
152
|
+
'- "version": "9.1.0",',
|
|
153
|
+
packageAdd('9.2.0'),
|
|
154
|
+
].join('\n');
|
|
155
|
+
expect(detectReleaseVersion(patch)).toBe('9.2.0');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('is NOT a release PR when only the changelog heading changed (no version bump)', () => {
|
|
159
|
+
expect(detectReleaseVersion(changelogAdd('9.2.0'))).toBeNull();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('is NOT a release PR when only package.json bumped (no changelog heading)', () => {
|
|
163
|
+
expect(detectReleaseVersion(packageAdd('9.2.0'))).toBeNull();
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
it('is NOT a release PR on a normal feature-PR patch (neither signal present)', () => {
|
|
167
|
+
const patch = ['+export function foo() {}', '-export function bar() {}'].join('\n');
|
|
168
|
+
expect(detectReleaseVersion(patch)).toBeNull();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('refuses to guess when the changelog and package.json versions disagree', () => {
|
|
172
|
+
const patch = [changelogAdd('9.2.0'), packageAdd('9.3.0')].join('\n');
|
|
173
|
+
expect(detectReleaseVersion(patch)).toBeNull();
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('ignores removed lines (the old version) and reads only the added one', () => {
|
|
177
|
+
const patch = ['- "version": "9.1.0",', packageAdd('9.2.0'), changelogAdd('9.2.0')].join('\n');
|
|
178
|
+
expect(detectReleaseVersion(patch)).toBe('9.2.0');
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
describe('pickPreviousTag', () => {
|
|
183
|
+
it('picks the highest tag strictly below the release version', () => {
|
|
184
|
+
expect(pickPreviousTag('9.2.0', ['9.0.0', '9.1.0', '9.2.0'])).toBe('9.1.0');
|
|
185
|
+
});
|
|
186
|
+
it('handles a v-prefixed tag naming convention', () => {
|
|
187
|
+
expect(pickPreviousTag('9.2.0', ['v9.0.0', 'v9.1.0'])).toBe('v9.1.0');
|
|
188
|
+
});
|
|
189
|
+
it('returns null when no tag is strictly below the version', () => {
|
|
190
|
+
expect(pickPreviousTag('9.2.0', ['9.2.0', '9.3.0'])).toBeNull();
|
|
191
|
+
expect(pickPreviousTag('9.2.0', [])).toBeNull();
|
|
192
|
+
});
|
|
193
|
+
it('ignores non-semver tags (branch-backup names etc.) instead of crashing', () => {
|
|
194
|
+
expect(
|
|
195
|
+
pickPreviousTag('9.2.0', [
|
|
196
|
+
'backup/pre-rebase-augment-limit-fit',
|
|
197
|
+
'9.1.0',
|
|
198
|
+
'local-squashed-tip-2026-05-18',
|
|
199
|
+
]),
|
|
200
|
+
).toBe('9.1.0');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
describe('buildPlan — release-PR shape (PR #957 reproduction)', () => {
|
|
205
|
+
function git(root: string, ...args: string[]) {
|
|
206
|
+
return spawnSync('git', args, {
|
|
207
|
+
cwd: root,
|
|
208
|
+
encoding: 'utf8',
|
|
209
|
+
env: {
|
|
210
|
+
...process.env,
|
|
211
|
+
GIT_AUTHOR_NAME: 'T',
|
|
212
|
+
GIT_AUTHOR_EMAIL: 't@e.test',
|
|
213
|
+
GIT_COMMITTER_NAME: 'T',
|
|
214
|
+
GIT_COMMITTER_EMAIL: 't@e.test',
|
|
215
|
+
},
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
function write(root: string, rel: string, content: string): void {
|
|
219
|
+
const full = path.join(root, rel);
|
|
220
|
+
fs.mkdirSync(path.dirname(full), { recursive: true });
|
|
221
|
+
fs.writeFileSync(full, content, 'utf-8');
|
|
222
|
+
}
|
|
223
|
+
function mkTmp(): string {
|
|
224
|
+
return fs.realpathSync(fs.mkdtempSync(path.join(os.tmpdir(), 'srg-')));
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
let root: string | undefined;
|
|
228
|
+
afterEach(() => {
|
|
229
|
+
if (root) fs.rmSync(root, { recursive: true, force: true });
|
|
230
|
+
root = undefined;
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
it('release mode sees the pre-cut feature file; the packaging diff alone does not (PR #957 shape)', () => {
|
|
234
|
+
root = mkTmp();
|
|
235
|
+
git(root, 'init', '-q', '-b', 'main');
|
|
236
|
+
write(root, 'package.json', '{\n "name": "x",\n "version": "9.0.0"\n}\n');
|
|
237
|
+
write(root, 'CHANGELOG.md', '# Changelog\n\n## [Unreleased]\n');
|
|
238
|
+
git(root, 'add', '-A');
|
|
239
|
+
git(root, 'commit', '-q', '-m', 'baseline');
|
|
240
|
+
git(root, 'tag', '9.1.0'); // the previous release tag
|
|
241
|
+
|
|
242
|
+
// The feature merges into main BEFORE the release cut — the PR #957 shape.
|
|
243
|
+
write(root, 'feature.txt', 'new cross-source-consistency rule content\n');
|
|
244
|
+
git(root, 'add', '-A');
|
|
245
|
+
git(root, 'commit', '-q', '-m', 'feat: cross-source-consistency');
|
|
246
|
+
|
|
247
|
+
// Release branch cut from main's current tip — no divergence yet, so
|
|
248
|
+
// main...release-branch only shows the release-cut commit below.
|
|
249
|
+
git(root, 'checkout', '-q', '-b', 'release-branch');
|
|
250
|
+
write(
|
|
251
|
+
root,
|
|
252
|
+
'CHANGELOG.md',
|
|
253
|
+
'# Changelog\n\n## [Unreleased]\n\n' +
|
|
254
|
+
'## [9.2.0](https://github.com/event4u-app/agent-config/compare/9.1.0...9.2.0) (2026-07-14)\n',
|
|
255
|
+
);
|
|
256
|
+
write(root, 'package.json', '{\n "name": "x",\n "version": "9.2.0"\n}\n');
|
|
257
|
+
git(root, 'add', '-A');
|
|
258
|
+
git(root, 'commit', '-q', '-m', 'chore(release): 9.2.0');
|
|
259
|
+
|
|
260
|
+
const plan = buildPlan('main', root);
|
|
261
|
+
|
|
262
|
+
expect(plan.release?.version).toBe('9.2.0');
|
|
263
|
+
expect(plan.release?.previousTag).toBe('9.1.0');
|
|
264
|
+
// The packaging diff (main...HEAD) alone does NOT show the pre-cut
|
|
265
|
+
// feature — the exact false-advisory shape PR #957 hit.
|
|
266
|
+
expect(plan.release?.packagingFiles).not.toContain('feature.txt');
|
|
267
|
+
expect(plan.release?.packagingFiles).toEqual(
|
|
268
|
+
expect.arrayContaining(['CHANGELOG.md', 'package.json']),
|
|
269
|
+
);
|
|
270
|
+
// Release mode's actual analysis range (previousTag...HEAD) DOES
|
|
271
|
+
// include it — this is what stops "feature not in diff" recurring.
|
|
272
|
+
expect(plan.files).toContain('feature.txt');
|
|
273
|
+
expect(plan.analysisBase).toBe('9.1.0');
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('a normal feature PR (no changelog/version bump) uses the unchanged base', () => {
|
|
277
|
+
root = mkTmp();
|
|
278
|
+
git(root, 'init', '-q', '-b', 'main');
|
|
279
|
+
write(root, 'package.json', '{\n "name": "x",\n "version": "9.1.0"\n}\n');
|
|
280
|
+
write(root, 'CHANGELOG.md', '# Changelog\n\n## [Unreleased]\n');
|
|
281
|
+
git(root, 'add', '-A');
|
|
282
|
+
git(root, 'commit', '-q', '-m', 'baseline');
|
|
283
|
+
git(root, 'tag', '9.1.0');
|
|
284
|
+
|
|
285
|
+
git(root, 'checkout', '-q', '-b', 'feature-branch');
|
|
286
|
+
write(root, 'feature.txt', 'some feature\n');
|
|
287
|
+
git(root, 'add', '-A');
|
|
288
|
+
git(root, 'commit', '-q', '-m', 'feat: add feature');
|
|
289
|
+
|
|
290
|
+
const plan = buildPlan('main', root);
|
|
291
|
+
|
|
292
|
+
expect(plan.release).toBeUndefined();
|
|
293
|
+
expect(plan.analysisBase).toBe('main');
|
|
294
|
+
expect(plan.files).toContain('feature.txt');
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -83,9 +83,9 @@ export function isReviewablePath(p: string): boolean {
|
|
|
83
83
|
return !SKIP_PREFIXES.some((pre) => p.startsWith(pre));
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
function changedFiles(baseRef: string): string[] {
|
|
86
|
+
function changedFiles(baseRef: string, cwd: string = REPO_ROOT): string[] {
|
|
87
87
|
const r = spawnSync('git', ['diff', '--name-only', `${baseRef}...HEAD`], {
|
|
88
|
-
cwd
|
|
88
|
+
cwd,
|
|
89
89
|
encoding: 'utf8',
|
|
90
90
|
});
|
|
91
91
|
if (r.status !== 0) {
|
|
@@ -98,10 +98,10 @@ function changedFiles(baseRef: string): string[] {
|
|
|
98
98
|
.filter(isReviewablePath);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
function diffText(baseRef: string, files: string[]): string {
|
|
101
|
+
function diffText(baseRef: string, files: string[], cwd: string = REPO_ROOT): string {
|
|
102
102
|
if (files.length === 0) return '';
|
|
103
103
|
const r = spawnSync('git', ['diff', `${baseRef}...HEAD`, '--', ...files], {
|
|
104
|
-
cwd
|
|
104
|
+
cwd,
|
|
105
105
|
encoding: 'utf8',
|
|
106
106
|
maxBuffer: 32 * 1024 * 1024,
|
|
107
107
|
});
|
|
@@ -109,10 +109,10 @@ function diffText(baseRef: string, files: string[]): string {
|
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/** Sum of added+deleted lines across `files` (binary files count 0). */
|
|
112
|
-
function changedLineCount(baseRef: string, files: string[]): number {
|
|
112
|
+
function changedLineCount(baseRef: string, files: string[], cwd: string = REPO_ROOT): number {
|
|
113
113
|
if (files.length === 0) return 0;
|
|
114
114
|
const r = spawnSync('git', ['diff', '--numstat', `${baseRef}...HEAD`, '--', ...files], {
|
|
115
|
-
cwd
|
|
115
|
+
cwd,
|
|
116
116
|
encoding: 'utf8',
|
|
117
117
|
maxBuffer: 32 * 1024 * 1024,
|
|
118
118
|
});
|
|
@@ -124,6 +124,94 @@ function changedLineCount(baseRef: string, files: string[]): number {
|
|
|
124
124
|
return total;
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
+
// ── Release-PR detection (road-to-feedback-9.2.0-followups Phase 3) ────
|
|
128
|
+
/**
|
|
129
|
+
* A release PR is detected from its own packaging diff (baseRef...HEAD,
|
|
130
|
+
* scoped to CHANGELOG.md + package.json): an added changelog heading and an
|
|
131
|
+
* added package.json version bump, agreeing on the same version. Pure over
|
|
132
|
+
* the patch text — no git call — so it is unit-testable with synthetic
|
|
133
|
+
* patches. See docs/design/release-pr-review-mode.md.
|
|
134
|
+
*/
|
|
135
|
+
export function detectReleaseVersion(patchText: string): string | null {
|
|
136
|
+
const addedLines = patchText
|
|
137
|
+
.split('\n')
|
|
138
|
+
.filter((l) => l.startsWith('+') && !l.startsWith('+++'))
|
|
139
|
+
.map((l) => l.slice(1));
|
|
140
|
+
|
|
141
|
+
let changelogVersion: string | null = null;
|
|
142
|
+
let packageVersion: string | null = null;
|
|
143
|
+
for (const line of addedLines) {
|
|
144
|
+
const changelogMatch = /^##\s*\[(\d+\.\d+\.\d+)\]/.exec(line);
|
|
145
|
+
if (changelogMatch) changelogVersion = changelogMatch[1] ?? null;
|
|
146
|
+
const packageMatch = /^\s*"version"\s*:\s*"(\d+\.\d+\.\d+)"/.exec(line);
|
|
147
|
+
if (packageMatch) packageVersion = packageMatch[1] ?? null;
|
|
148
|
+
}
|
|
149
|
+
if (changelogVersion && packageVersion && changelogVersion === packageVersion) {
|
|
150
|
+
return changelogVersion;
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function releaseDetectionPatch(baseRef: string, cwd: string): string {
|
|
156
|
+
const r = spawnSync('git', ['diff', `${baseRef}...HEAD`, '--', 'CHANGELOG.md', 'package.json'], {
|
|
157
|
+
cwd,
|
|
158
|
+
encoding: 'utf8',
|
|
159
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
160
|
+
});
|
|
161
|
+
return (r.stdout ?? '').toString();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Impure wrapper: collects the packaging patch via git, then detects. */
|
|
165
|
+
export function detectReleaseVersionFromGit(baseRef: string, cwd: string = REPO_ROOT): string | null {
|
|
166
|
+
return detectReleaseVersion(releaseDetectionPatch(baseRef, cwd));
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** `major.minor.patch`, tolerating an optional `v` prefix; null if not semver-shaped. */
|
|
170
|
+
function parseSemver(raw: string): [number, number, number] | null {
|
|
171
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(raw.trim());
|
|
172
|
+
if (!m) return null;
|
|
173
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function semverLessThan(a: [number, number, number], b: [number, number, number]): boolean {
|
|
177
|
+
const [aMajor, aMinor, aPatch] = a;
|
|
178
|
+
const [bMajor, bMinor, bPatch] = b;
|
|
179
|
+
if (aMajor !== bMajor) return aMajor < bMajor;
|
|
180
|
+
if (aMinor !== bMinor) return aMinor < bMinor;
|
|
181
|
+
return aPatch < bPatch;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Highest semver-shaped tag strictly below `version`, or null if none. Pure
|
|
186
|
+
* over the supplied tag list — no git call. Non-semver tags (branch-backup
|
|
187
|
+
* names etc.) are ignored rather than throwing.
|
|
188
|
+
*/
|
|
189
|
+
export function pickPreviousTag(version: string, tags: readonly string[]): string | null {
|
|
190
|
+
const target = parseSemver(version);
|
|
191
|
+
if (!target) return null;
|
|
192
|
+
let best: { raw: string; parsed: [number, number, number] } | null = null;
|
|
193
|
+
for (const raw of tags) {
|
|
194
|
+
const parsed = parseSemver(raw);
|
|
195
|
+
if (!parsed) continue;
|
|
196
|
+
if (!semverLessThan(parsed, target)) continue;
|
|
197
|
+
if (!best || semverLessThan(best.parsed, parsed)) best = { raw, parsed };
|
|
198
|
+
}
|
|
199
|
+
return best ? best.raw : null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function listGitTags(cwd: string): string[] {
|
|
203
|
+
const r = spawnSync('git', ['tag'], { cwd, encoding: 'utf8' });
|
|
204
|
+
return (r.stdout ?? '')
|
|
205
|
+
.split('\n')
|
|
206
|
+
.map((s) => s.trim())
|
|
207
|
+
.filter(Boolean);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Impure wrapper: lists tags via git, then picks the previous one. */
|
|
211
|
+
export function resolvePreviousTagFromGit(version: string, cwd: string = REPO_ROOT): string | null {
|
|
212
|
+
return pickPreviousTag(version, listGitTags(cwd));
|
|
213
|
+
}
|
|
214
|
+
|
|
127
215
|
// ── Escalation classifier (large / claim-affecting → full ai-council) ──
|
|
128
216
|
/**
|
|
129
217
|
* A large or claim-affecting diff warrants the FULL `ai-council` (advisor
|
|
@@ -157,9 +245,31 @@ function loadSkillBody(name: string): string {
|
|
|
157
245
|
return readFileSync(p, 'utf8');
|
|
158
246
|
}
|
|
159
247
|
|
|
160
|
-
|
|
248
|
+
/** Info about a detected release PR — see docs/design/release-pr-review-mode.md. */
|
|
249
|
+
export interface ReleaseInfo {
|
|
250
|
+
version: string;
|
|
251
|
+
previousTag: string;
|
|
252
|
+
/** Files touched by the packaging diff (baseRef...HEAD) — for context only. */
|
|
253
|
+
packagingFiles: string[];
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Release-mode note appended to the system prompt so the model analyzes the
|
|
258
|
+
* feature range instead of reporting release features as "not in the diff"
|
|
259
|
+
* (the PR #957 false-advisory shape — see docs/design/release-pr-review-mode.md).
|
|
260
|
+
*/
|
|
261
|
+
function releaseNoteText(release: ReleaseInfo, baseRef: string): string {
|
|
262
|
+
const fileList = release.packagingFiles.length > 0 ? release.packagingFiles.join(', ') : '(none)';
|
|
263
|
+
return (
|
|
264
|
+
`\n\nRelease PR for ${release.version}: analysis range is ${release.previousTag}...HEAD ` +
|
|
265
|
+
`(the full release commit range). The packaging diff vs ${baseRef} touches: ${fileList}. ` +
|
|
266
|
+
"Do NOT report a feature as 'not in the diff' when it is present in the release range."
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function buildSystemPrompt(release?: ReleaseInfo, baseRef?: string): string {
|
|
161
271
|
const bodies = REVIEW_SKILLS.map((s) => `# Skill: ${s}\n\n${loadSkillBody(s)}`).join('\n\n---\n\n');
|
|
162
|
-
|
|
272
|
+
const base = [
|
|
163
273
|
'You are the self-review gate for an AI-agent governance package. Apply the',
|
|
164
274
|
'two skills below to the supplied PR diff. Return ONLY a JSON object of the',
|
|
165
275
|
'shape {"findings":[{"severity":"critical|high|medium|low",',
|
|
@@ -170,6 +280,7 @@ function buildSystemPrompt(): string {
|
|
|
170
280
|
'',
|
|
171
281
|
bodies,
|
|
172
282
|
].join('\n');
|
|
283
|
+
return release && baseRef ? base + releaseNoteText(release, baseRef) : base;
|
|
173
284
|
}
|
|
174
285
|
|
|
175
286
|
// ── Plan (dry-run) ────────────────────────────────────────────────────
|
|
@@ -179,22 +290,47 @@ export interface ReviewPlan {
|
|
|
179
290
|
promptChars: number;
|
|
180
291
|
note: string;
|
|
181
292
|
escalation: string[];
|
|
293
|
+
/** The base actually analyzed for `files`/diff: `baseRef`, or `release.previousTag`. */
|
|
294
|
+
analysisBase: string;
|
|
295
|
+
/** Present iff a release PR was detected — see docs/design/release-pr-review-mode.md. */
|
|
296
|
+
release?: ReleaseInfo;
|
|
182
297
|
}
|
|
183
298
|
|
|
184
|
-
export function buildPlan(baseRef: string): ReviewPlan {
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
|
|
299
|
+
export function buildPlan(baseRef: string, cwd: string = REPO_ROOT): ReviewPlan {
|
|
300
|
+
const packagingFiles = changedFiles(baseRef, cwd);
|
|
301
|
+
const releaseVersion = detectReleaseVersionFromGit(baseRef, cwd);
|
|
302
|
+
|
|
303
|
+
let release: ReleaseInfo | undefined;
|
|
304
|
+
let analysisBase = baseRef;
|
|
305
|
+
if (releaseVersion) {
|
|
306
|
+
const previousTag = resolvePreviousTagFromGit(releaseVersion, cwd);
|
|
307
|
+
if (previousTag) {
|
|
308
|
+
release = { version: releaseVersion, previousTag, packagingFiles };
|
|
309
|
+
analysisBase = previousTag;
|
|
310
|
+
} else {
|
|
311
|
+
process.stdout.write(
|
|
312
|
+
`::notice::self-review-gate — release ${releaseVersion} detected but no previous tag ` +
|
|
313
|
+
`found; falling back to the normal base (${baseRef}).\n`,
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const files = analysisBase === baseRef ? packagingFiles : changedFiles(analysisBase, cwd);
|
|
319
|
+
const diff = diffText(analysisBase, files, cwd);
|
|
320
|
+
const escalation = escalationReasons(files, changedLineCount(analysisBase, files, cwd));
|
|
321
|
+
const systemPrompt = buildSystemPrompt(release, baseRef);
|
|
188
322
|
return {
|
|
189
323
|
skills: [...REVIEW_SKILLS],
|
|
190
324
|
files,
|
|
191
|
-
|
|
325
|
+
analysisBase,
|
|
326
|
+
...(release ? { release } : {}),
|
|
327
|
+
promptChars: systemPrompt.length + diff.length,
|
|
192
328
|
escalation,
|
|
193
329
|
note:
|
|
194
330
|
files.length === 0
|
|
195
331
|
? 'No reviewable (non-generated) files changed — the live review would no-op.'
|
|
196
332
|
: `${files.length} reviewable file(s); live review would send ~${Math.ceil(
|
|
197
|
-
(
|
|
333
|
+
(systemPrompt.length + diff.length) / 4,
|
|
198
334
|
)} input tokens.`,
|
|
199
335
|
};
|
|
200
336
|
}
|
|
@@ -302,6 +438,10 @@ export function main(argv: string[]): 0 | 2 {
|
|
|
302
438
|
process.stdout.write(
|
|
303
439
|
`self-review-gate (dry-run — no spend, advisory):\n` +
|
|
304
440
|
` skills: ${plan.skills.join(', ')}\n` +
|
|
441
|
+
(plan.release
|
|
442
|
+
? ` mode: release (${plan.release.version}; feature range ${plan.release.previousTag}...HEAD; ` +
|
|
443
|
+
`packaging diff ${plan.release.packagingFiles.length} file(s))\n`
|
|
444
|
+
: '') +
|
|
305
445
|
` files: ${plan.files.length}\n` +
|
|
306
446
|
` ${plan.note}\n` +
|
|
307
447
|
(plan.escalation.length
|
|
@@ -341,7 +481,7 @@ export function main(argv: string[]): 0 | 2 {
|
|
|
341
481
|
// findings returns 2 — an error is not a finding.)
|
|
342
482
|
try {
|
|
343
483
|
const client = new AnthropicClient({ api_key: key });
|
|
344
|
-
const resp = client.ask(buildSystemPrompt(), diffText(
|
|
484
|
+
const resp = client.ask(buildSystemPrompt(plan.release, baseRef), diffText(plan.analysisBase, plan.files), 4096);
|
|
345
485
|
if (resp.error) {
|
|
346
486
|
process.stdout.write(
|
|
347
487
|
`::warning::self-review-gate NEUTRAL — model call did not complete (${resp.error}); ` +
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Session-canary injection — `session_start` hook.
|
|
4
|
+
*
|
|
5
|
+
* Deterministic backstop for the `session-canary` rule. When the consumer has
|
|
6
|
+
* set `personal.canary_name` in `.agent-settings.yml`, every NEW session gets a
|
|
7
|
+
* `<session-canary>` context block injected at start (same mechanism as
|
|
8
|
+
* hot-context: `{"decision":"allow","context":"<block>"}` on stdout; the
|
|
9
|
+
* dispatcher forwards `context` on session_start so the host adds it to the
|
|
10
|
+
* session context).
|
|
11
|
+
*
|
|
12
|
+
* Why a hook and not just the rule: the canary contract (greet the user by
|
|
13
|
+
* name at task start; reply-close markers at the end of work replies) is a
|
|
14
|
+
* liveness signal — the user watches it like a canary in a coal mine, and its
|
|
15
|
+
* silent disappearance means the context window is degrading. A trigger-routed
|
|
16
|
+
* rule alone is exactly the kind of surface that is dropped in fresh
|
|
17
|
+
* conversations (found RED baseline on the reply-close PR-URL contract,
|
|
18
|
+
* 2026-07-27); the session_start injection makes the contract present in every
|
|
19
|
+
* new conversation on hook-capable hosts. Copilot (no hook surface) falls back
|
|
20
|
+
* to the rule alone.
|
|
21
|
+
*
|
|
22
|
+
* Gate: `personal.canary_name` non-empty. Missing settings file, missing key,
|
|
23
|
+
* or empty value → clean no-op (exit 0, no stdout). Never blocks
|
|
24
|
+
* (fail_closed: false).
|
|
25
|
+
*/
|
|
26
|
+
import fs from "node:fs";
|
|
27
|
+
import path from "node:path";
|
|
28
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
29
|
+
import { readHookStdin } from "./hooks/hook_stdin.js";
|
|
30
|
+
|
|
31
|
+
const EXIT_ALLOW = 0;
|
|
32
|
+
|
|
33
|
+
export const SETTINGS_FILE = ".agent-settings.yml";
|
|
34
|
+
|
|
35
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | { [k: string]: JsonValue };
|
|
36
|
+
type JsonObject = { [k: string]: JsonValue };
|
|
37
|
+
|
|
38
|
+
function _isObject(v: unknown): v is JsonObject {
|
|
39
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Minimal line-walker for `personal.canary_name` — no YAML dependency, same
|
|
44
|
+
* approach as onboarding_gate_hook._read_onboarded. Returns the raw scalar or
|
|
45
|
+
* null when the section/key is absent.
|
|
46
|
+
*/
|
|
47
|
+
export function read_canary_name(settings_path: string): string | null {
|
|
48
|
+
let text: string;
|
|
49
|
+
try {
|
|
50
|
+
if (!fs.statSync(settings_path).isFile()) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
text = fs.readFileSync(settings_path, "utf-8");
|
|
54
|
+
} catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
let in_personal = false;
|
|
58
|
+
for (const line of text.split(/\r?\n/)) {
|
|
59
|
+
if (/^personal\s*:\s*(?:#.*)?$/.test(line)) {
|
|
60
|
+
in_personal = true;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (in_personal && /^\S/.test(line)) {
|
|
64
|
+
in_personal = false; // left the personal: block
|
|
65
|
+
}
|
|
66
|
+
if (in_personal) {
|
|
67
|
+
const m = /^\s+canary_name\s*:\s*(.*?)\s*(?:#.*)?$/.exec(line);
|
|
68
|
+
if (m && m[1] !== undefined) {
|
|
69
|
+
return m[1].trim();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The name is user-owned config, but it lands verbatim in model context —
|
|
78
|
+
* strip quotes, collapse whitespace, drop markup-significant characters, and
|
|
79
|
+
* cap the length so a mangled settings file cannot smuggle a paragraph in.
|
|
80
|
+
*/
|
|
81
|
+
export function sanitize_name(raw: string | null): string {
|
|
82
|
+
if (raw === null) {
|
|
83
|
+
return "";
|
|
84
|
+
}
|
|
85
|
+
let name = raw.trim();
|
|
86
|
+
if (
|
|
87
|
+
(name.startsWith('"') && name.endsWith('"')) ||
|
|
88
|
+
(name.startsWith("'") && name.endsWith("'"))
|
|
89
|
+
) {
|
|
90
|
+
name = name.slice(1, -1);
|
|
91
|
+
}
|
|
92
|
+
name = name.replace(/[<>&`]/g, "").replace(/\s+/g, " ").trim();
|
|
93
|
+
return name.slice(0, 64);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function build_canary_block(name: string): string {
|
|
97
|
+
return [
|
|
98
|
+
`<session-canary settings-key="personal.canary_name">`,
|
|
99
|
+
`The user has configured a session canary. Two obligations, this whole conversation:`,
|
|
100
|
+
`1. OPENING CANARY — the first reply of this session, and the first reply of each` +
|
|
101
|
+
` NEW task within it, opens by addressing the user by name: "${name}". One natural` +
|
|
102
|
+
` mention in the user's language; intermediate replies of the same task do not re-greet.`,
|
|
103
|
+
`2. CLOSING CANARY — a reply that landed substantial work ends with ONE compact` +
|
|
104
|
+
` end-summary, and a PR created or updated this turn puts its raw URL as the` +
|
|
105
|
+
` LITERAL LAST LINE (reply-close contract of the direct-answers rule).`,
|
|
106
|
+
`Purpose: the user watches these markers like a canary in a mine — their silent` +
|
|
107
|
+
` disappearance signals context degradation. Never fake continuity: if you notice` +
|
|
108
|
+
` you dropped a canary, say so and suggest a fresh session or /agent-handoff.`,
|
|
109
|
+
`</session-canary>`,
|
|
110
|
+
].join("\n");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function _workspaceRoot(envelope: JsonObject): string {
|
|
114
|
+
const v = envelope["workspace_root"];
|
|
115
|
+
if (typeof v === "string" && v) {
|
|
116
|
+
return v;
|
|
117
|
+
}
|
|
118
|
+
return process.cwd();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export function main(): number {
|
|
122
|
+
let envelope: JsonValue = {};
|
|
123
|
+
try {
|
|
124
|
+
const raw = _readStdin();
|
|
125
|
+
envelope = raw.trim() ? (JSON.parse(raw) as JsonValue) : {};
|
|
126
|
+
} catch {
|
|
127
|
+
// malformed stdin — still try cwd-based settings below; never block
|
|
128
|
+
}
|
|
129
|
+
const env: JsonObject = _isObject(envelope) ? envelope : {};
|
|
130
|
+
|
|
131
|
+
// Only session_start carries context-injection semantics; other events no-op.
|
|
132
|
+
const event = env["event"];
|
|
133
|
+
if (typeof event === "string" && event !== "" && event !== "session_start") {
|
|
134
|
+
return EXIT_ALLOW;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const root = _workspaceRoot(env);
|
|
138
|
+
const name = sanitize_name(read_canary_name(path.join(root, SETTINGS_FILE)));
|
|
139
|
+
if (!name) {
|
|
140
|
+
return EXIT_ALLOW; // canary not configured — clean no-op
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
process.stdout.write(
|
|
144
|
+
`${JSON.stringify({
|
|
145
|
+
decision: "allow",
|
|
146
|
+
reason: `session-canary: active for "${name}"`,
|
|
147
|
+
context: build_canary_block(name),
|
|
148
|
+
})}\n`,
|
|
149
|
+
);
|
|
150
|
+
return EXIT_ALLOW;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function _readStdin(): string {
|
|
154
|
+
return readHookStdin();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
158
|
+
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
159
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
160
|
+
function _isCliEntry(): boolean {
|
|
161
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
if (process.argv[1] === undefined) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
168
|
+
if (import.meta.url === argvUrl) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
173
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
174
|
+
return here === argv;
|
|
175
|
+
} catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (_isCliEntry()) {
|
|
181
|
+
process.exit(main());
|
|
182
|
+
}
|
|
@@ -78,8 +78,8 @@ function _checkInstallerRuns(tmpdir: string): [number, string | null] {
|
|
|
78
78
|
];
|
|
79
79
|
// ADR-020: --project is reserved for maintainers; CI is a maintainer context.
|
|
80
80
|
const env = { ...process.env, AGENT_CONFIG_DEV_MODE: '1' };
|
|
81
|
-
// Run the installer's `.ts` twin via the repo-local tsx binary (
|
|
82
|
-
//
|
|
81
|
+
// Run the installer's `.ts` twin via the repo-local tsx binary (the
|
|
82
|
+
// retired Python implementation is deleted, ADR-200).
|
|
83
83
|
const result = spawnSync(TSX_BIN, cmd, {
|
|
84
84
|
encoding: 'utf-8',
|
|
85
85
|
timeout: 60000,
|
|
@@ -28,6 +28,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
|
28
28
|
import { parse as parseYaml } from 'yaml';
|
|
29
29
|
|
|
30
30
|
import { is_replay_mode } from './hooks/state_io.js';
|
|
31
|
+
import { readHookStdin } from './hooks/hook_stdin.js';
|
|
31
32
|
|
|
32
33
|
const CHECK_WINDOW_MS = 24 * 60 * 60 * 1000;
|
|
33
34
|
const STATE_REL = ['agents', 'runtime', 'state', 'surface-probe.json'] as const;
|
|
@@ -50,13 +51,7 @@ function _package_root(): string {
|
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
function _readStdinIfNotTty(): void {
|
|
53
|
-
|
|
54
|
-
if (!process.stdin.isTTY) {
|
|
55
|
-
fs.readFileSync(0, 'utf-8');
|
|
56
|
-
}
|
|
57
|
-
} catch {
|
|
58
|
-
/* ignore */
|
|
59
|
-
}
|
|
54
|
+
readHookStdin();
|
|
60
55
|
}
|
|
61
56
|
|
|
62
57
|
function _exists(p: string): boolean {
|
|
@@ -209,7 +204,13 @@ export function main(argv?: string[], opts: ProbeOptions = {}): number {
|
|
|
209
204
|
}
|
|
210
205
|
}
|
|
211
206
|
|
|
207
|
+
// Bundle-safety: never auto-run when inlined into an esbuild bundle, where
|
|
208
|
+
// every module shares the bundle's `import.meta.url` (see cmd_migrate.ts).
|
|
209
|
+
declare const __AGENT_CONFIG_BUNDLE__: boolean | undefined;
|
|
212
210
|
function _isCliEntry(): boolean {
|
|
211
|
+
if (typeof __AGENT_CONFIG_BUNDLE__ !== 'undefined' && __AGENT_CONFIG_BUNDLE__) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
213
214
|
if (process.argv[1] === undefined) {
|
|
214
215
|
return false;
|
|
215
216
|
}
|