@event4u/agent-config 8.4.1 → 8.6.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 +92 -0
- package/README.md +17 -5
- package/dist/agent-src/README.md +1 -1
- package/dist/agent-src/commands/{analyze-reference-repo.md → analyze/reference-repo.md} +3 -1
- package/dist/agent-src/commands/analyze.md +9 -6
- package/dist/agent-src/commands/{bug-fix.md → bug/fix.md} +3 -1
- package/dist/agent-src/commands/{bug-investigate.md → bug/investigate.md} +4 -2
- package/dist/agent-src/commands/bug.md +59 -0
- package/dist/agent-src/commands/{set-cost-profile.md → cost/profile.md} +9 -6
- package/dist/agent-src/commands/{cost-report.md → cost/report.md} +38 -17
- package/dist/agent-src/commands/cost.md +57 -0
- package/dist/agent-src/commands/evals/{review-changes.json → review.json} +12 -8
- package/dist/agent-src/commands/{quality-fix.md → fix/quality.md} +5 -2
- package/dist/agent-src/commands/fix.md +7 -4
- package/dist/agent-src/commands/optimize/project.md +250 -0
- package/dist/agent-src/commands/{optimize-prompt.md → optimize/prompt.md} +3 -2
- package/dist/agent-src/commands/optimize.md +17 -12
- package/dist/agent-src/commands/{package-reset.md → package/reset.md} +2 -0
- package/dist/agent-src/commands/{package-test.md → package/test.md} +3 -1
- package/dist/agent-src/commands/package.md +56 -0
- package/dist/agent-src/commands/{project-analyze.md → project/analyze.md} +10 -8
- package/dist/agent-src/commands/{project-health.md → project/health.md} +2 -0
- package/dist/agent-src/commands/project.md +60 -0
- package/dist/agent-src/commands/{review-changes.md → review/changes.md} +26 -24
- package/dist/agent-src/commands/{review-routing.md → review/routing.md} +21 -17
- package/dist/agent-src/commands/review.md +61 -0
- package/dist/agent-src/commands/security-audit-config.md +24 -23
- package/dist/agent-src/commands/{sync-agent-settings.md → sync/agent-settings.md} +11 -7
- package/dist/agent-src/commands/{sync-gitignore → sync/gitignore}/fix.md +36 -27
- package/dist/agent-src/commands/{sync-gitignore.md → sync/gitignore.md} +22 -21
- package/dist/agent-src/commands/sync.md +58 -0
- package/dist/agent-src/commands/{e2e-heal.md → tests/e2e-heal.md} +5 -2
- package/dist/agent-src/commands/{e2e-plan.md → tests/e2e-plan.md} +5 -2
- package/dist/agent-src/commands/tests.md +11 -5
- package/dist/agent-src/contexts/augment-infrastructure.md +3 -3
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +30 -0
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +15 -1
- package/dist/agent-src/contexts/execution/subagent-steering.md +54 -1
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/model-recommendations.md +19 -0
- package/dist/agent-src/contexts/skills-and-commands.md +2 -2
- package/dist/agent-src/contexts/subagent-configuration.md +8 -0
- package/dist/agent-src/rules/external-reference-deep-dive.md +1 -1
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +1 -1
- package/dist/agent-src/skills/judge-test-coverage/SKILL.md +1 -1
- package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
- package/dist/agent-src/skills/mobile-e2e-strategy/SKILL.md +5 -5
- package/dist/agent-src/skills/prompt-optimizer/SKILL.md +2 -2
- package/dist/agent-src/skills/quality-tools/SKILL.md +1 -1
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/agent-settings.md +1 -1
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
- package/dist/cli/commands/config.js +44 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/uiServe.js +1 -0
- package/dist/cli/commands/uiServe.js.map +1 -1
- package/dist/cli/help.js +38 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/initRouting.js +16 -1
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +43 -37
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +45 -44
- package/dist/cli/registry.js.map +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +419 -210
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +31 -25
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +30 -24
- package/dist/install/install.mjs +6064 -159
- package/dist/install/selectedTools.js +39 -10
- package/dist/install/selectedTools.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/server/app.js +15 -3
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/ping.js +16 -0
- package/dist/server/routes/ping.js.map +1 -1
- package/dist/server/routes/settings.js +42 -6
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/routes/settingsChanges.js +55 -0
- package/dist/server/routes/settingsChanges.js.map +1 -0
- package/dist/server/routes/userMd.js +7 -2
- package/dist/server/routes/userMd.js.map +1 -1
- package/dist/server/routes/wizard.js +76 -14
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/server/writeRoot.js +17 -0
- package/dist/server/writeRoot.js.map +1 -1
- package/dist/shared/settingsSurface.js +120 -0
- package/dist/shared/settingsSurface.js.map +1 -0
- package/dist/ui/assets/index-BPFMZWUs.css +1 -0
- package/dist/ui/assets/index-BiEZiZ31.js +40 -0
- package/dist/ui/assets/index-BiEZiZ31.js.map +1 -0
- package/dist/ui/index.html +15 -2
- package/docs/CLAIMS.md +27 -15
- package/docs/architecture.md +1 -1
- package/docs/catalog.md +37 -31
- package/docs/command-flows.md +22 -16
- package/docs/contracts/command-clusters.md +39 -9
- package/docs/contracts/file-ownership-matrix.json +21 -0
- package/docs/contracts/frontmatter-contract.md +1 -1
- package/docs/contracts/gui-wizard.md +16 -4
- package/docs/contracts/iron-law-overrides.txt +1 -0
- package/docs/contracts/rule-classification.md +2 -2
- package/docs/contracts/settings-api.md +58 -2
- package/docs/contracts/surface-matrix.md +5 -0
- package/docs/cookbook.md +7 -7
- package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +74 -0
- package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +91 -0
- package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +125 -0
- package/docs/decisions/INDEX.md +3 -0
- package/docs/featured-commands.md +1 -1
- package/docs/featured-skills.md +4 -4
- package/docs/flows.md +2 -2
- package/docs/getting-started-by-role.md +1 -1
- package/docs/getting-started-laravel.md +1 -1
- package/docs/getting-started.md +6 -3
- package/docs/governance-advantage.md +1 -1
- package/docs/guidelines/agent-infra/5w2h-analysis.md +1 -1
- package/docs/guidelines/agent-infra/ios-simulator-guide.md +1 -1
- package/docs/proof.md +12 -2
- package/package.json +3 -1
- package/src/agent-src/README.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +1 -1
- package/src/config/agent-settings.template.yml +1 -1
- package/src/install/selectedTools.ts +38 -10
- package/src/scripts/_cli/cmd_converge.ts +38 -0
- package/src/scripts/_cli/cmd_doctor.ts +113 -2
- package/src/scripts/_cli/cmd_explain.ts +2 -2
- package/src/scripts/_cli/cmd_export.ts +3 -3
- package/src/scripts/_cli/cmd_fleet.ts +13 -1
- package/src/scripts/_cli/cmd_migrate.ts +3 -3
- package/src/scripts/_cli/cmd_prune.ts +2 -2
- package/src/scripts/_cli/cmd_refresh.ts +4 -4
- package/src/scripts/_cli/cmd_settings_check.ts +2 -2
- package/src/scripts/_cli/cmd_settings_migrate.ts +2 -2
- package/src/scripts/_cli/cmd_sync.ts +2 -2
- package/src/scripts/_cli/cmd_uninstall.ts +2 -2
- package/src/scripts/_cli/cmd_update.ts +8 -8
- package/src/scripts/_cli/cmd_upgrade.ts +4 -3
- package/src/scripts/_cli/cmd_validate.ts +3 -3
- package/src/scripts/_cli/cmd_versions.ts +2 -2
- package/src/scripts/_cli/explain_last/assumptions.ts +2 -2
- package/src/scripts/_cli/explain_last/council.ts +2 -2
- package/src/scripts/_cli/explain_last/halt.ts +2 -2
- package/src/scripts/_cli/explain_last/index.ts +2 -2
- package/src/scripts/_cli/explain_last/inputs.ts +4 -4
- package/src/scripts/_cli/explain_last/memory.ts +2 -2
- package/src/scripts/_cli/explain_last/provider.ts +2 -2
- package/src/scripts/_cli/explain_last/render.ts +2 -2
- package/src/scripts/_cli/explain_last/route.ts +2 -2
- package/src/scripts/_cli/explain_last/scrubber.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/assumptions.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/council.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/halt.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/header.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/index.ts +1 -1
- package/src/scripts/_cli/explain_last/sections/inputs.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/memory.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/pack.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/provider.ts +2 -2
- package/src/scripts/_cli/explain_last/sections/route.ts +2 -2
- package/src/scripts/_cli/explain_last/state_loader.ts +2 -2
- package/src/scripts/_dispatch.bash +20 -1
- package/src/scripts/_lib/agent_settings.ts +1 -1
- package/src/scripts/_lib/agent_src.ts +7 -7
- package/src/scripts/_lib/agents_overlay.ts +1 -1
- package/src/scripts/_lib/auto_dispatch.ts +63 -0
- package/src/scripts/_lib/bench_ab_cache.ts +1 -1
- package/src/scripts/_lib/bench_ab_scoring.ts +1 -1
- package/src/scripts/_lib/bench_ab_scoring_v2.ts +3 -3
- package/src/scripts/_lib/bench_cost.ts +1 -1
- package/src/scripts/_lib/bench_quality.ts +3 -3
- package/src/scripts/_lib/bench_report.ts +4 -4
- package/src/scripts/_lib/bench_telegraph.ts +1 -1
- package/src/scripts/_lib/bench_telegraph_report.ts +4 -4
- package/src/scripts/_lib/changelog_eras.ts +1 -1
- package/src/scripts/_lib/claude_desktop_bundler.ts +1 -1
- package/src/scripts/_lib/cli_wrapper.ts +1 -1
- package/src/scripts/_lib/fs_atomic.ts +1 -1
- package/src/scripts/_lib/global_deploy_inventory.ts +1 -1
- package/src/scripts/_lib/install_layout.ts +1 -1
- package/src/scripts/_lib/install_regenerator.ts +1 -1
- package/src/scripts/_lib/installed_lock.ts +1 -1
- package/src/scripts/_lib/installed_tools.ts +1 -1
- package/src/scripts/_lib/json_pointers.ts +1 -1
- package/src/scripts/_lib/knowledge_global.ts +1 -1
- package/src/scripts/_lib/knowledge_global_promote.ts +2 -2
- package/src/scripts/_lib/knowledge_global_redaction.ts +2 -2
- package/src/scripts/_lib/link_crypto.ts +4 -4
- package/src/scripts/_lib/linked_projects.ts +4 -4
- package/src/scripts/_lib/model_tier.ts +1 -1
- package/src/scripts/_lib/module_detection.ts +2 -2
- package/src/scripts/_lib/pin_resolver.ts +1 -1
- package/src/scripts/_lib/script_output.ts +1 -1
- package/src/scripts/_lib/security_lint.ts +1 -1
- package/src/scripts/_lib/subagent_routing.ts +24 -0
- package/src/scripts/_lib/subagent_steering.ts +213 -3
- package/src/scripts/_lib/surface_tiers.ts +1 -1
- package/src/scripts/_lib/text_similarity.ts +1 -1
- package/src/scripts/_lib/update_check.ts +2 -2
- package/src/scripts/_lib/user_global_paths.ts +1 -1
- package/src/scripts/_lib/value_ladder.ts +1 -1
- package/src/scripts/_lib/value_report.ts +1 -1
- package/src/scripts/_lib/zip_min.ts +2 -2
- package/src/scripts/adoption_report.ts +3 -3
- package/src/scripts/adoption_snapshot.ts +3 -3
- package/src/scripts/adoption_status.ts +2 -2
- package/src/scripts/adr/regenerate_index.ts +3 -3
- package/src/scripts/ai_council/_default_prices.ts +2 -3
- package/src/scripts/ai_council/advisors.ts +1 -1
- package/src/scripts/ai_council/airgap.ts +1 -1
- package/src/scripts/ai_council/budget_guard.ts +1 -1
- package/src/scripts/ai_council/bundler.ts +1 -1
- package/src/scripts/ai_council/cli_hints.ts +1 -1
- package/src/scripts/ai_council/clients.ts +5 -5
- package/src/scripts/ai_council/compile_corpus.ts +1 -1
- package/src/scripts/ai_council/confidence_gate.ts +1 -1
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/consensus.ts +1 -1
- package/src/scripts/ai_council/events_log.ts +1 -1
- package/src/scripts/ai_council/learn_low_impact_preview.ts +1 -1
- package/src/scripts/ai_council/low_impact_corpus.ts +1 -1
- package/src/scripts/ai_council/low_impact_intake.ts +1 -1
- package/src/scripts/ai_council/modes.ts +1 -1
- package/src/scripts/ai_council/orchestrator.ts +3 -3
- package/src/scripts/ai_council/pricing.ts +2 -2
- package/src/scripts/ai_council/probation_gate.ts +2 -2
- package/src/scripts/ai_council/project_context.ts +1 -1
- package/src/scripts/ai_council/prompts.ts +1 -1
- package/src/scripts/ai_council/redact_low_impact_entry.ts +2 -2
- package/src/scripts/ai_council/session.ts +1 -1
- package/src/scripts/ai_council/shadow_dispatch.ts +1 -1
- package/src/scripts/ai_council/solo_dispatch.ts +1 -1
- package/src/scripts/analysis_freshness.ts +2 -2
- package/src/scripts/annotate_discovery.ts +2 -2
- package/src/scripts/apply_modules_config.ts +2 -2
- package/src/scripts/audit_adr_coverage.ts +3 -3
- package/src/scripts/audit_auto_rules.ts +2 -2
- package/src/scripts/audit_cloud_compatibility.ts +3 -3
- package/src/scripts/audit_command_surface.ts +2 -2
- package/src/scripts/audit_initial_context.ts +7 -6
- package/src/scripts/audit_likelihood.ts +5 -5
- package/src/scripts/audit_mcp_tools.ts +3 -3
- package/src/scripts/audit_overlap.ts +2 -2
- package/src/scripts/audit_skill_descriptions.ts +2 -2
- package/src/scripts/audit_skill_overlap.ts +5 -5
- package/src/scripts/audit_user_type_axis.ts +4 -4
- package/src/scripts/backfill_model_tier.ts +1 -1
- package/src/scripts/bench_ab_cache_dispatch.ts +2 -2
- package/src/scripts/bench_ab_clone.ts +2 -2
- package/src/scripts/bench_ab_diff.ts +3 -3
- package/src/scripts/bench_ab_integrity.ts +2 -2
- package/src/scripts/bench_ab_run.ts +4 -4
- package/src/scripts/bench_ab_task_runner.ts +1 -1
- package/src/scripts/bench_ab_tracka_run.ts +2 -2
- package/src/scripts/bench_ab_v2_run.ts +1 -1
- package/src/scripts/bench_ab_v2_stats.ts +2 -2
- package/src/scripts/bench_baseline_ready.ts +1 -1
- package/src/scripts/bench_condense_memory.ts +4 -4
- package/src/scripts/bench_drift_check.ts +3 -3
- package/src/scripts/bench_per_tool.ts +1 -1
- package/src/scripts/bench_rtk_savings.ts +4 -4
- package/src/scripts/bench_run.ts +4 -4
- package/src/scripts/bench_runner.ts +1 -1
- package/src/scripts/build_cloud_bundle.ts +3 -3
- package/src/scripts/build_discovery_manifest.ts +13 -15
- package/src/scripts/build_linear_digest.ts +2 -2
- package/src/scripts/build_mcp_registry_manifest.ts +3 -3
- package/src/scripts/build_proof.ts +6 -0
- package/src/scripts/build_rule_trigger_matrix.ts +2 -2
- package/src/scripts/capture_showcase_session.ts +3 -3
- package/src/scripts/chat_history.ts +1 -1
- package/src/scripts/check_always_budget.ts +1 -1
- package/src/scripts/check_artefact_checksums.ts +4 -4
- package/src/scripts/check_artefact_count_messaging.ts +197 -0
- package/src/scripts/check_augment_description_cap.ts +3 -3
- package/src/scripts/check_augmentignore.ts +1 -1
- package/src/scripts/check_beta_review_markers.ts +3 -3
- package/src/scripts/check_bite_sized_granularity.ts +1 -1
- package/src/scripts/check_cluster_patterns.ts +47 -3
- package/src/scripts/check_command_count_messaging.ts +2 -2
- package/src/scripts/check_condensation.ts +2 -2
- package/src/scripts/check_condensed_paths.ts +6 -6
- package/src/scripts/check_context_paths.ts +1 -1
- package/src/scripts/check_council_config_location.ts +3 -3
- package/src/scripts/check_council_layout.ts +2 -2
- package/src/scripts/check_council_references.ts +2 -2
- package/src/scripts/check_discovery_determinism.ts +3 -3
- package/src/scripts/check_gate_paths.ts +4 -4
- package/src/scripts/check_iron_law_prominence.ts +2 -2
- package/src/scripts/check_kernel_rule_bundle.ts +3 -3
- package/src/scripts/check_knowledge_cards.ts +4 -4
- package/src/scripts/check_knowledge_pages.ts +1 -1
- package/src/scripts/check_md_language.ts +3 -3
- package/src/scripts/check_memory.ts +3 -3
- package/src/scripts/check_memory_proposal.ts +2 -2
- package/src/scripts/check_module_management_neutral.ts +1 -1
- package/src/scripts/check_no_conflict_markers.ts +1 -1
- package/src/scripts/check_no_external_sources.ts +1 -1
- package/src/scripts/check_no_local_settings_committed.ts +2 -2
- package/src/scripts/check_no_new_legacy_path.ts +3 -3
- package/src/scripts/check_no_roadmap_refs.ts +3 -3
- package/src/scripts/check_one_off_location.ts +3 -3
- package/src/scripts/check_overlay_cascade_subdirs.ts +3 -3
- package/src/scripts/check_portability.ts +3 -3
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_public_catalog_links.ts +1 -1
- package/src/scripts/check_public_links.ts +2 -2
- package/src/scripts/check_references.ts +3 -3
- package/src/scripts/check_release_includes_discovery.ts +2 -2
- package/src/scripts/check_release_pr_shape.ts +2 -2
- package/src/scripts/check_release_published.ts +1 -1
- package/src/scripts/check_release_trunk_sync.ts +3 -3
- package/src/scripts/check_reply_consistency.ts +1 -1
- package/src/scripts/check_roadmap_trackable.ts +2 -2
- package/src/scripts/check_role_doc_links.ts +2 -2
- package/src/scripts/check_safety_floor_untouched.ts +3 -3
- package/src/scripts/check_skill_requires.ts +2 -2
- package/src/scripts/check_structural_breaking.ts +2 -2
- package/src/scripts/check_surface_tiers.ts +2 -2
- package/src/scripts/check_template_pin_drift.ts +1 -1
- package/src/scripts/check_test_coverage_diff.ts +2 -2
- package/src/scripts/check_token_optimizer_freshness.ts +3 -3
- package/src/scripts/check_trigger_evals.ts +2 -2
- package/src/scripts/check_update_banner.ts +1 -1
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/ci_summary.ts +3 -3
- package/src/scripts/ci_time_ratio.ts +1 -1
- package/src/scripts/command_suggester/cooldown.ts +1 -1
- package/src/scripts/command_suggester/index.ts +1 -1
- package/src/scripts/command_suggester/loader.ts +1 -1
- package/src/scripts/command_suggester/match.ts +1 -1
- package/src/scripts/command_suggester/rank.ts +1 -1
- package/src/scripts/command_suggester/render.ts +1 -1
- package/src/scripts/command_suggester/sanitize.ts +1 -1
- package/src/scripts/command_suggester/settings.ts +1 -1
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +4 -4
- package/src/scripts/condense.ts +3 -3
- package/src/scripts/condense_memory.ts +1 -1
- package/src/scripts/config/index.ts +1 -1
- package/src/scripts/config/packs.ts +1 -1
- package/src/scripts/config/presets.ts +1 -1
- package/src/scripts/config/profile_explain.ts +1 -1
- package/src/scripts/config/profiles.ts +1 -1
- package/src/scripts/config/session_profiles.ts +1 -1
- package/src/scripts/context_hygiene_hook.ts +2 -2
- package/src/scripts/cost_by_conversation.ts +1 -1
- package/src/scripts/cost_summary.ts +2 -2
- package/src/scripts/council_cli.ts +1 -1
- package/src/scripts/council_prune.ts +1 -1
- package/src/scripts/cross_repo_retrieve.ts +2 -2
- package/src/scripts/discovery_stats.ts +3 -3
- package/src/scripts/evidence_report.ts +4 -4
- package/src/scripts/extract_audit_patterns.ts +2 -2
- package/src/scripts/first_run_gate_hook.ts +1 -1
- package/src/scripts/gen_discovery_baseline.ts +2 -2
- package/src/scripts/generate_capabilities_index.ts +2 -2
- package/src/scripts/generate_capability_matrix.ts +2 -2
- package/src/scripts/generate_catalog.ts +2 -2
- package/src/scripts/generate_command_flows.ts +2 -2
- package/src/scripts/generate_cookbook.ts +1 -1
- package/src/scripts/generate_index.ts +3 -3
- package/src/scripts/generate_ownership_matrix.ts +2 -2
- package/src/scripts/generate_pack_manifests.ts +2 -2
- package/src/scripts/generate_role_experiences_catalog.ts +3 -3
- package/src/scripts/hooks/block_no_verify.ts +2 -2
- package/src/scripts/hooks/dispatch_hook.ts +2 -2
- package/src/scripts/hooks/dispatch_issues.ts +1 -1
- package/src/scripts/hooks/envelope.ts +1 -1
- package/src/scripts/hooks/replay_hook.ts +1 -1
- package/src/scripts/hooks/state_io.ts +1 -1
- package/src/scripts/hooks_doctor.ts +1 -1
- package/src/scripts/hooks_status.ts +1 -1
- package/src/scripts/injection_scan_hook.ts +1 -1
- package/src/scripts/install.ts +145 -3
- package/src/scripts/inventory_abstraction_budget.ts +5 -5
- package/src/scripts/inventory_frontmatter.ts +1 -1
- package/src/scripts/inventory_meta_layers.ts +1 -1
- package/src/scripts/iron_law_sha.ts +1 -1
- package/src/scripts/knowledge_global_cli.ts +3 -3
- package/src/scripts/linked_projects_list.ts +1 -1
- package/src/scripts/lint_agent_security.ts +4 -4
- package/src/scripts/lint_agent_skill_names.ts +1 -1
- package/src/scripts/lint_agents_layout.ts +2 -2
- package/src/scripts/lint_agents_md.ts +3 -3
- package/src/scripts/lint_archived_skills.ts +2 -2
- package/src/scripts/lint_artefact_frontmatter.ts +2 -2
- package/src/scripts/lint_bench_ab.ts +2 -2
- package/src/scripts/lint_bench_corpus.ts +1 -1
- package/src/scripts/lint_command_flow_coverage.ts +1 -1
- package/src/scripts/lint_command_routing.ts +2 -2
- package/src/scripts/lint_command_tiers.ts +1 -1
- package/src/scripts/lint_command_verbs.ts +4 -4
- package/src/scripts/lint_commit_subjects.ts +2 -2
- package/src/scripts/lint_context_spine_usage.ts +3 -3
- package/src/scripts/lint_discovery_manifest.ts +4 -4
- package/src/scripts/lint_discovery_vocabulary.ts +2 -2
- package/src/scripts/lint_empty_roadmaps.ts +3 -3
- package/src/scripts/lint_eval_freshness.ts +2 -2
- package/src/scripts/lint_examples.ts +2 -2
- package/src/scripts/lint_explain_trace.ts +2 -2
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_flows.ts +5 -5
- package/src/scripts/lint_framework_leakage.ts +1 -1
- package/src/scripts/lint_framework_leakage_allowlist.json +10 -2
- package/src/scripts/lint_frontmatter_boilerplate.ts +2 -2
- package/src/scripts/lint_ghostwriter_source.ts +3 -3
- package/src/scripts/lint_global_paths.ts +1 -1
- package/src/scripts/lint_handoffs.ts +1 -1
- package/src/scripts/lint_hidden_unicode.ts +1 -1
- package/src/scripts/lint_hook_concern_budget.ts +2 -2
- package/src/scripts/lint_hook_manifest.ts +2 -2
- package/src/scripts/lint_instruction_smuggling.ts +1 -1
- package/src/scripts/lint_load_context.ts +2 -2
- package/src/scripts/lint_marketplace.ts +1 -1
- package/src/scripts/lint_marketplace_install_completeness.ts +2 -2
- package/src/scripts/lint_mcp_config_security.ts +1 -1
- package/src/scripts/lint_mcp_registry_manifest.ts +1 -1
- package/src/scripts/lint_media_policy_linkage.ts +3 -3
- package/src/scripts/lint_missions.ts +3 -3
- package/src/scripts/lint_model_tier_coverage.ts +3 -3
- package/src/scripts/lint_namespace.ts +2 -2
- package/src/scripts/lint_namespace_collisions.ts +2 -2
- package/src/scripts/lint_new_skill_gate.ts +3 -3
- package/src/scripts/lint_no_new_atomic_commands.ts +9 -6
- package/src/scripts/lint_no_python_twin_rationale.ts +102 -0
- package/src/scripts/lint_one_off_age.ts +2 -2
- package/src/scripts/lint_orchestration_dsl.ts +3 -3
- package/src/scripts/lint_orchestrator_auto_detect.ts +1 -1
- package/src/scripts/lint_pack_boundaries.ts +2 -2
- package/src/scripts/lint_pack_dependencies.ts +2 -2
- package/src/scripts/lint_pack_first_win.ts +2 -2
- package/src/scripts/lint_persona_governance.ts +3 -3
- package/src/scripts/lint_positioning.ts +1 -1
- package/src/scripts/lint_profile_overlay_set_only.ts +2 -2
- package/src/scripts/lint_readme_jargon.ts +2 -2
- package/src/scripts/lint_readme_size.ts +2 -2
- package/src/scripts/lint_regression.ts +3 -3
- package/src/scripts/lint_roadmap_ci_steps.ts +3 -3
- package/src/scripts/lint_roadmap_complexity.ts +1 -1
- package/src/scripts/lint_roadmap_later_disposition.ts +2 -2
- package/src/scripts/lint_role_experiences.ts +2 -2
- package/src/scripts/lint_rule_interactions.ts +1 -1
- package/src/scripts/lint_rule_tiers.ts +1 -1
- package/src/scripts/lint_showcase_sessions.ts +2 -2
- package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_skill_tools.ts +3 -3
- package/src/scripts/lint_ticket_buildable.ts +2 -2
- package/src/scripts/lint_topics_yaml.ts +3 -3
- package/src/scripts/lint_trust_coherence.ts +3 -3
- package/src/scripts/lint_value_dashboard.ts +3 -3
- package/src/scripts/lint_workflow_security.ts +3 -3
- package/src/scripts/lint_workspace_boundary.ts +2 -2
- package/src/scripts/mcp_parity_smoke.ts +1 -1
- package/src/scripts/mcp_render.ts +1 -1
- package/src/scripts/mcp_server/catalog.ts +1 -1
- package/src/scripts/mcp_server/index.ts +1 -1
- package/src/scripts/mcp_server/metadata.ts +1 -1
- package/src/scripts/mcp_server/prompts.ts +1 -1
- package/src/scripts/mcp_server/resources.ts +1 -1
- package/src/scripts/mcp_server/server.ts +1 -1
- package/src/scripts/mcp_server/telemetry.ts +1 -1
- package/src/scripts/mcp_server/tools.ts +1 -1
- package/src/scripts/mcp_telemetry_health.ts +1 -1
- package/src/scripts/mcp_telemetry_query.ts +3 -3
- package/src/scripts/mcp_telemetry_store.ts +3 -3
- package/src/scripts/measure_augment_budget.ts +2 -2
- package/src/scripts/measure_density.ts +2 -2
- package/src/scripts/measure_frugality_savings.ts +3 -3
- package/src/scripts/measure_markitdown_lift.ts +1 -1
- package/src/scripts/measure_patterns.ts +1 -1
- package/src/scripts/measure_projection_bytes.ts +1 -1
- package/src/scripts/measure_rule_budget.ts +1 -1
- package/src/scripts/measure_skill_reduction.ts +1 -1
- package/src/scripts/memory_hash.ts +1 -1
- package/src/scripts/memory_lookup.ts +6 -6
- package/src/scripts/memory_report.ts +1 -1
- package/src/scripts/memory_signal.ts +1 -1
- package/src/scripts/memory_status.ts +2 -2
- package/src/scripts/migrate_command_suggestions.ts +1 -1
- package/src/scripts/migrate_frontmatter_defaults.ts +1 -1
- package/src/scripts/mine_session.ts +3 -3
- package/src/scripts/minimal_safe_diff_hook.ts +2 -2
- package/src/scripts/move_artefact.ts +3 -3
- package/src/scripts/new_skill.ts +3 -3
- package/src/scripts/onboarding_gate_hook.ts +2 -2
- package/src/scripts/pack_mcp_content.ts +1 -1
- package/src/scripts/parity/replay.ts +3 -2
- package/src/scripts/pattern_share.ts +2 -2
- package/src/scripts/plan_physical_move.ts +3 -3
- package/src/scripts/prediction-pool/poisson_sim.ts +2 -2
- package/src/scripts/prediction-pool/pool_winsim.ts +2 -2
- package/src/scripts/prediction-pool/score_ev.ts +2 -2
- package/src/scripts/print_required_checks.ts +2 -2
- package/src/scripts/probe_projection_fidelity.ts +2 -2
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/profile_staleness_hook.ts +2 -2
- package/src/scripts/profile_use.ts +2 -2
- package/src/scripts/project_thin_rules.ts +3 -3
- package/src/scripts/propose_modules_config.ts +2 -2
- package/src/scripts/prototype_lint_contradictions.ts +2 -2
- package/src/scripts/prove_pack_extractable.ts +1 -1
- package/src/scripts/readme_linter.ts +4 -4
- package/src/scripts/redact_hook_capture.ts +2 -2
- package/src/scripts/refine_ticket_detect.ts +1 -1
- package/src/scripts/release.ts +30 -19
- package/src/scripts/render_benchmark_md.ts +2 -2
- package/src/scripts/render_value_md.ts +2 -2
- package/src/scripts/roadmap_progress_hook.ts +1 -1
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/run_skill_evals.ts +2 -2
- package/src/scripts/runtime_dispatcher.ts +1 -1
- package/src/scripts/runtime_handler.ts +1 -1
- package/src/scripts/runtime_registry.ts +3 -3
- package/src/scripts/score_skill_selection.ts +1 -1
- package/src/scripts/security_audit_config.ts +2 -2
- package/src/scripts/skill_collision_clusters.ts +1 -1
- package/src/scripts/skill_discovery.ts +1 -1
- package/src/scripts/skill_linter.ts +8 -7
- package/src/scripts/skill_overlap.ts +2 -2
- package/src/scripts/skill_preview.ts +1 -1
- package/src/scripts/skill_tools/audit_persona_coverage.ts +3 -3
- package/src/scripts/skill_tools/audit_user_type_coverage.ts +3 -3
- package/src/scripts/skill_tools/index.ts +1 -1
- package/src/scripts/skill_tools/run_block_d_eval.ts +3 -3
- package/src/scripts/skill_tools/score_skill_relevance.ts +3 -3
- package/src/scripts/skill_tools/suggest_skill_for_task.ts +3 -3
- package/src/scripts/skill_trigger_eval.ts +2 -2
- package/src/scripts/skill_usage_collect.ts +2 -2
- package/src/scripts/skill_usage_report.ts +2 -2
- package/src/scripts/smoke_path_resolution.ts +2 -2
- package/src/scripts/smoke_quickstart.ts +4 -4
- package/src/scripts/snapshot_agent_outputs.ts +2 -2
- package/src/scripts/spotcheck_thin_root.ts +2 -2
- package/src/scripts/surface-tiers.yml +1 -0
- package/src/scripts/sync_agent_settings.ts +2 -2
- package/src/scripts/sync_github_metadata.ts +4 -4
- package/src/scripts/sync_gitignore.ts +3 -3
- package/src/scripts/sync_yaml_rt.ts +2 -2
- package/src/scripts/telegraph_stats.ts +1 -1
- package/src/scripts/tool_registry.ts +2 -2
- package/src/scripts/tools/adapter_errors.ts +1 -1
- package/src/scripts/tools/base_adapter.ts +1 -1
- package/src/scripts/tools/github_adapter.ts +1 -1
- package/src/scripts/tools/jira_adapter.ts +1 -1
- package/src/scripts/trigger_coverage.ts +2 -2
- package/src/scripts/update_counts.ts +68 -6
- package/src/scripts/update_prices.ts +3 -3
- package/src/scripts/validate_agent_settings.ts +3 -3
- package/src/scripts/validate_decision_engine.ts +2 -2
- package/src/scripts/validate_discovery_manifest.ts +3 -3
- package/src/scripts/validate_frontmatter.ts +5 -5
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/scripts/validate_safe_paths.ts +2 -2
- package/src/scripts/validate_telegraph_carveouts.ts +3 -3
- package/src/scripts/verify_before_complete_hook.ts +2 -2
- package/src/scripts/verify_physical_move.ts +2 -2
- package/src/scripts/wrapper_freshness_hook.ts +3 -3
- package/src/server/schemas/settings.ts +426 -0
- package/src/shared/settingsSurface.ts +184 -0
- package/src/shared/userMd/formAdapter.ts +86 -0
- package/src/shared/userMd/schema.ts +59 -0
- package/src/shared/userMd/utils.ts +91 -0
- package/dist/agent-src/commands/optimize-project.md +0 -243
- package/dist/ui/assets/index-BbWWuFrF.css +0 -1
- package/dist/ui/assets/index-UjcTG_9O.js +0 -40
- package/dist/ui/assets/index-UjcTG_9O.js.map +0 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Measure rtk's token savings on a fixed corpus of verbose CLI invocations.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 8 / Wave 8d). The CLI contract mirrors the Python
|
|
5
|
+
* Ported from the retired Python `src/scripts/bench_rtk_savings.py` (ADR-200 py2ts
|
|
6
|
+
* Phase 8 / Wave 8d). The CLI contract mirrors the retired Python implementation
|
|
7
7
|
* EXACTLY — `--corpus`, `--out`, `--quiet`, exit codes, stdout/stderr
|
|
8
8
|
* split, the one-line headline summary, and byte-identical written
|
|
9
9
|
* reports (`json.dumps(indent=2, ensure_ascii=False)` + trailing
|
|
@@ -53,7 +53,7 @@ type Dict = Record<string, unknown>;
|
|
|
53
53
|
* Marker for a value that is a Python `float`. CPython's `json.dumps`
|
|
54
54
|
* renders a float `0.0` as `0.0` (not `0`); JS numbers lose that
|
|
55
55
|
* distinction. Wrapping the report's float fields keeps the written
|
|
56
|
-
* JSON byte-identical with the Python
|
|
56
|
+
* JSON byte-identical with the retired Python implementation.
|
|
57
57
|
*/
|
|
58
58
|
class PyFloat {
|
|
59
59
|
constructor(readonly value: number) {}
|
|
@@ -366,7 +366,7 @@ export function run(corpus_path: string = DEFAULT_CORPUS, out_dir: string = DEFA
|
|
|
366
366
|
|
|
367
367
|
/**
|
|
368
368
|
* Mirror Path.relative_to(REPO_ROOT) — raises (ValueError-equivalent) when
|
|
369
|
-
* the path is not under REPO_ROOT, matching the Python
|
|
369
|
+
* the path is not under REPO_ROOT, matching the retired Python implementation's behaviour.
|
|
370
370
|
*/
|
|
371
371
|
function _relativeToRepo(p: string): string {
|
|
372
372
|
const resolvedRoot = path.resolve(REPO_ROOT);
|
package/src/scripts/bench_run.ts
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Bench orchestrator — step-4 measurement-and-benchmark Phase 2.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Wave 8d). The CLI contract
|
|
5
|
+
* Ported from the retired Python `src/scripts/bench_run.py` (ADR-200, Phase 8 /
|
|
6
|
+
* Wave 8d). The CLI contract pins the historical contract exactly — same
|
|
7
7
|
* flags, exit codes, stdout/stderr split, byte-identical headline / Markdown
|
|
8
8
|
* stdout and byte-identical written report JSON
|
|
9
9
|
* (`json.dumps(indent=2) + "\n"`). No behaviour changes — latent Python
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* `ai_council.clients` module (it carries no legacy source-tree literal, so
|
|
24
24
|
* ADR-051 does not require porting it in this wave). The `--telegraph-dry-run`
|
|
25
25
|
* path is fully self-contained; the live path degrades to the same "cannot
|
|
26
|
-
* build Anthropic client" exit-2 surface the Python
|
|
26
|
+
* build Anthropic client" exit-2 surface the retired Python implementation produces when the
|
|
27
27
|
* client can't be built. Flagged as a divergence candidate.
|
|
28
28
|
*/
|
|
29
29
|
import * as fs from 'node:fs';
|
|
@@ -390,7 +390,7 @@ function _run_telegraph(args: Args): number {
|
|
|
390
390
|
/**
|
|
391
391
|
* Live-API telegraph path. Builds the Anthropic client; on any failure prints
|
|
392
392
|
* the same "cannot build Anthropic client" message and returns 2, mirroring
|
|
393
|
-
* the Python
|
|
393
|
+
* the retired Python implementation's `try/except Exception` guard. Because the
|
|
394
394
|
* `ai_council.clients` twin is not yet present, this currently always takes
|
|
395
395
|
* the failure branch (flagged divergence — the live happy path is unreachable
|
|
396
396
|
* until that module is ported).
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Bench runner for the eval corpora — step-4 measurement-and-benchmark Phase 1.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/bench_runner.py` (ADR-200 Python→TS
|
|
6
6
|
* migration, Phase 8 / Wave 8d). Mirrors the CLI contract EXACTLY: flags
|
|
7
7
|
* (`--corpus`, `--top-k`, `--json`), exit codes (0 PASS / 1 FAIL / 2 corpus
|
|
8
8
|
* not found), byte-identical stdout/stderr, and byte-identical JSON
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* build_cloud_bundle.ts — package skills as Anthropic Skills ZIP bundles.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/build_cloud_bundle.py` (ADR-200 —
|
|
6
6
|
* Python→TS migration, Phase 8 / Wave 8b). The CLI contract is mirrored
|
|
7
7
|
* EXACTLY — the mutually-exclusive `--skill` / `--all` / `--check` flags,
|
|
8
8
|
* `--out` / `--strict-budget` / `--clean`, exit codes, the stdout/stderr
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* CONTENTS written into each ZIP are byte-identical.
|
|
13
13
|
*
|
|
14
14
|
* Imports the `audit_cloud_compatibility` twin (the SAME `scan` /
|
|
15
|
-
* `detect_cloud_marker` surfaces the Python
|
|
15
|
+
* `detect_cloud_marker` surfaces the retired Python implementation imports) for tier
|
|
16
16
|
* classification.
|
|
17
17
|
*
|
|
18
18
|
* DIVERGENCE CANDIDATE (documented under the ADR-200 process):
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* compares decompressed entry maps (name → bytes), the manifest JSON, and the
|
|
26
26
|
* console output — not the raw archive bytes.
|
|
27
27
|
*
|
|
28
|
-
* Note on error semantics: the Python
|
|
28
|
+
* Note on error semantics: the retired Python implementation raises bare
|
|
29
29
|
* `SystemExit("❌ …")` for budget / source / T3-H failures. A string
|
|
30
30
|
* SystemExit prints the message to stderr and exits with code 1 (NOT the
|
|
31
31
|
* 2/3/4/5 codes named in the docstring, which never fire). This twin
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Release-time discovery scanner — produces discovery-manifest.json.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 5). The CLI contract is
|
|
5
|
+
* Ported from the retired Python `src/scripts/build_discovery_manifest.py` (ADR-200,
|
|
6
|
+
* Phase 5). The CLI contract is pinned — every flag (`--write`,
|
|
7
7
|
* `--out`, `--summary`, `--deprecation-report`, `--trust-report`,
|
|
8
8
|
* `--orphan-report`, `--workspaces-json`, `--packs-json`, `--strict`,
|
|
9
9
|
* `--quiet`), the CI-strict env override, exit codes, the stdout/stderr
|
|
@@ -20,18 +20,17 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Imports the `_lib/agent_src` twin for the artefact walk and the
|
|
22
22
|
* `validate_frontmatter` twin for frontmatter parse + schema-default
|
|
23
|
-
* injection (the SAME functions the Python
|
|
23
|
+
* injection (the SAME functions the retired Python implementation imports). The checksum
|
|
24
24
|
* primitive `_artefact_checksum` / `_CATEGORY_SCHEMA` / `_FRONTMATTER_RE` are
|
|
25
25
|
* replicated here EXACTLY and kept in agreement with the inline copy in
|
|
26
26
|
* `check_artefact_checksums.ts`.
|
|
27
27
|
*
|
|
28
|
-
*
|
|
28
|
+
* Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
|
|
29
29
|
*
|
|
30
30
|
* DIVERGENCE CANDIDATE (documented under the ADR-200 process):
|
|
31
|
-
* `_scanner_version()` in the Python
|
|
32
|
-
* bytes (`Path(__file__).read_bytes()`).
|
|
33
|
-
*
|
|
34
|
-
* Python-rebuild diff in `validate_discovery_manifest.py` — this twin hashes
|
|
31
|
+
* `_scanner_version()` in the retired Python implementation hashes the scanner file's OWN
|
|
32
|
+
* bytes (`Path(__file__).read_bytes()`). During the migration the TS-built
|
|
33
|
+
* manifest had to match the Python-built one byte-for-byte, so this port hashes
|
|
35
34
|
* the SIBLING `build_discovery_manifest.py` bytes (falling back to its own
|
|
36
35
|
* `.ts` bytes only when the `.py` is absent, e.g. after the same-PR deletion).
|
|
37
36
|
* Until the `.py` is deleted the manifest is byte-identical; after deletion
|
|
@@ -68,7 +67,7 @@ const _HERE = fileURLToPath(import.meta.url);
|
|
|
68
67
|
|
|
69
68
|
// --- Module-level path config (mutable to mirror Python monkeypatch seam) ----
|
|
70
69
|
//
|
|
71
|
-
//
|
|
70
|
+
// the retired Python implementation derives ROOT / SRC / VOCAB_DIR / DEFAULT_* as
|
|
72
71
|
// module-level constants and `tests/test_build_discovery_manifest.py`
|
|
73
72
|
// reassigns `mod.ROOT`, `mod.SRC`, `mod.VOCAB_DIR`, `mod.artefact_roots`, and
|
|
74
73
|
// `mod.resolve_logical` via monkeypatch. To preserve that injection surface,
|
|
@@ -314,11 +313,10 @@ function _vocab(): [VocabEntry[], VocabEntry[], Record<string, string>] {
|
|
|
314
313
|
}
|
|
315
314
|
|
|
316
315
|
function _scanner_version(): string {
|
|
317
|
-
//
|
|
318
|
-
//
|
|
319
|
-
//
|
|
320
|
-
//
|
|
321
|
-
// manifest is regenerated then anyway).
|
|
316
|
+
// Scanner version = hash of this file's own bytes (the .py-sibling branch
|
|
317
|
+
// below is inert since the teardown — no sibling exists; kept because the
|
|
318
|
+
// manifest checksum gates pin the current output and removing the branch
|
|
319
|
+
// is a behaviour-neutral cleanup for its own change).
|
|
322
320
|
const pyPath = path.join(path.dirname(_HERE), 'build_discovery_manifest.py');
|
|
323
321
|
const target = _isFile(pyPath) ? pyPath : _HERE;
|
|
324
322
|
const h = crypto.createHash('sha256').update(fs.readFileSync(target)).digest('hex');
|
|
@@ -827,7 +825,7 @@ function _cmpStr(a: string, b: string): number {
|
|
|
827
825
|
* 0, "" and the EMPTY array/object — distinct from JS, where `[]`/`{}` are
|
|
828
826
|
* truthy. Used at the optional-field emission sites in `_build` so an empty
|
|
829
827
|
* `optional_packs` / `example_roles` / `suggests` is omitted exactly as the
|
|
830
|
-
* Python
|
|
828
|
+
* retired Python implementation omitted it.
|
|
831
829
|
*/
|
|
832
830
|
function _pyTruthy(v: Json): boolean {
|
|
833
831
|
if (v === undefined || v === null || v === false || v === '' || v === 0) {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* build_linear_digest.ts — build the Linear AI rules digest.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/build_linear_digest.py` (ADR-200 —
|
|
6
6
|
* Python→TS migration, Phase 8 / Wave 8b). The CLI contract is mirrored
|
|
7
7
|
* EXACTLY — the `--max-bytes` / `--out-dir` / `--strict-missing` flags,
|
|
8
8
|
* exit codes (0 ok · 2 over-budget · 3 missing rule file · 4
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Concatenates a curated set of cloud-safe rules from `dist/agent-src/rules/`
|
|
13
13
|
* into three Markdown files under `dist/linear/`.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
15
|
+
* Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
|
|
16
16
|
*/
|
|
17
17
|
import * as fs from 'node:fs';
|
|
18
18
|
import * as path from 'node:path';
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Build `dist/mcp/registry-manifest.json` + the two rendered payloads.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 5). The CLI contract is
|
|
5
|
+
* Ported from the retired Python `src/scripts/build_mcp_registry_manifest.py` (ADR-200,
|
|
6
|
+
* Phase 5). The CLI contract is pinned — every flag (`--write`,
|
|
7
7
|
* `--strict`, `--quiet`), exit codes (0 = ok; 2 = `--strict` drift without
|
|
8
8
|
* `--write`; 1 = missing discovery prereq via SystemExit), the stdout/stderr
|
|
9
9
|
* split, byte-identical messages, AND byte-identical generated output:
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* (`status`, `submitted_at`, `pr_url`, `last_verified`) is preserved from the
|
|
17
17
|
* previous manifest.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
19
|
+
* Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
|
|
20
20
|
*
|
|
21
21
|
* Schema: `docs/contracts/mcp-registry-manifest.schema.json`
|
|
22
22
|
*/
|
|
@@ -83,6 +83,12 @@ function render(): string {
|
|
|
83
83
|
}
|
|
84
84
|
L.push('');
|
|
85
85
|
L.push(`**${backed.length} backed claim(s)** — all evidence pointers resolve in CI.`);
|
|
86
|
+
L.push('');
|
|
87
|
+
L.push('Artefact counts in public prose (skills, commands, governed rules,');
|
|
88
|
+
L.push('guidelines, personas) are **generated from source and CI-drift-checked**:');
|
|
89
|
+
L.push('`update_counts.ts` writes the numbers, `check_artefact_count_messaging.ts`');
|
|
90
|
+
L.push('fails the build on any count-shaped prose mention that drifts from the');
|
|
91
|
+
L.push('source count — or on two different numbers for the same artefact kind.');
|
|
86
92
|
if (unbacked.length > 0) {
|
|
87
93
|
L.push('');
|
|
88
94
|
L.push(`We also publish our **debt**: ${unbacked.length} claim(s) are logged as`);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Build agents/settings/contexts/rule-trigger-matrix.md.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/build_rule_trigger_matrix.py` (ADR-200,
|
|
6
6
|
* Phase 8 / Wave 8g). Mirrors the Python contract EXACTLY — same generated
|
|
7
7
|
* markdown (byte-identical), same `CLASSIFICATION` table, same stdout
|
|
8
8
|
* (`✅ Wrote …` line) + stderr (unclassified-rule warning) split, exit codes
|
|
@@ -340,7 +340,7 @@ function emit(): number {
|
|
|
340
340
|
lines.push('');
|
|
341
341
|
lines.push('**Source:** Phase 1 of `road-to-rule-hardening.md` (self-check audit) +');
|
|
342
342
|
lines.push('Phase 1 of `road-to-context-layer-maturity.md` (`load_context:` inventory).');
|
|
343
|
-
lines.push('**Generated by:** `scripts/build_rule_trigger_matrix.
|
|
343
|
+
lines.push('**Generated by:** `src/scripts/build_rule_trigger_matrix.ts` — re-run after rule');
|
|
344
344
|
lines.push("set changes. Manual classifications live in the script's `CLASSIFICATION`");
|
|
345
345
|
lines.push('table; size and context-chain columns are derived from the rule files.');
|
|
346
346
|
lines.push('');
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* capture_showcase_session.ts — wrap and measure showcase sessions.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/capture_showcase_session.py` (ADR-200 —
|
|
6
6
|
* Python→TS migration, Phase 8 / Wave 8g). Mirrors the Python CLI contract
|
|
7
7
|
* EXACTLY — the `capture` / `metrics` subcommands, every flag, exit codes
|
|
8
8
|
* (0 success / 1 user error / 2 metric-gate pending), the stdout/stderr
|
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
*
|
|
25
25
|
* `commit_sha` (git HEAD) and `started`/`ended` (now) are non-deterministic;
|
|
26
26
|
* golden parity supplies fixed timestamps via `--started`/`--ended` and
|
|
27
|
-
* excludes `commit_sha`. No behaviour changes —
|
|
28
|
-
*
|
|
27
|
+
* excludes `commit_sha`. No behaviour changes — historical quirks
|
|
28
|
+
* preserved.
|
|
29
29
|
*/
|
|
30
30
|
import { spawnSync } from 'node:child_process';
|
|
31
31
|
import * as fs from 'node:fs';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Persistent chat-history log for crash recovery.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
3
|
+
// Ported from the retired Python `src/scripts/chat_history.py` (ADR-200 — Python→TS
|
|
4
4
|
// migration). Public API mirrors the Python module exactly (snake_case kept
|
|
5
5
|
// deliberately) so callers — including the MCP tools layer
|
|
6
6
|
// (`src/scripts/mcp_server/tools.ts`) — depend on one source of truth.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Always-rule budget gate (Phases 7.1 + 7.4 of road-to-pr-34-followups,
|
|
4
4
|
* extended by Phase 0.2 of road-to-structural-optimization).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Ported from the retired Python `src/scripts/check_always_budget.py` (ADR-200 —
|
|
7
7
|
* Python→TS migration, Phase 4 / Wave 4a). Mirrors the Python CLI
|
|
8
8
|
* contract exactly: flags (`--quiet`, `--no-trend`), exit codes
|
|
9
9
|
* (0 = pass/warn, 1 = fail, 3 = internal error), stdout/stderr split,
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Phase-6 checksum-stability gate (monorepo Phase 2, ADR-015).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 4 / Wave 4c). The CLI contract is
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_artefact_checksums.py` (ADR-200,
|
|
6
|
+
* Phase 4 / Wave 4c). The CLI contract is pinned — `--manifest`
|
|
7
7
|
* / `--quiet` flags, exit codes (0 match, 1 drift / malformed / missing),
|
|
8
8
|
* stdout/stderr split, byte-identical messages, the same per-artefact
|
|
9
9
|
* checksum recomputation and the same error truncation (first 20 + "… and N
|
|
10
|
-
* more").
|
|
10
|
+
* more"). Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
12
|
+
* the retired Python implementation imports `_artefact_checksum` + `_CATEGORY_SCHEMA` from
|
|
13
13
|
* `build_discovery_manifest.py` (which has no TS twin yet). To keep the TS
|
|
14
14
|
* twin self-contained AND in lockstep, the checksum primitive is ported
|
|
15
15
|
* inline here from `build_discovery_manifest._artefact_checksum` /
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
/**
|
|
3
|
+
* Artefact-count messaging gate (road-to-truth-and-reference-hygiene Phase 1).
|
|
4
|
+
*
|
|
5
|
+
* Generalises `check_command_count_messaging.ts` (which stays wired as
|
|
6
|
+
* `task check-command-count` — its badge/browse anchors are required-check
|
|
7
|
+
* contract surface and are NOT removed here) from commands-only to every
|
|
8
|
+
* artefact kind: any count-shaped prose mention of skills / commands /
|
|
9
|
+
* governed rules / guidelines / personas on a flagship public surface must
|
|
10
|
+
* equal the canonical source count, and no surface may carry two DIFFERENT
|
|
11
|
+
* numbers for the same kind (the 150-vs-162-vs-166 failure mode that
|
|
12
|
+
* motivated this gate).
|
|
13
|
+
*
|
|
14
|
+
* Ownership split:
|
|
15
|
+
* - `update_counts.ts` GENERATES the numbers into anchored positions
|
|
16
|
+
* (badges + prose) and `--check`s those exact anchors.
|
|
17
|
+
* - THIS gate SCANS the flagship surfaces for any count-shaped phrase —
|
|
18
|
+
* anchored or not — so a hand-typed new sentence with a stale number
|
|
19
|
+
* fails CI even though no anchor covers it yet.
|
|
20
|
+
* - `check_command_count_messaging.ts` keeps the command-specific
|
|
21
|
+
* active-vs-shim split checks.
|
|
22
|
+
*
|
|
23
|
+
* Scope: flagship surfaces only (SURFACES below). Dated census / analysis
|
|
24
|
+
* snapshots (SKILL_CENSUS, skills-taxonomy, positioning-evidence, …) carry
|
|
25
|
+
* point-in-time counts by design and are deliberately out of scope — the
|
|
26
|
+
* gate's charter is the surfaces a fresh reader treats as current.
|
|
27
|
+
*
|
|
28
|
+
* Exit codes: 0 clean · 1 drift or internal inconsistency.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import * as fs from 'node:fs';
|
|
32
|
+
import * as path from 'node:path';
|
|
33
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
34
|
+
|
|
35
|
+
import { canonical_counts } from './check_command_count_messaging.js';
|
|
36
|
+
import { count } from './update_counts.js';
|
|
37
|
+
|
|
38
|
+
const _HERE = fileURLToPath(import.meta.url);
|
|
39
|
+
export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
|
|
40
|
+
|
|
41
|
+
/** Flagship public prose surfaces (repo-relative). Missing files are skipped
|
|
42
|
+
* with a warning so a doc rename does not hard-break the gate. */
|
|
43
|
+
export const SURFACES: readonly string[] = [
|
|
44
|
+
'README.md',
|
|
45
|
+
'AGENTS.md',
|
|
46
|
+
'llms.txt',
|
|
47
|
+
'docs/CLAIMS.md',
|
|
48
|
+
'docs/getting-started.md',
|
|
49
|
+
'docs/getting-started-by-role.md',
|
|
50
|
+
'docs/architecture.md',
|
|
51
|
+
'docs/command-flows.md',
|
|
52
|
+
'docs/governance-advantage.md',
|
|
53
|
+
'docs/featured-skills.md',
|
|
54
|
+
'docs/featured-commands.md',
|
|
55
|
+
'docs/proof.md',
|
|
56
|
+
'site/src/content/docs/index.mdx',
|
|
57
|
+
'site/src/content/docs/claims.md',
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/** kind → canonical-count resolver. "governed rules" is the canonical total
|
|
61
|
+
* phrasing for rules; bare "N rules" is NOT matched (too many legitimate
|
|
62
|
+
* subset scopes: kernel rules, router rules, maintainer-only rules …). */
|
|
63
|
+
const KIND_PATTERNS: ReadonlyArray<[string, RegExp]> = [
|
|
64
|
+
['skills', /(~?)(\d+)\+?\s+skills\b/g],
|
|
65
|
+
['commands', /(~?)(\d+)\+?\s+commands\b/g],
|
|
66
|
+
['rules', /(~?)(\d+)\+?\s+governed rules\b/g],
|
|
67
|
+
['guidelines', /(~?)(\d+)\+?\s+guidelines\b/g],
|
|
68
|
+
['personas', /(~?)(\d+)\+?\s+personas\b/g],
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
export interface Finding {
|
|
72
|
+
file: string;
|
|
73
|
+
line: number;
|
|
74
|
+
kind: string;
|
|
75
|
+
found: number;
|
|
76
|
+
expected: number;
|
|
77
|
+
approx: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function canonical_for(kind: string): number {
|
|
81
|
+
if (kind === 'commands') {
|
|
82
|
+
// Prose command mentions carry the ACTIVE count (total − shims),
|
|
83
|
+
// matching the hero badge owned by check_command_count_messaging.
|
|
84
|
+
const [, , active] = canonical_counts();
|
|
85
|
+
return active;
|
|
86
|
+
}
|
|
87
|
+
return count(kind);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Scan one text body; returns findings + the per-kind numbers seen. */
|
|
91
|
+
export function scan_text(
|
|
92
|
+
rel: string,
|
|
93
|
+
text: string,
|
|
94
|
+
expected: Readonly<Record<string, number>>,
|
|
95
|
+
): { findings: Finding[]; seen: Record<string, Set<number>> } {
|
|
96
|
+
const findings: Finding[] = [];
|
|
97
|
+
const seen: Record<string, Set<number>> = {};
|
|
98
|
+
const lines = text.split('\n');
|
|
99
|
+
for (const [kind, pattern] of KIND_PATTERNS) {
|
|
100
|
+
for (let i = 0; i < lines.length; i++) {
|
|
101
|
+
const re = new RegExp(pattern.source, pattern.flags);
|
|
102
|
+
for (const m of lines[i]!.matchAll(re)) {
|
|
103
|
+
const found = Number.parseInt(m[2]!, 10);
|
|
104
|
+
(seen[kind] ??= new Set()).add(found);
|
|
105
|
+
const exp = expected[kind]!;
|
|
106
|
+
const approx = m[1] === '~';
|
|
107
|
+
if (found !== exp || approx) {
|
|
108
|
+
findings.push({ file: rel, line: i + 1, kind, found, expected: exp, approx });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { findings, seen };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function main(argv: readonly string[] = process.argv.slice(2)): number {
|
|
117
|
+
const QUIET = argv.includes('--quiet');
|
|
118
|
+
const expected: Record<string, number> = {};
|
|
119
|
+
for (const [kind] of KIND_PATTERNS) {
|
|
120
|
+
expected[kind] = canonical_for(kind);
|
|
121
|
+
}
|
|
122
|
+
process.stdout.write(
|
|
123
|
+
`Canonical: skills=${expected['skills']} commands=${expected['commands']} ` +
|
|
124
|
+
`rules=${expected['rules']} guidelines=${expected['guidelines']} ` +
|
|
125
|
+
`personas=${expected['personas']}\n`,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const allFindings: Finding[] = [];
|
|
129
|
+
const global_seen: Record<string, Set<number>> = {};
|
|
130
|
+
for (const rel of SURFACES) {
|
|
131
|
+
const p = path.join(ROOT, rel);
|
|
132
|
+
if (!fs.existsSync(p)) {
|
|
133
|
+
process.stderr.write(` ⚠️ surface missing (skipped): ${rel}\n`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const { findings, seen } = scan_text(rel, fs.readFileSync(p, 'utf-8'), expected);
|
|
137
|
+
allFindings.push(...findings);
|
|
138
|
+
for (const [kind, nums] of Object.entries(seen)) {
|
|
139
|
+
for (const n of nums) (global_seen[kind] ??= new Set()).add(n);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Internal-inconsistency check — the regression case this gate exists
|
|
144
|
+
// for: multiple DIFFERENT numbers for one kind across the surfaces.
|
|
145
|
+
const inconsistent: string[] = [];
|
|
146
|
+
for (const [kind, nums] of Object.entries(global_seen)) {
|
|
147
|
+
if (nums.size > 1) {
|
|
148
|
+
inconsistent.push(`${kind}: {${[...nums].sort((a, b) => a - b).join(', ')}}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (allFindings.length === 0 && inconsistent.length === 0) {
|
|
153
|
+
if (!QUIET) {
|
|
154
|
+
process.stdout.write('✅ All artefact-count prose in sync with source.\n');
|
|
155
|
+
}
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
process.stdout.write(
|
|
160
|
+
`❌ Artefact-count messaging drift — ${allFindings.length} mismatch(es):\n`,
|
|
161
|
+
);
|
|
162
|
+
for (const f of allFindings) {
|
|
163
|
+
const tag = f.approx ? ' (approximation "~" not allowed on flagship surfaces)' : '';
|
|
164
|
+
process.stdout.write(
|
|
165
|
+
` ${f.file}:${f.line}: ${f.kind} says ${f.found}, expected ${f.expected}${tag}\n`,
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
for (const line of inconsistent) {
|
|
169
|
+
process.stdout.write(` internal inconsistency — ${line}\n`);
|
|
170
|
+
}
|
|
171
|
+
process.stdout.write(
|
|
172
|
+
'\nFix: run `./scripts-run src/scripts/update_counts` for anchored positions,\n' +
|
|
173
|
+
'or correct the prose to the canonical number (never hand-type a new one).\n',
|
|
174
|
+
);
|
|
175
|
+
return 1;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function _isCliEntry(): boolean {
|
|
179
|
+
if (process.argv[1] === undefined) {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
const argvUrl = pathToFileURL(path.resolve(process.argv[1])).href;
|
|
183
|
+
if (import.meta.url === argvUrl) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const here = fs.realpathSync(fileURLToPath(import.meta.url));
|
|
188
|
+
const argv = fs.realpathSync(path.resolve(process.argv[1]));
|
|
189
|
+
return here === argv;
|
|
190
|
+
} catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (_isCliEntry() || process.argv[1] === _HERE) {
|
|
196
|
+
process.exit(main(process.argv.slice(2)));
|
|
197
|
+
}
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* Auto-rule description-length CI gate (Phase 1.3 of
|
|
4
4
|
* road-to-augment-limit-fit).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* Phase 4 / Wave 4c). The CLI contract is
|
|
6
|
+
* Ported from the retired Python `src/scripts/check_augment_description_cap.py` (ADR-200,
|
|
7
|
+
* Phase 4 / Wave 4c). The CLI contract is pinned — no flags, exit
|
|
8
8
|
* codes (0 pass, 1 over-cap), stdout/stderr split, byte-identical finding
|
|
9
9
|
* messages, same scan scope (`.agent-src.uncondensed/rules/*.md`) and file
|
|
10
|
-
* ordering.
|
|
10
|
+
* ordering. Historical quirks are preserved deliberately — tests and downstream consumers pin the exact behaviour.
|
|
11
11
|
*
|
|
12
12
|
* For every `type: auto` rule under `.agent-src.uncondensed/rules/`,
|
|
13
13
|
* fail CI when the frontmatter `description:` exceeds DESC_CAP chars.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Advisory check for `.augmentignore` (road-to-governance-cleanup F6.3).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_augmentignore.py` (ADR-200,
|
|
6
6
|
* Phase 4 / Wave 4c). CLI contract mirrored EXACTLY — `--quiet` flag,
|
|
7
7
|
* always exits 0, byte-identical advisory messages, same staleness /
|
|
8
8
|
* min-useful-lines thresholds, stdout-only output.
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Beta-review-marker checker for `docs/contracts/`.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 4 / Wave 4c). The CLI contract is
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_beta_review_markers.py` (ADR-200,
|
|
6
|
+
* Phase 4 / Wave 4c). The CLI contract is pinned — `--json`
|
|
7
7
|
* flag, exit codes (0 clean, 1 violations, 3 internal error), stdout/stderr
|
|
8
8
|
* split, byte-identical messages, the same scan order and the same date
|
|
9
9
|
* arithmetic (`keep-beta-until` ≤ today + 90 days). No behaviour changes —
|
|
10
|
-
*
|
|
10
|
+
* historical quirks preserved (consumers pin the exact behaviour).
|
|
11
11
|
*
|
|
12
12
|
* Every contract whose frontmatter declares `stability: beta` MUST carry
|
|
13
13
|
* exactly one of `promote-to: stable` | `keep-beta-until: YYYY-MM-DD` |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Bite-sized task granularity gate for structural roadmaps (P1.5).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_bite_sized_granularity.py` (ADR-200,
|
|
6
6
|
* Phase 4 / Wave 4c). This module is a pure library (no CLI / main); the
|
|
7
7
|
* Python module is imported as a test surface. The exported API mirrors the
|
|
8
8
|
* Python public API EXACTLY:
|
|
@@ -2,17 +2,22 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Cluster-pattern compliance check.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Phase 4 / Wave 4c). The CLI contract is
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_cluster_patterns.py` (ADR-200,
|
|
6
|
+
* Phase 4 / Wave 4c). The CLI contract is pinned — no flags,
|
|
7
7
|
* exit codes (0 clean, 1 pattern violations, 3 internal error),
|
|
8
8
|
* stdout/stderr split, byte-identical finding messages, the same
|
|
9
9
|
* locked-clusters table parse, the same domains slug map (via the
|
|
10
10
|
* `_lib/agent_src` twin), and the same dispatcher-structure checks. No
|
|
11
|
-
* behaviour changes —
|
|
11
|
+
* behaviour changes — historical quirks preserved (consumers pin the exact behaviour).
|
|
12
12
|
*
|
|
13
13
|
* Compares each cluster dispatcher against the Phase 1 reference patterns
|
|
14
14
|
* (`fix`, `optimize`, `feature`).
|
|
15
15
|
*
|
|
16
|
+
* Phase 4 additions (ADR-115): every `routes_to:` entry on a dispatcher must
|
|
17
|
+
* resolve to a real src/domains command slug, and the `## Dispatch` section
|
|
18
|
+
* must document the bare-invocation behaviour (menu / default route /
|
|
19
|
+
* detection fallback) per command-clusters.md § Bare invocation.
|
|
20
|
+
*
|
|
16
21
|
* Exit codes: 0 = clean, 1 = pattern violations, 3 = internal error.
|
|
17
22
|
*/
|
|
18
23
|
|
|
@@ -212,6 +217,45 @@ export function check_dispatcher(cluster: string, slug_map: Map<string, string>)
|
|
|
212
217
|
if (body.includes('## Sub-commands') && !TABLE_HEADER_RE.test(body)) {
|
|
213
218
|
rep.errors.push('Sub-commands table header must be `| Sub-command | Routes to | Purpose |`');
|
|
214
219
|
}
|
|
220
|
+
|
|
221
|
+
// routes_to entries must resolve to real commands (Phase 4 / ADR-115).
|
|
222
|
+
const routesRaw = fm['routes_to'];
|
|
223
|
+
if (routesRaw !== undefined) {
|
|
224
|
+
const m = /^\[(.*)\]$/.exec(routesRaw.trim());
|
|
225
|
+
const entries = m
|
|
226
|
+
? (m[1] as string)
|
|
227
|
+
.split(',')
|
|
228
|
+
.map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
|
|
229
|
+
.filter((s) => s.length > 0)
|
|
230
|
+
: [];
|
|
231
|
+
for (const entry of entries) {
|
|
232
|
+
// routes_to entries name either a command slug or a skill
|
|
233
|
+
// (e.g. `git-commit` routes to the `git-workflow` skill).
|
|
234
|
+
const skillPath = path.join(ROOT, 'src', 'skills', entry, 'SKILL.md');
|
|
235
|
+
if (!slug_map.has(entry) && !_isFile(skillPath)) {
|
|
236
|
+
rep.errors.push(
|
|
237
|
+
`routes_to entry \`${entry}\` resolves to no src/domains command slug ` +
|
|
238
|
+
'and no src/skills skill',
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Bare-invocation story (Phase 4 / ADR-115): the Dispatch section must say
|
|
245
|
+
// what a bare `/<cluster>` does — a menu, a default route, or detection.
|
|
246
|
+
const dispatchIdx = body.indexOf('## Dispatch');
|
|
247
|
+
if (dispatchIdx !== -1) {
|
|
248
|
+
const rest = body.slice(dispatchIdx + '## Dispatch'.length);
|
|
249
|
+
const nextSection = rest.search(/\n## /);
|
|
250
|
+
const section = nextSection === -1 ? rest : rest.slice(0, nextSection);
|
|
251
|
+
if (!/menu|bare|no argument|unknown or missing|detection|default/i.test(section)) {
|
|
252
|
+
rep.errors.push(
|
|
253
|
+
'`## Dispatch` must document the bare-invocation behaviour ' +
|
|
254
|
+
'(menu, default route, or detection fallback) per ' +
|
|
255
|
+
'command-clusters.md § Bare invocation',
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
215
259
|
return rep;
|
|
216
260
|
}
|
|
217
261
|
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Command-count messaging gate (road-to-pr-34-followups 1.2).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* (ADR-200, Phase 4 / Wave 4c).
|
|
5
|
+
* Ported from the retired Python `src/scripts/check_command_count_messaging.py`
|
|
6
|
+
* (ADR-200, Phase 4 / Wave 4c). The CLI contract is pinned —
|
|
7
7
|
* `--quiet` flag (positional anywhere in argv), exit codes (0 clean,
|
|
8
8
|
* 1 drift, 1 no-commands-dir via stderr), stdout/stderr split,
|
|
9
9
|
* byte-identical messages, same canonical-count derivation
|