@event4u/agent-config 16.1.0 → 16.3.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +98 -257
- package/README.md +14 -12
- package/dist/agent-src/commands/analyze/inbox.md +1 -1
- package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
- package/dist/agent-src/commands/bug/fix.md +17 -2
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/feature/roadmap.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +1 -1
- package/dist/agent-src/commands/implement-ticket.md +1 -1
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/roadmap/create.md +1 -1
- package/dist/agent-src/commands/roadmap/materialize.md +1 -1
- package/dist/agent-src/commands/roadmap/process-full.md +5 -5
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
- package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
- package/dist/agent-src/commands/roadmap.md +18 -4
- package/dist/agent-src/commands/tests/create.md +17 -3
- package/dist/agent-src/commands/tests/execute.md +22 -5
- package/dist/agent-src/commands/work.md +4 -0
- package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
- package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
- package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
- package/dist/agent-src/rules/active-remediation.md +1 -1
- package/dist/agent-src/rules/autonomous-execution.md +1 -0
- package/dist/agent-src/rules/broken-access-control.md +1 -0
- package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
- package/dist/agent-src/rules/context-hygiene.md +1 -1
- package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
- package/dist/agent-src/rules/design-fidelity.md +13 -16
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
- package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
- package/dist/agent-src/rules/domain-safety-pii.md +1 -0
- package/dist/agent-src/rules/domain-safety-retention.md +1 -0
- package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
- package/dist/agent-src/rules/evaluator-independence.md +3 -2
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
- package/dist/agent-src/rules/finance-safety-floor.md +1 -0
- package/dist/agent-src/rules/git-history-discipline.md +1 -0
- package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
- package/dist/agent-src/rules/legal-safety-floor.md +3 -2
- package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
- package/dist/agent-src/rules/media-governance-routing.md +14 -17
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
- package/dist/agent-src/rules/question-not-instruction.md +1 -0
- package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
- package/dist/agent-src/rules/runtime-safety.md +1 -0
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
- package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
- package/dist/agent-src/rules/session-canary.md +8 -62
- package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
- package/dist/agent-src/rules/source-confidentiality.md +1 -0
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
- package/dist/agent-src/rules/tool-safety.md +1 -0
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
- package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
- package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/dist/agent-src/scripts/deferral_carry.ts +339 -0
- package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
- package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
- package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
- package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
- package/dist/agent-src/skills/design-review/SKILL.md +30 -4
- package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
- package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
- package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
- package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
- package/dist/agent-src/skills/iconography/SKILL.md +1 -1
- package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
- package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
- package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
- package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
- package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
- package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
- package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
- package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
- package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
- package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
- package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
- package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +30 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/dist/cli/python/knowledge_ingest.js +1 -1
- package/dist/cli/python/workspace_drive.js +1 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
- package/dist/cli-delegate/check_update_banner.js +12 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
- package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
- package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
- package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
- package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
- package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
- package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
- package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
- package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
- package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
- package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
- package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
- package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
- package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
- package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
- package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
- package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
- package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
- package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
- package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
- package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
- package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +1862 -809
- package/dist/cli-delegate/cmd_doctor.js +13 -6
- package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
- package/dist/cli-delegate/cmd_explain.js +5 -5
- package/dist/cli-delegate/cmd_export.js +11 -8
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_handoff.js +10 -7
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_memory_get.js +3 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +6 -6
- package/dist/cli-delegate/cmd_prune.js +11 -8
- package/dist/cli-delegate/cmd_refresh.js +2 -1
- package/dist/cli-delegate/cmd_route_audit.js +8 -6
- package/dist/cli-delegate/cmd_route_explain.js +4 -4
- package/dist/cli-delegate/cmd_session_recycle.js +4 -3
- package/dist/cli-delegate/cmd_settings_get.js +1 -1
- package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
- package/dist/cli-delegate/cmd_settings_set.js +4 -4
- package/dist/cli-delegate/cmd_sync.js +11 -8
- package/dist/cli-delegate/cmd_uninstall.js +11 -8
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +3 -2
- package/dist/cli-delegate/cmd_validate.js +11 -8
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/cli-delegate/deferral_carry.js +16 -0
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +5 -5
- package/dist/cli-delegate/update_roadmap_progress.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +132 -80
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +7972 -5186
- package/dist/hooks/dispatch.sha256 +1 -0
- package/dist/install/claudePathsPlan.js +47 -6
- package/dist/install/claudeRuleRewrite.js +7 -0
- package/dist/install/emit_host_rules_cli.js +39 -36
- package/dist/install/globalRuleScope.js +87 -0
- package/dist/install/host_rule_ownership.js +160 -0
- package/dist/install/install.mjs +2226 -1055
- package/dist/install/installThinLayer.js +261 -0
- package/dist/install/installedRuleLinks.js +176 -0
- package/dist/install/wizard-plan.js +24 -0
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +40913 -34865
- package/dist/scripts/_lib/agent_settings.js +11 -0
- package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
- package/dist/scripts/_lib/installed_layer.js +378 -0
- package/dist/scripts/_lib/lean_projection_mode.js +218 -15
- package/dist/scripts/_lib/rule_consequence_class.js +45 -0
- package/dist/scripts/_lib/rule_injection.js +67 -10
- package/dist/scripts/_lib/rule_law_section.js +122 -0
- package/dist/scripts/_lib/thin_rules.js +458 -0
- package/dist/scripts/_lib/windsurf_render.js +60 -0
- package/dist/scripts/condense.js +14 -26
- package/dist/scripts/project_thin_rules.js +14 -294
- package/dist/server/schemas/settings.js +29 -0
- package/dist/shared/skillRanking.js +74 -13
- package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
- package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
- package/dist/ui/index.html +2 -2
- package/docs/contracts/settings-classes.md +10 -6
- package/package.json +4 -4
- package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
- package/src/agent-src/scripts/deferral_carry.ts +339 -0
- package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
- package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
- package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
- package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
- package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
- package/src/config/agent-settings.template.yml +91 -22
- package/src/config/ci-local-parity.yml +18 -0
- package/src/config/continuity-surface.json +9 -2
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +327 -3
- package/src/config/gate-violation-baselines.json +21 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-latency-budget.json +21 -0
- package/src/config/hook-token-budget.json +8 -3
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/metric-registry.yml +114 -0
- package/src/config/placeholder-drift-budget.json +10 -0
- package/src/config/routing-coverage-seed.json +38 -3
- package/src/config/rule-activation-census.json +7 -3
- package/src/config/rule-consequence-class.json +161 -0
- package/src/config/rule-law-ceilings.json +99 -0
- package/src/install/claudePathsPlan.ts +46 -4
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/emit_host_rules_cli.ts +43 -34
- package/src/install/globalRuleScope.ts +109 -0
- package/src/install/host_rule_ownership.ts +170 -0
- package/src/install/installThinLayer.ts +312 -0
- package/src/install/installedRuleLinks.ts +220 -0
- package/src/install/wizard-plan.ts +24 -0
- package/src/scripts/_cli/cmd_doctor.ts +28 -90
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_cli/doctor_execution.ts +100 -17
- package/src/scripts/_cli/doctor_network_posture.ts +226 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/body_portable.ts +102 -0
- package/src/scripts/_lib/cc_transcript.ts +132 -1
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- package/src/scripts/_lib/concern_sla_window.ts +200 -0
- package/src/scripts/_lib/estate_offsets.ts +241 -0
- package/src/scripts/_lib/exemption_shape.ts +143 -0
- package/src/scripts/_lib/fnv.ts +23 -0
- package/src/scripts/_lib/foreign_scan.ts +106 -0
- package/src/scripts/_lib/forge_protection.ts +114 -0
- package/src/scripts/_lib/forge_reader.ts +558 -0
- package/src/scripts/_lib/gitignore_block.ts +314 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
- package/src/scripts/_lib/graph_feeder_record.ts +214 -0
- package/src/scripts/_lib/hook_settings.ts +73 -0
- package/src/scripts/_lib/host_capability.ts +40 -19
- package/src/scripts/_lib/host_env_write.ts +111 -0
- package/src/scripts/_lib/host_hook_merge.ts +165 -0
- package/src/scripts/_lib/installed_layer.ts +538 -0
- package/src/scripts/_lib/json_merge.ts +82 -0
- package/src/scripts/_lib/json_pointers.ts +93 -11
- package/src/scripts/_lib/lean_projection_mode.ts +275 -15
- package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
- package/src/scripts/_lib/machine_wake.ts +16 -3
- package/src/scripts/_lib/neighbour_census.ts +760 -0
- package/src/scripts/_lib/neighbour_scan.ts +122 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
- package/src/scripts/_lib/obligations.ts +119 -8
- package/src/scripts/_lib/probe_inputs.ts +271 -0
- package/src/scripts/_lib/prompt_shape.ts +46 -0
- package/src/scripts/_lib/read_surface_scan.ts +322 -0
- package/src/scripts/_lib/release_highlights.ts +2 -1
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
- package/src/scripts/_lib/review_coverage.ts +134 -0
- package/src/scripts/_lib/rule_consequence_class.ts +71 -0
- package/src/scripts/_lib/rule_injection.ts +130 -10
- package/src/scripts/_lib/rule_law_section.ts +147 -0
- package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
- package/src/scripts/_lib/shell_write_shapes.ts +108 -0
- package/src/scripts/_lib/skill_origin.ts +254 -0
- package/src/scripts/_lib/structural_hiding.ts +622 -0
- package/src/scripts/_lib/structured_ask.ts +64 -21
- package/src/scripts/_lib/thin_rules.ts +540 -0
- package/src/scripts/_lib/touched_file_quality.ts +434 -0
- package/src/scripts/_lib/turn_end_refusals.ts +600 -4
- package/src/scripts/_lib/turn_end_transcript.ts +216 -0
- package/src/scripts/_lib/verification_command.ts +324 -0
- package/src/scripts/_lib/verification_evidence.ts +647 -0
- package/src/scripts/_lib/verify_clause.ts +280 -0
- package/src/scripts/_lib/windsurf_render.ts +63 -0
- package/src/scripts/ai_council/cli_call_budget.ts +13 -5
- package/src/scripts/ai_council/clients.ts +26 -57
- package/src/scripts/ai_council/config.ts +1 -1
- package/src/scripts/ai_council/vendor_defaults.ts +45 -0
- package/src/scripts/ai_team/team_dispatch.ts +4 -0
- package/src/scripts/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +573 -25
- package/src/scripts/bench_hook_latency.ts +412 -5
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/cache_realization_report.ts +61 -1
- package/src/scripts/check_argument_hint.ts +287 -0
- package/src/scripts/check_claims.ts +125 -1
- package/src/scripts/check_enforcement_coverage.ts +38 -9
- package/src/scripts/check_enforcement_matrix.ts +621 -22
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +138 -7
- package/src/scripts/check_generator_sync.ts +71 -0
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_host_docs_digest.ts +786 -0
- package/src/scripts/check_host_format_column.ts +559 -0
- package/src/scripts/check_input_references.ts +228 -0
- package/src/scripts/check_inputs_parity.ts +235 -0
- package/src/scripts/check_kernel_edit_ratified.ts +89 -9
- package/src/scripts/check_kill_switch_table.ts +294 -0
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_placeholder_drift.ts +221 -0
- package/src/scripts/check_read_surface_coverage.ts +515 -0
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_holds.ts +2 -1
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_routing_coverage.ts +378 -11
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_static_parity.ts +17 -0
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- package/src/scripts/ci_settle.ts +145 -19
- package/src/scripts/closure_scan.ts +115 -1
- package/src/scripts/code_graph/detect.ts +127 -7
- package/src/scripts/code_graph/foreign.ts +194 -0
- package/src/scripts/code_graph/query.ts +217 -4
- package/src/scripts/code_graph/types.ts +26 -2
- package/src/scripts/code_graph/validate.ts +3 -1
- package/src/scripts/code_graph/verbs.ts +103 -0
- package/src/scripts/compile_hook_manifest.ts +90 -14
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/external_sources_denylist.json +29 -4
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +192 -14
- package/src/scripts/hooks/block_config_weakening.ts +294 -4
- package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
- package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
- package/src/scripts/hooks/bundle_integrity.ts +291 -0
- package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
- package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
- package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/concern_timings.ts +94 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
- package/src/scripts/hooks/design_pass_hook.ts +100 -9
- package/src/scripts/hooks/design_slop_hook.ts +1 -2
- package/src/scripts/hooks/dispatch_hook.ts +77 -71
- package/src/scripts/hooks/edit_shape_hook.ts +1 -2
- package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
- package/src/scripts/hooks/evidence_independence.ts +1 -2
- package/src/scripts/hooks/exit_codes.ts +129 -0
- package/src/scripts/hooks/host_lowering.json +1 -0
- package/src/scripts/hooks/host_lowering.ts +146 -3
- package/src/scripts/hooks/host_lowering.yaml +262 -46
- package/src/scripts/hooks/host_semantics.ts +30 -2
- package/src/scripts/hooks/injection_budget.ts +9 -2
- package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
- package/src/scripts/hooks/journal_record_hook.ts +1 -2
- package/src/scripts/hooks/memory_recall_hook.ts +1 -2
- package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
- package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
- package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/permission_gate.ts +1 -2
- package/src/scripts/hooks/push_settle_hook.ts +1 -3
- package/src/scripts/hooks/replay_hook.ts +2 -1
- package/src/scripts/hooks/reread_guard_hook.ts +1 -2
- package/src/scripts/hooks/review_baseline_hook.ts +1 -2
- package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
- package/src/scripts/hooks/rule_inject_hook.ts +765 -68
- package/src/scripts/hooks/run_continuation_hook.ts +13 -15
- package/src/scripts/hooks/skill_route_hook.ts +1 -2
- package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
- package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
- package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
- package/src/scripts/hooks/table_fingerprint.ts +70 -0
- package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
- package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
- package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
- package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
- package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +75 -189
- package/src/scripts/installed_layer_report.ts +103 -0
- package/src/scripts/language_mirror_hook.ts +15 -6
- package/src/scripts/learning_sidecar.ts +119 -8
- package/src/scripts/lint_deny_text.ts +419 -0
- package/src/scripts/lint_exit_codes.ts +262 -0
- package/src/scripts/lint_hook_manifest.ts +108 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_roadmap_blockers.ts +78 -12
- package/src/scripts/lint_rule_law_section.ts +517 -0
- package/src/scripts/lint_skill_descriptions.ts +1 -1
- package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
- package/src/scripts/lint_workflow_security.ts +161 -5
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
- package/src/scripts/mcp_server/graph_tools.ts +72 -3
- package/src/scripts/mcp_server/prompts.ts +142 -1
- package/src/scripts/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
- package/src/scripts/measure_turn_end_gate.ts +193 -0
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/memory_lookup.ts +1 -1
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/prepack-check.mjs +53 -0
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/release_publication.ts +13 -1
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_invocation_surface.ts +383 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_carriers.ts +699 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_obligation_writer_split.ts +236 -0
- package/src/scripts/report_single_token_triggers.ts +277 -0
- package/src/scripts/report_skill_menu_census.ts +208 -0
- package/src/scripts/report_skill_ranker_confusion.ts +442 -0
- package/src/scripts/report_standing_payload_by_host.ts +188 -15
- package/src/scripts/report_verification_record_coverage.ts +306 -0
- package/src/scripts/roadmap_verify_share.ts +213 -0
- package/src/scripts/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/command.schema.json +44 -0
- package/src/scripts/schemas/review-findings.schema.json +7 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/schemas/skill.schema.json +44 -0
- package/src/scripts/self_review_gate.ts +421 -17
- package/src/scripts/semantic_parity_census.ts +314 -0
- package/src/scripts/session_eol_report.ts +54 -1
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- package/src/scripts/sweep_dead_scan_roots.ts +1 -1
- package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
- package/src/scripts/sync_gitignore.ts +29 -235
- package/src/scripts/trigger_eval_grandfather.json +0 -7
- package/src/scripts/trigger_eval_rotation.ts +122 -27
- package/src/scripts/ui_conformance_probe.ts +156 -4
- package/src/scripts/update_prices.ts +85 -3
- package/src/scripts/write_bundle_digest.mjs +74 -0
- package/src/server/schemas/settings.ts +41 -0
- package/src/shared/skillRanking.ts +117 -11
- package/src/templates/consumer-settings/ONBOARDING.md +1 -0
- package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
- package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
- package/dist/ui/assets/index-DH1xc62v.js +0 -29
- package/dist/ui/assets/index-jSfMW8_t.css +0 -1
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* quietly until the gate means nothing. Cross-pack pairs never block — a
|
|
31
31
|
* cross-pack merge changes install shape and is a different decision.
|
|
32
32
|
*/
|
|
33
|
+
import { createHash } from 'node:crypto';
|
|
33
34
|
import * as fs from 'node:fs';
|
|
34
35
|
import * as path from 'node:path';
|
|
35
36
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
@@ -47,6 +48,7 @@ export const OUT_MD_NAME = 'skill-overlap.md';
|
|
|
47
48
|
export const OUT_JSON = path.join(REPORT_DIR, OUT_JSON_NAME);
|
|
48
49
|
export const OUT_MD = path.join(REPORT_DIR, OUT_MD_NAME);
|
|
49
50
|
export const ALLOWLIST = path.join(ROOT, 'src', 'scripts', 'audit_skill_overlap_allowlist.json');
|
|
51
|
+
export const CROSS_CACHE_NAME = 'neighbour-overlap.json';
|
|
50
52
|
export const ALLOWLIST_CAP = 20;
|
|
51
53
|
// re.compile(r"^---\n(.*?)\n---", re.DOTALL) — used with .search (anywhere).
|
|
52
54
|
const FM_RE = /^---\n([\s\S]*?)\n---/m;
|
|
@@ -68,6 +70,8 @@ type Json = any;
|
|
|
68
70
|
interface Skill {
|
|
69
71
|
name: string;
|
|
70
72
|
relpath: string;
|
|
73
|
+
/** Absolute `SKILL.md` path — the key a cross-root result is returned under. */
|
|
74
|
+
abspath: string;
|
|
71
75
|
packs: Set<string>;
|
|
72
76
|
vector: Map<string, number>;
|
|
73
77
|
}
|
|
@@ -178,6 +182,7 @@ export function _parse(md: string, field: Field = 'body'): Skill {
|
|
|
178
182
|
return {
|
|
179
183
|
name: name ? String(name) : path.basename(path.dirname(md)),
|
|
180
184
|
relpath: _relPosix(md, ROOT),
|
|
185
|
+
abspath: path.resolve(md),
|
|
181
186
|
packs: Array.isArray(packsVal) ? new Set(packsVal.map((x) => String(x))) : new Set(),
|
|
182
187
|
vector: _keyword_vector(source),
|
|
183
188
|
};
|
|
@@ -322,6 +327,193 @@ export function find_pairs(skills: Skill[], threshold: number): Pair[] {
|
|
|
322
327
|
return stableSort(pairs, (p) => [p.same_domain ? 0 : 1, -p.similarity]);
|
|
323
328
|
}
|
|
324
329
|
|
|
330
|
+
/**
|
|
331
|
+
* One neighbour skill against one of ours, at or above the threshold.
|
|
332
|
+
*
|
|
333
|
+
* `neighbour_path` is absolute, because the two sides live under different roots
|
|
334
|
+
* and a repo-relative path would be a `../..` string that no caller can key on.
|
|
335
|
+
*/
|
|
336
|
+
export interface CrossPair {
|
|
337
|
+
neighbour: string;
|
|
338
|
+
neighbour_path: string;
|
|
339
|
+
ours: string;
|
|
340
|
+
similarity: number;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Cross-root pairs: every NEIGHBOUR skill against every one of OURS.
|
|
345
|
+
*
|
|
346
|
+
* NOT `find_pairs` over a merged list, and the difference is the whole point of
|
|
347
|
+
* the mode. `find_pairs` is `combinations(skills, 2)` over one corpus, so a
|
|
348
|
+
* merged list would also compare our skills against each other — re-deriving the
|
|
349
|
+
* same-corpus report under a different name, at the cost of the pairs the caller
|
|
350
|
+
* actually asked for being buried in it. This emits exactly the cross product,
|
|
351
|
+
* which is also the cheaper half: |neighbours| × |ours| rather than C(n+m, 2).
|
|
352
|
+
*
|
|
353
|
+
* The THRESHOLD is the caller's and defaults to {@link OVERLAP_THRESHOLD} — the
|
|
354
|
+
* same 0.70 every historical same-corpus report is calibrated against. Reusing it
|
|
355
|
+
* is deliberate: a second, softer bar invented for neighbours would make
|
|
356
|
+
* `compat: overlapping` mean something no existing number can be compared to.
|
|
357
|
+
*/
|
|
358
|
+
export function crossRootPairs(
|
|
359
|
+
neighbourRoot: string,
|
|
360
|
+
ourRoot: string,
|
|
361
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
362
|
+
field: Field = 'body',
|
|
363
|
+
): CrossPair[] {
|
|
364
|
+
return crossPairsForFiles(skillMdsUnder(neighbourRoot), ourRoot, threshold, field);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/** Non-archived `SKILL.md` paths under a root, in the collector's own order. */
|
|
368
|
+
export function skillMdsUnder(root: string): string[] {
|
|
369
|
+
return _rglobSkillMd(root).filter((md) => !md.split(path.sep).includes('_archive'));
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* The same cross product, over an EXPLICIT neighbour file list.
|
|
374
|
+
*
|
|
375
|
+
* This is the shape the census actually needs, and the root-taking wrapper above
|
|
376
|
+
* is the convenience layer rather than the other way round. A census's neighbour
|
|
377
|
+
* skills are the UNCLAIMED entries of two roots that also hold claimed ones —
|
|
378
|
+
* `agent-config install` writes our own skills into `~/.claude/skills` — so
|
|
379
|
+
* pairing a whole root would compare this package's installed copies against its
|
|
380
|
+
* own source tree and report the install as an overlap.
|
|
381
|
+
*/
|
|
382
|
+
export function crossPairsForFiles(
|
|
383
|
+
neighbourFiles: readonly string[],
|
|
384
|
+
ourRoot: string,
|
|
385
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
386
|
+
field: Field = 'body',
|
|
387
|
+
): CrossPair[] {
|
|
388
|
+
const theirs: Skill[] = [];
|
|
389
|
+
for (const md of neighbourFiles) {
|
|
390
|
+
try {
|
|
391
|
+
theirs.push(_parse(md, field));
|
|
392
|
+
} catch {
|
|
393
|
+
// Unreadable neighbour file: not a pair, and not a crash.
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const ours = collect(ourRoot, field);
|
|
397
|
+
const out: CrossPair[] = [];
|
|
398
|
+
for (const n of theirs) {
|
|
399
|
+
for (const o of ours) {
|
|
400
|
+
const sim = _cosine(n.vector, o.vector);
|
|
401
|
+
if (sim < threshold) continue;
|
|
402
|
+
out.push({
|
|
403
|
+
neighbour: n.name,
|
|
404
|
+
neighbour_path: n.abspath,
|
|
405
|
+
ours: o.name,
|
|
406
|
+
similarity: pyRound(sim, 3),
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return stableSort(out, (p) => [-p.similarity]);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Cross-root pairs folded the way the census reads them: highest-scoring hit per
|
|
415
|
+
* neighbour `SKILL.md`, with every our-skill name that crossed the bar.
|
|
416
|
+
*/
|
|
417
|
+
export function crossRootOverlapMap(
|
|
418
|
+
pairs: readonly CrossPair[],
|
|
419
|
+
): Map<string, { names: string[]; similarity: number }> {
|
|
420
|
+
const out = new Map<string, { names: string[]; similarity: number }>();
|
|
421
|
+
for (const p of pairs) {
|
|
422
|
+
const hit = out.get(p.neighbour_path);
|
|
423
|
+
if (hit === undefined) {
|
|
424
|
+
out.set(p.neighbour_path, { names: [p.ours], similarity: p.similarity });
|
|
425
|
+
continue;
|
|
426
|
+
}
|
|
427
|
+
if (!hit.names.includes(p.ours)) hit.names.push(p.ours);
|
|
428
|
+
if (p.similarity > hit.similarity) hit.similarity = p.similarity;
|
|
429
|
+
}
|
|
430
|
+
for (const hit of out.values()) hit.names.sort();
|
|
431
|
+
return out;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* The census digest the cross-root cache is keyed by.
|
|
436
|
+
*
|
|
437
|
+
* Over the INPUTS and nothing else: every skill's absolute path and the sha256
|
|
438
|
+
* of its bytes, on both sides, plus the threshold and the field. Risk-register
|
|
439
|
+
* row 3 is why a cache exists at all — a pairwise pass per prompt is not a
|
|
440
|
+
* hook-budget shape — and keying it on the bytes is what makes "a changed digest
|
|
441
|
+
* rescans first" true rather than aspirational. A key over NAMES alone would
|
|
442
|
+
* hand a stale score to a body that was rewritten underneath it.
|
|
443
|
+
*/
|
|
444
|
+
export function censusDigest(
|
|
445
|
+
neighbourFiles: readonly string[],
|
|
446
|
+
ourRoot: string,
|
|
447
|
+
threshold: number,
|
|
448
|
+
field: Field = 'body',
|
|
449
|
+
): string {
|
|
450
|
+
const h = createHash('sha256');
|
|
451
|
+
h.update(`${String(threshold)}\n${field}\n`);
|
|
452
|
+
const sides: ReadonlyArray<readonly string[]> = [
|
|
453
|
+
[...neighbourFiles].sort(),
|
|
454
|
+
skillMdsUnder(ourRoot),
|
|
455
|
+
];
|
|
456
|
+
for (const side of sides) {
|
|
457
|
+
h.update('side\n');
|
|
458
|
+
for (const md of side) {
|
|
459
|
+
let bytes: Buffer;
|
|
460
|
+
try {
|
|
461
|
+
bytes = fs.readFileSync(md);
|
|
462
|
+
} catch {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
h.update(path.resolve(md));
|
|
466
|
+
h.update('\0');
|
|
467
|
+
h.update(createHash('sha256').update(bytes).digest('hex'));
|
|
468
|
+
h.update('\n');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return h.digest('hex');
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export interface CrossCache {
|
|
475
|
+
schema_version: 1;
|
|
476
|
+
digest: string;
|
|
477
|
+
threshold: number;
|
|
478
|
+
pairs: CrossPair[];
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Cross-root pairs, recomputed only when the census digest moved.
|
|
483
|
+
*
|
|
484
|
+
* A cache miss is never silent: the result says `cached: false`, so a caller
|
|
485
|
+
* reporting "this came from the cache" cannot be reporting it about a pass that
|
|
486
|
+
* actually ran. A write failure is not fatal — the pairs are correct either way,
|
|
487
|
+
* and refusing to answer because a report directory is read-only would turn a
|
|
488
|
+
* cache into a dependency.
|
|
489
|
+
*/
|
|
490
|
+
export function cachedCrossRootPairs(
|
|
491
|
+
neighbourFiles: readonly string[],
|
|
492
|
+
ourRoot: string,
|
|
493
|
+
cacheFile: string,
|
|
494
|
+
threshold: number = OVERLAP_THRESHOLD,
|
|
495
|
+
field: Field = 'body',
|
|
496
|
+
): { pairs: CrossPair[]; digest: string; cached: boolean } {
|
|
497
|
+
const digest = censusDigest(neighbourFiles, ourRoot, threshold, field);
|
|
498
|
+
try {
|
|
499
|
+
const parsed = JSON.parse(fs.readFileSync(cacheFile, 'utf-8')) as Partial<CrossCache>;
|
|
500
|
+
if (parsed.digest === digest && Array.isArray(parsed.pairs)) {
|
|
501
|
+
return { pairs: parsed.pairs as CrossPair[], digest, cached: true };
|
|
502
|
+
}
|
|
503
|
+
} catch {
|
|
504
|
+
// No cache, or an unreadable one: compute.
|
|
505
|
+
}
|
|
506
|
+
const pairs = crossPairsForFiles(neighbourFiles, ourRoot, threshold, field);
|
|
507
|
+
const payload: CrossCache = { schema_version: 1, digest, threshold, pairs };
|
|
508
|
+
try {
|
|
509
|
+
fs.mkdirSync(path.dirname(cacheFile), { recursive: true });
|
|
510
|
+
fs.writeFileSync(cacheFile, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
511
|
+
} catch {
|
|
512
|
+
// A cache that cannot be written is still a correct answer.
|
|
513
|
+
}
|
|
514
|
+
return { pairs, digest, cached: false };
|
|
515
|
+
}
|
|
516
|
+
|
|
325
517
|
/** Stable sort by a tuple-of-numbers key (Python tuple compare). */
|
|
326
518
|
function stableSort<T>(arr: T[], key: (x: T) => number[]): T[] {
|
|
327
519
|
return arr
|
|
@@ -484,6 +676,9 @@ class FloatTag {
|
|
|
484
676
|
export function main(argv: string[] | null = null): number {
|
|
485
677
|
const args = parse_args(argv ?? process.argv.slice(2));
|
|
486
678
|
const root = args.root ?? _default_skill_root();
|
|
679
|
+
if (args.neighbourRoot !== undefined) {
|
|
680
|
+
return _mainCrossRoot(args, root);
|
|
681
|
+
}
|
|
487
682
|
const skills = collect(root, args.field);
|
|
488
683
|
try {
|
|
489
684
|
assertScanned({
|
|
@@ -570,6 +765,55 @@ export function main(argv: string[] | null = null): number {
|
|
|
570
765
|
return 1;
|
|
571
766
|
}
|
|
572
767
|
|
|
768
|
+
/**
|
|
769
|
+
* `--neighbour-root` — the cross-root pair mode.
|
|
770
|
+
*
|
|
771
|
+
* A SECOND QUESTION, not a second answer to the first. The same-corpus report
|
|
772
|
+
* asks "are two of our skills so alike that one should absorb the other", and a
|
|
773
|
+
* merge is the action it leads to. This asks "is a skill another package
|
|
774
|
+
* installed close enough to one of ours that a reader of the route line needs to
|
|
775
|
+
* know", and NOTHING is merged, removed or suppressed on the answer — the
|
|
776
|
+
* neighbour is not ours to merge. So it writes its own artifact and leaves
|
|
777
|
+
* `skill-overlap.json` alone.
|
|
778
|
+
*
|
|
779
|
+
* Exit 0 always. A finding here is a report; `--strict` belongs to the
|
|
780
|
+
* same-corpus mode, where the pair is between two files this package owns.
|
|
781
|
+
*/
|
|
782
|
+
function _mainCrossRoot(args: Args, ourRoot: string): number {
|
|
783
|
+
const neighbourRoot = args.neighbourRoot as string;
|
|
784
|
+
const outDir = args.outDir ?? REPORT_DIR;
|
|
785
|
+
const cacheFile = args.crossCache ?? path.join(outDir, CROSS_CACHE_NAME);
|
|
786
|
+
const { pairs, digest, cached } = cachedCrossRootPairs(
|
|
787
|
+
skillMdsUnder(neighbourRoot),
|
|
788
|
+
ourRoot,
|
|
789
|
+
cacheFile,
|
|
790
|
+
args.threshold,
|
|
791
|
+
args.field,
|
|
792
|
+
);
|
|
793
|
+
const theirs = collect(neighbourRoot, args.field);
|
|
794
|
+
// The counts line the gate-coverage contract asks for, on stderr like its
|
|
795
|
+
// sibling, so the report body on stdout stays machine-readable.
|
|
796
|
+
process.stderr.write(`scanned: ${String(theirs.length)}\n`);
|
|
797
|
+
if (!args.quiet) {
|
|
798
|
+
process.stdout.write(
|
|
799
|
+
`\u2705 Neighbour overlap: ${theirs.length} neighbour skill(s) \u00d7 ` +
|
|
800
|
+
`${collect(ourRoot, args.field).length} of ours, ${pairs.length} pair(s) ` +
|
|
801
|
+
`\u2265 ${_pct(args.threshold)} (${cached ? 'from cache' : 'recomputed'}).\n`,
|
|
802
|
+
);
|
|
803
|
+
process.stdout.write(` census digest: ${digest.slice(0, 12)}\n`);
|
|
804
|
+
process.stdout.write(` cache: ${_relPosix(cacheFile, ROOT)}\n`);
|
|
805
|
+
}
|
|
806
|
+
const byPath = crossRootOverlapMap(pairs);
|
|
807
|
+
for (const skill of theirs) {
|
|
808
|
+
const hit = byPath.get(skill.abspath);
|
|
809
|
+
if (hit === undefined) continue;
|
|
810
|
+
process.stdout.write(
|
|
811
|
+
` ${hit.similarity.toFixed(3)} ${skill.name} also: ${hit.names.join(', ')}\n`,
|
|
812
|
+
);
|
|
813
|
+
}
|
|
814
|
+
return 0;
|
|
815
|
+
}
|
|
816
|
+
|
|
573
817
|
/** Order-independent key for an unordered pair. */
|
|
574
818
|
export function _pairKey(a: string, b: string): string {
|
|
575
819
|
return a < b ? `${a}::${b}` : `${b}::${a}`;
|
|
@@ -662,6 +906,10 @@ interface Args {
|
|
|
662
906
|
strict: boolean;
|
|
663
907
|
/** Allowlist path override (tests); `undefined` = the shipped file. */
|
|
664
908
|
allowlist?: string;
|
|
909
|
+
/** Cross-root mode: the NEIGHBOUR tree to pair against `--root`. */
|
|
910
|
+
neighbourRoot?: string;
|
|
911
|
+
/** Cross-root cache path; `undefined` = `<out-dir>/neighbour-overlap.json`. */
|
|
912
|
+
crossCache?: string;
|
|
665
913
|
/** Which text the vector is built from. `description` is NON-canonical. */
|
|
666
914
|
field: Field;
|
|
667
915
|
}
|
|
@@ -698,6 +946,19 @@ export function parse_args(argv: string[]): Args {
|
|
|
698
946
|
} else if (a === '--threshold' || a.startsWith('--threshold=')) {
|
|
699
947
|
const inline = a.startsWith('--threshold=') ? a.slice('--threshold='.length) : undefined;
|
|
700
948
|
args.threshold = Number(takeValue('--threshold', inline, () => argv[++i]));
|
|
949
|
+
} else if (a === '--neighbour-root' || a.startsWith('--neighbour-root=')) {
|
|
950
|
+
const inline = a.startsWith('--neighbour-root=')
|
|
951
|
+
? a.slice('--neighbour-root='.length)
|
|
952
|
+
: undefined;
|
|
953
|
+
args.neighbourRoot = path.resolve(
|
|
954
|
+
ROOT,
|
|
955
|
+
takeValue('--neighbour-root', inline, () => argv[++i]),
|
|
956
|
+
);
|
|
957
|
+
} else if (a === '--cross-cache' || a.startsWith('--cross-cache=')) {
|
|
958
|
+
const inline = a.startsWith('--cross-cache=')
|
|
959
|
+
? a.slice('--cross-cache='.length)
|
|
960
|
+
: undefined;
|
|
961
|
+
args.crossCache = path.resolve(ROOT, takeValue('--cross-cache', inline, () => argv[++i]));
|
|
701
962
|
} else if (a === '--root' || a.startsWith('--root=')) {
|
|
702
963
|
const inline = a.startsWith('--root=') ? a.slice('--root='.length) : undefined;
|
|
703
964
|
args.root = path.resolve(ROOT, takeValue('--root', inline, () => argv[++i]));
|