@event4u/agent-config 16.3.0 → 16.4.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 +251 -0
- package/README.md +2 -2
- package/agents/templates/.ai-council.yml.example +26 -8
- package/dist/agent-src/commands/analyze/inbox.md +10 -7
- package/dist/agent-src/commands/bug/investigate.md +1 -1
- package/dist/agent-src/commands/commit/in-chunks.md +40 -31
- package/dist/agent-src/commands/commit.md +72 -33
- package/dist/agent-src/commands/condense.md +2 -8
- package/dist/agent-src/commands/council/debate.md +11 -7
- package/dist/agent-src/commands/council/default.md +10 -9
- package/dist/agent-src/commands/council.md +1 -1
- package/dist/agent-src/commands/estimate-ticket.md +1 -1
- package/dist/agent-src/commands/feature/explore.md +3 -3
- package/dist/agent-src/commands/feature/plan.md +1 -1
- package/dist/agent-src/commands/fix/ci.md +17 -3
- package/dist/agent-src/commands/fix/commit-messages.md +48 -23
- package/dist/agent-src/commands/fix/pr-comments.md +3 -6
- package/dist/agent-src/commands/implement-ticket.md +3 -3
- package/dist/agent-src/commands/memory/add.md +4 -16
- package/dist/agent-src/commands/memory/load.md +5 -6
- package/dist/agent-src/commands/memory/promote.md +3 -16
- package/dist/agent-src/commands/mission/upgrade.md +3 -2
- package/dist/agent-src/commands/optimize/agents-dir.md +2 -2
- package/dist/agent-src/commands/optimize/deep.md +4 -2
- package/dist/agent-src/commands/optimize/rtk.md +4 -26
- package/dist/agent-src/commands/pr/create/description-only.md +18 -15
- package/dist/agent-src/commands/pr/create.md +42 -34
- package/dist/agent-src/commands/pr/merge.md +136 -9
- package/dist/agent-src/commands/prepare-for-review.md +13 -11
- package/dist/agent-src/commands/project/analyze.md +7 -35
- package/dist/agent-src/commands/refine-ticket.md +1 -1
- package/dist/agent-src/commands/review/changes.md +14 -19
- package/dist/agent-src/commands/roadmap/next.md +10 -1
- package/dist/agent-src/commands/roadmap/process-full.md +52 -38
- package/dist/agent-src/commands/roadmap/resolve-blockers.md +64 -14
- package/dist/agent-src/commands/worktree/create.md +7 -3
- package/dist/agent-src/commands/worktree/verify.md +2 -1
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +5 -3
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +7 -9
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +8 -6
- package/dist/agent-src/contexts/contracts/frugality-charter.md +8 -5
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +1 -1
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +0 -1
- package/dist/agent-src/contexts/execution/evidence-discipline.md +2 -2
- package/dist/agent-src/contexts/execution/non-interactive-contract.md +5 -8
- package/dist/agent-src/contexts/execution/rdp-gate.md +4 -4
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +9 -8
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +67 -52
- package/dist/agent-src/contexts/execution/subagent-routing.md +8 -8
- package/dist/agent-src/contexts/execution/subagent-steering.md +6 -4
- package/dist/agent-src/contexts/execution/terminal-states.md +2 -2
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +4 -10
- package/dist/agent-src/contexts/subagent-configuration.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/dist/agent-src/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/dist/agent-src/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/dist/agent-src/guidelines/agent-infra/layered-settings.md +13 -1
- package/dist/agent-src/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/dist/agent-src/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/dist/agent-src/guidelines/agent-infra/size-and-scope.md +36 -0
- package/dist/agent-src/guidelines/php/git.md +15 -2
- package/dist/agent-src/rules/active-remediation.md +0 -1
- package/dist/agent-src/rules/analysis-skill-routing.md +0 -1
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -1
- package/dist/agent-src/rules/artifact-engagement-recording.md +0 -1
- package/dist/agent-src/rules/augment-edit-discipline.md +0 -1
- package/dist/agent-src/rules/autonomous-execution.md +0 -1
- package/dist/agent-src/rules/brand-consistency.md +0 -1
- package/dist/agent-src/rules/brand-source-of-truth.md +0 -1
- package/dist/agent-src/rules/broken-access-control.md +0 -1
- package/dist/agent-src/rules/cli-output-handling.md +0 -1
- package/dist/agent-src/rules/code-comment-discipline.md +0 -1
- package/dist/agent-src/rules/code-provenance.md +0 -1
- package/dist/agent-src/rules/command-suggestion-policy.md +0 -1
- package/dist/agent-src/rules/commit-conventions.md +1 -2
- package/dist/agent-src/rules/communication-through-line.md +1 -2
- package/dist/agent-src/rules/content-quoting-floor.md +1 -2
- package/dist/agent-src/rules/context-hygiene.md +5 -5
- package/dist/agent-src/rules/copilot-routing.md +1 -2
- package/dist/agent-src/rules/council-availability.md +4 -4
- package/dist/agent-src/rules/cross-source-consistency.md +4 -6
- package/dist/agent-src/rules/decision-revisit-gate.md +2 -3
- package/dist/agent-src/rules/delegation-policy.md +2 -3
- package/dist/agent-src/rules/design-fidelity.md +0 -1
- package/dist/agent-src/rules/design-review-after-ui-write.md +3 -3
- package/dist/agent-src/rules/devcontainer-routing.md +1 -2
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +0 -1
- package/dist/agent-src/rules/docker-commands.md +0 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -1
- package/dist/agent-src/rules/domain-safety-disclaimer.md +0 -1
- package/dist/agent-src/rules/domain-safety-pii.md +0 -1
- package/dist/agent-src/rules/domain-safety-retention.md +0 -1
- package/dist/agent-src/rules/downstream-changes.md +0 -1
- package/dist/agent-src/rules/engineering-safety-floor.md +0 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +0 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -2
- package/dist/agent-src/rules/finance-safety-floor.md +0 -1
- package/dist/agent-src/rules/fix-what-you-see.md +6 -32
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +1 -2
- package/dist/agent-src/rules/guidelines.md +0 -1
- package/dist/agent-src/rules/history-discipline.md +0 -1
- package/dist/agent-src/rules/icon-consistency.md +0 -1
- package/dist/agent-src/rules/image-likeness-and-rights.md +0 -1
- package/dist/agent-src/rules/improve-before-implement.md +0 -1
- package/dist/agent-src/rules/invite-challenge.md +0 -1
- package/dist/agent-src/rules/laravel-routing.md +1 -2
- package/dist/agent-src/rules/laravel-translations.md +0 -1
- package/dist/agent-src/rules/legal-safety-floor.md +0 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +0 -1
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -1
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +0 -1
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/media-governance-routing.md +1 -2
- package/dist/agent-src/rules/media-sync-ground-truth.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +0 -1
- package/dist/agent-src/rules/missing-skill-recovery.md +0 -1
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/model-recommendation.md +0 -1
- package/dist/agent-src/rules/neighbour-precedence.md +64 -0
- package/dist/agent-src/rules/no-attribution-footers.md +0 -1
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +0 -1
- package/dist/agent-src/rules/no-pr-progress-comments.md +0 -1
- package/dist/agent-src/rules/no-roadmap-references.md +0 -1
- package/dist/agent-src/rules/notes-first-reasoning.md +0 -1
- package/dist/agent-src/rules/onboarding-gate.md +0 -1
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/package-ci-checks.md +0 -1
- package/dist/agent-src/rules/persona-governance.md +2 -3
- package/dist/agent-src/rules/php-coding.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -1
- package/dist/agent-src/rules/preservation-guard.md +0 -1
- package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -3
- package/dist/agent-src/rules/question-not-instruction.md +0 -1
- package/dist/agent-src/rules/reviewer-awareness.md +0 -1
- package/dist/agent-src/rules/roadmap-ci-steps-policy.md +0 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +3 -6
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/rule-type-governance.md +0 -1
- package/dist/agent-src/rules/runtime-safety.md +0 -1
- package/dist/agent-src/rules/scale-discipline.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +0 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +0 -1
- package/dist/agent-src/rules/self-repair-loop.md +0 -1
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -1
- package/dist/agent-src/rules/session-canary.md +0 -1
- package/dist/agent-src/rules/settings-ask-protocol.md +5 -6
- package/dist/agent-src/rules/size-enforcement.md +0 -1
- package/dist/agent-src/rules/skill-improvement-trigger.md +2 -3
- package/dist/agent-src/rules/skill-quality.md +0 -1
- package/dist/agent-src/rules/slash-command-routing-policy.md +0 -1
- package/dist/agent-src/rules/source-confidentiality.md +0 -1
- package/dist/agent-src/rules/source-discovery-gate.md +0 -1
- package/dist/agent-src/rules/source-of-truth.md +0 -1
- package/dist/agent-src/rules/spreadsheet-source-quality.md +1 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +0 -1
- package/dist/agent-src/rules/symfony-routing.md +1 -2
- package/dist/agent-src/rules/think-before-action.md +0 -1
- package/dist/agent-src/rules/token-budget-discipline.md +12 -46
- package/dist/agent-src/rules/token-efficiency.md +0 -1
- package/dist/agent-src/rules/token-optimizer-maintenance.md +0 -1
- package/dist/agent-src/rules/tool-safety.md +0 -1
- package/dist/agent-src/rules/ui-audit-gate.md +1 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +0 -1
- package/dist/agent-src/rules/upstream-proposal.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -1
- package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
- package/dist/agent-src/scripts/gate_budget.ts +47 -23
- package/dist/agent-src/scripts/gate_execute.ts +12 -4
- package/dist/agent-src/skills/ai-council/SKILL.md +7 -4
- package/dist/agent-src/skills/ai-council/references/cost-and-redaction.md +21 -11
- package/dist/agent-src/skills/ai-council/references/procedure.md +12 -6
- package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +1 -1
- package/dist/agent-src/skills/command-routing/SKILL.md +3 -4
- package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +127 -139
- package/dist/agent-src/skills/corpus-grounding/ATTRIBUTION.md +39 -0
- package/dist/agent-src/skills/corpus-grounding/SKILL.md +8 -2
- package/dist/agent-src/skills/database/data/manifest.json +2 -2
- package/dist/agent-src/skills/database/data/query-tuning.csv +13 -13
- package/dist/agent-src/skills/design-system-capture/SKILL.md +0 -3
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +1 -1
- package/dist/agent-src/skills/feature-planning/SKILL.md +1 -1
- package/dist/agent-src/skills/git-workflow/SKILL.md +44 -44
- package/dist/agent-src/skills/git-workflow/references/branch-update.md +312 -0
- package/dist/agent-src/skills/git-workflow/references/commit-subject.md +205 -0
- package/dist/agent-src/skills/jira-integration/SKILL.md +3 -3
- package/dist/agent-src/skills/merge-conflicts/SKILL.md +10 -4
- package/dist/agent-src/skills/po-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +4 -4
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -2
- package/dist/agent-src/skills/source-discovery/SKILL.md +1 -1
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +3 -1
- package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +2 -2
- package/dist/agent-src/templates/AGENTS.md +1 -1
- package/dist/agent-src/templates/agent-settings.md +46 -129
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +3 -3
- package/dist/agent-src/templates/command.md +2 -2
- package/dist/agent-src/templates/roadmaps.md +6 -1
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/dist/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/dist/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/dist/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/dist/agent-src/templates/skill.md +1 -1
- package/dist/cli/registry.js +1 -0
- package/dist/cli-delegate/check_update_banner.js +195 -119
- package/dist/cli-delegate/{chunk-TRI6DQZ6.js → chunk-5GPULQBE.js} +60 -42
- package/dist/cli-delegate/{chunk-JQVYKIZA.js → chunk-6SRJTYJS.js} +33 -177
- package/dist/cli-delegate/chunk-6V5FMA3P.js +186 -0
- package/dist/cli-delegate/chunk-6YQC2HLF.js +415 -0
- package/dist/cli-delegate/{chunk-E4XIZDIB.js → chunk-7HKRE54K.js} +1 -64
- package/dist/cli-delegate/{chunk-NQ7WT43P.js → chunk-AED2VQGM.js} +65 -11
- package/dist/cli-delegate/{chunk-7HQ52DHU.js → chunk-AL3RZ22D.js} +1 -1
- package/dist/cli-delegate/{chunk-DBH4AHDK.js → chunk-ED7KCMLB.js} +9 -11
- package/dist/cli-delegate/{chunk-NXEILF2K.js → chunk-F3QDG2GT.js} +481 -72
- package/dist/cli-delegate/{chunk-CQWX336L.js → chunk-G5VVIZRC.js} +3 -3
- package/dist/cli-delegate/{chunk-JY2I2DXV.js → chunk-H76PHZBI.js} +137 -60
- package/dist/cli-delegate/chunk-IAYTIIQW.js +67 -0
- package/dist/cli-delegate/{chunk-LIYTLH6O.js → chunk-KXXWJTDO.js} +5 -10
- package/dist/cli-delegate/{chunk-T7L2QK3K.js → chunk-LQOCRFWT.js} +1 -1
- package/dist/cli-delegate/{chunk-S4YWNRKO.js → chunk-MDPPKQCQ.js} +34 -1
- package/dist/cli-delegate/{chunk-S4UMZNES.js → chunk-MSUL5NYP.js} +5 -5
- package/dist/cli-delegate/chunk-OAFSJBHH.js +272 -0
- package/dist/cli-delegate/{chunk-GKE7ZVFA.js → chunk-PWX7CKMD.js} +1 -1
- package/dist/cli-delegate/{chunk-NDJLNC6Q.js → chunk-T6BP34WI.js} +1 -0
- package/dist/cli-delegate/{chunk-RQNNW7IF.js → chunk-T7XSJSUQ.js} +433 -632
- package/dist/cli-delegate/{chunk-EEHDXSYD.js → chunk-WQWXGIWB.js} +12 -273
- package/dist/cli-delegate/{chunk-QLDHIPWR.js → chunk-XQTPXKFA.js} +1 -1
- package/dist/cli-delegate/cmd_analyze_session.js +223 -43
- package/dist/cli-delegate/cmd_brand_status.js +3 -2
- package/dist/cli-delegate/cmd_conformance.js +105 -35
- package/dist/cli-delegate/cmd_converge.js +3 -3
- package/dist/cli-delegate/cmd_doctor.js +15 -12
- package/dist/cli-delegate/cmd_doctor_neighbours.js +11 -4
- package/dist/cli-delegate/cmd_explain.js +43 -19
- package/dist/cli-delegate/cmd_export.js +10 -10
- package/dist/cli-delegate/cmd_git_convention.js +1851 -0
- package/dist/cli-delegate/cmd_handoff.js +40 -21
- package/dist/cli-delegate/cmd_mcp_available.js +3 -2
- package/dist/cli-delegate/cmd_migrate.js +3 -3
- package/dist/cli-delegate/cmd_packs_active.js +4 -3
- package/dist/cli-delegate/cmd_prune.js +10 -10
- package/dist/cli-delegate/cmd_route_audit.js +7 -7
- package/dist/cli-delegate/cmd_route_explain.js +5 -5
- package/dist/cli-delegate/cmd_session_recycle.js +9 -7
- package/dist/cli-delegate/cmd_settings_check.js +54 -7
- package/dist/cli-delegate/cmd_settings_get.js +18 -8
- package/dist/cli-delegate/cmd_settings_migrate.js +10 -10
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +10 -10
- package/dist/cli-delegate/cmd_uninstall.js +10 -10
- package/dist/cli-delegate/cmd_update.js +7 -7
- package/dist/cli-delegate/cmd_upgrade.js +7 -7
- package/dist/cli-delegate/cmd_validate.js +10 -10
- package/dist/cli-delegate/cmd_versions.js +5 -5
- package/dist/cli-delegate/gate_budget.js +1 -1
- package/dist/cli-delegate/gate_execute.js +2 -2
- package/dist/cli-delegate/roadmap_gates.js +2 -2
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +129 -90
- 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 +24 -9
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +5 -4
- package/dist/hooks/dispatch.js +2151 -1820
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/install/install.mjs +462 -431
- package/dist/install/installThinLayer.js +40 -12
- package/dist/install/installedRuleLinks.js +105 -19
- package/dist/mcp/awesome-mcp-servers.row.md +1 -1
- package/dist/mcp/mcp-cloudflare-catalogue.json +2 -2
- package/dist/mcp/registry-manifest.json +5 -5
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2702 -1995
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +15 -120
- package/dist/scripts/_lib/compile_time_toggles.js +12 -21
- package/dist/scripts/_lib/git_convention.js +232 -0
- package/dist/scripts/_lib/global_deploy_inventory.js +730 -0
- package/dist/scripts/_lib/installed_layer.js +344 -18
- package/dist/scripts/_lib/package_root.js +68 -0
- package/dist/scripts/_lib/rule_law_section.js +1 -1
- package/dist/scripts/_lib/settings_removed_keys.js +168 -0
- package/dist/scripts/_lib/thin_rules.js +80 -3
- package/dist/server/app.js +2 -1
- package/dist/server/gitKeysGate.js +105 -0
- package/dist/server/routes/settings.js +67 -8
- package/dist/server/routes/wizard.js +4 -0
- package/dist/server/schemas/settings.js +23 -81
- package/dist/shared/skillRanking.js +30 -4
- package/dist/ui/assets/{index-Cwq4d0hX.js → index-C3djEJah.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/docs/MIGRATION.md +72 -1
- package/docs/contracts/settings-classes.md +35 -65
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +39 -0
- package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/cross-source-consistency-mechanics.md +8 -10
- package/docs/guidelines/agent-infra/frontier-reasoning-operating-profile.md +3 -2
- package/docs/guidelines/agent-infra/layered-settings.md +13 -1
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +1 -1
- package/docs/guidelines/agent-infra/self-improvement-pipeline.md +10 -3
- package/docs/guidelines/agent-infra/size-and-scope.md +36 -0
- package/docs/guidelines/php/git.md +15 -2
- package/package.json +1 -1
- package/src/agent-src/scripts/gate_budget.ts +47 -23
- package/src/agent-src/scripts/gate_execute.ts +12 -4
- package/src/agent-src/templates/AGENTS.md +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/directives/backend/_self_fix.ts +11 -7
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/decision_trace.ts +3 -2
- package/src/agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.ts +2 -1
- package/src/agent-src/templates/scripts/work_engine/hooks/settings.ts +0 -6
- package/src/agent-src/templates/scripts/work_engine/scoring/decision_engine.ts +9 -12
- package/src/agent-src/templates/scripts/work_engine/scoring/memory_visibility.ts +2 -1
- package/src/config/agent-settings.template.yml +79 -312
- package/src/config/agents-paths.yml +16 -0
- package/src/config/assurance-capability-registry.json +7 -3
- package/src/config/ci-local-parity.yml +3 -0
- package/src/config/continuity-surface.json +3 -3
- package/src/config/discovery/packs.yml +17 -1
- package/src/config/evaluator-budgets.json +19 -6
- package/src/config/gate-coverage.yml +65 -23
- package/src/config/gate-violation-baselines.json +53 -13
- package/src/config/gitignore-block.txt +19 -0
- package/src/config/hook-bundle-budget.json +1 -1
- package/src/config/release-gate-locality.yml +2 -1
- package/src/config/routing-coverage-seed.json +48 -6
- package/src/config/rule-law-ceilings.json +12 -6
- package/src/config/rule-obligations.json +833 -0
- package/src/install/installThinLayer.ts +76 -10
- package/src/install/installedRuleLinks.ts +105 -17
- package/src/scripts/_cli/cmd_analyze_session.ts +9 -15
- package/src/scripts/_cli/cmd_conformance.ts +13 -2
- package/src/scripts/_cli/cmd_doctor.ts +10 -10
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +133 -0
- package/src/scripts/_cli/cmd_explain.ts +72 -14
- package/src/scripts/_cli/cmd_git_convention.ts +637 -0
- package/src/scripts/_cli/cmd_settings_check.ts +66 -8
- package/src/scripts/_cli/cmd_settings_get.ts +18 -3
- package/src/scripts/_cli/doctor_execution.ts +72 -1
- package/src/scripts/_dispatch.bash +37 -2
- package/src/scripts/_lib/agent_settings.ts +15 -124
- package/src/scripts/_lib/blocked_by_marker.ts +1 -1
- package/src/scripts/_lib/compile_time_toggles.ts +12 -21
- package/src/scripts/_lib/dispatch_import_closure.ts +163 -0
- package/src/scripts/_lib/git_base_ref.ts +92 -0
- package/src/scripts/_lib/git_convention.ts +291 -0
- package/src/scripts/_lib/git_convention_carrier.ts +389 -0
- package/src/scripts/_lib/git_convention_grammar.ts +246 -0
- package/src/scripts/_lib/git_convention_measure.ts +344 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +74 -0
- package/src/scripts/_lib/graph_feeder_record.ts +236 -13
- package/src/scripts/_lib/installed_layer.ts +448 -23
- package/src/scripts/_lib/knowledge_global.ts +14 -1
- package/src/scripts/_lib/module_reach.ts +456 -0
- package/src/scripts/_lib/neighbour_contradictions.ts +236 -0
- package/src/scripts/_lib/neighbour_tool_use.ts +8 -10
- package/src/scripts/_lib/ratification_artifact.ts +220 -1
- package/src/scripts/_lib/ratification_subject.ts +92 -0
- package/src/scripts/_lib/release_findings_ingest.ts +15 -7
- package/src/scripts/_lib/release_highlights.ts +5 -0
- package/src/scripts/_lib/rule_law_section.ts +1 -1
- package/src/scripts/_lib/rule_obligations.ts +205 -0
- package/src/scripts/_lib/self_repair.ts +1 -1
- package/src/scripts/_lib/settings_removed_keys.ts +173 -0
- package/src/scripts/_lib/test_red_state.ts +5 -0
- package/src/scripts/_lib/thin_rules.ts +83 -3
- package/src/scripts/_lib/touched_file_quality.ts +142 -6
- package/src/scripts/_lib/worker_budget.ts +1 -1
- package/src/scripts/adr/regenerate_index.ts +16 -1
- package/src/scripts/ai_council/config.ts +7 -7
- package/src/scripts/ai_council/modification_review.ts +100 -0
- package/src/scripts/ai_council/modification_review_questions.ts +90 -0
- package/src/scripts/ai_council/orchestrator.ts +5 -5
- package/src/scripts/ai_council/spend_gate.ts +18 -7
- package/src/scripts/ai_team/config.ts +11 -16
- package/src/scripts/audit_user_type_axis.ts +20 -8
- package/src/scripts/bench_ab_clone.ts +1 -2
- package/src/scripts/bench_concern_spawn_path.ts +129 -0
- package/src/scripts/bench_graph_feeder_latency.ts +584 -0
- package/src/scripts/check_agent_artifact_location.ts +36 -0
- package/src/scripts/check_branch_freshness.ts +147 -24
- package/src/scripts/check_enforcement_coverage.ts +130 -0
- package/src/scripts/check_evaluator_budgets.ts +4 -0
- package/src/scripts/check_finding_dispositions.ts +88 -25
- package/src/scripts/check_gate_coverage.ts +4 -3
- package/src/scripts/check_gate_reachability.ts +48 -1
- package/src/scripts/check_generator_sync.ts +48 -0
- package/src/scripts/check_hook_bundle_composition.ts +107 -0
- package/src/scripts/check_kernel_edit_ratified.ts +86 -6
- package/src/scripts/check_pack_size.ts +1 -1
- package/src/scripts/check_release_manifest_content.ts +189 -0
- package/src/scripts/check_standing_rule_delivery.ts +96 -0
- package/src/scripts/check_suppression_hygiene.ts +2 -5
- package/src/scripts/ci_settle.ts +42 -5
- package/src/scripts/classify_merge_risk.ts +320 -0
- package/src/scripts/closure_scan.ts +91 -1
- package/src/scripts/command_suggester/settings.ts +8 -108
- package/src/scripts/command_suggester/types.ts +4 -5
- package/src/scripts/consumer_matrix.ts +102 -0
- package/src/scripts/context_hygiene_hook.ts +13 -23
- package/src/scripts/cost/preflight.mjs +12 -1
- package/src/scripts/council_cli.ts +7 -7
- package/src/scripts/dispatch_r2_reviewer.ts +24 -11
- package/src/scripts/explain_run.ts +8 -13
- package/src/scripts/generate_git_convention_grammar.ts +127 -0
- package/src/scripts/generate_host_cost_table.ts +20 -3
- package/src/scripts/handoff_context_hook.ts +86 -37
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +25 -6
- package/src/scripts/hooks/block_config_weakening.ts +48 -5
- package/src/scripts/hooks/block_plumbing_writes.ts +8 -4
- package/src/scripts/hooks/concern_registry.ts +2 -0
- package/src/scripts/hooks/delegation_nudge_hook.ts +2 -3
- package/src/scripts/hooks/evidence_independence.ts +12 -4
- package/src/scripts/hooks/mcp_usage_observation_hook.ts +121 -0
- package/src/scripts/hooks/push_settle_hook.ts +4 -3
- package/src/scripts/hooks/rule_inject_hook.ts +44 -3
- package/src/scripts/hooks/state_io.ts +8 -4
- package/src/scripts/hooks/telemetry_usage_hook.ts +7 -46
- package/src/scripts/hooks/turn_end_gate_hook.ts +1 -0
- package/src/scripts/install-hooks.sh +42 -14
- package/src/scripts/install.ts +7 -31
- package/src/scripts/lint_blocker_citations.ts +198 -0
- package/src/scripts/lint_evidence_artifacts.ts +9 -0
- package/src/scripts/lint_hook_concern_budget.ts +10 -21
- package/src/scripts/lint_pack_boundaries.ts +406 -28
- package/src/scripts/lint_roadmap_blockers.ts +282 -29
- package/src/scripts/lint_roadmap_complexity.ts +4 -2
- package/src/scripts/lint_rule_law_section.ts +151 -21
- package/src/scripts/lint_rule_skill_pack_reach.ts +17 -0
- package/src/scripts/lint_settings_classes.ts +1 -1
- package/src/scripts/lint_ticked_unmet_criteria.ts +165 -0
- package/src/scripts/lint_workflow_security.ts +12 -1
- package/src/scripts/measure_skill_ranker_baseline.ts +5 -0
- package/src/scripts/model_rule_injection.ts +3 -3
- package/src/scripts/onboarding_gate_hook.ts +7 -6
- package/src/scripts/print_required_checks.ts +15 -3
- package/src/scripts/probe_host_compliance.ts +33 -5
- package/src/scripts/probe_turnaround.ts +183 -3
- package/src/scripts/ratification_header.ts +77 -0
- package/src/scripts/refusal_envelope.ts +138 -0
- package/src/scripts/release_publication.ts +29 -3
- package/src/scripts/report_dispatch_import_closure.ts +76 -0
- package/src/scripts/report_installed_rule_links.ts +118 -1
- package/src/scripts/report_module_reach.ts +212 -0
- package/src/scripts/report_obligation_mechanism.ts +16 -18
- package/src/scripts/report_parked_blockers.ts +222 -0
- package/src/scripts/report_required_checks_drift.ts +196 -0
- package/src/scripts/report_skill_ranker_confusion.ts +103 -2
- package/src/scripts/report_standing_payload_by_host.ts +1 -1
- package/src/scripts/routing_doctor.ts +2 -2
- package/src/scripts/schemas/agent-settings.schema.json +17 -31
- package/src/scripts/schemas/command.schema.json +1 -1
- package/src/scripts/schemas/skill.schema.json +1 -1
- package/src/scripts/self_review_gate.ts +39 -2
- package/src/scripts/skill_tools/score_skill_relevance.ts +28 -19
- package/src/scripts/sync_pr_branch.ts +403 -132
- package/src/scripts/trigger_eval_grandfather.json +0 -16
- package/src/server/schemas/settings.ts +33 -177
- package/src/shared/skillRanking.ts +53 -4
- package/dist/cli-delegate/chunk-NYX3L2PZ.js +0 -99
- package/src/scripts/_lib/config_chain.ts +0 -477
- package/src/scripts/_lib/conformance_report.ts +0 -403
- package/src/scripts/_lib/eval_discrimination.ts +0 -95
- package/src/scripts/_lib/evaluator_promotion.ts +0 -225
- package/src/scripts/_lib/file_slicer.ts +0 -117
- package/src/scripts/_lib/legacy_boundary_map.ts +0 -228
- package/src/scripts/_lib/minimality_tiebreak.ts +0 -168
- package/src/scripts/_lib/overbuild_lens_contract.ts +0 -196
- package/src/scripts/_lib/role_split.ts +0 -338
|
@@ -4,6 +4,15 @@ import {
|
|
|
4
4
|
entryCommands,
|
|
5
5
|
isManagedEntry
|
|
6
6
|
} from "./chunk-DEIV7XP7.js";
|
|
7
|
+
import {
|
|
8
|
+
manifest_path,
|
|
9
|
+
readRecordedHashes
|
|
10
|
+
} from "./chunk-OKJUIAPS.js";
|
|
11
|
+
import {
|
|
12
|
+
COUNCIL_CONFIG_ENV,
|
|
13
|
+
load_council_config,
|
|
14
|
+
resolve_config_path
|
|
15
|
+
} from "./chunk-WQWXGIWB.js";
|
|
7
16
|
import {
|
|
8
17
|
scanText
|
|
9
18
|
} from "./chunk-KB5FZ655.js";
|
|
@@ -21,32 +30,32 @@ import {
|
|
|
21
30
|
report_child_scanned,
|
|
22
31
|
scan_file
|
|
23
32
|
} from "./chunk-JQOM7TTM.js";
|
|
24
|
-
import {
|
|
25
|
-
manifest_path,
|
|
26
|
-
readRecordedHashes
|
|
27
|
-
} from "./chunk-OKJUIAPS.js";
|
|
28
33
|
import {
|
|
29
34
|
DeadScopeError,
|
|
30
35
|
assertScanned
|
|
31
36
|
} from "./chunk-I3EIN2YG.js";
|
|
37
|
+
import {
|
|
38
|
+
readHookStdin
|
|
39
|
+
} from "./chunk-F7DQWYR5.js";
|
|
32
40
|
import {
|
|
33
41
|
require_dist
|
|
34
42
|
} from "./chunk-OY53J6II.js";
|
|
35
|
-
import {
|
|
36
|
-
resolvePackageRoot
|
|
37
|
-
} from "./chunk-MCJYCQPF.js";
|
|
38
43
|
import {
|
|
39
44
|
SRC_SKILLS
|
|
40
45
|
} from "./chunk-YCU3TIXH.js";
|
|
46
|
+
import {
|
|
47
|
+
resolvePackageRoot
|
|
48
|
+
} from "./chunk-MCJYCQPF.js";
|
|
41
49
|
import {
|
|
42
50
|
__toESM
|
|
43
51
|
} from "./chunk-J55WI3RR.js";
|
|
44
52
|
|
|
45
53
|
// src/scripts/_cli/cmd_doctor_neighbours.ts
|
|
46
54
|
var YAML = __toESM(require_dist(), 1);
|
|
47
|
-
import
|
|
48
|
-
import * as
|
|
49
|
-
import
|
|
55
|
+
import { spawnSync } from "node:child_process";
|
|
56
|
+
import * as fs11 from "node:fs";
|
|
57
|
+
import * as path10 from "node:path";
|
|
58
|
+
import { fileURLToPath as fileURLToPath6, pathToFileURL as pathToFileURL6 } from "node:url";
|
|
50
59
|
|
|
51
60
|
// src/scripts/_lib/neighbour_census.ts
|
|
52
61
|
import { createHash as createHash2 } from "node:crypto";
|
|
@@ -1235,20 +1244,335 @@ function writeScanCache(file, entries) {
|
|
|
1235
1244
|
}
|
|
1236
1245
|
}
|
|
1237
1246
|
|
|
1238
|
-
// src/scripts/
|
|
1239
|
-
var import_yaml2 = __toESM(require_dist(), 1);
|
|
1240
|
-
import { createHash as createHash3 } from "node:crypto";
|
|
1247
|
+
// src/scripts/_lib/neighbour_contradictions.ts
|
|
1241
1248
|
import * as fs8 from "node:fs";
|
|
1249
|
+
var RANK_PROJECT = 3;
|
|
1250
|
+
var RANK_SUITE = 4;
|
|
1251
|
+
var RANK_NEIGHBOUR_ALWAYS_ON = 6;
|
|
1252
|
+
var RANK_NEIGHBOUR_SKILL = 7;
|
|
1253
|
+
var RANK_LABEL = {
|
|
1254
|
+
[RANK_PROJECT]: "project instruction file",
|
|
1255
|
+
[RANK_SUITE]: "this suite's routed guidance",
|
|
1256
|
+
[RANK_NEIGHBOUR_ALWAYS_ON]: "neighbour's always-on text",
|
|
1257
|
+
[RANK_NEIGHBOUR_SKILL]: "neighbour skill body (discoverable)"
|
|
1258
|
+
};
|
|
1259
|
+
var NEGATION = /\b(never|don't|do not|must not|mustn't|should not|shouldn't|avoid|stop)\b/iu;
|
|
1260
|
+
var DIRECTIVE_WORD = /\b(always|must|should|never|don't|do not|avoid)\b/iu;
|
|
1261
|
+
var NON_IMPERATIVE_START = /* @__PURE__ */ new Set([
|
|
1262
|
+
"the",
|
|
1263
|
+
"a",
|
|
1264
|
+
"an",
|
|
1265
|
+
"this",
|
|
1266
|
+
"that",
|
|
1267
|
+
"these",
|
|
1268
|
+
"those",
|
|
1269
|
+
"it",
|
|
1270
|
+
"its",
|
|
1271
|
+
"we",
|
|
1272
|
+
"you",
|
|
1273
|
+
"i",
|
|
1274
|
+
"our",
|
|
1275
|
+
"they",
|
|
1276
|
+
"there",
|
|
1277
|
+
"when",
|
|
1278
|
+
"if",
|
|
1279
|
+
"see",
|
|
1280
|
+
"for",
|
|
1281
|
+
"in",
|
|
1282
|
+
"on",
|
|
1283
|
+
"as",
|
|
1284
|
+
"by",
|
|
1285
|
+
"with",
|
|
1286
|
+
"from"
|
|
1287
|
+
]);
|
|
1288
|
+
var STOP = /* @__PURE__ */ new Set([
|
|
1289
|
+
"always",
|
|
1290
|
+
"never",
|
|
1291
|
+
"must",
|
|
1292
|
+
"should",
|
|
1293
|
+
"avoid",
|
|
1294
|
+
"stop",
|
|
1295
|
+
"don",
|
|
1296
|
+
"with",
|
|
1297
|
+
"without",
|
|
1298
|
+
"that",
|
|
1299
|
+
"this",
|
|
1300
|
+
"they",
|
|
1301
|
+
"them",
|
|
1302
|
+
"then",
|
|
1303
|
+
"than",
|
|
1304
|
+
"into",
|
|
1305
|
+
"from",
|
|
1306
|
+
"your",
|
|
1307
|
+
"when",
|
|
1308
|
+
"what",
|
|
1309
|
+
"will",
|
|
1310
|
+
"each",
|
|
1311
|
+
"every",
|
|
1312
|
+
"only",
|
|
1313
|
+
"also",
|
|
1314
|
+
"here",
|
|
1315
|
+
"there",
|
|
1316
|
+
"have",
|
|
1317
|
+
"been",
|
|
1318
|
+
"more",
|
|
1319
|
+
"some",
|
|
1320
|
+
"such",
|
|
1321
|
+
"like",
|
|
1322
|
+
"just"
|
|
1323
|
+
]);
|
|
1324
|
+
function stem(word) {
|
|
1325
|
+
let w = word.toLowerCase().replace(/[^a-z]/gu, "");
|
|
1326
|
+
for (const suffix of ["ing", "ed", "es", "s"]) {
|
|
1327
|
+
if (w.length > suffix.length + 3 && w.endsWith(suffix)) {
|
|
1328
|
+
w = w.slice(0, -suffix.length);
|
|
1329
|
+
break;
|
|
1330
|
+
}
|
|
1331
|
+
}
|
|
1332
|
+
return w;
|
|
1333
|
+
}
|
|
1334
|
+
function isDirective(text) {
|
|
1335
|
+
if (DIRECTIVE_WORD.test(text)) return true;
|
|
1336
|
+
const first = (text.split(/\s+/u)[0] ?? "").toLowerCase().replace(/[^a-z']/gu, "");
|
|
1337
|
+
return first.length > 0 && !NON_IMPERATIVE_START.has(first);
|
|
1338
|
+
}
|
|
1339
|
+
function extractInstructions(source, body) {
|
|
1340
|
+
let text;
|
|
1341
|
+
try {
|
|
1342
|
+
text = body ?? fs8.readFileSync(source.file, "utf-8");
|
|
1343
|
+
} catch {
|
|
1344
|
+
return [];
|
|
1345
|
+
}
|
|
1346
|
+
const out = [];
|
|
1347
|
+
let fenced = false;
|
|
1348
|
+
let frontmatter = false;
|
|
1349
|
+
text.split("\n").forEach((raw, i) => {
|
|
1350
|
+
const line = raw.trim();
|
|
1351
|
+
if (i === 0 && line === "---") {
|
|
1352
|
+
frontmatter = true;
|
|
1353
|
+
return;
|
|
1354
|
+
}
|
|
1355
|
+
if (frontmatter) {
|
|
1356
|
+
if (line === "---") frontmatter = false;
|
|
1357
|
+
return;
|
|
1358
|
+
}
|
|
1359
|
+
if (line.startsWith("```") || line.startsWith("~~~")) {
|
|
1360
|
+
fenced = !fenced;
|
|
1361
|
+
return;
|
|
1362
|
+
}
|
|
1363
|
+
if (fenced || line === "" || line.startsWith("#") || line.startsWith("|") || line.startsWith(">")) return;
|
|
1364
|
+
const clean = line.replace(/^([-*+]|\d+\.)\s+/u, "").replace(/[*_`]/gu, "");
|
|
1365
|
+
if (clean.split(/\s+/u).length < 3 || !isDirective(clean)) return;
|
|
1366
|
+
const stems = new Set(
|
|
1367
|
+
clean.split(/\s+/u).map(stem).filter((s) => s.length >= 4 && !STOP.has(s))
|
|
1368
|
+
);
|
|
1369
|
+
out.push({ source, line: i + 1, text: clean, negative: NEGATION.test(clean), stems });
|
|
1370
|
+
});
|
|
1371
|
+
return out;
|
|
1372
|
+
}
|
|
1373
|
+
function where(l) {
|
|
1374
|
+
return `${l.source.label}:${l.line}`;
|
|
1375
|
+
}
|
|
1376
|
+
function modalityPairs(lines, cap = 20) {
|
|
1377
|
+
const out = [];
|
|
1378
|
+
for (let i = 0; i < lines.length && out.length < cap; i += 1) {
|
|
1379
|
+
for (let j = i + 1; j < lines.length && out.length < cap; j += 1) {
|
|
1380
|
+
const x = lines[i];
|
|
1381
|
+
const y = lines[j];
|
|
1382
|
+
if (x.source.rank === y.source.rank || x.negative === y.negative) continue;
|
|
1383
|
+
const shared = [...x.stems].filter((s) => y.stems.has(s)).sort();
|
|
1384
|
+
if (shared.length === 0) continue;
|
|
1385
|
+
const [hi, lo] = x.source.rank <= y.source.rank ? [x, y] : [y, x];
|
|
1386
|
+
out.push({
|
|
1387
|
+
kind: "opposite-modality",
|
|
1388
|
+
a: { label: where(hi), rank: hi.source.rank, text: hi.text },
|
|
1389
|
+
b: { label: where(lo), rank: lo.source.rank, text: lo.text },
|
|
1390
|
+
subject: shared[0]
|
|
1391
|
+
});
|
|
1392
|
+
}
|
|
1393
|
+
}
|
|
1394
|
+
return out;
|
|
1395
|
+
}
|
|
1396
|
+
function collisionPair(neighbourQualified, ourName) {
|
|
1397
|
+
return {
|
|
1398
|
+
kind: "name-collision",
|
|
1399
|
+
a: { label: `suite:${ourName}`, rank: RANK_SUITE, text: `this suite's skill \`${ourName}\`` },
|
|
1400
|
+
b: {
|
|
1401
|
+
label: neighbourQualified,
|
|
1402
|
+
rank: RANK_NEIGHBOUR_SKILL,
|
|
1403
|
+
text: `neighbour skill \`${neighbourQualified}\``
|
|
1404
|
+
},
|
|
1405
|
+
subject: ourName
|
|
1406
|
+
};
|
|
1407
|
+
}
|
|
1408
|
+
function winnerBy21(p) {
|
|
1409
|
+
const w = p.a.rank <= p.b.rank ? p.a : p.b;
|
|
1410
|
+
return `${w.label} (rank ${w.rank}, ${RANK_LABEL[w.rank] ?? "unranked"})`;
|
|
1411
|
+
}
|
|
1412
|
+
function seatPrompt(pairs, rubric) {
|
|
1413
|
+
const rows = pairs.map(
|
|
1414
|
+
(p, i) => `PAIR ${i + 1} (${p.kind}, subject "${p.subject}")
|
|
1415
|
+
A [${p.a.label}]: ${p.a.text}
|
|
1416
|
+
B [${p.b.label}]: ${p.b.text}`
|
|
1417
|
+
);
|
|
1418
|
+
return [
|
|
1419
|
+
"# Neighbour contradiction review",
|
|
1420
|
+
"",
|
|
1421
|
+
"For each pair, decide whether A and B give an agent instructions that cannot both be followed.",
|
|
1422
|
+
"Answer one line per pair, exactly `PAIR <n>: contradiction`, `PAIR <n>: compatible` or `PAIR <n>: unclear`,",
|
|
1423
|
+
"then at most one sentence of reason on the same line. The rubric for which source wins is below; you do not",
|
|
1424
|
+
"need to restate it.",
|
|
1425
|
+
"",
|
|
1426
|
+
"## Rubric \u2014 neighbour-precedence",
|
|
1427
|
+
"",
|
|
1428
|
+
rubric.trim(),
|
|
1429
|
+
"",
|
|
1430
|
+
"## Pairs",
|
|
1431
|
+
"",
|
|
1432
|
+
...rows,
|
|
1433
|
+
""
|
|
1434
|
+
].join("\n");
|
|
1435
|
+
}
|
|
1436
|
+
function parseVerdicts(text, count) {
|
|
1437
|
+
const out = Array.from({ length: count }, () => "unclear");
|
|
1438
|
+
for (const m of text.matchAll(/PAIR\s+(\d+)\s*:\s*(contradiction|compatible|unclear)/giu)) {
|
|
1439
|
+
const n = Number(m[1]) - 1;
|
|
1440
|
+
if (n >= 0 && n < count) out[n] = (m[2] ?? "unclear").toLowerCase();
|
|
1441
|
+
}
|
|
1442
|
+
return out;
|
|
1443
|
+
}
|
|
1444
|
+
function reviewRows(pairs, verdicts) {
|
|
1445
|
+
return pairs.map((p, i) => ({
|
|
1446
|
+
pair: `${p.a.label} "${p.a.text}" \xD7 ${p.b.label} "${p.b.text}"`,
|
|
1447
|
+
verdict: verdicts[i] ?? "unclear",
|
|
1448
|
+
wins: winnerBy21(p)
|
|
1449
|
+
}));
|
|
1450
|
+
}
|
|
1451
|
+
function renderReview(rows) {
|
|
1452
|
+
if (rows.length === 0) return [" no candidate pairs \u2014 nothing to review"];
|
|
1453
|
+
return [" pair | verdict | which wins by 2.1", ...rows.map((r) => ` ${r.pair} | ${r.verdict} | ${r.wins}`)];
|
|
1454
|
+
}
|
|
1455
|
+
|
|
1456
|
+
// src/scripts/council_availability_hook.ts
|
|
1457
|
+
import * as fs9 from "node:fs";
|
|
1242
1458
|
import * as path8 from "node:path";
|
|
1243
1459
|
import { fileURLToPath as fileURLToPath4, pathToFileURL as pathToFileURL4 } from "node:url";
|
|
1244
|
-
var
|
|
1245
|
-
|
|
1246
|
-
|
|
1460
|
+
var EXIT_ALLOW = 0;
|
|
1461
|
+
function resolveAvailability(cwd, env) {
|
|
1462
|
+
let p;
|
|
1463
|
+
try {
|
|
1464
|
+
p = String(resolve_config_path(cwd, { env }));
|
|
1465
|
+
} catch {
|
|
1466
|
+
return null;
|
|
1467
|
+
}
|
|
1468
|
+
const exists = fs9.existsSync(p);
|
|
1469
|
+
const provenance = env[COUNCIL_CONFIG_ENV] ? "env-override" : "user-global";
|
|
1470
|
+
if (!exists) {
|
|
1471
|
+
return { configured: false, path: p, exists: false, provenance, membersEnabled: 0, memberNames: [] };
|
|
1472
|
+
}
|
|
1473
|
+
try {
|
|
1474
|
+
const cfg = load_council_config(p);
|
|
1475
|
+
const enabled = [...cfg.members.entries()].filter(([, m]) => m.enabled).map(([n]) => n);
|
|
1476
|
+
return {
|
|
1477
|
+
configured: cfg.enabled && enabled.length > 0,
|
|
1478
|
+
path: p,
|
|
1479
|
+
exists: true,
|
|
1480
|
+
provenance,
|
|
1481
|
+
membersEnabled: enabled.length,
|
|
1482
|
+
memberNames: enabled
|
|
1483
|
+
};
|
|
1484
|
+
} catch {
|
|
1485
|
+
return { configured: false, path: p, exists: true, provenance, membersEnabled: 0, memberNames: [] };
|
|
1486
|
+
}
|
|
1487
|
+
}
|
|
1488
|
+
function buildFact(a) {
|
|
1489
|
+
const head = a.configured ? `An AI council IS configured: ${String(a.membersEnabled)} enabled member(s) \u2014 ${a.memberNames.join(", ")}.` : a.exists ? "An AI council config exists but is NOT usable (unreadable, disabled, or no enabled member)." : "No AI council is configured on this machine.";
|
|
1490
|
+
return [
|
|
1491
|
+
"<council-availability>",
|
|
1492
|
+
head,
|
|
1493
|
+
`Resolved from ${a.provenance}: ${a.path}`,
|
|
1494
|
+
"The project tree is NEVER searched for council config (ADR-104), and the",
|
|
1495
|
+
"config has not lived in `.agent-settings.yml` since the Phase-0 migration.",
|
|
1496
|
+
"So do NOT infer council availability from any project file, in either",
|
|
1497
|
+
"direction \u2014 this line is the answer, and `agent-config council:status`",
|
|
1498
|
+
"re-checks it on demand without spending anything.",
|
|
1499
|
+
a.configured ? "Never announce that no council is configured, and never substitute a weaker path on that basis." : "A substitute is legitimate here \u2014 say which one you are using and why.",
|
|
1500
|
+
"</council-availability>"
|
|
1501
|
+
].join("\n");
|
|
1502
|
+
}
|
|
1503
|
+
function _workspaceRoot(env) {
|
|
1504
|
+
for (const key of ["project_dir", "projectDir", "cwd", "workspace_root"]) {
|
|
1505
|
+
const v = env[key];
|
|
1506
|
+
if (typeof v === "string" && v.trim() !== "") {
|
|
1507
|
+
return v;
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
return process.cwd();
|
|
1511
|
+
}
|
|
1512
|
+
function run(stdin, options = {}) {
|
|
1513
|
+
let envelope = {};
|
|
1514
|
+
if (stdin.trim() !== "") {
|
|
1515
|
+
try {
|
|
1516
|
+
const parsed = JSON.parse(stdin);
|
|
1517
|
+
if (parsed !== null && typeof parsed === "object") {
|
|
1518
|
+
envelope = parsed;
|
|
1519
|
+
}
|
|
1520
|
+
} catch {
|
|
1521
|
+
return EXIT_ALLOW;
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
const event = envelope["event"];
|
|
1525
|
+
const slot = typeof event === "string" && event !== "" ? event : "session_start";
|
|
1526
|
+
if (slot !== "session_start") {
|
|
1527
|
+
return EXIT_ALLOW;
|
|
1528
|
+
}
|
|
1529
|
+
const a = resolveAvailability(_workspaceRoot(envelope), options.env ?? process.env);
|
|
1530
|
+
if (a === null) {
|
|
1531
|
+
return EXIT_ALLOW;
|
|
1532
|
+
}
|
|
1533
|
+
process.stdout.write(
|
|
1534
|
+
`${JSON.stringify({
|
|
1535
|
+
decision: "allow",
|
|
1536
|
+
reason: `council-availability: ${a.configured ? "configured" : "not configured"}`,
|
|
1537
|
+
context: buildFact(a)
|
|
1538
|
+
})}
|
|
1539
|
+
`
|
|
1540
|
+
);
|
|
1541
|
+
return EXIT_ALLOW;
|
|
1542
|
+
}
|
|
1543
|
+
function main4(argv) {
|
|
1544
|
+
const args = argv ?? process.argv.slice(2);
|
|
1545
|
+
let env = process.env;
|
|
1546
|
+
void args;
|
|
1547
|
+
return run(readHookStdin(), { env });
|
|
1548
|
+
}
|
|
1549
|
+
function _isCliEntry4() {
|
|
1550
|
+
if (true) {
|
|
1551
|
+
return false;
|
|
1552
|
+
}
|
|
1553
|
+
if (process.argv[1] === void 0) {
|
|
1554
|
+
return false;
|
|
1555
|
+
}
|
|
1556
|
+
return import.meta.url === pathToFileURL4(path8.resolve(process.argv[1])).href;
|
|
1557
|
+
}
|
|
1558
|
+
if (_isCliEntry4()) {
|
|
1559
|
+
process.exit(main4());
|
|
1560
|
+
}
|
|
1561
|
+
|
|
1562
|
+
// src/scripts/audit_skill_overlap.ts
|
|
1563
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
1564
|
+
import { createHash as createHash3 } from "node:crypto";
|
|
1565
|
+
import * as fs10 from "node:fs";
|
|
1566
|
+
import * as path9 from "node:path";
|
|
1567
|
+
import { fileURLToPath as fileURLToPath5, pathToFileURL as pathToFileURL5 } from "node:url";
|
|
1568
|
+
var _HERE = fileURLToPath5(import.meta.url);
|
|
1569
|
+
var ROOT2 = path9.resolve(path9.dirname(_HERE), "..", "..");
|
|
1570
|
+
var REPORT_DIR = path9.join(ROOT2, "agents", "reports");
|
|
1247
1571
|
var OUT_JSON_NAME = "skill-overlap.json";
|
|
1248
1572
|
var OUT_MD_NAME = "skill-overlap.md";
|
|
1249
|
-
var OUT_JSON =
|
|
1250
|
-
var OUT_MD =
|
|
1251
|
-
var ALLOWLIST =
|
|
1573
|
+
var OUT_JSON = path9.join(REPORT_DIR, OUT_JSON_NAME);
|
|
1574
|
+
var OUT_MD = path9.join(REPORT_DIR, OUT_MD_NAME);
|
|
1575
|
+
var ALLOWLIST = path9.join(ROOT2, "src", "scripts", "audit_skill_overlap_allowlist.json");
|
|
1252
1576
|
var CROSS_CACHE_NAME = "neighbour-overlap.json";
|
|
1253
1577
|
var ALLOWLIST_CAP = 20;
|
|
1254
1578
|
var FM_RE = /^---\n([\s\S]*?)\n---/m;
|
|
@@ -1320,14 +1644,14 @@ var STOPWORDS = /* @__PURE__ */ new Set([
|
|
|
1320
1644
|
]);
|
|
1321
1645
|
function _isDir(p) {
|
|
1322
1646
|
try {
|
|
1323
|
-
return
|
|
1647
|
+
return fs10.statSync(p).isDirectory();
|
|
1324
1648
|
} catch {
|
|
1325
1649
|
return false;
|
|
1326
1650
|
}
|
|
1327
1651
|
}
|
|
1328
1652
|
function _isFile(p) {
|
|
1329
1653
|
try {
|
|
1330
|
-
return
|
|
1654
|
+
return fs10.statSync(p).isFile();
|
|
1331
1655
|
} catch {
|
|
1332
1656
|
return false;
|
|
1333
1657
|
}
|
|
@@ -1375,7 +1699,7 @@ function _cosine(a, b) {
|
|
|
1375
1699
|
return da && db ? num / (da * db) : 0;
|
|
1376
1700
|
}
|
|
1377
1701
|
function _parse(md, field = "body") {
|
|
1378
|
-
const text =
|
|
1702
|
+
const text = fs10.readFileSync(md, "utf-8");
|
|
1379
1703
|
let fm = {};
|
|
1380
1704
|
let body = text;
|
|
1381
1705
|
const m = FM_RE.exec(text);
|
|
@@ -1393,27 +1717,27 @@ function _parse(md, field = "body") {
|
|
|
1393
1717
|
const descVal = isObj ? fm["description"] : null;
|
|
1394
1718
|
const source = field === "description" ? descVal ? String(descVal) : "" : body;
|
|
1395
1719
|
return {
|
|
1396
|
-
name: name ? String(name) :
|
|
1720
|
+
name: name ? String(name) : path9.basename(path9.dirname(md)),
|
|
1397
1721
|
relpath: _relPosix(md, ROOT2),
|
|
1398
|
-
abspath:
|
|
1722
|
+
abspath: path9.resolve(md),
|
|
1399
1723
|
packs: Array.isArray(packsVal) ? new Set(packsVal.map((x) => String(x))) : /* @__PURE__ */ new Set(),
|
|
1400
1724
|
vector: _keyword_vector(source)
|
|
1401
1725
|
};
|
|
1402
1726
|
}
|
|
1403
1727
|
function _relPosix(child, root) {
|
|
1404
|
-
return
|
|
1728
|
+
return path9.relative(root, child).split(path9.sep).join("/");
|
|
1405
1729
|
}
|
|
1406
1730
|
function _rglobSkillMd(root) {
|
|
1407
1731
|
const out = [];
|
|
1408
1732
|
const walk = (dir) => {
|
|
1409
1733
|
let entries;
|
|
1410
1734
|
try {
|
|
1411
|
-
entries =
|
|
1735
|
+
entries = fs10.readdirSync(dir, { withFileTypes: true });
|
|
1412
1736
|
} catch {
|
|
1413
1737
|
return;
|
|
1414
1738
|
}
|
|
1415
1739
|
for (const ent of entries) {
|
|
1416
|
-
const full =
|
|
1740
|
+
const full = path9.join(dir, ent.name);
|
|
1417
1741
|
if (ent.name === "SKILL.md") {
|
|
1418
1742
|
out.push(full);
|
|
1419
1743
|
}
|
|
@@ -1427,8 +1751,8 @@ function _rglobSkillMd(root) {
|
|
|
1427
1751
|
return out;
|
|
1428
1752
|
}
|
|
1429
1753
|
function _pathlibCompare(a, b) {
|
|
1430
|
-
const pa = a.split(
|
|
1431
|
-
const pb = b.split(
|
|
1754
|
+
const pa = a.split(path9.sep);
|
|
1755
|
+
const pb = b.split(path9.sep);
|
|
1432
1756
|
const n = Math.min(pa.length, pb.length);
|
|
1433
1757
|
for (let i = 0; i < n; i++) {
|
|
1434
1758
|
const x = pa[i];
|
|
@@ -1443,10 +1767,10 @@ function collect(root = _default_skill_root(), field = "body") {
|
|
|
1443
1767
|
const skills = [];
|
|
1444
1768
|
const seen = /* @__PURE__ */ new Set();
|
|
1445
1769
|
for (const md of _rglobSkillMd(root)) {
|
|
1446
|
-
if (md.split(
|
|
1770
|
+
if (md.split(path9.sep).includes("_archive")) {
|
|
1447
1771
|
continue;
|
|
1448
1772
|
}
|
|
1449
|
-
const key =
|
|
1773
|
+
const key = path9.basename(path9.dirname(md));
|
|
1450
1774
|
if (seen.has(key)) {
|
|
1451
1775
|
continue;
|
|
1452
1776
|
}
|
|
@@ -1500,7 +1824,7 @@ function find_pairs(skills, threshold) {
|
|
|
1500
1824
|
return stableSort(pairs, (p) => [p.same_domain ? 0 : 1, -p.similarity]);
|
|
1501
1825
|
}
|
|
1502
1826
|
function skillMdsUnder(root) {
|
|
1503
|
-
return _rglobSkillMd(root).filter((md) => !md.split(
|
|
1827
|
+
return _rglobSkillMd(root).filter((md) => !md.split(path9.sep).includes("_archive"));
|
|
1504
1828
|
}
|
|
1505
1829
|
function crossPairsForFiles(neighbourFiles, ourRoot, threshold = OVERLAP_THRESHOLD, field = "body") {
|
|
1506
1830
|
const theirs = [];
|
|
@@ -1554,11 +1878,11 @@ ${field}
|
|
|
1554
1878
|
for (const md of side) {
|
|
1555
1879
|
let bytes;
|
|
1556
1880
|
try {
|
|
1557
|
-
bytes =
|
|
1881
|
+
bytes = fs10.readFileSync(md);
|
|
1558
1882
|
} catch {
|
|
1559
1883
|
continue;
|
|
1560
1884
|
}
|
|
1561
|
-
h.update(
|
|
1885
|
+
h.update(path9.resolve(md));
|
|
1562
1886
|
h.update("\0");
|
|
1563
1887
|
h.update(createHash3("sha256").update(bytes).digest("hex"));
|
|
1564
1888
|
h.update("\n");
|
|
@@ -1569,7 +1893,7 @@ ${field}
|
|
|
1569
1893
|
function cachedCrossRootPairs(neighbourFiles, ourRoot, cacheFile, threshold = OVERLAP_THRESHOLD, field = "body") {
|
|
1570
1894
|
const digest = censusDigest(neighbourFiles, ourRoot, threshold, field);
|
|
1571
1895
|
try {
|
|
1572
|
-
const parsed = JSON.parse(
|
|
1896
|
+
const parsed = JSON.parse(fs10.readFileSync(cacheFile, "utf-8"));
|
|
1573
1897
|
if (parsed.digest === digest && Array.isArray(parsed.pairs)) {
|
|
1574
1898
|
return { pairs: parsed.pairs, digest, cached: true };
|
|
1575
1899
|
}
|
|
@@ -1578,8 +1902,8 @@ function cachedCrossRootPairs(neighbourFiles, ourRoot, cacheFile, threshold = OV
|
|
|
1578
1902
|
const pairs = crossPairsForFiles(neighbourFiles, ourRoot, threshold, field);
|
|
1579
1903
|
const payload = { schema_version: 1, digest, threshold, pairs };
|
|
1580
1904
|
try {
|
|
1581
|
-
|
|
1582
|
-
|
|
1905
|
+
fs10.mkdirSync(path9.dirname(cacheFile), { recursive: true });
|
|
1906
|
+
fs10.writeFileSync(cacheFile, `${JSON.stringify(payload, null, 2)}
|
|
1583
1907
|
`, "utf-8");
|
|
1584
1908
|
} catch {
|
|
1585
1909
|
}
|
|
@@ -1703,7 +2027,7 @@ var FloatTag = class {
|
|
|
1703
2027
|
}
|
|
1704
2028
|
value;
|
|
1705
2029
|
};
|
|
1706
|
-
function
|
|
2030
|
+
function main5(argv = null) {
|
|
1707
2031
|
const args = parse_args4(argv ?? process.argv.slice(2));
|
|
1708
2032
|
const root = args.root ?? _default_skill_root();
|
|
1709
2033
|
if (args.neighbourRoot !== void 0) {
|
|
@@ -1729,16 +2053,16 @@ function main4(argv = null) {
|
|
|
1729
2053
|
`);
|
|
1730
2054
|
const pairs = find_pairs(skills, args.threshold);
|
|
1731
2055
|
const outDir = args.outDir ?? REPORT_DIR;
|
|
1732
|
-
const outJson =
|
|
1733
|
-
const outMd =
|
|
1734
|
-
|
|
2056
|
+
const outJson = path9.join(outDir, OUT_JSON_NAME);
|
|
2057
|
+
const outMd = path9.join(outDir, OUT_MD_NAME);
|
|
2058
|
+
fs10.mkdirSync(outDir, { recursive: true });
|
|
1735
2059
|
const jsonObj = {
|
|
1736
2060
|
threshold: new FloatTag(args.threshold),
|
|
1737
2061
|
skills_scanned: skills.length,
|
|
1738
2062
|
pairs: pairs.map(_pairToJson)
|
|
1739
2063
|
};
|
|
1740
|
-
|
|
1741
|
-
|
|
2064
|
+
fs10.writeFileSync(outJson, _dumpsWithFloats(jsonObj), "utf-8");
|
|
2065
|
+
fs10.writeFileSync(outMd, render_md(skills, pairs, args.threshold, args.field), "utf-8");
|
|
1742
2066
|
const merge = pairs.filter((p) => p.same_domain);
|
|
1743
2067
|
if (!args.quiet) {
|
|
1744
2068
|
process.stdout.write(
|
|
@@ -1796,7 +2120,7 @@ function main4(argv = null) {
|
|
|
1796
2120
|
function _mainCrossRoot(args, ourRoot) {
|
|
1797
2121
|
const neighbourRoot = args.neighbourRoot;
|
|
1798
2122
|
const outDir = args.outDir ?? REPORT_DIR;
|
|
1799
|
-
const cacheFile = args.crossCache ??
|
|
2123
|
+
const cacheFile = args.crossCache ?? path9.join(outDir, CROSS_CACHE_NAME);
|
|
1800
2124
|
const { pairs, digest, cached } = cachedCrossRootPairs(
|
|
1801
2125
|
skillMdsUnder(neighbourRoot),
|
|
1802
2126
|
ourRoot,
|
|
@@ -1835,7 +2159,7 @@ function _loadAllowlist(file) {
|
|
|
1835
2159
|
if (!_isFile(file)) {
|
|
1836
2160
|
return /* @__PURE__ */ new Set();
|
|
1837
2161
|
}
|
|
1838
|
-
const data = JSON.parse(
|
|
2162
|
+
const data = JSON.parse(fs10.readFileSync(file, "utf-8"));
|
|
1839
2163
|
const entries = Array.isArray(data.entries) ? data.entries : [];
|
|
1840
2164
|
if (entries.length > ALLOWLIST_CAP) {
|
|
1841
2165
|
throw new Error(
|
|
@@ -1921,7 +2245,7 @@ function parse_args4(argv) {
|
|
|
1921
2245
|
args.strict = true;
|
|
1922
2246
|
} else if (a === "--allowlist" || a.startsWith("--allowlist=")) {
|
|
1923
2247
|
const inline = a.startsWith("--allowlist=") ? a.slice("--allowlist=".length) : void 0;
|
|
1924
|
-
args.allowlist =
|
|
2248
|
+
args.allowlist = path9.resolve(ROOT2, takeValue("--allowlist", inline, () => argv[++i]));
|
|
1925
2249
|
} else if (a === "--descriptions") {
|
|
1926
2250
|
args.field = "description";
|
|
1927
2251
|
} else if (a === "--print-table") {
|
|
@@ -1931,19 +2255,19 @@ function parse_args4(argv) {
|
|
|
1931
2255
|
args.threshold = Number(takeValue("--threshold", inline, () => argv[++i]));
|
|
1932
2256
|
} else if (a === "--neighbour-root" || a.startsWith("--neighbour-root=")) {
|
|
1933
2257
|
const inline = a.startsWith("--neighbour-root=") ? a.slice("--neighbour-root=".length) : void 0;
|
|
1934
|
-
args.neighbourRoot =
|
|
2258
|
+
args.neighbourRoot = path9.resolve(
|
|
1935
2259
|
ROOT2,
|
|
1936
2260
|
takeValue("--neighbour-root", inline, () => argv[++i])
|
|
1937
2261
|
);
|
|
1938
2262
|
} else if (a === "--cross-cache" || a.startsWith("--cross-cache=")) {
|
|
1939
2263
|
const inline = a.startsWith("--cross-cache=") ? a.slice("--cross-cache=".length) : void 0;
|
|
1940
|
-
args.crossCache =
|
|
2264
|
+
args.crossCache = path9.resolve(ROOT2, takeValue("--cross-cache", inline, () => argv[++i]));
|
|
1941
2265
|
} else if (a === "--root" || a.startsWith("--root=")) {
|
|
1942
2266
|
const inline = a.startsWith("--root=") ? a.slice("--root=".length) : void 0;
|
|
1943
|
-
args.root =
|
|
2267
|
+
args.root = path9.resolve(ROOT2, takeValue("--root", inline, () => argv[++i]));
|
|
1944
2268
|
} else if (a === "--out-dir" || a.startsWith("--out-dir=")) {
|
|
1945
2269
|
const inline = a.startsWith("--out-dir=") ? a.slice("--out-dir=".length) : void 0;
|
|
1946
|
-
args.outDir =
|
|
2270
|
+
args.outDir = path9.resolve(ROOT2, takeValue("--out-dir", inline, () => argv[++i]));
|
|
1947
2271
|
} else {
|
|
1948
2272
|
process.stderr.write(`unrecognized arguments: ${a}
|
|
1949
2273
|
`);
|
|
@@ -1952,32 +2276,32 @@ function parse_args4(argv) {
|
|
|
1952
2276
|
}
|
|
1953
2277
|
return args;
|
|
1954
2278
|
}
|
|
1955
|
-
function
|
|
2279
|
+
function _isCliEntry5() {
|
|
1956
2280
|
if (process.argv[1] === void 0) {
|
|
1957
2281
|
return false;
|
|
1958
2282
|
}
|
|
1959
|
-
const argvUrl =
|
|
2283
|
+
const argvUrl = pathToFileURL5(path9.resolve(process.argv[1])).href;
|
|
1960
2284
|
if (import.meta.url === argvUrl) {
|
|
1961
2285
|
return true;
|
|
1962
2286
|
}
|
|
1963
2287
|
try {
|
|
1964
|
-
const here =
|
|
1965
|
-
const argv =
|
|
2288
|
+
const here = fs10.realpathSync(fileURLToPath5(import.meta.url));
|
|
2289
|
+
const argv = fs10.realpathSync(path9.resolve(process.argv[1]));
|
|
1966
2290
|
return here === argv;
|
|
1967
2291
|
} catch {
|
|
1968
2292
|
return false;
|
|
1969
2293
|
}
|
|
1970
2294
|
}
|
|
1971
|
-
var _isMain =
|
|
2295
|
+
var _isMain = _isCliEntry5();
|
|
1972
2296
|
if (_isMain) {
|
|
1973
|
-
process.exitCode =
|
|
2297
|
+
process.exitCode = main5();
|
|
1974
2298
|
}
|
|
1975
2299
|
|
|
1976
2300
|
// src/scripts/_cli/cmd_doctor_neighbours.ts
|
|
1977
2301
|
function gatedEvents(packageRoot) {
|
|
1978
2302
|
try {
|
|
1979
|
-
const file =
|
|
1980
|
-
const doc = YAML.parse(
|
|
2303
|
+
const file = path10.join(packageRoot, "src", "scripts", "hook_manifest.yaml");
|
|
2304
|
+
const doc = YAML.parse(fs11.readFileSync(file, "utf-8"));
|
|
1981
2305
|
return gatedEventsFrom(doc, doc.native_event_aliases ?? {});
|
|
1982
2306
|
} catch {
|
|
1983
2307
|
return /* @__PURE__ */ new Set();
|
|
@@ -1986,7 +2310,7 @@ function gatedEvents(packageRoot) {
|
|
|
1986
2310
|
function ourSkillNames(packageRoot) {
|
|
1987
2311
|
try {
|
|
1988
2312
|
return new Set(
|
|
1989
|
-
|
|
2313
|
+
fs11.readdirSync(path10.join(packageRoot, "src", "skills"), { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => e.name)
|
|
1990
2314
|
);
|
|
1991
2315
|
} catch {
|
|
1992
2316
|
return /* @__PURE__ */ new Set();
|
|
@@ -2003,21 +2327,21 @@ function runCensus(projectRoot, packageRoot, homeRoot) {
|
|
|
2003
2327
|
};
|
|
2004
2328
|
const base = {
|
|
2005
2329
|
gatedEvents: gatedEvents(packageRoot),
|
|
2006
|
-
templatesRoot:
|
|
2330
|
+
templatesRoot: path10.join(packageRoot, "src", "agent-src", "templates"),
|
|
2007
2331
|
ourSkillNames: ourSkillNames(packageRoot),
|
|
2008
2332
|
packageRoot,
|
|
2009
2333
|
scan,
|
|
2010
2334
|
...homeRoot === void 0 ? {} : { homeRoot }
|
|
2011
2335
|
};
|
|
2012
2336
|
const first = census(projectRoot, base);
|
|
2013
|
-
const ourRoot =
|
|
2337
|
+
const ourRoot = path10.join(packageRoot, "src", "skills");
|
|
2014
2338
|
let overlaps = /* @__PURE__ */ new Map();
|
|
2015
|
-
if (first.skills.length > 0 &&
|
|
2339
|
+
if (first.skills.length > 0 && fs11.existsSync(ourRoot)) {
|
|
2016
2340
|
try {
|
|
2017
2341
|
const { pairs } = cachedCrossRootPairs(
|
|
2018
2342
|
first.skills.map((s) => s.source),
|
|
2019
2343
|
ourRoot,
|
|
2020
|
-
|
|
2344
|
+
path10.join(projectRoot, "agents", "reports", CROSS_CACHE_NAME),
|
|
2021
2345
|
OVERLAP_THRESHOLD
|
|
2022
2346
|
);
|
|
2023
2347
|
overlaps = crossRootOverlapMap(pairs);
|
|
@@ -2038,6 +2362,79 @@ function runCensus(projectRoot, packageRoot, homeRoot) {
|
|
|
2038
2362
|
);
|
|
2039
2363
|
return full;
|
|
2040
2364
|
}
|
|
2365
|
+
function contradictionCandidates(projectRoot, packageRoot, homeRoot) {
|
|
2366
|
+
const ours = ourSkillNames(packageRoot);
|
|
2367
|
+
const c = census(projectRoot, {
|
|
2368
|
+
gatedEvents: gatedEvents(packageRoot),
|
|
2369
|
+
templatesRoot: path10.join(packageRoot, "src", "agent-src", "templates"),
|
|
2370
|
+
ourSkillNames: ours,
|
|
2371
|
+
packageRoot,
|
|
2372
|
+
scan: (p) => scanNeighbourBody(p).kind,
|
|
2373
|
+
...homeRoot === void 0 ? {} : { homeRoot }
|
|
2374
|
+
});
|
|
2375
|
+
const sources = [];
|
|
2376
|
+
for (const name of ["CLAUDE.md", "AGENTS.md"]) {
|
|
2377
|
+
const file = path10.join(projectRoot, name);
|
|
2378
|
+
if (fs11.existsSync(file)) sources.push({ label: name, file, rank: RANK_PROJECT });
|
|
2379
|
+
}
|
|
2380
|
+
for (const r of c.rule_files) {
|
|
2381
|
+
if (scanNeighbourBody(r.source).kind === null) {
|
|
2382
|
+
sources.push({ label: r.id, file: r.source, rank: RANK_NEIGHBOUR_ALWAYS_ON });
|
|
2383
|
+
}
|
|
2384
|
+
}
|
|
2385
|
+
for (const s of c.skills) {
|
|
2386
|
+
if (s.unscanned === null) sources.push({ label: s.qualified, file: s.source, rank: RANK_NEIGHBOUR_SKILL });
|
|
2387
|
+
}
|
|
2388
|
+
const pairs = modalityPairs(sources.flatMap((src) => extractInstructions(src)));
|
|
2389
|
+
for (const s of c.skills) {
|
|
2390
|
+
const name = s.qualified.split(":").slice(1).join(":") || s.qualified;
|
|
2391
|
+
if (ours.has(name)) pairs.push(collisionPair(s.qualified, name));
|
|
2392
|
+
}
|
|
2393
|
+
return pairs;
|
|
2394
|
+
}
|
|
2395
|
+
function councilSeat(projectRoot) {
|
|
2396
|
+
return (prompt) => {
|
|
2397
|
+
const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/gu, "-");
|
|
2398
|
+
const q = path10.join(projectRoot, "agents", "runtime", "council", "questions", `neighbour-contradictions-${stamp}.md`);
|
|
2399
|
+
const out = path10.join(projectRoot, "agents", "runtime", "council", "responses", `neighbour-contradictions-${stamp}.md`);
|
|
2400
|
+
try {
|
|
2401
|
+
fs11.mkdirSync(path10.dirname(q), { recursive: true });
|
|
2402
|
+
fs11.writeFileSync(q, prompt, "utf-8");
|
|
2403
|
+
const args = ["council", "run", q, "--single", "--prompt-mode", "analysis", "--output", out, "--confirm", "--invocation", "user_explicit"];
|
|
2404
|
+
const res = spawnSync("agent-config", args, { cwd: projectRoot, encoding: "utf-8" });
|
|
2405
|
+
if (res.status !== 0) return null;
|
|
2406
|
+
const doc = JSON.parse(fs11.readFileSync(out, "utf-8"));
|
|
2407
|
+
return doc.responses?.map((r) => r.text ?? "").join("\n") ?? null;
|
|
2408
|
+
} catch {
|
|
2409
|
+
return null;
|
|
2410
|
+
}
|
|
2411
|
+
};
|
|
2412
|
+
}
|
|
2413
|
+
function runContradictions(projectRoot, packageRoot, opts = {}) {
|
|
2414
|
+
const configured = opts.configured ?? resolveAvailability(projectRoot, process.env)?.configured ?? false;
|
|
2415
|
+
const pairs = contradictionCandidates(projectRoot, packageRoot, opts.homeRoot);
|
|
2416
|
+
if (!configured) {
|
|
2417
|
+
return {
|
|
2418
|
+
lines: [` contradictions: n/a \u2014 no council configured (${pairs.length} candidate pair(s) formed, none reviewed)`],
|
|
2419
|
+
rows: null
|
|
2420
|
+
};
|
|
2421
|
+
}
|
|
2422
|
+
if (pairs.length === 0) return { lines: renderReview([]), rows: [] };
|
|
2423
|
+
let rubric = "";
|
|
2424
|
+
for (const rel of [["dist", "agent-src", "rules"], ["src", "rules"]]) {
|
|
2425
|
+
try {
|
|
2426
|
+
rubric = fs11.readFileSync(path10.join(packageRoot, ...rel, "neighbour-precedence.md"), "utf-8");
|
|
2427
|
+
break;
|
|
2428
|
+
} catch {
|
|
2429
|
+
}
|
|
2430
|
+
}
|
|
2431
|
+
const answer = (opts.seat ?? councilSeat(projectRoot))(seatPrompt(pairs, rubric));
|
|
2432
|
+
if (answer === null) {
|
|
2433
|
+
return { lines: [` contradictions: n/a \u2014 the council seat did not answer (${pairs.length} candidate pair(s) formed)`], rows: null };
|
|
2434
|
+
}
|
|
2435
|
+
const rows = reviewRows(pairs, parseVerdicts(answer, pairs.length));
|
|
2436
|
+
return { lines: renderReview(rows), rows };
|
|
2437
|
+
}
|
|
2041
2438
|
function summaryLine(c) {
|
|
2042
2439
|
const counts = [
|
|
2043
2440
|
`${c.hook_groups.length} hook group(s)`,
|
|
@@ -2102,12 +2499,14 @@ function renderText(c) {
|
|
|
2102
2499
|
out.push(" it cannot say what ran first, and no label here refuses anything.");
|
|
2103
2500
|
return out;
|
|
2104
2501
|
}
|
|
2105
|
-
function
|
|
2502
|
+
function main6(argv = process.argv.slice(2)) {
|
|
2106
2503
|
let json = false;
|
|
2504
|
+
let contradictions = false;
|
|
2107
2505
|
let root = process.cwd();
|
|
2108
2506
|
let home;
|
|
2109
2507
|
for (let i = 0; i < argv.length; i += 1) {
|
|
2110
2508
|
if (argv[i] === "--json") json = true;
|
|
2509
|
+
else if (argv[i] === "--contradictions") contradictions = true;
|
|
2111
2510
|
else if (argv[i] === "--project") {
|
|
2112
2511
|
root = argv[i + 1] ?? root;
|
|
2113
2512
|
i += 1;
|
|
@@ -2122,7 +2521,15 @@ function main5(argv = process.argv.slice(2)) {
|
|
|
2122
2521
|
return 2;
|
|
2123
2522
|
}
|
|
2124
2523
|
}
|
|
2125
|
-
|
|
2524
|
+
if (contradictions) {
|
|
2525
|
+
const r = runContradictions(path10.resolve(root), resolvePackageRoot(import.meta.url), home === void 0 ? {} : { homeRoot: home });
|
|
2526
|
+
if (json) process.stdout.write(`${JSON.stringify({ contradictions: r.rows })}
|
|
2527
|
+
`);
|
|
2528
|
+
else for (const line of r.lines) process.stdout.write(`${line}
|
|
2529
|
+
`);
|
|
2530
|
+
return 0;
|
|
2531
|
+
}
|
|
2532
|
+
const c = runCensus(path10.resolve(root), resolvePackageRoot(import.meta.url), home);
|
|
2126
2533
|
if (json) {
|
|
2127
2534
|
process.stdout.write(`${JSON.stringify(c)}
|
|
2128
2535
|
`);
|
|
@@ -2132,29 +2539,31 @@ function main5(argv = process.argv.slice(2)) {
|
|
|
2132
2539
|
}
|
|
2133
2540
|
return 0;
|
|
2134
2541
|
}
|
|
2135
|
-
function
|
|
2542
|
+
function _isCliEntry6() {
|
|
2136
2543
|
const bundled = true;
|
|
2137
2544
|
const cliDelegate = true;
|
|
2138
2545
|
if (bundled && !cliDelegate) return false;
|
|
2139
2546
|
if (process.argv[1] === void 0) return false;
|
|
2140
|
-
if (cliDelegate &&
|
|
2547
|
+
if (cliDelegate && path10.basename(process.argv[1], ".js") === "cmd_doctor_neighbours") {
|
|
2141
2548
|
return true;
|
|
2142
2549
|
}
|
|
2143
|
-
const argvUrl =
|
|
2550
|
+
const argvUrl = pathToFileURL6(path10.resolve(process.argv[1])).href;
|
|
2144
2551
|
if (import.meta.url === argvUrl) return true;
|
|
2145
2552
|
try {
|
|
2146
|
-
return
|
|
2553
|
+
return fs11.realpathSync(fileURLToPath6(import.meta.url)) === fs11.realpathSync(path10.resolve(process.argv[1]));
|
|
2147
2554
|
} catch {
|
|
2148
2555
|
return false;
|
|
2149
2556
|
}
|
|
2150
2557
|
}
|
|
2151
|
-
if (
|
|
2152
|
-
process.exit(
|
|
2558
|
+
if (_isCliEntry6()) {
|
|
2559
|
+
process.exit(main6());
|
|
2153
2560
|
}
|
|
2154
2561
|
|
|
2155
2562
|
export {
|
|
2156
2563
|
runCensus,
|
|
2564
|
+
contradictionCandidates,
|
|
2565
|
+
runContradictions,
|
|
2157
2566
|
summaryLine,
|
|
2158
2567
|
renderText,
|
|
2159
|
-
|
|
2568
|
+
main6 as main
|
|
2160
2569
|
};
|