@event4u/agent-config 16.2.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 +89 -237
- 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 +4 -4
- 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/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/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/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/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-system-capture/references/import-procedure.md +1 -1
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +2 -2
- 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/monorepo-workspace/SKILL.md +1 -1
- 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 +2 -2
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +48 -6
- package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- 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-IGD6ERX6.js → chunk-JQVYKIZA.js} +10 -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-7RQP4UDH.js → chunk-KR6EM23A.js} +235 -1455
- package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
- package/dist/cli-delegate/{chunk-YJ72UIAK.js → chunk-NQ7WT43P.js} +1186 -244
- 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-7XGBX6ZH.js → chunk-RQNNW7IF.js} +1314 -560
- package/dist/cli-delegate/{chunk-4XFP2Y3E.js → chunk-S4UMZNES.js} +1 -1
- package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
- package/dist/cli-delegate/{chunk-FP36SWJD.js → chunk-TRI6DQZ6.js} +2781 -340
- 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 +1167 -234
- 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 +127 -75
- 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 +5357 -6656
- package/dist/hooks/dispatch.sha256 +1 -1
- 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 +2080 -1024
- 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 +31965 -27154
- 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 +6 -0
- package/dist/shared/skillRanking.js +74 -13
- package/docs/contracts/settings-classes.md +7 -5
- package/package.json +1 -1
- 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/apply.ts +48 -6
- package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
- package/src/config/agent-settings.template.yml +62 -22
- package/src/config/continuity-surface.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +96 -3
- package/src/config/gate-violation-baselines.json +17 -9
- package/src/config/hook-bundle-budget.json +25 -0
- package/src/config/hook-token-budget.json +6 -1
- package/src/config/host-instruction-limits.json +33 -0
- package/src/config/routing-coverage-seed.json +24 -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 +23 -71
- package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
- package/src/scripts/_dispatch.bash +16 -2
- package/src/scripts/_lib/agent_settings.ts +11 -0
- package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
- 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/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_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/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/prompt_shape.ts +46 -0
- package/src/scripts/_lib/release_migration_gate.ts +19 -3
- package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
- 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/skill_origin.ts +254 -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 +77 -2
- 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/audit_skill_overlap.ts +261 -0
- package/src/scripts/before_complete_hook.ts +243 -12
- package/src/scripts/bench_touched_file_quality.ts +238 -0
- package/src/scripts/check_enforcement_matrix.ts +377 -20
- package/src/scripts/check_estate_count.ts +130 -153
- package/src/scripts/check_finding_dispositions.ts +116 -4
- package/src/scripts/check_hook_bundle_composition.ts +370 -0
- package/src/scripts/check_kernel_edit_ratified.ts +49 -11
- package/src/scripts/check_memory.ts +7 -1
- package/src/scripts/check_release_highlights.ts +10 -0
- package/src/scripts/check_release_pr_shape.ts +38 -15
- package/src/scripts/check_standing_rule_delivery.ts +33 -13
- package/src/scripts/check_verify_expectation_delta.ts +521 -0
- 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 +33 -1
- package/src/scripts/condense.ts +14 -27
- package/src/scripts/estate_exemption_shape.ts +202 -0
- package/src/scripts/generate_host_cost_table.ts +1 -1
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +150 -9
- package/src/scripts/hooks/block_config_weakening.ts +67 -2
- package/src/scripts/hooks/block_plumbing_writes.ts +29 -1
- package/src/scripts/hooks/code_graph_context_hook.ts +252 -23
- package/src/scripts/hooks/concern_failure_policy.ts +280 -0
- package/src/scripts/hooks/dispatch_hook.ts +52 -52
- package/src/scripts/hooks/exit_codes.ts +2 -1
- package/src/scripts/hooks/host_lowering.json +1 -1
- package/src/scripts/hooks/host_lowering.ts +19 -1
- package/src/scripts/hooks/one_question_per_ask_hook.ts +41 -25
- package/src/scripts/hooks/payload_stub.ts +10 -1
- package/src/scripts/hooks/rule_inject_hook.ts +757 -63
- package/src/scripts/hooks/table_fingerprint.ts +21 -0
- package/src/scripts/hooks/telemetry_usage_hook.ts +64 -8
- package/src/scripts/hooks/turn_end_gate_hook.ts +84 -0
- package/src/scripts/hooks_status.ts +112 -0
- package/src/scripts/injection_scan_hook.ts +7 -0
- package/src/scripts/install.ts +72 -185
- 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_hook_manifest.ts +53 -0
- package/src/scripts/lint_major_migration_sections.ts +156 -26
- package/src/scripts/lint_pack_boundaries.ts +63 -5
- package/src/scripts/lint_rule_law_section.ts +517 -0
- 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/measure_routing_signal.ts +54 -16
- package/src/scripts/measure_skill_ranker_baseline.ts +216 -8
- package/src/scripts/memory_learn_hook.ts +91 -6
- package/src/scripts/model_rule_injection.ts +52 -5
- package/src/scripts/project_thin_rules.ts +34 -327
- package/src/scripts/report_evidence_temperature.ts +657 -0
- package/src/scripts/report_installed_rule_links.ts +157 -0
- package/src/scripts/report_label_agreement.ts +233 -0
- package/src/scripts/report_obligation_mechanism.ts +230 -0
- package/src/scripts/report_single_token_triggers.ts +277 -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/rule_activation_census.ts +5 -2
- package/src/scripts/rule_trigger_eval.ts +9 -9
- package/src/scripts/schemas/review-findings.schema.json +3 -2
- package/src/scripts/schemas/rule.schema.json +5 -0
- package/src/scripts/self_review_gate.ts +62 -7
- package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
- 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 -5
- package/src/server/schemas/settings.ts +10 -0
- package/src/shared/skillRanking.ts +117 -11
- package/dist/cli-delegate/chunk-JNMVLWLR.js +0 -4457
- package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/agent-src/scripts/deferral_carry.ts
|
|
4
|
+
import * as fs from "node:fs";
|
|
5
|
+
import * as path from "node:path";
|
|
6
|
+
var DEFERRED_RESOLUTION_RE = /<!--\s*deferred-resolution:\s*(carried-to|merged-into)\s*=\s*([A-Za-z0-9._-]+)\s*-->/;
|
|
7
|
+
var DEFERRED_STEP_RE = /^[ \t]*[-*][ \t]+\[~\][ \t]*(.*)$/;
|
|
8
|
+
var BLOCK_END_RE = /^[ \t]*[-*][ \t]+\[[ xX~-]\]|^#{1,6}[ \t]/;
|
|
9
|
+
var BLOCKED_BY_RE = /blocked-by:\s*([A-Za-z0-9._-]+)/g;
|
|
10
|
+
var BLOCKER_HEAD_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/i;
|
|
11
|
+
var STATUS_LINE_RE = /^([ \t]*-[ \t]+\*\*Status:\*\*[ \t]*)(.*)$/;
|
|
12
|
+
var AC_HEADING_RE = /^##[ \t]+acceptance/i;
|
|
13
|
+
var OWNER_LINE_RE = /^[ \t]*-[ \t]+\*\*Owner:\*\*[ \t]*`?([A-Za-z]+)/;
|
|
14
|
+
var AGENT_SIDE_OWNERS = /* @__PURE__ */ new Set(["implementer", "council", "agent", "ai"]);
|
|
15
|
+
var LIGHTWEIGHT_LINE_BUDGET = 500;
|
|
16
|
+
var DISPOSITION_DIRS = ["", "later", "archive", "skipped"];
|
|
17
|
+
function _bareSteps(lines) {
|
|
18
|
+
const out = [];
|
|
19
|
+
let inAcceptance = false;
|
|
20
|
+
for (let i = 0; i < lines.length; i++) {
|
|
21
|
+
const line = lines[i];
|
|
22
|
+
if (/^##[ \t]/.test(line)) inAcceptance = AC_HEADING_RE.test(line);
|
|
23
|
+
const m = DEFERRED_STEP_RE.exec(line);
|
|
24
|
+
if (m === null) continue;
|
|
25
|
+
let end = i + 1;
|
|
26
|
+
while (end < lines.length && !BLOCK_END_RE.test(lines[end])) end++;
|
|
27
|
+
const raw = lines.slice(i, end);
|
|
28
|
+
if (DEFERRED_RESOLUTION_RE.test(raw.join("\n"))) continue;
|
|
29
|
+
while (raw.length > 1 && raw[raw.length - 1].trim() === "") raw.pop();
|
|
30
|
+
const indent = /^[ \t]*/.exec(line)[0].length;
|
|
31
|
+
const block = raw.map((l) => l.slice(0, indent).trim() === "" ? l.slice(indent) : l);
|
|
32
|
+
const ids = /* @__PURE__ */ new Set();
|
|
33
|
+
for (const b of raw) for (const hit of b.matchAll(BLOCKED_BY_RE)) ids.add(hit[1]);
|
|
34
|
+
out.push({ line: i, block, isAcceptance: inAcceptance, blockerIds: [...ids] });
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
function _blockerSpans(lines) {
|
|
39
|
+
const start = lines.findIndex((l) => /^##[ \t]+Blockers[ \t]*$/i.test(l));
|
|
40
|
+
if (start === -1) return [];
|
|
41
|
+
let sectionEnd = lines.length;
|
|
42
|
+
for (let i = start + 1; i < lines.length; i++) {
|
|
43
|
+
if (/^##[ \t]+\S/.test(lines[i])) {
|
|
44
|
+
sectionEnd = i;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const spans = [];
|
|
49
|
+
for (let i = start + 1; i < sectionEnd; i++) {
|
|
50
|
+
const m = BLOCKER_HEAD_RE.exec(lines[i]);
|
|
51
|
+
if (m === null) continue;
|
|
52
|
+
let end = i + 1;
|
|
53
|
+
while (end < sectionEnd && !/^###?[ \t]/.test(lines[end])) end++;
|
|
54
|
+
const status = lines.slice(i, end).map((l) => STATUS_LINE_RE.exec(l)).find((s) => s !== null);
|
|
55
|
+
const value = (status?.[2] ?? "open").trim().toLowerCase();
|
|
56
|
+
const owner = lines.slice(i, end).map((l) => OWNER_LINE_RE.exec(l)).find((o) => o !== null);
|
|
57
|
+
spans.push({
|
|
58
|
+
id: m[1].trim(),
|
|
59
|
+
start: i,
|
|
60
|
+
end,
|
|
61
|
+
open: !/^resolved\b/.test(value),
|
|
62
|
+
ownerDependent: !AGENT_SIDE_OWNERS.has((owner?.[1] ?? "").toLowerCase())
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return spans;
|
|
66
|
+
}
|
|
67
|
+
function _plusDays(date, days) {
|
|
68
|
+
const d = /* @__PURE__ */ new Date(`${date}T00:00:00Z`);
|
|
69
|
+
d.setUTCDate(d.getUTCDate() + days);
|
|
70
|
+
return d.toISOString().slice(0, 10);
|
|
71
|
+
}
|
|
72
|
+
function nextCarrySlug(root, sourceSlug) {
|
|
73
|
+
const base = sourceSlug.replace(/-carried(-\d+)?$/, "");
|
|
74
|
+
for (let n = 1; ; n++) {
|
|
75
|
+
const slug = n === 1 ? `${base}-carried` : `${base}-carried-${n}`;
|
|
76
|
+
const taken = DISPOSITION_DIRS.some(
|
|
77
|
+
(d) => fs.existsSync(path.join(root, "agents", "roadmaps", d, `${slug}.md`))
|
|
78
|
+
);
|
|
79
|
+
if (!taken) return slug;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function _title(sourceText, sourceSlug) {
|
|
83
|
+
const h1 = /^#[ \t]+(.+?)[ \t]*$/m.exec(sourceText.replace(/^---\n[\s\S]*?\n---\n/, ""));
|
|
84
|
+
return h1 !== null ? h1[1] : sourceSlug.replace(/-/g, " ");
|
|
85
|
+
}
|
|
86
|
+
function planCarry(root, rel, text, openBlockerIds, date, ownerDecision = "ask") {
|
|
87
|
+
const sourceSlug = rel.replace(/\.md$/, "");
|
|
88
|
+
const lines = text.split("\n");
|
|
89
|
+
const steps = _bareSteps(lines);
|
|
90
|
+
if (steps.length === 0) return { refused: "no bare `[~]` step to carry" };
|
|
91
|
+
const named = new Set(steps.flatMap((s) => s.blockerIds));
|
|
92
|
+
const stranded = openBlockerIds.filter((id) => !named.has(id));
|
|
93
|
+
if (stranded.length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
refused: `open blocker(s) no deferred step names (${stranded.join(", ")}) \u2014 carrying around them would not let this roadmap archive`
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const moved = _blockerSpans(lines).filter((b) => b.open && named.has(b.id));
|
|
99
|
+
const ownerBlockers = moved.filter((b) => b.ownerDependent).map((b) => b.id);
|
|
100
|
+
const parked = ownerBlockers.length > 0 && ownerDecision === "later";
|
|
101
|
+
const destSlug = nextCarrySlug(root, sourceSlug);
|
|
102
|
+
const annotation = `<!-- deferred-resolution: carried-to=${destSlug} -->`;
|
|
103
|
+
const out = [...lines];
|
|
104
|
+
for (const b of moved) {
|
|
105
|
+
for (let i = b.start; i < b.end; i++) {
|
|
106
|
+
const s = STATUS_LINE_RE.exec(out[i]);
|
|
107
|
+
if (s === null) continue;
|
|
108
|
+
out[i] = `${s[1]}resolved \u2014 carried, still open, to \`${destSlug}\` with the steps it blocks (was: ${s[2].trim()})`;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const s of steps) out[s.line] = `${out[s.line]} ${annotation}`;
|
|
113
|
+
const toOpen = (block) => block.map((l, i) => i === 0 ? l.replace(/\[~\]/, "[ ]") : l).join("\n");
|
|
114
|
+
const phaseSteps = steps.filter((s) => !s.isAcceptance).map((s) => toOpen(s.block));
|
|
115
|
+
const acSteps = steps.filter((s) => s.isAcceptance).map((s) => toOpen(s.block));
|
|
116
|
+
const phaseName = `Deferred steps carried from ${sourceSlug}`;
|
|
117
|
+
const blockerText = moved.map((b) => lines.slice(b.start, b.end).join("\n").trimEnd());
|
|
118
|
+
const body = [
|
|
119
|
+
`# ${_title(text, sourceSlug)} \u2014 carried`,
|
|
120
|
+
"",
|
|
121
|
+
`> **Source:** carried by the archival sweep on ${date} from`,
|
|
122
|
+
`> [\`${sourceSlug}\`](${parked ? "../" : ""}archive/${sourceSlug}.md), which closed every other step.`,
|
|
123
|
+
"> Each step below was `[~]` there and is restated verbatim as open work, so",
|
|
124
|
+
"> archiving the parent buried nothing. Blockers the steps name moved with them.",
|
|
125
|
+
"",
|
|
126
|
+
"## Goal",
|
|
127
|
+
"",
|
|
128
|
+
`Every step ${sourceSlug} deferred is either done here or explicitly disposed`,
|
|
129
|
+
"of \u2014 a step that still cannot run is re-deferred with its reason, never",
|
|
130
|
+
"left to read as finished.",
|
|
131
|
+
"",
|
|
132
|
+
`## Phase 1 \u2014 ${phaseName}`,
|
|
133
|
+
"",
|
|
134
|
+
phaseSteps.length > 0 ? phaseSteps.join("\n") : "- [ ] **1.1 Close the carried acceptance criteria below.** The parent deferred\n only acceptance criteria; this step is done when each is checked or disposed of.\n verify: every criterion under `## Acceptance Criteria` is `[x]` or `[-]`",
|
|
135
|
+
"",
|
|
136
|
+
...blockerText.length > 0 ? ["## Blockers", "", blockerText.join("\n\n"), ""] : [],
|
|
137
|
+
"## Risk Register",
|
|
138
|
+
`<!-- risk-review: v1 | reviewed: ${date} | reviewer: archive-sweep/auto-carry -->`,
|
|
139
|
+
"",
|
|
140
|
+
"| Rank | Item | Risk type | Description | Mitigation | Anchored under |",
|
|
141
|
+
"|------|------|-----------|-------------|------------|----------------|",
|
|
142
|
+
`| 1 | Carried steps stay blocked indefinitely | implementation | A step deferred once for elapsed time or a decision can sit here as long as it sat in the parent | It now counts as open work in the dashboard instead of as 100 %, and its blocker is listed where the estate gates count it | Phase 1 \u2014 ${phaseName} |`,
|
|
143
|
+
"",
|
|
144
|
+
"## Acceptance Criteria",
|
|
145
|
+
"",
|
|
146
|
+
acSteps.length > 0 ? acSteps.join("\n") : `- [ ] AC-1 \u2014 No step carried from \`${sourceSlug}\` is still \`[ ]\` without a recorded disposition.`,
|
|
147
|
+
""
|
|
148
|
+
].join("\n");
|
|
149
|
+
const complexity = body.split("\n").length > LIGHTWEIGHT_LINE_BUDGET ? "structural" : "lightweight";
|
|
150
|
+
const ids = ownerBlockers.join(", ");
|
|
151
|
+
const parkedKeys = parked ? `entry_condition:
|
|
152
|
+
what: the owner resolves blocker(s) ${ids}
|
|
153
|
+
when: whenever the owner takes the next step
|
|
154
|
+
who: owner
|
|
155
|
+
review_by: ${_plusDays(date, 90)}
|
|
156
|
+
estate_growth_exempt: >-
|
|
157
|
+
Owner-chosen archive of ${sourceSlug}: its deferred steps wait on owner
|
|
158
|
+
blocker(s) ${ids} and are parked here instead of left active. The parent
|
|
159
|
+
is archived in the same change, so the active count drops by one.
|
|
160
|
+
` : "";
|
|
161
|
+
const destText = `---
|
|
162
|
+
complexity: ${complexity}
|
|
163
|
+
status: ${parked ? "later" : "ready"}
|
|
164
|
+
execution:
|
|
165
|
+
mode: phase-checkpoints
|
|
166
|
+
parent_roadmap: ${sourceSlug}
|
|
167
|
+
${parkedKeys}---
|
|
168
|
+
${body}`;
|
|
169
|
+
const destRel = parked ? `agents/roadmaps/later/${destSlug}.md` : `agents/roadmaps/${destSlug}.md`;
|
|
170
|
+
return {
|
|
171
|
+
plan: {
|
|
172
|
+
destSlug,
|
|
173
|
+
destRel,
|
|
174
|
+
destText,
|
|
175
|
+
sourceText: out.join("\n"),
|
|
176
|
+
carried: steps.length,
|
|
177
|
+
movedBlockers: moved.map((b) => b.id),
|
|
178
|
+
ownerBlockers,
|
|
179
|
+
firstStep: steps[0].block.join("\n"),
|
|
180
|
+
parked
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export {
|
|
186
|
+
DEFERRED_RESOLUTION_RE,
|
|
187
|
+
DEFERRED_STEP_RE,
|
|
188
|
+
BLOCK_END_RE,
|
|
189
|
+
nextCarrySlug,
|
|
190
|
+
planCarry
|
|
191
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
|
|
3
|
+
// src/scripts/_lib/json_merge.ts
|
|
4
|
+
function isPlainObject(v) {
|
|
5
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
6
|
+
}
|
|
7
|
+
function deepcopy(v) {
|
|
8
|
+
if (v === null || typeof v !== "object") return v;
|
|
9
|
+
if (Array.isArray(v)) return v.map((x) => deepcopy(x));
|
|
10
|
+
const out = {};
|
|
11
|
+
for (const k of Object.keys(v)) {
|
|
12
|
+
out[k] = deepcopy(v[k]);
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
function deepMerge(base, overlay) {
|
|
17
|
+
const result = deepcopy(base);
|
|
18
|
+
for (const key of Object.keys(overlay)) {
|
|
19
|
+
const value = overlay[key];
|
|
20
|
+
if (Object.prototype.hasOwnProperty.call(result, key) && isPlainObject(result[key]) && isPlainObject(value)) {
|
|
21
|
+
result[key] = deepMerge(result[key], value);
|
|
22
|
+
} else {
|
|
23
|
+
result[key] = deepcopy(value);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
function jsonEqual(a, b) {
|
|
29
|
+
if (a === b) return true;
|
|
30
|
+
if (typeof a !== typeof b) return false;
|
|
31
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
32
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
|
|
33
|
+
return a.every((v, i) => jsonEqual(v, b[i]));
|
|
34
|
+
}
|
|
35
|
+
if (isPlainObject(a) && isPlainObject(b)) {
|
|
36
|
+
const ka = Object.keys(a);
|
|
37
|
+
const kb = Object.keys(b);
|
|
38
|
+
if (ka.length !== kb.length) return false;
|
|
39
|
+
return ka.every(
|
|
40
|
+
(k) => Object.prototype.hasOwnProperty.call(b, k) && jsonEqual(a[k], b[k])
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// src/scripts/_lib/host_hook_merge.ts
|
|
47
|
+
var HOOK_SIGNATURES = {
|
|
48
|
+
"~/.augment/settings.json": "augment-dispatcher.sh",
|
|
49
|
+
".cursor/hooks.json": "dispatch:hook --platform cursor",
|
|
50
|
+
"~/.cursor/hooks.json": "cursor-dispatcher.sh",
|
|
51
|
+
".windsurf/hooks.json": "dispatch:hook --platform windsurf",
|
|
52
|
+
"~/.codeium/windsurf/hooks.json": "windsurf-dispatcher.sh",
|
|
53
|
+
".gemini/settings.json": "dispatch:hook --platform gemini",
|
|
54
|
+
"~/.gemini/settings.json": "gemini-dispatcher.sh"
|
|
55
|
+
};
|
|
56
|
+
function entryCommands(entry) {
|
|
57
|
+
if (!isPlainObject(entry)) return [];
|
|
58
|
+
const out = [];
|
|
59
|
+
if (typeof entry["command"] === "string") out.push(entry["command"]);
|
|
60
|
+
const nested = entry["hooks"];
|
|
61
|
+
if (Array.isArray(nested)) {
|
|
62
|
+
for (const inner of nested) {
|
|
63
|
+
if (isPlainObject(inner) && typeof inner["command"] === "string") {
|
|
64
|
+
out.push(inner["command"]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
function isManagedEntry(entry, signature) {
|
|
71
|
+
if (signature === "") return false;
|
|
72
|
+
return entryCommands(entry).some((cmd) => cmd.includes(signature));
|
|
73
|
+
}
|
|
74
|
+
function mergeEventEntries(existing, incoming, signature) {
|
|
75
|
+
const kept = existing.filter((entry) => !isManagedEntry(entry, signature));
|
|
76
|
+
return [...kept.map((e) => deepcopy(e)), ...incoming.map((e) => deepcopy(e))];
|
|
77
|
+
}
|
|
78
|
+
function mergeHookEvents(existingHooks, patchHooks, signature) {
|
|
79
|
+
if (!isPlainObject(existingHooks)) return deepcopy(patchHooks);
|
|
80
|
+
const out = deepcopy(existingHooks);
|
|
81
|
+
for (const event of Object.keys(patchHooks)) {
|
|
82
|
+
const incoming = patchHooks[event];
|
|
83
|
+
const current = out[event];
|
|
84
|
+
if (!Array.isArray(incoming)) {
|
|
85
|
+
out[event] = deepcopy(incoming);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
out[event] = mergeEventEntries(Array.isArray(current) ? current : [], incoming, signature);
|
|
89
|
+
}
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
function mergeHostConfig(existing, patch, signature, deepMergeFn) {
|
|
93
|
+
const merged = deepMergeFn(existing, patch);
|
|
94
|
+
const patchHooks = patch["hooks"];
|
|
95
|
+
if (signature === "" || !isPlainObject(patchHooks)) return merged;
|
|
96
|
+
merged["hooks"] = mergeHookEvents(existing["hooks"], patchHooks, signature);
|
|
97
|
+
return merged;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
isPlainObject,
|
|
102
|
+
deepMerge,
|
|
103
|
+
jsonEqual,
|
|
104
|
+
HOOK_SIGNATURES,
|
|
105
|
+
entryCommands,
|
|
106
|
+
isManagedEntry,
|
|
107
|
+
mergeHostConfig
|
|
108
|
+
};
|