@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
|
@@ -4,26 +4,73 @@
|
|
|
4
4
|
*
|
|
5
5
|
* build [--root P] [--out P] [--force] (re)build the deterministic graph
|
|
6
6
|
* validate [--graph P] schema-gate a graph.json
|
|
7
|
+
* detect [--root P] [--format json] three-state freshness verdict
|
|
8
|
+
* refresh [--root P] [--out P] [--budget-seconds N]
|
|
9
|
+
* build --update (STALE) / no-op
|
|
10
|
+
* (FRESH) / full build (ABSENT)
|
|
7
11
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
12
|
+
* `detect --format json` (Phase 2, road-to-reachable-code-memory) emits a
|
|
13
|
+
* single-line, stable-key-order JSON verdict on stdout — no timestamps, safe
|
|
14
|
+
* to diff or pipe to `jq`:
|
|
15
|
+
*
|
|
16
|
+
* { "verdict": "ABSENT" | "STALE" | "FRESH",
|
|
17
|
+
* "behind_commits": <n> | null,
|
|
18
|
+
* "source": { "kind": "consumer" | "scip" | "native", "path": "…" } | null,
|
|
19
|
+
* "sources": [ { "kind": …, "path": "…", "present": true, … }, … ] }
|
|
20
|
+
*
|
|
21
|
+
* `refresh` never blocks on a hung build: it spawns the actual `build` in a
|
|
22
|
+
* CHILD process against a temp `--out` path, under a hard wall-clock
|
|
23
|
+
* `--budget-seconds` (default 60, via SIGKILL). The real cache at `--out` is
|
|
24
|
+
* only ever touched by a same-directory atomic rename of that child's
|
|
25
|
+
* completed temp output — on budget-exceeded, build failure, or the child
|
|
26
|
+
* never producing output, the rename never happens and the OLD cache is left
|
|
27
|
+
* byte-for-byte untouched. The cache itself (default
|
|
28
|
+
* `agents/runtime/state/code-graph-v1.json`) is local-only and disposable —
|
|
29
|
+
* gitignored, rebuildable from source at any time; never a source of truth.
|
|
30
|
+
*
|
|
31
|
+
* Query subcommands (query/path/explain/affected) are added by the Phase-3
|
|
32
|
+
* query tier. Deterministic, LLM-free, no network. Exit codes:
|
|
33
|
+
* 0 ok · 1 not-found / validation-failed / refresh-budget-exceeded ·
|
|
34
|
+
* 2 usage · 3 internal.
|
|
35
|
+
*
|
|
36
|
+
* suggest-verb "<question>" (Phase 9 D3) print the verb
|
|
37
|
+
* (query/affected/path/explain)
|
|
38
|
+
* a regex table thinks best
|
|
39
|
+
* answers a free-text structure
|
|
40
|
+
* question — a standalone hint,
|
|
41
|
+
* never auto-run against a
|
|
42
|
+
* graph.
|
|
11
43
|
*/
|
|
12
|
-
import { execFileSync } from 'node:child_process';
|
|
44
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
45
|
+
import { randomBytes } from 'node:crypto';
|
|
13
46
|
import * as fs from 'node:fs';
|
|
14
47
|
import * as path from 'node:path';
|
|
15
48
|
import process from 'node:process';
|
|
16
49
|
import { fileURLToPath } from 'node:url';
|
|
17
50
|
|
|
18
51
|
import { hardenedSpawnEnv } from '../_lib/spawn_env.js';
|
|
19
|
-
import { buildFromRepo } from './build.js';
|
|
20
|
-
import { detectSources, pickSource } from './detect.js';
|
|
21
|
-
import {
|
|
52
|
+
import { buildFromRepo, sidecarPath } from './build.js';
|
|
53
|
+
import { computeVerdict, detectSources, pickSource } from './detect.js';
|
|
54
|
+
import { suggestVerb } from './intent.js';
|
|
55
|
+
import {
|
|
56
|
+
affected,
|
|
57
|
+
explain,
|
|
58
|
+
loadGraph,
|
|
59
|
+
type LoadedGraph,
|
|
60
|
+
mergeRecommendedReads,
|
|
61
|
+
path as graphPath,
|
|
62
|
+
query,
|
|
63
|
+
type QueryResult,
|
|
64
|
+
} from './query.js';
|
|
22
65
|
import { validateGraph } from './validate.js';
|
|
23
66
|
|
|
24
67
|
const _HERE = fileURLToPath(import.meta.url);
|
|
25
68
|
export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..', '..');
|
|
26
69
|
export const DEFAULT_CACHE = path.join(REPO_ROOT, 'agents', 'runtime', 'state', 'code-graph-v1.json');
|
|
70
|
+
/** Local `tsx` binary — `refresh` spawns `build` as a child of THIS file
|
|
71
|
+
* through it, so a budget-exceeded kill only ever terminates the child. */
|
|
72
|
+
const TSX_BIN = path.join(REPO_ROOT, 'node_modules', '.bin', process.platform === 'win32' ? 'tsx.cmd' : 'tsx');
|
|
73
|
+
const DEFAULT_BUDGET_SECONDS = 60;
|
|
27
74
|
|
|
28
75
|
function flag(argv: string[], name: string): string | null {
|
|
29
76
|
const i = argv.indexOf(name);
|
|
@@ -93,6 +140,10 @@ function render(r: QueryResult, staleNote: string): number {
|
|
|
93
140
|
for (const l of r.lines) process.stdout.write(` ${l}\n`);
|
|
94
141
|
if (r.truncated) process.stdout.write(' … (budget reached — narrow the seed or raise --budget)\n');
|
|
95
142
|
if (!r.lines.length) process.stdout.write(' (no matching relations)\n');
|
|
143
|
+
if (r.recommended_reads.length) {
|
|
144
|
+
process.stdout.write('recommended reads (dropped by the budget, or a low-confidence seed match):\n');
|
|
145
|
+
for (const rr of r.recommended_reads) process.stdout.write(` ${rr.path}${rr.lines ? `:${rr.lines[0]}-${rr.lines[1]}` : ''}\n`);
|
|
146
|
+
}
|
|
96
147
|
return 0;
|
|
97
148
|
}
|
|
98
149
|
|
|
@@ -130,12 +181,16 @@ function cmdQuery(kind: 'query' | 'explain' | 'affected' | 'path', argv: string[
|
|
|
130
181
|
if (kind === 'affected' && flag(argv, '--since')) {
|
|
131
182
|
const root = flag(argv, '--root') ?? REPO_ROOT;
|
|
132
183
|
const seeds = changedNodeSeeds(r.g, root, flag(argv, '--since') as string);
|
|
133
|
-
const merged: QueryResult = { source: r.g.source, seeds: [], lines: [], truncated: false };
|
|
184
|
+
const merged: QueryResult = { source: r.g.source, seeds: [], lines: [], truncated: false, recommended_reads: [] };
|
|
185
|
+
const perSeed: QueryResult[] = [];
|
|
134
186
|
for (const s of seeds) {
|
|
135
187
|
const one = affected(r.g, s, 2, budget);
|
|
136
188
|
merged.seeds.push(...one.seeds);
|
|
137
189
|
merged.lines.push(...one.lines);
|
|
190
|
+
merged.truncated = merged.truncated || one.truncated;
|
|
191
|
+
perSeed.push(one);
|
|
138
192
|
}
|
|
193
|
+
merged.recommended_reads = mergeRecommendedReads(perSeed);
|
|
139
194
|
return render(merged, r.note);
|
|
140
195
|
}
|
|
141
196
|
const a = positional[0];
|
|
@@ -162,6 +217,12 @@ function isFlagValue(argv: string[], token: string): boolean {
|
|
|
162
217
|
|
|
163
218
|
function cmdDetect(argv: string[]): number {
|
|
164
219
|
const root = flag(argv, '--root') ?? REPO_ROOT;
|
|
220
|
+
if (flag(argv, '--format') === 'json') {
|
|
221
|
+
// Machine-readable three-state verdict (Phase 2). Existing human-text
|
|
222
|
+
// output below is unchanged for existing consumers.
|
|
223
|
+
process.stdout.write(`${JSON.stringify(computeVerdict(root, DEFAULT_CACHE))}\n`);
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
165
226
|
const verdicts = detectSources(root, DEFAULT_CACHE);
|
|
166
227
|
if (!verdicts.length) {
|
|
167
228
|
process.stdout.write('no code-graph source detected\n');
|
|
@@ -176,16 +237,127 @@ function cmdDetect(argv: string[]): number {
|
|
|
176
237
|
return 0;
|
|
177
238
|
}
|
|
178
239
|
|
|
240
|
+
function budgetSecondsOf(argv: string[]): number {
|
|
241
|
+
const raw = flag(argv, '--budget-seconds');
|
|
242
|
+
if (raw === null) return DEFAULT_BUDGET_SECONDS;
|
|
243
|
+
const n = Number(raw);
|
|
244
|
+
return Number.isFinite(n) ? n : DEFAULT_BUDGET_SECONDS;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Best-effort removal of a temp build output + its sidecar. Never throws —
|
|
248
|
+
* cleanup failure must not mask the real result (budget-exceeded / error). */
|
|
249
|
+
function cleanupTemp(tmpOut: string): void {
|
|
250
|
+
for (const p of [tmpOut, sidecarPath(tmpOut)]) {
|
|
251
|
+
try {
|
|
252
|
+
fs.unlinkSync(p);
|
|
253
|
+
} catch {
|
|
254
|
+
/* already absent, or never materialised — fine */
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Run `build` (optionally `--update`) as a CHILD process against a temp
|
|
261
|
+
* `--out` path, under a hard wall-clock budget. Only on a clean, in-budget
|
|
262
|
+
* exit does the temp output get promoted into `out` — via a same-directory
|
|
263
|
+
* `renameSync`, atomic at the OS level, exactly the technique `write_atomic`
|
|
264
|
+
* itself uses. Any other outcome (timeout, non-zero exit, missing output)
|
|
265
|
+
* cleans up the temp files and leaves `out` untouched.
|
|
266
|
+
*/
|
|
267
|
+
function runBudgetedBuild(root: string, out: string, update: boolean, budgetSeconds: number): number {
|
|
268
|
+
if (!(budgetSeconds > 0)) {
|
|
269
|
+
// Node's own `timeout` option treats 0 as "no limit" — a genuinely
|
|
270
|
+
// zero-or-negative budget is an immediate, deterministic abort
|
|
271
|
+
// instead of silently becoming unlimited.
|
|
272
|
+
process.stderr.write(`code-graph: refresh budget exceeded (${budgetSeconds}s) — old cache kept\n`);
|
|
273
|
+
return 1;
|
|
274
|
+
}
|
|
275
|
+
const dir = path.dirname(out);
|
|
276
|
+
const tmpOut = path.join(dir, `.${path.basename(out)}.refresh-tmp-${process.pid}-${randomBytes(4).toString('hex')}.json`);
|
|
277
|
+
if (update) {
|
|
278
|
+
const realSidecar = sidecarPath(out);
|
|
279
|
+
if (fs.existsSync(realSidecar)) {
|
|
280
|
+
try {
|
|
281
|
+
fs.copyFileSync(realSidecar, sidecarPath(tmpOut));
|
|
282
|
+
} catch {
|
|
283
|
+
/* fall back to a full re-extraction inside the child */
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const args = ['build', '--root', root, '--out', tmpOut, ...(update ? ['--update'] : [])];
|
|
288
|
+
const res = spawnSync(TSX_BIN, [_HERE, ...args], {
|
|
289
|
+
env: hardenedSpawnEnv(),
|
|
290
|
+
stdio: 'ignore',
|
|
291
|
+
timeout: Math.round(budgetSeconds * 1000),
|
|
292
|
+
killSignal: 'SIGKILL',
|
|
293
|
+
});
|
|
294
|
+
const timedOut = res.signal !== null || (res.error !== undefined && (res.error as NodeJS.ErrnoException).code === 'ETIMEDOUT');
|
|
295
|
+
if (timedOut) {
|
|
296
|
+
cleanupTemp(tmpOut);
|
|
297
|
+
process.stderr.write(`code-graph: refresh budget exceeded (${budgetSeconds}s) — old cache kept\n`);
|
|
298
|
+
return 1;
|
|
299
|
+
}
|
|
300
|
+
if (res.status !== 0) {
|
|
301
|
+
cleanupTemp(tmpOut);
|
|
302
|
+
const detail = res.error ? `: ${res.error.message}` : res.status !== null ? ` (exit ${res.status})` : '';
|
|
303
|
+
process.stderr.write(`code-graph: refresh build failed${detail} — old cache kept\n`);
|
|
304
|
+
return 1;
|
|
305
|
+
}
|
|
306
|
+
if (!fs.existsSync(tmpOut)) {
|
|
307
|
+
cleanupTemp(tmpOut);
|
|
308
|
+
process.stderr.write('code-graph: refresh produced no output — old cache kept\n');
|
|
309
|
+
return 3;
|
|
310
|
+
}
|
|
311
|
+
fs.renameSync(tmpOut, out); // same-dir → atomic; real cache only ever changes here
|
|
312
|
+
const tmpSidecar = sidecarPath(tmpOut);
|
|
313
|
+
if (fs.existsSync(tmpSidecar)) fs.renameSync(tmpSidecar, sidecarPath(out));
|
|
314
|
+
process.stdout.write(`✅ code-graph refreshed — cache: ${path.relative(REPO_ROOT, out)}\n`);
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function cmdRefresh(argv: string[]): number {
|
|
319
|
+
const root = flag(argv, '--root') ?? REPO_ROOT;
|
|
320
|
+
const out = flag(argv, '--out') ?? DEFAULT_CACHE;
|
|
321
|
+
const budgetSeconds = budgetSecondsOf(argv);
|
|
322
|
+
if (!fs.existsSync(root)) {
|
|
323
|
+
process.stderr.write(`code-graph: root not found: ${root}\n`);
|
|
324
|
+
return 1;
|
|
325
|
+
}
|
|
326
|
+
const v = computeVerdict(root, out);
|
|
327
|
+
if (v.verdict === 'FRESH') {
|
|
328
|
+
process.stdout.write('fresh — nothing to do\n');
|
|
329
|
+
return 0;
|
|
330
|
+
}
|
|
331
|
+
return runBudgetedBuild(root, out, v.verdict === 'STALE', budgetSeconds);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* `suggest-verb "<question>"` (Phase 9 D3) — print the `code_graph` verb a
|
|
336
|
+
* pure regex table thinks best answers a free-text structure question. A
|
|
337
|
+
* standalone hint only: never resolves a graph, never runs a query itself.
|
|
338
|
+
*/
|
|
339
|
+
function cmdSuggestVerb(argv: string[]): number {
|
|
340
|
+
const question = argv.filter((a) => !a.startsWith('--')).join(' ').trim();
|
|
341
|
+
if (!question) {
|
|
342
|
+
process.stderr.write('usage: code_graph/cli.ts suggest-verb "<question>"\n');
|
|
343
|
+
return 2;
|
|
344
|
+
}
|
|
345
|
+
process.stdout.write(`${suggestVerb(question)}\n`);
|
|
346
|
+
return 0;
|
|
347
|
+
}
|
|
348
|
+
|
|
179
349
|
export async function main(argv: string[] = process.argv.slice(2)): Promise<number> {
|
|
180
350
|
const sub = argv[0];
|
|
181
351
|
try {
|
|
182
352
|
if (sub === 'build') return await cmdBuild(argv.slice(1));
|
|
183
353
|
if (sub === 'validate') return cmdValidate(argv.slice(1));
|
|
184
354
|
if (sub === 'detect') return cmdDetect(argv.slice(1));
|
|
355
|
+
if (sub === 'refresh') return cmdRefresh(argv.slice(1));
|
|
185
356
|
if (sub === 'query' || sub === 'explain' || sub === 'affected' || sub === 'path')
|
|
186
357
|
return cmdQuery(sub, argv.slice(1));
|
|
358
|
+
if (sub === 'suggest-verb') return cmdSuggestVerb(argv.slice(1));
|
|
187
359
|
process.stderr.write(
|
|
188
|
-
'usage: code_graph/cli.ts <build|validate|detect|query|explain|affected|path> [options]\n',
|
|
360
|
+
'usage: code_graph/cli.ts <build|validate|detect|refresh|query|explain|affected|path|suggest-verb> [options]\n',
|
|
189
361
|
);
|
|
190
362
|
return 2;
|
|
191
363
|
} catch (e) {
|
|
@@ -132,3 +132,55 @@ export function pickSource(verdicts: SourceVerdict[]): SourceVerdict | null {
|
|
|
132
132
|
if (native) return native;
|
|
133
133
|
return verdicts.find((v) => v.kind === 'consumer') ?? null;
|
|
134
134
|
}
|
|
135
|
+
|
|
136
|
+
/** A single detected source, JSON-shaped (only defined fields are emitted —
|
|
137
|
+
* key order fixed by construction so `JSON.stringify` output is stable). */
|
|
138
|
+
export interface DetectedSourceJSON {
|
|
139
|
+
kind: SourceKind;
|
|
140
|
+
path: string;
|
|
141
|
+
present: boolean;
|
|
142
|
+
stale?: boolean;
|
|
143
|
+
commits_behind?: number;
|
|
144
|
+
note?: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** The `code-graph detect --format json` verdict shape (Phase 2). Deterministic:
|
|
148
|
+
* fixed key order, no timestamps, paths relative to `root`. */
|
|
149
|
+
export interface VerdictJSON {
|
|
150
|
+
verdict: 'ABSENT' | 'STALE' | 'FRESH';
|
|
151
|
+
/** commits behind, when known from the picked source; else null. */
|
|
152
|
+
behind_commits: number | null;
|
|
153
|
+
/** the source `refresh`/queries would use, or null when ABSENT. */
|
|
154
|
+
source: { kind: SourceKind; path: string } | null;
|
|
155
|
+
/** every detected source (for diagnostics), not just the picked one. */
|
|
156
|
+
sources: DetectedSourceJSON[];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Three-state freshness verdict for `root`, reusing `detectSources` +
|
|
161
|
+
* `pickSource` (no duplicated precedence logic). ABSENT = no usable source
|
|
162
|
+
* (a bare `scip` presence or nothing at all); STALE = the picked source is
|
|
163
|
+
* stale; FRESH = picked source is fresh, or freshness is unknown (mirrors the
|
|
164
|
+
* nudge hook's `picked.stale ? STALE : FRESH` reading — unknown is not
|
|
165
|
+
* treated as stale).
|
|
166
|
+
*/
|
|
167
|
+
export function computeVerdict(root: string, nativeCache: string): VerdictJSON {
|
|
168
|
+
const abs = path.resolve(root);
|
|
169
|
+
const verdicts = detectSources(root, nativeCache);
|
|
170
|
+
const picked = pickSource(verdicts);
|
|
171
|
+
const rel = (p: string): string => path.relative(abs, p).split(path.sep).join('/');
|
|
172
|
+
const verdict: VerdictJSON['verdict'] = picked === null ? 'ABSENT' : picked.stale ? 'STALE' : 'FRESH';
|
|
173
|
+
const sources: DetectedSourceJSON[] = verdicts.map((v) => {
|
|
174
|
+
const s: DetectedSourceJSON = { kind: v.kind, path: rel(v.path), present: v.present };
|
|
175
|
+
if (v.stale !== undefined) s.stale = v.stale;
|
|
176
|
+
if (v.commits_behind !== undefined) s.commits_behind = v.commits_behind;
|
|
177
|
+
if (v.note !== undefined) s.note = v.note;
|
|
178
|
+
return s;
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
verdict,
|
|
182
|
+
behind_commits: picked?.commits_behind ?? null,
|
|
183
|
+
source: picked ? { kind: picked.kind, path: rel(picked.path) } : null,
|
|
184
|
+
sources,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intent-conditioned verb selection (Phase 9 D3, road-to-reachable-code-memory)
|
|
3
|
+
* — a PURE regex table, no model call. `suggestVerb` maps a natural-language
|
|
4
|
+
* structure question to the `code_graph` subcommand most likely to answer it:
|
|
5
|
+
*
|
|
6
|
+
* affected — "who calls / uses / references this", "what would break",
|
|
7
|
+
* "blast radius" — a reverse (who-depends-on-it) lookup.
|
|
8
|
+
* path — "how does X reach/connect to Y", "is A reachable from B",
|
|
9
|
+
* "trace the route between A and B" — connectivity between
|
|
10
|
+
* two named seeds.
|
|
11
|
+
* explain — "overview", "what's around X", "the neighbourhood of X",
|
|
12
|
+
* "walk me through X" — a broader 2-hop neighbourhood, not a
|
|
13
|
+
* single direct-relations answer.
|
|
14
|
+
* query — the default: a seed's own direct (1-hop) relations.
|
|
15
|
+
*
|
|
16
|
+
* Order matters — first pattern class to match wins: affected → path →
|
|
17
|
+
* explain → query. Ship gate (pre-registered in
|
|
18
|
+
* `tests/fixtures/code-graph-intent/queries.json`, written BEFORE this file):
|
|
19
|
+
* `suggestVerb` must beat the always-`query` baseline's correct-verb rate
|
|
20
|
+
* over that 30-query set, or this module stays unwired (evidence only, per
|
|
21
|
+
* the D3 evidence note in `agents/evidence/reports/`).
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export type Verb = 'query' | 'affected' | 'path' | 'explain';
|
|
25
|
+
|
|
26
|
+
const AFFECTED_RE =
|
|
27
|
+
/\b(who\s+(calls?|uses?|else|references?)|where\s+(is|are|'s)?\s*.*\bused\b|impact(s|ed|ing)?|blast\s+radius|break(s|ing)?|would\s+break|caller(s)?|referenc(e|es|ed|ing)|touch(es|ed)?)\b/i;
|
|
28
|
+
|
|
29
|
+
const PATH_RE =
|
|
30
|
+
/\b(reach(able|es|ing)?|connect(s|ed|ion|ing)?|\btrace\b|\broute\b|\bpath\b|shortest)\b/i;
|
|
31
|
+
|
|
32
|
+
const EXPLAIN_RE =
|
|
33
|
+
/\b(overview|explain(s|ed|ing)?|\baround\b|surround(ing|s)?|\bcontext\b|big\s+picture|neighbo[u]?rhood|walk\s+me\s+through|summar(y|ize|ise))\b/i;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Suggest the `code_graph` verb a free-text structure question most likely
|
|
37
|
+
* needs. Deterministic, side-effect-free, no network, no model call.
|
|
38
|
+
*/
|
|
39
|
+
export function suggestVerb(question: string): Verb {
|
|
40
|
+
const q = question.trim();
|
|
41
|
+
if (AFFECTED_RE.test(q)) return 'affected';
|
|
42
|
+
if (PATH_RE.test(q)) return 'path';
|
|
43
|
+
if (EXPLAIN_RE.test(q)) return 'explain';
|
|
44
|
+
return 'query';
|
|
45
|
+
}
|
|
@@ -9,6 +9,7 @@ import * as fs from 'node:fs';
|
|
|
9
9
|
|
|
10
10
|
import { LexicalIndex, tokenize } from '../_lib/lexical_index.js';
|
|
11
11
|
import { sanitizeLabel } from './sanitize.js';
|
|
12
|
+
import { emitSqliteTwin, loadSerializedFromTwin } from './sqlite_store.js';
|
|
12
13
|
import type { CodeEdge, CodeGraph } from './types.js';
|
|
13
14
|
import { validateGraph } from './validate.js';
|
|
14
15
|
|
|
@@ -24,10 +25,19 @@ export interface LoadedGraph {
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export function loadGraph(graphPath: string, source = graphPath): LoadedGraph {
|
|
27
|
-
|
|
28
|
+
// Prefer the derived SQLite twin (ADR-129): checksum/stat-verified against
|
|
29
|
+
// the canonical JSON, byte-identical content, ~1/90 the load cost at
|
|
30
|
+
// consumer scale. Fallback = parse the JSON — and best-effort re-emit the
|
|
31
|
+
// twin from it (zero-touch rebuild-on-drift, Phase 7).
|
|
32
|
+
const fromTwin = loadSerializedFromTwin(graphPath);
|
|
33
|
+
const raw = fromTwin ?? fs.readFileSync(graphPath, 'utf-8');
|
|
34
|
+
const parsed = JSON.parse(raw) as unknown;
|
|
28
35
|
const v = validateGraph(parsed);
|
|
29
36
|
if (!v.ok) throw new Error(`invalid graph at ${graphPath}: ${v.errors.slice(0, 3).join('; ')}`);
|
|
30
37
|
const graph = parsed as CodeGraph;
|
|
38
|
+
if (fromTwin === null) {
|
|
39
|
+
emitSqliteTwin(graph, raw, graphPath);
|
|
40
|
+
}
|
|
31
41
|
const byId = new Map(graph.nodes.map((n) => [n.id, n]));
|
|
32
42
|
const outM = new Map<string, CodeEdge[]>();
|
|
33
43
|
const inM = new Map<string, CodeEdge[]>();
|
|
@@ -44,13 +54,25 @@ export function loadGraph(graphPath: string, source = graphPath): LoadedGraph {
|
|
|
44
54
|
return { graph, source, byId, out: outM, in: inM, lex };
|
|
45
55
|
}
|
|
46
56
|
|
|
57
|
+
interface SeedResolution {
|
|
58
|
+
ids: string[];
|
|
59
|
+
/** true when NEITHER an exact-id nor an exact-label match was found and
|
|
60
|
+
* resolution fell back to BM25 — a best-guess, not a confirmed hit. */
|
|
61
|
+
weak: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
47
64
|
/** Resolve a free-text seed to node ids: exact id → exact label → BM25. */
|
|
48
|
-
|
|
49
|
-
if (g.byId.has(seed)) return [seed];
|
|
65
|
+
function resolveSeedsTiered(g: LoadedGraph, seed: string, limit = 5): SeedResolution {
|
|
66
|
+
if (g.byId.has(seed)) return { ids: [seed], weak: false };
|
|
50
67
|
const exactLabel = g.graph.nodes.filter((n) => n.label === seed).map((n) => n.id);
|
|
51
|
-
if (exactLabel.length) return exactLabel.slice(0, limit);
|
|
68
|
+
if (exactLabel.length) return { ids: exactLabel.slice(0, limit), weak: false };
|
|
52
69
|
const ranked = g.lex.rank(tokenize(seed)).filter((r) => r.score > 0);
|
|
53
|
-
return ranked.slice(0, limit).map((r) => r.id);
|
|
70
|
+
return { ids: ranked.slice(0, limit).map((r) => r.id), weak: true };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Resolve a free-text seed to node ids: exact id → exact label → BM25. */
|
|
74
|
+
export function resolveSeeds(g: LoadedGraph, seed: string, limit = 5): string[] {
|
|
75
|
+
return resolveSeedsTiered(g, seed, limit).ids;
|
|
54
76
|
}
|
|
55
77
|
|
|
56
78
|
function label(g: LoadedGraph, id: string): string {
|
|
@@ -61,42 +83,109 @@ function edgeLine(g: LoadedGraph, e: CodeEdge): string {
|
|
|
61
83
|
return `${e.confidence} ${sanitizeLabel(e.source)} --${e.relation}--> ${sanitizeLabel(e.target)}${cand}`;
|
|
62
84
|
}
|
|
63
85
|
|
|
86
|
+
/**
|
|
87
|
+
* A file + (when known) a 1-based inclusive line range worth reading directly
|
|
88
|
+
* — surfaced whenever the engine dropped or under-trusted something instead
|
|
89
|
+
* of silently truncating it (Phase 9 D4: "a read plan instead of silent
|
|
90
|
+
* truncation").
|
|
91
|
+
*/
|
|
92
|
+
export interface RecommendedRead {
|
|
93
|
+
path: string;
|
|
94
|
+
lines: [number, number] | null;
|
|
95
|
+
}
|
|
96
|
+
|
|
64
97
|
export interface QueryResult {
|
|
65
98
|
source: string;
|
|
66
99
|
seeds: string[];
|
|
67
100
|
lines: string[];
|
|
68
101
|
truncated: boolean;
|
|
102
|
+
recommended_reads: RecommendedRead[];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function readKey(r: RecommendedRead): string {
|
|
106
|
+
return r.lines ? `${r.path}:${r.lines[0]}-${r.lines[1]}` : r.path;
|
|
69
107
|
}
|
|
70
108
|
|
|
71
|
-
|
|
109
|
+
/** A node's file + line range, or `null` for an unresolved `symbol:*`
|
|
110
|
+
* placeholder (nothing real to read) or a node with no location info. */
|
|
111
|
+
function recommendedReadFor(g: LoadedGraph, id: string): RecommendedRead | null {
|
|
112
|
+
const n = g.byId.get(id);
|
|
113
|
+
if (!n) return null;
|
|
114
|
+
const loc = n.source_location;
|
|
115
|
+
return { path: n.source_file, lines: loc.length >= 3 ? [loc[0] as number, loc[2] as number] : null };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** One relation line plus the node id (if any) a reader should go inspect
|
|
119
|
+
* directly when this line gets dropped by the budget. */
|
|
120
|
+
interface LineEntry {
|
|
121
|
+
text: string;
|
|
122
|
+
focusId?: string;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Apply the token budget to `entries`, then translate BOTH failure classes
|
|
127
|
+
* this delta targets into a deterministic `recommended_reads` list: every
|
|
128
|
+
* entry the budget dropped, plus every read the caller already flagged as
|
|
129
|
+
* weak (an under-threshold/BM25-fallback seed match) — deduped by
|
|
130
|
+
* path+line-range, insertion-ordered for determinism.
|
|
131
|
+
*/
|
|
132
|
+
function budgetedLines(
|
|
133
|
+
g: LoadedGraph,
|
|
134
|
+
source: string,
|
|
135
|
+
seeds: string[],
|
|
136
|
+
entries: LineEntry[],
|
|
137
|
+
budget: number,
|
|
138
|
+
weakSeedReads: RecommendedRead[] = [],
|
|
139
|
+
): QueryResult {
|
|
72
140
|
const cap = budget * APPROX_CHARS_PER_TOKEN;
|
|
73
141
|
const kept: string[] = [];
|
|
142
|
+
const dropped: LineEntry[] = [];
|
|
74
143
|
let used = 0;
|
|
75
144
|
let truncated = false;
|
|
76
|
-
for (const
|
|
77
|
-
if (used +
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
if (!truncated && used + entry.text.length <= cap) {
|
|
147
|
+
kept.push(entry.text);
|
|
148
|
+
used += entry.text.length + 1;
|
|
149
|
+
} else {
|
|
78
150
|
truncated = true;
|
|
79
|
-
|
|
151
|
+
dropped.push(entry);
|
|
80
152
|
}
|
|
81
|
-
kept.push(l);
|
|
82
|
-
used += l.length + 1;
|
|
83
153
|
}
|
|
84
|
-
|
|
154
|
+
const recommended = new Map<string, RecommendedRead>();
|
|
155
|
+
for (const r of weakSeedReads) recommended.set(readKey(r), r);
|
|
156
|
+
for (const entry of dropped) {
|
|
157
|
+
if (!entry.focusId) continue;
|
|
158
|
+
const r = recommendedReadFor(g, entry.focusId);
|
|
159
|
+
if (r) recommended.set(readKey(r), r);
|
|
160
|
+
}
|
|
161
|
+
return { source, seeds, lines: kept, truncated, recommended_reads: [...recommended.values()] };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function weakSeedReads(g: LoadedGraph, resolution: SeedResolution): RecommendedRead[] {
|
|
165
|
+
if (!resolution.weak) return [];
|
|
166
|
+
const out: RecommendedRead[] = [];
|
|
167
|
+
for (const id of resolution.ids) {
|
|
168
|
+
const r = recommendedReadFor(g, id);
|
|
169
|
+
if (r) out.push(r);
|
|
170
|
+
}
|
|
171
|
+
return out;
|
|
85
172
|
}
|
|
86
173
|
|
|
87
174
|
/** `query <seed>` — the seed's direct (1-hop) outgoing relations. */
|
|
88
175
|
export function query(g: LoadedGraph, seed: string, budget = 1500): QueryResult {
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
176
|
+
const resolution = resolveSeedsTiered(g, seed);
|
|
177
|
+
const seeds = resolution.ids;
|
|
178
|
+
const entries: LineEntry[] = [];
|
|
179
|
+
for (const s of seeds) for (const e of g.out.get(s) ?? []) entries.push({ text: edgeLine(g, e), focusId: e.target });
|
|
180
|
+
return budgetedLines(g, g.source, seeds.map((s) => label(g, s)), entries, budget, weakSeedReads(g, resolution));
|
|
93
181
|
}
|
|
94
182
|
|
|
95
183
|
/** `explain <seed>` — 2-hop neighbourhood (out-edges of seeds + their targets). */
|
|
96
184
|
export function explain(g: LoadedGraph, seed: string, budget = 1500): QueryResult {
|
|
97
|
-
const
|
|
185
|
+
const resolution = resolveSeedsTiered(g, seed);
|
|
186
|
+
const seeds = resolution.ids;
|
|
98
187
|
const seen = new Set<string>();
|
|
99
|
-
const
|
|
188
|
+
const entries: LineEntry[] = [];
|
|
100
189
|
const frontier = [...seeds];
|
|
101
190
|
for (let hop = 0; hop < 2 && frontier.length; hop += 1) {
|
|
102
191
|
const next: string[] = [];
|
|
@@ -104,26 +193,30 @@ export function explain(g: LoadedGraph, seed: string, budget = 1500): QueryResul
|
|
|
104
193
|
if (seen.has(s)) continue;
|
|
105
194
|
seen.add(s);
|
|
106
195
|
for (const e of g.out.get(s) ?? []) {
|
|
107
|
-
|
|
196
|
+
entries.push({ text: edgeLine(g, e), focusId: e.target });
|
|
108
197
|
next.push(e.target);
|
|
109
198
|
}
|
|
110
199
|
}
|
|
111
200
|
frontier.push(...next);
|
|
112
201
|
}
|
|
113
|
-
return budgetedLines(g.source, seeds.map((s) => label(g, s)),
|
|
202
|
+
return budgetedLines(g, g.source, seeds.map((s) => label(g, s)), entries, budget, weakSeedReads(g, resolution));
|
|
114
203
|
}
|
|
115
204
|
|
|
116
205
|
/** `affected <target>` — reverse BFS: who calls / references the target. */
|
|
117
206
|
export function affected(g: LoadedGraph, target: string, depth = 2, budget = 1500): QueryResult {
|
|
118
|
-
const
|
|
207
|
+
const resolution = resolveSeedsTiered(g, target);
|
|
208
|
+
const seeds = resolution.ids;
|
|
119
209
|
const seen = new Set<string>(seeds);
|
|
120
|
-
const
|
|
210
|
+
const entries: LineEntry[] = [];
|
|
121
211
|
let frontier = [...seeds];
|
|
122
212
|
for (let d = 0; d < depth && frontier.length; d += 1) {
|
|
123
213
|
const next: string[] = [];
|
|
124
214
|
for (const t of frontier) {
|
|
125
215
|
for (const e of g.in.get(t) ?? []) {
|
|
126
|
-
|
|
216
|
+
// the newly-discovered node here is the CALLER (e.source) —
|
|
217
|
+
// e.target is already a known seed, so that side carries no
|
|
218
|
+
// new read-plan information.
|
|
219
|
+
entries.push({ text: edgeLine(g, e), focusId: e.source });
|
|
127
220
|
if (!seen.has(e.source)) {
|
|
128
221
|
seen.add(e.source);
|
|
129
222
|
next.push(e.source);
|
|
@@ -132,14 +225,16 @@ export function affected(g: LoadedGraph, target: string, depth = 2, budget = 150
|
|
|
132
225
|
}
|
|
133
226
|
frontier = next;
|
|
134
227
|
}
|
|
135
|
-
return budgetedLines(g.source, seeds.map((s) => label(g, s)),
|
|
228
|
+
return budgetedLines(g, g.source, seeds.map((s) => label(g, s)), entries, budget, weakSeedReads(g, resolution));
|
|
136
229
|
}
|
|
137
230
|
|
|
138
231
|
/** `path <a> <b>` — shortest undirected path (direction preserved per edge). */
|
|
139
232
|
export function path(g: LoadedGraph, a: string, b: string, budget = 1500): QueryResult {
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
|
|
233
|
+
const startRes = resolveSeedsTiered(g, a, 1);
|
|
234
|
+
const goalRes = resolveSeedsTiered(g, b, 1);
|
|
235
|
+
const starts = startRes.ids;
|
|
236
|
+
const goals = new Set(goalRes.ids);
|
|
237
|
+
if (!starts.length || !goals.size) return { source: g.source, seeds: [], lines: [], truncated: false, recommended_reads: [] };
|
|
143
238
|
const start = starts[0] as string;
|
|
144
239
|
const prev = new Map<string, CodeEdge>();
|
|
145
240
|
const seen = new Set<string>([start]);
|
|
@@ -164,7 +259,16 @@ export function path(g: LoadedGraph, a: string, b: string, budget = 1500): Query
|
|
|
164
259
|
}
|
|
165
260
|
frontier = next;
|
|
166
261
|
}
|
|
167
|
-
|
|
262
|
+
const seedReads = [...weakSeedReads(g, startRes), ...weakSeedReads(g, goalRes)];
|
|
263
|
+
if (!hit) {
|
|
264
|
+
return {
|
|
265
|
+
source: g.source,
|
|
266
|
+
seeds: [label(g, start)],
|
|
267
|
+
lines: ['(no path found)'],
|
|
268
|
+
truncated: false,
|
|
269
|
+
recommended_reads: [...new Map(seedReads.map((r) => [readKey(r), r])).values()],
|
|
270
|
+
};
|
|
271
|
+
}
|
|
168
272
|
const chain: CodeEdge[] = [];
|
|
169
273
|
let cur = hit;
|
|
170
274
|
while (prev.has(cur)) {
|
|
@@ -172,5 +276,15 @@ export function path(g: LoadedGraph, a: string, b: string, budget = 1500): Query
|
|
|
172
276
|
chain.unshift(e);
|
|
173
277
|
cur = e.source === cur ? e.target : e.source;
|
|
174
278
|
}
|
|
175
|
-
|
|
279
|
+
const entries = chain.map((e) => ({ text: edgeLine(g, e), focusId: e.target }));
|
|
280
|
+
return budgetedLines(g, g.source, [label(g, start), label(g, hit)], entries, budget, seedReads);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/** Merge several `QueryResult`s (e.g. one per `--since` seed) into one,
|
|
284
|
+
* de-duplicating `recommended_reads` by path+line-range so a read plan never
|
|
285
|
+
* repeats the same file twice across merged seeds. */
|
|
286
|
+
export function mergeRecommendedReads(results: readonly QueryResult[]): RecommendedRead[] {
|
|
287
|
+
const merged = new Map<string, RecommendedRead>();
|
|
288
|
+
for (const r of results) for (const rr of r.recommended_reads) merged.set(readKey(rr), rr);
|
|
289
|
+
return [...merged.values()];
|
|
176
290
|
}
|