@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
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* R-A7 growth-budget for Prisma schemas (F7) —
|
|
3
|
+
* road-to-scale-and-history-discipline Phase 5.
|
|
4
|
+
*
|
|
5
|
+
* An append-only-shaped model (name or `@@map` target matching the shared
|
|
6
|
+
* append-only vocabulary: *_logs, *_events, *_history, audits, jobs, queue,
|
|
7
|
+
* sessions, notifications, …) must declare a retention policy as a doc
|
|
8
|
+
* comment on the model (`/// retention: <policy>`) or carry a
|
|
9
|
+
* `/// no-retention: <reason>` waiver. Same semantics as the raw-SQL
|
|
10
|
+
* adapter's R-A7 check, applied to schema.prisma.
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
|
|
15
|
+
import type { Finding } from './types.js';
|
|
16
|
+
import { is_ignored_dir } from './types.js';
|
|
17
|
+
import { is_append_only_name } from './adapter_raw_sql.js';
|
|
18
|
+
|
|
19
|
+
const RETENTION_RE = /\/\/\/?\s*retention\s*:\s*\S/;
|
|
20
|
+
const NO_RETENTION_RE = /\/\/\/?\s*no-retention\s*:\s*(\S.*)$/m;
|
|
21
|
+
|
|
22
|
+
export function detect_prisma_growth(files: Array<{ path: string; content: string }>): Finding[] {
|
|
23
|
+
const findings: Finding[] = [];
|
|
24
|
+
for (const f of files) {
|
|
25
|
+
const lines = f.content.split('\n');
|
|
26
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
27
|
+
const m = lines[i]!.match(/^\s*model\s+(\w+)\s*\{/);
|
|
28
|
+
if (!m) continue;
|
|
29
|
+
// Model body: find the closing brace (prisma blocks are flat).
|
|
30
|
+
let end = i;
|
|
31
|
+
for (let j = i + 1; j < lines.length; j += 1) {
|
|
32
|
+
if (/^\s*\}/.test(lines[j]!)) {
|
|
33
|
+
end = j;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const body = lines.slice(i, end + 1).join('\n');
|
|
38
|
+
const mapped = body.match(/@@map\(\s*["'](\w+)["']\s*\)/);
|
|
39
|
+
const table_name = mapped ? mapped[1]! : m[1]!;
|
|
40
|
+
if (!is_append_only_name(table_name)) continue;
|
|
41
|
+
|
|
42
|
+
// Retention/waiver: doc comments directly above the model or inside it.
|
|
43
|
+
const head = lines.slice(Math.max(0, i - 3), i).join('\n');
|
|
44
|
+
if (RETENTION_RE.test(head) || RETENTION_RE.test(body)) continue;
|
|
45
|
+
const waiver = (head + '\n' + body).match(NO_RETENTION_RE);
|
|
46
|
+
findings.push({
|
|
47
|
+
failure_class: 'F7',
|
|
48
|
+
rule: 'R-A7',
|
|
49
|
+
file: f.path,
|
|
50
|
+
line: i + 1,
|
|
51
|
+
message: `model ${m[1]} (table ${table_name}) looks append-only but declares no retention policy (add "/// retention: <policy>" or a no-retention waiver)`,
|
|
52
|
+
tier: 'gate',
|
|
53
|
+
...(waiver ? { waived: true, waiver_reason: waiver[1]!.trim() } : {}),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return findings;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function scan_dir(dir: string): Finding[] {
|
|
61
|
+
const files: Array<{ path: string; content: string }> = [];
|
|
62
|
+
const walk = (d: string): void => {
|
|
63
|
+
for (const e of fs.readdirSync(d, { withFileTypes: true })) {
|
|
64
|
+
const p = path.join(d, e.name);
|
|
65
|
+
if (e.isDirectory()) {
|
|
66
|
+
if (!is_ignored_dir(e.name)) walk(p);
|
|
67
|
+
} else if (e.name.endsWith('.prisma')) {
|
|
68
|
+
files.push({ path: p, content: fs.readFileSync(p, 'utf8') });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
walk(dir);
|
|
73
|
+
return detect_prisma_growth(files);
|
|
74
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offloadable-call catalog for R-A8 (thin-request-path, F9) and R-A10
|
|
3
|
+
* (durable-async, F11) — spike S0.5, road-to-scale-and-history-discipline.
|
|
4
|
+
*
|
|
5
|
+
* The catalog is CONFIG DATA, not detector logic: a positive list of
|
|
6
|
+
* expensive call classes per stack. A single indexed insert or a cache op is
|
|
7
|
+
* never in the catalog — over-application (queueing trivially cheap work) is
|
|
8
|
+
* the failure mode this shape prevents.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface CatalogEntry {
|
|
12
|
+
/** Regex source matched against a single (masked) code line. */
|
|
13
|
+
pattern: string;
|
|
14
|
+
/** Human label used in the finding message. */
|
|
15
|
+
label: string;
|
|
16
|
+
/**
|
|
17
|
+
* Whether losing this work silently is unacceptable (drives F11 for
|
|
18
|
+
* fire-and-forget shapes): promised emails, billing, webhooks out.
|
|
19
|
+
*/
|
|
20
|
+
must_not_lose: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface StackCatalog {
|
|
24
|
+
/** Offloadable call classes — firing inside a request handler is F9. */
|
|
25
|
+
offloadable: CatalogEntry[];
|
|
26
|
+
/**
|
|
27
|
+
* Patterns that are the CORRECT offload shape — their presence on the
|
|
28
|
+
* same line neutralizes an offloadable match (e.g. Mail::queue).
|
|
29
|
+
*/
|
|
30
|
+
allowed_alternatives: string[];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const ELOQUENT_CATALOG: StackCatalog = {
|
|
34
|
+
offloadable: [
|
|
35
|
+
{ pattern: String.raw`\bMail::send\s*\(`, label: 'synchronous mail send', must_not_lose: true },
|
|
36
|
+
{ pattern: String.raw`\bMail::to\s*\([^)]*\)\s*->\s*send\s*\(`, label: 'synchronous mail send', must_not_lose: true },
|
|
37
|
+
{ pattern: String.raw`\bHttp::`, label: 'outbound HTTP call', must_not_lose: false },
|
|
38
|
+
{ pattern: String.raw`\b(PDF|Pdf)::loadView\s*\(`, label: 'PDF generation', must_not_lose: false },
|
|
39
|
+
{ pattern: String.raw`\bExcel::store\s*\(`, label: 'spreadsheet export to storage', must_not_lose: false },
|
|
40
|
+
{ pattern: String.raw`\bImage::make\s*\(`, label: 'image processing chain', must_not_lose: false },
|
|
41
|
+
{ pattern: String.raw`\bBrowsershot::`, label: 'headless-browser rendering', must_not_lose: false },
|
|
42
|
+
{ pattern: String.raw`new\s+\\?Stripe\\StripeClient\b|\bStripe\\\w+::`, label: 'payment SDK call', must_not_lose: true },
|
|
43
|
+
{ pattern: String.raw`\bTwilio\\|\bnew\s+\\?Twilio\b`, label: 'SMS/voice SDK call', must_not_lose: true },
|
|
44
|
+
{ pattern: String.raw`\bOpenAI::|\bAnthropic\\|\bAnthropic::`, label: 'ML/AI inference call', must_not_lose: false },
|
|
45
|
+
],
|
|
46
|
+
allowed_alternatives: [
|
|
47
|
+
String.raw`\bMail::queue\s*\(`,
|
|
48
|
+
String.raw`->\s*queue\s*\(`,
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export const TS_CATALOG: StackCatalog = {
|
|
53
|
+
offloadable: [
|
|
54
|
+
{ pattern: String.raw`\.sendMail\s*\(`, label: 'synchronous mail send', must_not_lose: true },
|
|
55
|
+
{ pattern: String.raw`\b(fetch|axios(\.\w+)?)\s*\(\s*['"\`]https?://`, label: 'outbound HTTP call', must_not_lose: false },
|
|
56
|
+
{ pattern: String.raw`\bpuppeteer\.launch\s*\(|\bchromium\.launch\s*\(`, label: 'headless-browser rendering', must_not_lose: false },
|
|
57
|
+
{ pattern: String.raw`\bsharp\s*\([^)]*\)\s*\.`, label: 'image processing chain', must_not_lose: false },
|
|
58
|
+
{ pattern: String.raw`\.chat\.completions\.create\s*\(|\banthropic\.messages\.create\s*\(`, label: 'ML/AI inference call', must_not_lose: false },
|
|
59
|
+
{ pattern: String.raw`\bstripe\.\w+(\.\w+)*\.create\s*\(`, label: 'payment SDK call', must_not_lose: true },
|
|
60
|
+
{ pattern: String.raw`\.updateMany\s*\(\s*\{\s*data\s*:`, label: 'unbounded bulk mutation', must_not_lose: false },
|
|
61
|
+
],
|
|
62
|
+
allowed_alternatives: [
|
|
63
|
+
String.raw`\bqueue\.add\s*\(`,
|
|
64
|
+
String.raw`\.add\s*\(\s*['"\`]`,
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Job-class names whose loss is unacceptable — drives the
|
|
70
|
+
* dispatchAfterResponse / fire-and-forget F11 checks.
|
|
71
|
+
*/
|
|
72
|
+
export const MUST_NOT_LOSE_NAME_RE =
|
|
73
|
+
/(Mail|Email|Invoice|Webhook|Payment|Billing|Notification|Receipt)/;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the persistence-lint substrate (lint_persistence).
|
|
3
|
+
*
|
|
4
|
+
* Failure classes F1–F11 and rule ids R-A1…R-A11 / R-B1…R-B5 are defined in
|
|
5
|
+
* agents/roadmaps/archive/road-to-scale-and-history-discipline.md (roadmap) and,
|
|
6
|
+
* post-merge, in the scale-discipline / history-discipline pack rules.
|
|
7
|
+
*
|
|
8
|
+
* "Deterministic" throughout means: deterministic PATTERN detection with an
|
|
9
|
+
* auditable waiver process — the linter identifies the pattern class
|
|
10
|
+
* mechanically; instance-level correctness is contextual and handled by a
|
|
11
|
+
* reasoned waiver, never by the linter claiming judgment it does not have.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export type FailureClass =
|
|
15
|
+
| 'F1' // N+1 queries
|
|
16
|
+
| 'F2' // missing indexes
|
|
17
|
+
| 'F3' // unbounded selects
|
|
18
|
+
| 'F6' // unsafe migrations
|
|
19
|
+
| 'F7' // unbounded table growth
|
|
20
|
+
| 'F8' // missing audit history
|
|
21
|
+
| 'F9' // sync work in request path
|
|
22
|
+
| 'F11'; // non-durable async
|
|
23
|
+
|
|
24
|
+
export type FindingTier = 'gate' | 'advice';
|
|
25
|
+
|
|
26
|
+
export interface Finding {
|
|
27
|
+
failure_class: FailureClass;
|
|
28
|
+
rule: string; // e.g. "R-A6"
|
|
29
|
+
file: string; // repo-relative path
|
|
30
|
+
line: number; // 1-indexed
|
|
31
|
+
message: string;
|
|
32
|
+
tier: FindingTier;
|
|
33
|
+
/** Set when the offending line carries a recognized waiver. */
|
|
34
|
+
waived?: boolean;
|
|
35
|
+
/** The waiver reason text, when present. */
|
|
36
|
+
waiver_reason?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ScanResult {
|
|
40
|
+
findings: Finding[];
|
|
41
|
+
/** Files the adapter looked at (for coverage reporting). */
|
|
42
|
+
scanned_files: string[];
|
|
43
|
+
/** Waivers encountered, incl. empty-reason violations. */
|
|
44
|
+
waivers: WaiverRecord[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface WaiverRecord {
|
|
48
|
+
file: string;
|
|
49
|
+
line: number;
|
|
50
|
+
kind: string; // 'no-index' | 'sync-required' | 'accepted-loss' | 'no-retention' | 'migration-unsafe'
|
|
51
|
+
reason: string; // empty string = hygiene violation
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Waiver comment grammar (shared across adapters):
|
|
56
|
+
* PHP/TS: // <kind>: <reason> e.g. // no-index: read-heavy analytics column
|
|
57
|
+
* SQL: -- <kind>: <reason>
|
|
58
|
+
* Recognized kinds: no-index, sync-required, accepted-loss, no-retention,
|
|
59
|
+
* migration-unsafe.
|
|
60
|
+
*/
|
|
61
|
+
export const WAIVER_KINDS = [
|
|
62
|
+
'no-index',
|
|
63
|
+
'sync-required',
|
|
64
|
+
'accepted-loss',
|
|
65
|
+
'no-retention',
|
|
66
|
+
'migration-unsafe',
|
|
67
|
+
] as const;
|
|
68
|
+
|
|
69
|
+
const WAIVER_RE = new RegExp(
|
|
70
|
+
String.raw`(?://|--|#)\s*(${WAIVER_KINDS.join('|')})\s*:\s*(.*)$`,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
/** Parse a waiver on the given line (or the line directly above). */
|
|
74
|
+
export function parse_waiver(lines: string[], idx0: number): WaiverRecord | null {
|
|
75
|
+
for (const i of [idx0, idx0 - 1]) {
|
|
76
|
+
if (i < 0 || i >= lines.length) continue;
|
|
77
|
+
const m = lines[i]!.match(WAIVER_RE);
|
|
78
|
+
if (m) {
|
|
79
|
+
return { file: '', line: i + 1, kind: m[1]!, reason: (m[2] ?? '').trim() };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** Directory names every persistence walker skips (dependency/build trees). */
|
|
86
|
+
export const IGNORED_DIRS: ReadonlySet<string> = new Set([
|
|
87
|
+
'vendor',
|
|
88
|
+
'node_modules',
|
|
89
|
+
'storage',
|
|
90
|
+
'.git',
|
|
91
|
+
'bootstrap',
|
|
92
|
+
'dist',
|
|
93
|
+
'build',
|
|
94
|
+
'.next',
|
|
95
|
+
'coverage',
|
|
96
|
+
// Test trees are not production read paths — R-A1/A2/A3/A8 target
|
|
97
|
+
// production code; test-suite queries run against small fixtures. The
|
|
98
|
+
// scan ROOT itself is never name-checked, so pointing the linter AT a
|
|
99
|
+
// fixture tree still works.
|
|
100
|
+
'tests',
|
|
101
|
+
'Tests',
|
|
102
|
+
'test',
|
|
103
|
+
'__tests__',
|
|
104
|
+
'spec',
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
export function is_ignored_dir(name: string): boolean {
|
|
108
|
+
return IGNORED_DIRS.has(name) || name.startsWith('.');
|
|
109
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rtk allowlist for worker tool loops (road-to-lean-agent-init Phase 4).
|
|
3
|
+
*
|
|
4
|
+
* Wraps ONLY the command class with a MEASURED ~55% output saving —
|
|
5
|
+
* `internal/bench/rtk-savings/RESULTS.md` is the single source of the
|
|
6
|
+
* numbers (referenced, never duplicated here). The ~0%-savings class stays
|
|
7
|
+
* unwrapped: wrap overhead without return. Congruence with RESULTS.md is
|
|
8
|
+
* enforced by `tests/scripts/_lib_rtk_allowlist.test.ts`, which parses the
|
|
9
|
+
* results table and asserts every allowlisted pattern measured ≥ the
|
|
10
|
+
* threshold and every excluded pattern measured below it.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** A worker wraps a command with rtk only when its saving measured ≥ this. */
|
|
14
|
+
export const RTK_WRAP_THRESHOLD_PCT = 50;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Command patterns in the measured high-savings class. Matched against the
|
|
18
|
+
* command a worker is about to run; first match wins.
|
|
19
|
+
*/
|
|
20
|
+
export const RTK_WRAP_ALLOWLIST: ReadonlyArray<{ pattern: RegExp; benchCommand: string }> = [
|
|
21
|
+
{ pattern: /^git status\b/, benchCommand: 'git status' },
|
|
22
|
+
// Full-format git log (NOT --oneline — that class measured ~0%).
|
|
23
|
+
{ pattern: /^git log(?!.*--oneline)\b/, benchCommand: 'git log -10' },
|
|
24
|
+
{ pattern: /^ls -la?\b/, benchCommand: 'ls -la src/scripts' },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Measured-near-zero class — never wrapped (documented so nobody "helpfully"
|
|
29
|
+
* adds them back without a new measurement).
|
|
30
|
+
*/
|
|
31
|
+
export const RTK_NO_WRAP: ReadonlyArray<{ pattern: RegExp; benchCommand: string }> = [
|
|
32
|
+
{ pattern: /^git log .*--oneline\b/, benchCommand: 'git log --oneline -50' },
|
|
33
|
+
{ pattern: /^git diff .*--stat\b/, benchCommand: 'git diff --stat HEAD~5..HEAD' },
|
|
34
|
+
{ pattern: /^git branch\b/, benchCommand: 'git branch -a' },
|
|
35
|
+
{ pattern: /^npm ls\b/, benchCommand: 'npm ls --depth=0' },
|
|
36
|
+
{ pattern: /^git show .*--stat\b/, benchCommand: 'git show --stat HEAD' },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/** Should a worker wrap this command with rtk? Deterministic, measured-class only. */
|
|
40
|
+
export function shouldWrapWithRtk(command: string): boolean {
|
|
41
|
+
const cmd = command.trim();
|
|
42
|
+
if (RTK_NO_WRAP.some((e) => e.pattern.test(cmd))) return false;
|
|
43
|
+
return RTK_WRAP_ALLOWLIST.some((e) => e.pattern.test(cmd));
|
|
44
|
+
}
|
|
@@ -33,6 +33,11 @@ const EXPECTED_KIND: Readonly<Record<string, string>> = {
|
|
|
33
33
|
jwt: 'jwt',
|
|
34
34
|
dburl: 'db-connection-uri',
|
|
35
35
|
assignment: 'generic-assignment',
|
|
36
|
+
// adversarial-corpus additions (road-to-feedback-9.8.0-followups Phase 3)
|
|
37
|
+
'github-fine-grained': 'github-pat',
|
|
38
|
+
'env-db-password': 'generic-assignment',
|
|
39
|
+
'env-api-key': 'generic-assignment',
|
|
40
|
+
'dburl-mysql': 'db-connection-uri',
|
|
36
41
|
};
|
|
37
42
|
|
|
38
43
|
function isReal(f: SecretFinding): boolean {
|
|
@@ -66,6 +66,9 @@ const RULES: readonly Rule[] = [
|
|
|
66
66
|
{ rule: 'aws-access-key', kind: 'aws-access-key', regex: /AKIA[0-9A-Z]{16}/g },
|
|
67
67
|
{ rule: 'google-api-key', kind: 'google-api-key', regex: /AIza[0-9A-Za-z_-]{35}/g },
|
|
68
68
|
{ rule: 'github-pat', kind: 'github-pat', regex: /ghp_[0-9A-Za-z]{36}/g },
|
|
69
|
+
// Fine-grained PATs (github_pat_…) were a measured detector gap: the
|
|
70
|
+
// 2026-07-28 adversarial corpus pass flagged them as missed positives.
|
|
71
|
+
{ rule: 'github-fine-grained-pat', kind: 'github-pat', regex: /github_pat_[0-9A-Za-z_]{22,}/g },
|
|
69
72
|
{
|
|
70
73
|
rule: 'jwt',
|
|
71
74
|
kind: 'jwt',
|
|
@@ -282,6 +285,12 @@ export function scanText(text: string, opts: ScanOptions = {}): SecretFinding[]
|
|
|
282
285
|
if (UUID.test(token)) {
|
|
283
286
|
continue; // benign identifier
|
|
284
287
|
}
|
|
288
|
+
if (/^sha(?:256|384|512)-/.test(token)) {
|
|
289
|
+
// SRI / npm-lockfile integrity digest (`sha512-<base64>`) —
|
|
290
|
+
// a hash, not a credential. Measured FP class on the
|
|
291
|
+
// 2026-07-28 adversarial corpus pass.
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
285
294
|
const entropy = shannonEntropy(token);
|
|
286
295
|
const isHex = IS_HEX.test(token);
|
|
287
296
|
if (isHex && HASH_HEX_LENGTHS.has(token.length)) {
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// Adversarial precision/recall measurement for the secret detector
|
|
2
|
+
// (road-to-feedback-9.8.0-followups Phase 3). Runs the REAL scanText over
|
|
3
|
+
// the committed fixture corpus plus runtime-constructed multiline cases
|
|
4
|
+
// (assembled from parts so nothing key-shaped beyond the existing corpus
|
|
5
|
+
// convention lands in the tree), computes precision / recall / FP-rate, and
|
|
6
|
+
// publishes the rates to internal/reports/secret-scanner-adversarial.json.
|
|
7
|
+
//
|
|
8
|
+
// Hard floor: recall = 100% on positives, FP-rate = 0% on negative controls.
|
|
9
|
+
// A genuine detector miss must NOT be papered over by weakening a fixture —
|
|
10
|
+
// it gets a known_gap entry excluded from the hard assertion and REPORTED.
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
14
|
+
import { describe, expect, it } from 'vitest';
|
|
15
|
+
|
|
16
|
+
import { scanText, type SecretFinding } from './secret_detector.js';
|
|
17
|
+
|
|
18
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const FIXTURES = path.join(HERE, 'fixtures', 'secret-detector');
|
|
20
|
+
const REPO = path.resolve(HERE, '..', '..', '..');
|
|
21
|
+
const REPORT = path.join(REPO, 'internal', 'reports', 'secret-scanner-adversarial.json');
|
|
22
|
+
|
|
23
|
+
/** Measured, documented gaps — excluded from the hard floor, published. */
|
|
24
|
+
const KNOWN_GAPS: string[] = [];
|
|
25
|
+
|
|
26
|
+
const isReal = (f: SecretFinding): boolean => f.confidence === 'high' || f.confidence === 'medium';
|
|
27
|
+
|
|
28
|
+
interface Case { id: string; text: string; expect_hit: boolean }
|
|
29
|
+
|
|
30
|
+
function corpusCases(): Case[] {
|
|
31
|
+
const cases: Case[] = [];
|
|
32
|
+
for (const [file, expectHit] of [['positives.txt', true], ['negatives.txt', false]] as const) {
|
|
33
|
+
const lines = fs.readFileSync(path.join(FIXTURES, file), 'utf-8').split('\n');
|
|
34
|
+
lines.forEach((line, i) => {
|
|
35
|
+
if (line.trim().length === 0 || line.startsWith('#')) return;
|
|
36
|
+
const value = expectHit ? (line.split('|')[1] ?? line) : line;
|
|
37
|
+
cases.push({ id: `${file}:${i + 1}`, text: value, expect_hit: expectHit });
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return cases;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Multiline / wrapped positives assembled at runtime. */
|
|
44
|
+
function constructedCases(): Case[] {
|
|
45
|
+
// A fake PEM body: base64-ish filler between real BEGIN/END framing.
|
|
46
|
+
const pem = [
|
|
47
|
+
['-----BEGIN', 'RSA PRIVATE KEY-----'].join(' '),
|
|
48
|
+
'MIIEpAIBAAKCAQEA7fakebodyfakebodyfakebodyfakebodyfakebody12345678',
|
|
49
|
+
'q7fakebodyfakebodyfakebodyfakebodyfakebodyfakebodyfakebody901234',
|
|
50
|
+
['-----END', 'RSA PRIVATE KEY-----'].join(' '),
|
|
51
|
+
].join('\n');
|
|
52
|
+
// A base64-WRAPPED credential next to a keyword: the wrapped payload is a
|
|
53
|
+
// fake AWS key; the wrapper alone must still trip entropy+keyword.
|
|
54
|
+
const wrapped = `api_key = "${Buffer.from('AKIA' + '1234567890ABCDEF').toString('base64')}"`;
|
|
55
|
+
// .env multiline block (several assignments in one scan call).
|
|
56
|
+
const envBlock = ['APP_ENV=production', 'DB_PASSWORD=q7Xp2Vr9kLm4Nt8wYz3BdF6h', 'MAIL_FROM=noreply@example.com'].join('\n');
|
|
57
|
+
return [
|
|
58
|
+
{ id: 'constructed:pem-multiline', text: pem, expect_hit: true },
|
|
59
|
+
{ id: 'constructed:base64-wrapped-key', text: wrapped, expect_hit: true },
|
|
60
|
+
{ id: 'constructed:env-block', text: envBlock, expect_hit: true },
|
|
61
|
+
// Negative: random base64 with NO credential keyword nearby.
|
|
62
|
+
{ id: 'constructed:naked-base64-no-keyword-short', text: 'blob dGhpcyBpcyBmaWxsZXI=', expect_hit: false },
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
describe('secret detector — adversarial corpus measurement', () => {
|
|
67
|
+
const cases = [...corpusCases(), ...constructedCases()];
|
|
68
|
+
const rows = cases.map((c) => {
|
|
69
|
+
const real = scanText(c.text).filter(isReal);
|
|
70
|
+
return { ...c, hit: real.length > 0, kinds: [...new Set(real.map((f) => f.kind))] };
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
const positives = rows.filter((r) => r.expect_hit);
|
|
74
|
+
const negatives = rows.filter((r) => !r.expect_hit);
|
|
75
|
+
const detected = positives.filter((r) => r.hit);
|
|
76
|
+
const missed = positives.filter((r) => !r.hit).map((r) => r.id);
|
|
77
|
+
const falsePositives = negatives.filter((r) => r.hit).map((r) => r.id);
|
|
78
|
+
const recall = positives.length > 0 ? detected.length / positives.length : 1;
|
|
79
|
+
const fpRate = negatives.length > 0 ? falsePositives.length / negatives.length : 0;
|
|
80
|
+
const precision =
|
|
81
|
+
detected.length + falsePositives.length > 0
|
|
82
|
+
? detected.length / (detected.length + falsePositives.length)
|
|
83
|
+
: 1;
|
|
84
|
+
|
|
85
|
+
it('publishes the measured rates', () => {
|
|
86
|
+
const report = {
|
|
87
|
+
_doc:
|
|
88
|
+
'Adversarial fixture measurement of the secret detector (scanText). ' +
|
|
89
|
+
'Regenerated by src/scripts/_lib/secret_detector_adversarial.test.ts on every run; ' +
|
|
90
|
+
'hard floor asserted there (recall 100% / FP 0% outside known_gaps).',
|
|
91
|
+
generated: new Date().toISOString().slice(0, 10),
|
|
92
|
+
corpus_size: rows.length,
|
|
93
|
+
positives: positives.length,
|
|
94
|
+
negatives: negatives.length,
|
|
95
|
+
detected: detected.length,
|
|
96
|
+
missed,
|
|
97
|
+
false_positives: falsePositives,
|
|
98
|
+
known_gaps: KNOWN_GAPS,
|
|
99
|
+
precision: +precision.toFixed(3),
|
|
100
|
+
recall: +recall.toFixed(3),
|
|
101
|
+
fp_rate: +fpRate.toFixed(3),
|
|
102
|
+
};
|
|
103
|
+
fs.mkdirSync(path.dirname(REPORT), { recursive: true });
|
|
104
|
+
fs.writeFileSync(REPORT, `${JSON.stringify(report, null, 2)}\n`);
|
|
105
|
+
expect(fs.existsSync(REPORT)).toBe(true);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('recall floor: every positive outside known_gaps is detected', () => {
|
|
109
|
+
const hardMisses = missed.filter((id) => !KNOWN_GAPS.includes(id));
|
|
110
|
+
expect(hardMisses, `detector missed: ${hardMisses.join(', ')}`).toHaveLength(0);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('FP floor: no negative control fires high/medium', () => {
|
|
114
|
+
expect(falsePositives, `false positives: ${falsePositives.join(', ')}`).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
@@ -54,6 +54,13 @@ const DENY_EXACT: ReadonlySet<string> = new Set([
|
|
|
54
54
|
// attacker-controlled object stores; the GIT_CONFIG* family is handled by
|
|
55
55
|
// prefix below (it is a general arbitrary-config-injection primitive).
|
|
56
56
|
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
57
|
+
// git path-redirection: GIT_DIR / GIT_INDEX_FILE / GIT_NAMESPACE point a
|
|
58
|
+
// child's git at an attacker-controlled repo, index file, or ref namespace
|
|
59
|
+
// — ordinary git ops then read and write attacker state (low severity,
|
|
60
|
+
// same family as GIT_ALTERNATE_OBJECT_DIRECTORIES above).
|
|
61
|
+
'GIT_DIR',
|
|
62
|
+
'GIT_INDEX_FILE',
|
|
63
|
+
'GIT_NAMESPACE',
|
|
57
64
|
// resolver hijack: HOSTALIASES remaps hostnames via an attacker file,
|
|
58
65
|
// redirecting any network fetch the child performs (CWE-427-adjacent).
|
|
59
66
|
'HOSTALIASES',
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// Shared `node:sqlite` guard — lazy import, availability probe, FTS5 probe,
|
|
2
|
+
// and `PRAGMA user_version` helpers (road-to-reachable-code-memory Phase 6/7).
|
|
3
|
+
//
|
|
4
|
+
// Extracted from the two telemetry twins (mcp_telemetry_store.ts /
|
|
5
|
+
// mcp_telemetry_query.ts) so every derived SQLite store (telemetry, the
|
|
6
|
+
// memory FTS index, the graph store) shares one guard instead of three
|
|
7
|
+
// copies of the same lazy-import + warning-silencer dance.
|
|
8
|
+
//
|
|
9
|
+
// `node:sqlite` ships from Node 22.5 (experimental on 22.x, stable/silent on
|
|
10
|
+
// >= 23); the package's supported floor is `>=20.11` (package.json
|
|
11
|
+
// `engines`), so every caller MUST treat this module's failure modes as
|
|
12
|
+
// expected, not exceptional — lazy import + graceful fallback, never a hard
|
|
13
|
+
// dependency (ADR-129).
|
|
14
|
+
import { createRequire } from 'node:module';
|
|
15
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
16
|
+
import type * as NodeSqlite from 'node:sqlite';
|
|
17
|
+
|
|
18
|
+
/** Thrown by {@link loadSqlite} when `node:sqlite` cannot be imported here. */
|
|
19
|
+
export class SqliteUnavailableError extends Error {
|
|
20
|
+
constructor(callerName: string, cause: string) {
|
|
21
|
+
super(
|
|
22
|
+
`node:sqlite is unavailable in this runtime (${cause}). ` +
|
|
23
|
+
`${callerName} requires Node with the built-in SQLite module.`,
|
|
24
|
+
);
|
|
25
|
+
this.name = 'SqliteUnavailableError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Node 22 flags `node:sqlite` experimental and prints an `ExperimentalWarning:
|
|
30
|
+
// SQLite …` line to stderr on first import (stable / silent on Node >= 23).
|
|
31
|
+
// Drop only that specific warning so stderr stays byte-stable across Node
|
|
32
|
+
// versions (CLI intent tests pin exact stderr bytes). Installed once,
|
|
33
|
+
// narrowly matched — every other `emitWarning` call passes through unchanged.
|
|
34
|
+
let _sqliteWarningSilenced = false;
|
|
35
|
+
function _silenceSqliteExperimentalWarning(): void {
|
|
36
|
+
if (_sqliteWarningSilenced) return;
|
|
37
|
+
_sqliteWarningSilenced = true;
|
|
38
|
+
const orig = process.emitWarning.bind(process);
|
|
39
|
+
process.emitWarning = ((warning: string | Error, ...rest: unknown[]): void => {
|
|
40
|
+
const text = typeof warning === 'string' ? warning : (warning?.message ?? '');
|
|
41
|
+
if (/SQLite is an experimental/i.test(text)) return;
|
|
42
|
+
(orig as (w: string | Error, ...a: unknown[]) => void)(warning, ...rest);
|
|
43
|
+
}) as typeof process.emitWarning;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Lazy `node:sqlite` import — keeps the caller module loadable on a runtime
|
|
48
|
+
* without it. `callerName` (e.g. `"mcp_telemetry_store"`) is folded into the
|
|
49
|
+
* thrown message so each caller's error text stays distinguishable.
|
|
50
|
+
*
|
|
51
|
+
* Throws {@link SqliteUnavailableError} on failure; callers that want a
|
|
52
|
+
* non-throwing check should use {@link isSqliteAvailable} first.
|
|
53
|
+
*/
|
|
54
|
+
export async function loadSqlite(callerName: string): Promise<typeof NodeSqlite> {
|
|
55
|
+
_silenceSqliteExperimentalWarning();
|
|
56
|
+
try {
|
|
57
|
+
return await import('node:sqlite');
|
|
58
|
+
} catch (exc) {
|
|
59
|
+
const message = exc instanceof Error ? exc.message : String(exc);
|
|
60
|
+
throw new SqliteUnavailableError(callerName, message);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** Non-throwing availability probe — true iff `node:sqlite` imports cleanly. */
|
|
65
|
+
export async function isSqliteAvailable(): Promise<boolean> {
|
|
66
|
+
_silenceSqliteExperimentalWarning();
|
|
67
|
+
try {
|
|
68
|
+
await import('node:sqlite');
|
|
69
|
+
return true;
|
|
70
|
+
} catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Whether this runtime's `node:sqlite` supports FTS5 — probed via an
|
|
77
|
+
* in-memory `CREATE VIRTUAL TABLE ... USING fts5` + `MATCH` round-trip
|
|
78
|
+
* (ADR-129: re-verified live on v25.9.0). Some minimal SQLite builds omit
|
|
79
|
+
* the FTS5 extension even when `node:sqlite` itself loads, so this is a
|
|
80
|
+
* separate probe from {@link isSqliteAvailable}.
|
|
81
|
+
*/
|
|
82
|
+
export async function probeFts5(): Promise<boolean> {
|
|
83
|
+
let sqlite: typeof NodeSqlite;
|
|
84
|
+
try {
|
|
85
|
+
sqlite = await loadSqlite('sqlite_guard.probeFts5');
|
|
86
|
+
} catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
let conn: DatabaseSync | null = null;
|
|
90
|
+
try {
|
|
91
|
+
conn = new sqlite.DatabaseSync(':memory:');
|
|
92
|
+
conn.exec("CREATE VIRTUAL TABLE _fts5_probe USING fts5(body)");
|
|
93
|
+
conn.exec("INSERT INTO _fts5_probe(body) VALUES ('probe')");
|
|
94
|
+
const row = conn.prepare("SELECT body FROM _fts5_probe WHERE _fts5_probe MATCH 'probe'").get();
|
|
95
|
+
return row !== undefined;
|
|
96
|
+
} catch {
|
|
97
|
+
return false;
|
|
98
|
+
} finally {
|
|
99
|
+
try {
|
|
100
|
+
conn?.close();
|
|
101
|
+
} catch {
|
|
102
|
+
/* best-effort */
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// --- Synchronous variants ---------------------------------------------------
|
|
108
|
+
//
|
|
109
|
+
// `node:sqlite`'s `DatabaseSync` API is itself fully synchronous; the async
|
|
110
|
+
// variants above exist only because the two telemetry twins happen to be
|
|
111
|
+
// async CLIs. A caller that must stay synchronous end-to-end (memory_lookup.ts
|
|
112
|
+
// — `retrieve()` is called synchronously all over the codebase and by tests)
|
|
113
|
+
// uses `createRequire` for a sync `require('node:sqlite')` instead of the
|
|
114
|
+
// dynamic `import()`, mirroring the file's own existing `_lazy_tokenizer()`
|
|
115
|
+
// sync-require pattern for `./_lib/token_count.js`.
|
|
116
|
+
let _require: NodeJS.Require | undefined;
|
|
117
|
+
function _syncRequire(): NodeJS.Require {
|
|
118
|
+
if (_require === undefined) {
|
|
119
|
+
_require = createRequire(import.meta.url);
|
|
120
|
+
}
|
|
121
|
+
return _require;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Synchronous `node:sqlite` require — see "Synchronous variants" above. */
|
|
125
|
+
export function loadSqliteSync(callerName: string): typeof NodeSqlite {
|
|
126
|
+
_silenceSqliteExperimentalWarning();
|
|
127
|
+
try {
|
|
128
|
+
return _syncRequire()('node:sqlite') as typeof NodeSqlite;
|
|
129
|
+
} catch (exc) {
|
|
130
|
+
const message = exc instanceof Error ? exc.message : String(exc);
|
|
131
|
+
throw new SqliteUnavailableError(callerName, message);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Non-throwing sync availability probe — true iff `node:sqlite` requires cleanly. */
|
|
136
|
+
export function isSqliteAvailableSync(): boolean {
|
|
137
|
+
_silenceSqliteExperimentalWarning();
|
|
138
|
+
try {
|
|
139
|
+
_syncRequire()('node:sqlite');
|
|
140
|
+
return true;
|
|
141
|
+
} catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Sync twin of {@link probeFts5} — see "Synchronous variants" above. */
|
|
147
|
+
export function probeFts5Sync(): boolean {
|
|
148
|
+
let sqlite: typeof NodeSqlite;
|
|
149
|
+
try {
|
|
150
|
+
sqlite = loadSqliteSync('sqlite_guard.probeFts5Sync');
|
|
151
|
+
} catch {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
let conn: DatabaseSync | null = null;
|
|
155
|
+
try {
|
|
156
|
+
conn = new sqlite.DatabaseSync(':memory:');
|
|
157
|
+
conn.exec("CREATE VIRTUAL TABLE _fts5_probe USING fts5(body)");
|
|
158
|
+
conn.exec("INSERT INTO _fts5_probe(body) VALUES ('probe')");
|
|
159
|
+
const row = conn.prepare("SELECT body FROM _fts5_probe WHERE _fts5_probe MATCH 'probe'").get();
|
|
160
|
+
return row !== undefined;
|
|
161
|
+
} catch {
|
|
162
|
+
return false;
|
|
163
|
+
} finally {
|
|
164
|
+
try {
|
|
165
|
+
conn?.close();
|
|
166
|
+
} catch {
|
|
167
|
+
/* best-effort */
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** Read `PRAGMA user_version` — 0 on a freshly created (never-stamped) DB. */
|
|
173
|
+
export function readUserVersion(conn: DatabaseSync): number {
|
|
174
|
+
const row = conn.prepare('PRAGMA user_version').get();
|
|
175
|
+
const v = row?.['user_version'];
|
|
176
|
+
if (typeof v === 'bigint') return Number(v);
|
|
177
|
+
if (typeof v === 'number') return v;
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Stamp `PRAGMA user_version`. SQLite's `PRAGMA` statements take no bind
|
|
183
|
+
* parameters, so `version` is range-checked (small non-negative 32-bit
|
|
184
|
+
* integer) before string interpolation.
|
|
185
|
+
*/
|
|
186
|
+
export function stampUserVersion(conn: DatabaseSync, version: number): void {
|
|
187
|
+
if (!Number.isInteger(version) || version < 0 || version > 2 ** 31 - 1) {
|
|
188
|
+
throw new RangeError(`stampUserVersion: version out of range: ${version}`);
|
|
189
|
+
}
|
|
190
|
+
conn.exec(`PRAGMA user_version = ${version}`);
|
|
191
|
+
}
|