@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
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
settings_layer_states,
|
|
4
|
+
template_defaults,
|
|
5
|
+
user_global_settings_paths
|
|
6
|
+
} from "./chunk-H76PHZBI.js";
|
|
7
|
+
|
|
8
|
+
// src/scripts/_lib/git_convention.ts
|
|
9
|
+
import { spawnSync } from "node:child_process";
|
|
10
|
+
import { createRequire } from "node:module";
|
|
11
|
+
import * as fs from "node:fs";
|
|
12
|
+
var _require = createRequire(import.meta.url);
|
|
13
|
+
var GIT_CONVENTION_KEYS = ["commit_format", "branch_pattern", "update_strategy"];
|
|
14
|
+
var GIT_CONVENTION_ENUMS = {
|
|
15
|
+
commit_format: ["ticket-scope", "ticket-conventional"],
|
|
16
|
+
update_strategy: ["merge", "rebase"]
|
|
17
|
+
};
|
|
18
|
+
function _parse(p) {
|
|
19
|
+
let text;
|
|
20
|
+
try {
|
|
21
|
+
if (!fs.statSync(p).isFile()) return { parsed: "absent", data: null };
|
|
22
|
+
text = fs.readFileSync(p, "utf-8");
|
|
23
|
+
} catch (err) {
|
|
24
|
+
if (err.code === "ENOENT") return { parsed: "absent", data: null };
|
|
25
|
+
return { parsed: "malformed", data: null, why: "the file cannot be read" };
|
|
26
|
+
}
|
|
27
|
+
return parseLayerText(text);
|
|
28
|
+
}
|
|
29
|
+
function _parseFailure(text, err) {
|
|
30
|
+
const line = err.linePos?.[0]?.line;
|
|
31
|
+
if (line === void 0) return "the file does not parse";
|
|
32
|
+
const quote = (text.split("\n")[line - 1] ?? "").includes("{") ? `; a value containing \`{\` must be quoted, e.g. ${_quoteExample("branch_pattern")}` : "";
|
|
33
|
+
return `the file does not parse at line ${line}${quote}`;
|
|
34
|
+
}
|
|
35
|
+
function _quoteExample(key) {
|
|
36
|
+
return `${key}: "${key === "branch_pattern" ? "{ticket}-{slug}" : GIT_CONVENTION_ENUMS[key]?.[0] ?? "\u2026"}"`;
|
|
37
|
+
}
|
|
38
|
+
function parseLayerText(text) {
|
|
39
|
+
let data;
|
|
40
|
+
try {
|
|
41
|
+
const YAML = _require("yaml");
|
|
42
|
+
data = YAML.parse(text, { version: "1.1" });
|
|
43
|
+
} catch (err) {
|
|
44
|
+
return { parsed: "malformed", data: null, why: _parseFailure(text, err) };
|
|
45
|
+
}
|
|
46
|
+
if (data === null || data === void 0) return { parsed: "valid", data: {} };
|
|
47
|
+
if (typeof data !== "object" || Array.isArray(data)) return { parsed: "malformed", data: null, why: "the document is not a map" };
|
|
48
|
+
return { parsed: "valid", data };
|
|
49
|
+
}
|
|
50
|
+
function fileSource(files) {
|
|
51
|
+
return {
|
|
52
|
+
layers: () => [
|
|
53
|
+
...(files.userGlobal ?? []).map((p) => ({ path: p, carries: false, ..._parse(p) })),
|
|
54
|
+
...(files.developer ?? []).map((p) => ({ path: p, carries: true, ..._parse(p) }))
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function checkoutSource(cwd) {
|
|
59
|
+
return {
|
|
60
|
+
layers: () => {
|
|
61
|
+
const userGlobalCount = user_global_settings_paths().length;
|
|
62
|
+
const all = settings_layer_states({ cwd }).map((l) => l.path);
|
|
63
|
+
return fileSource({ userGlobal: all.slice(0, userGlobalCount), developer: all.slice(userGlobalCount) }).layers();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function _lookup(data, key) {
|
|
68
|
+
if (data === null || typeof data !== "object") return { present: false };
|
|
69
|
+
const git = data.git;
|
|
70
|
+
if (git === void 0 || git === null) return { present: false };
|
|
71
|
+
if (typeof git !== "object" || Array.isArray(git)) return { present: true, notAMap: true };
|
|
72
|
+
const value = git[key];
|
|
73
|
+
if (value === void 0 || value === null) return { present: false };
|
|
74
|
+
return { present: true, value };
|
|
75
|
+
}
|
|
76
|
+
var BRANCH_PLACEHOLDERS = ["type", "ticket", "slug"];
|
|
77
|
+
var BRANCH_SAMPLE = {
|
|
78
|
+
type: "feat",
|
|
79
|
+
ticket: "DEV-1234",
|
|
80
|
+
slug: "sample-change"
|
|
81
|
+
};
|
|
82
|
+
var BRANCH_LITERAL = /^[A-Za-z0-9._/-]*$/;
|
|
83
|
+
function renderBranchSample(pattern) {
|
|
84
|
+
return pattern.replace(/\{(type|ticket|slug)\}/g, (_m, name) => BRANCH_SAMPLE[name]);
|
|
85
|
+
}
|
|
86
|
+
function _branchPatternReason(pattern) {
|
|
87
|
+
if (pattern === "") return "the pattern is empty";
|
|
88
|
+
const literal = pattern.replace(/\{([^{}]*)\}/g, (match, name) => {
|
|
89
|
+
return BRANCH_PLACEHOLDERS.includes(name) ? "" : `\0${match}`;
|
|
90
|
+
});
|
|
91
|
+
const unknown = /\u0000(\{[^{}]*\})/.exec(literal);
|
|
92
|
+
if (unknown !== null) {
|
|
93
|
+
return `unknown placeholder ${unknown[1]}; allowed: ${BRANCH_PLACEHOLDERS.map((p) => `{${p}}`).join(", ")}`;
|
|
94
|
+
}
|
|
95
|
+
if (/[{}]/.test(literal)) return "an unbalanced brace";
|
|
96
|
+
if (!BRANCH_LITERAL.test(literal)) {
|
|
97
|
+
const bad = [...new Set(literal.replace(/[A-Za-z0-9._/-]/g, ""))].join("");
|
|
98
|
+
return `literal character(s) ${JSON.stringify(bad)} outside [A-Za-z0-9._/-]`;
|
|
99
|
+
}
|
|
100
|
+
if (!pattern.includes("{slug}")) return "the pattern must contain {slug}";
|
|
101
|
+
const sample = renderBranchSample(pattern);
|
|
102
|
+
const check = spawnSync("git", ["check-ref-format", "--branch", sample], { encoding: "utf8" });
|
|
103
|
+
if (check.error === void 0 && check.status !== 0) {
|
|
104
|
+
return `the sample \`${sample}\` fails git check-ref-format --branch`;
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
function invalidReason(key, value) {
|
|
109
|
+
if (value !== value.trim()) return `\`${value}\` has leading or trailing whitespace`;
|
|
110
|
+
const allowed = GIT_CONVENTION_ENUMS[key];
|
|
111
|
+
if (allowed !== void 0) {
|
|
112
|
+
if (allowed.includes(value)) return null;
|
|
113
|
+
const caseOnly = allowed.includes(value.toLowerCase()) ? " (values are case-sensitive)" : "";
|
|
114
|
+
return `\`${value}\` is not one of ${allowed.map((v) => `\`${v}\``).join(", ")}${caseOnly}`;
|
|
115
|
+
}
|
|
116
|
+
return _branchPatternReason(value);
|
|
117
|
+
}
|
|
118
|
+
function _defaults() {
|
|
119
|
+
const git = template_defaults().git ?? {};
|
|
120
|
+
const out = {};
|
|
121
|
+
for (const key of GIT_CONVENTION_KEYS) {
|
|
122
|
+
if (typeof git[key] === "string") out[key] = git[key];
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
function conventionDefault(key) {
|
|
127
|
+
return _defaults()[key] ?? null;
|
|
128
|
+
}
|
|
129
|
+
function conventionReading(key, state, value, source, detail = null) {
|
|
130
|
+
const reason = isRefusal(state) ? `git-convention-${state}` : null;
|
|
131
|
+
return { key, value, source, state, reason, detail };
|
|
132
|
+
}
|
|
133
|
+
function readGitConventionKey(key, source, defaults = _defaults()) {
|
|
134
|
+
const layers = source.layers();
|
|
135
|
+
const fallback = defaults[key] ?? null;
|
|
136
|
+
for (const layer of [...layers].reverse().filter((l) => l.carries)) {
|
|
137
|
+
if (layer.parsed === "malformed") {
|
|
138
|
+
return conventionReading(key, "malformed", null, layer.path, `${layer.why ?? "the file cannot be read"}, so the value it may set is unknown`);
|
|
139
|
+
}
|
|
140
|
+
if (layer.shapeError !== void 0) return conventionReading(key, "invalid", null, layer.path, layer.shapeError);
|
|
141
|
+
const found = _lookup(layer.data, key);
|
|
142
|
+
if (!found.present) continue;
|
|
143
|
+
if ("notAMap" in found) return conventionReading(key, "invalid", null, layer.path, "`git:` is not a map");
|
|
144
|
+
if (typeof found.value !== "string") {
|
|
145
|
+
const shown = typeof found.value === "object" && found.value !== null ? JSON.stringify(found.value) : String(found.value);
|
|
146
|
+
return conventionReading(key, "invalid", shown, layer.path, `the value is not a string \u2014 quote the value, e.g. ${_quoteExample(key)}`);
|
|
147
|
+
}
|
|
148
|
+
const value = found.value;
|
|
149
|
+
const why = invalidReason(key, value);
|
|
150
|
+
return why === null ? conventionReading(key, "valid", value, layer.path) : conventionReading(key, "invalid", value, layer.path, why);
|
|
151
|
+
}
|
|
152
|
+
for (const layer of [...layers].reverse().filter((l) => !l.carries && l.parsed === "valid")) {
|
|
153
|
+
const found = _lookup(layer.data, key);
|
|
154
|
+
if (!found.present || "notAMap" in found) continue;
|
|
155
|
+
const value = typeof found.value === "string" ? found.value : String(found.value);
|
|
156
|
+
if (fallback !== null && value === fallback) continue;
|
|
157
|
+
return conventionReading(
|
|
158
|
+
key,
|
|
159
|
+
"discarded",
|
|
160
|
+
value,
|
|
161
|
+
layer.path,
|
|
162
|
+
"user-global files do not carry git.* keys; set it in the project settings file"
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return conventionReading(key, "absent", fallback, null);
|
|
166
|
+
}
|
|
167
|
+
var REFUSAL_STATES = ["malformed", "invalid", "discarded", "unresolvable"];
|
|
168
|
+
function isRefusal(state) {
|
|
169
|
+
return REFUSAL_STATES.includes(state);
|
|
170
|
+
}
|
|
171
|
+
function describeRefusal(reading) {
|
|
172
|
+
return `${reading.reason ?? "git-convention-ok"}: git.${reading.key} in ${reading.source ?? "(no file)"} \u2014 ${reading.detail ?? reading.state}`;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export {
|
|
176
|
+
GIT_CONVENTION_KEYS,
|
|
177
|
+
parseLayerText,
|
|
178
|
+
fileSource,
|
|
179
|
+
checkoutSource,
|
|
180
|
+
invalidReason,
|
|
181
|
+
conventionDefault,
|
|
182
|
+
conventionReading,
|
|
183
|
+
readGitConventionKey,
|
|
184
|
+
isRefusal,
|
|
185
|
+
describeRefusal
|
|
186
|
+
};
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
atomicAppendLine
|
|
4
|
+
} from "./chunk-MDPPKQCQ.js";
|
|
5
|
+
|
|
6
|
+
// src/install/txlog.ts
|
|
7
|
+
import { createGzip } from "node:zlib";
|
|
8
|
+
import { createReadStream, createWriteStream, existsSync, readFileSync, renameSync, statSync, unlinkSync } from "node:fs";
|
|
9
|
+
import { pipeline } from "node:stream/promises";
|
|
10
|
+
var ROTATION_MAX_BYTES = 10 * 1024 * 1024;
|
|
11
|
+
var ROTATION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
12
|
+
var RECOVERY_DEPTH_CAP = 500;
|
|
13
|
+
function appendTxLog(logPath, entry) {
|
|
14
|
+
if (shouldRotate(logPath)) {
|
|
15
|
+
rotateLogSync(logPath);
|
|
16
|
+
}
|
|
17
|
+
atomicAppendLine(logPath, JSON.stringify(entry));
|
|
18
|
+
}
|
|
19
|
+
function readRecentEntries(logPath) {
|
|
20
|
+
if (!existsSync(logPath)) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const raw = readFileSync(logPath, "utf8");
|
|
24
|
+
const lines = raw.split("\n").filter((l) => l.length > 0);
|
|
25
|
+
const tail = lines.slice(-RECOVERY_DEPTH_CAP);
|
|
26
|
+
const out = [];
|
|
27
|
+
for (const line of tail) {
|
|
28
|
+
const parsed = tryParseEntry(line);
|
|
29
|
+
if (parsed !== null) {
|
|
30
|
+
out.push(parsed);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function shouldRotate(logPath, now = /* @__PURE__ */ new Date()) {
|
|
36
|
+
if (!existsSync(logPath)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
let size = 0;
|
|
40
|
+
try {
|
|
41
|
+
size = statSync(logPath).size;
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (size >= ROTATION_MAX_BYTES) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
const firstTs = readFirstTimestamp(logPath);
|
|
49
|
+
if (firstTs === null) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return now.getTime() - firstTs >= ROTATION_MAX_AGE_MS;
|
|
53
|
+
}
|
|
54
|
+
function rotateLogSync(logPath) {
|
|
55
|
+
if (!existsSync(logPath)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
|
|
59
|
+
const rotated = logPath.replace(/\.jsonl$/, `.${stamp}.jsonl`);
|
|
60
|
+
renameSync(logPath, rotated);
|
|
61
|
+
void gzipInPlace(rotated).catch(() => {
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function gzipInPlace(source) {
|
|
65
|
+
const target = `${source}.gz`;
|
|
66
|
+
await pipeline(createReadStream(source), createGzip(), createWriteStream(target));
|
|
67
|
+
try {
|
|
68
|
+
unlinkSync(source);
|
|
69
|
+
} catch {
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function readFirstTimestamp(logPath) {
|
|
73
|
+
try {
|
|
74
|
+
const raw = readFileSync(logPath, "utf8");
|
|
75
|
+
const firstLine = raw.split("\n", 1)[0] ?? "";
|
|
76
|
+
const parsed = tryParseEntry(firstLine);
|
|
77
|
+
if (parsed === null) return null;
|
|
78
|
+
const t = Date.parse(parsed.ts);
|
|
79
|
+
return Number.isFinite(t) ? t : null;
|
|
80
|
+
} catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function tryParseEntry(line) {
|
|
85
|
+
try {
|
|
86
|
+
const obj = JSON.parse(line);
|
|
87
|
+
if (typeof obj.ts !== "string" || typeof obj.kind !== "string" || typeof obj.path !== "string") {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return obj;
|
|
91
|
+
} catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/scripts/_lib/thin_rules.ts
|
|
97
|
+
import { createHash } from "node:crypto";
|
|
98
|
+
import * as fs2 from "node:fs";
|
|
99
|
+
import * as path2 from "node:path";
|
|
100
|
+
import { fileURLToPath } from "node:url";
|
|
101
|
+
|
|
102
|
+
// src/scripts/_lib/rule_law_section.ts
|
|
103
|
+
var IRON_LAW_RE = /\biron\s+laws?\b/i;
|
|
104
|
+
var HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
|
|
105
|
+
var FENCE_RE = /^\s*```/;
|
|
106
|
+
function splitFrontmatter(text) {
|
|
107
|
+
if (text.startsWith("---\n")) {
|
|
108
|
+
const end = text.indexOf("\n---\n", 4);
|
|
109
|
+
if (end !== -1) {
|
|
110
|
+
return [text.slice(0, end + 5), text.slice(end + 5)];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return ["", text];
|
|
114
|
+
}
|
|
115
|
+
function ruleBody(text) {
|
|
116
|
+
const [, body] = splitFrontmatter(text);
|
|
117
|
+
return body.replace(/<!--[\s\S]*?-->/g, "").trim();
|
|
118
|
+
}
|
|
119
|
+
function lawSections(body) {
|
|
120
|
+
const lines = body.split("\n");
|
|
121
|
+
let inFence = false;
|
|
122
|
+
const headings = [];
|
|
123
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
124
|
+
const raw = lines[i];
|
|
125
|
+
if (FENCE_RE.test(raw)) {
|
|
126
|
+
inFence = !inFence;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (inFence) continue;
|
|
130
|
+
const m = HEADING_RE.exec(raw);
|
|
131
|
+
if (m) headings.push({ i, depth: m[1].length, title: m[2].trim() });
|
|
132
|
+
}
|
|
133
|
+
const out = [];
|
|
134
|
+
for (let k = 0; k < headings.length; k += 1) {
|
|
135
|
+
const h = headings[k];
|
|
136
|
+
if (!IRON_LAW_RE.test(h.title)) continue;
|
|
137
|
+
let end = lines.length;
|
|
138
|
+
for (let j = k + 1; j < headings.length; j += 1) {
|
|
139
|
+
const n = headings[j];
|
|
140
|
+
if (n.depth <= h.depth) {
|
|
141
|
+
end = n.i;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
out.push({
|
|
146
|
+
title: h.title,
|
|
147
|
+
depth: h.depth,
|
|
148
|
+
line: h.i + 1,
|
|
149
|
+
text: lines.slice(h.i, end).join("\n").trim()
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
function lawText(body) {
|
|
155
|
+
const sections = lawSections(body);
|
|
156
|
+
if (sections.length === 0) return null;
|
|
157
|
+
return sections.map((s) => s.text).join("\n\n");
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/scripts/_lib/rule_consequence_class.ts
|
|
161
|
+
import * as fs from "node:fs";
|
|
162
|
+
import * as path from "node:path";
|
|
163
|
+
var CLASS_CONFIG_REL = "src/config/rule-consequence-class.json";
|
|
164
|
+
function readConsequenceClass(repoRoot) {
|
|
165
|
+
const raw = JSON.parse(fs.readFileSync(path.join(repoRoot, CLASS_CONFIG_REL), "utf-8"));
|
|
166
|
+
return {
|
|
167
|
+
criterion_ref: raw.criterion_ref ?? "",
|
|
168
|
+
members: raw.members ?? {},
|
|
169
|
+
no_stub: raw.no_stub ?? {},
|
|
170
|
+
excluded: raw.excluded ?? {}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function stubLawIds(cfg) {
|
|
174
|
+
return new Set(Object.keys(cfg.members).filter((id) => cfg.no_stub[id] === void 0));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// src/scripts/_lib/rule_injection.ts
|
|
178
|
+
var PATH_TRIGGER_KINDS = ["path_prefix", "file_pattern"];
|
|
179
|
+
function tierEntries(router, tier) {
|
|
180
|
+
const raw = router[tier];
|
|
181
|
+
if (!Array.isArray(raw)) return [];
|
|
182
|
+
return raw.map((r) => ({
|
|
183
|
+
id: String(r["id"] ?? ""),
|
|
184
|
+
triggers: Array.isArray(r["triggers"]) ? r["triggers"] : []
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
function allTierRules(router) {
|
|
188
|
+
const out = [];
|
|
189
|
+
for (const tier of ["tier_1", "tier_2"]) {
|
|
190
|
+
for (const e of tierEntries(router, tier)) out.push({ ...e, tier });
|
|
191
|
+
}
|
|
192
|
+
return out;
|
|
193
|
+
}
|
|
194
|
+
function pathOnlyRuleIds(router) {
|
|
195
|
+
const ids = /* @__PURE__ */ new Set();
|
|
196
|
+
for (const r of allTierRules(router)) {
|
|
197
|
+
if (r.triggers.length === 0) continue;
|
|
198
|
+
const allPath = r.triggers.every(
|
|
199
|
+
(t) => PATH_TRIGGER_KINDS.some((k) => k in t)
|
|
200
|
+
);
|
|
201
|
+
if (allPath) ids.add(r.id);
|
|
202
|
+
}
|
|
203
|
+
return ids;
|
|
204
|
+
}
|
|
205
|
+
function triggerlessRuleIds(router) {
|
|
206
|
+
return allTierRules(router).filter((r) => r.triggers.length === 0).map((r) => r.id);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/scripts/_lib/thin_rules.ts
|
|
210
|
+
var _HERE = fileURLToPath(import.meta.url);
|
|
211
|
+
var REPO_ROOT = path2.resolve(path2.dirname(_HERE), "..", "..", "..");
|
|
212
|
+
var RULES_SOURCE = path2.join(REPO_ROOT, "dist/agent-src", "rules");
|
|
213
|
+
var ROUTER = path2.join(REPO_ROOT, "dist", "router.json");
|
|
214
|
+
function _globSortedMd(dir) {
|
|
215
|
+
let names;
|
|
216
|
+
try {
|
|
217
|
+
names = fs2.readdirSync(dir);
|
|
218
|
+
} catch {
|
|
219
|
+
return [];
|
|
220
|
+
}
|
|
221
|
+
const out = names.filter((n) => n.endsWith(".md")).map((n) => path2.join(dir, n));
|
|
222
|
+
out.sort();
|
|
223
|
+
return out;
|
|
224
|
+
}
|
|
225
|
+
function kernel_ids(routerPath = ROUTER) {
|
|
226
|
+
const data = JSON.parse(fs2.readFileSync(routerPath, "utf-8"));
|
|
227
|
+
const kernel = data.kernel;
|
|
228
|
+
if (Array.isArray(kernel)) {
|
|
229
|
+
return new Set(kernel.map((x) => String(x)));
|
|
230
|
+
}
|
|
231
|
+
return /* @__PURE__ */ new Set();
|
|
232
|
+
}
|
|
233
|
+
function _router(routerPath = ROUTER) {
|
|
234
|
+
return JSON.parse(fs2.readFileSync(routerPath, "utf-8"));
|
|
235
|
+
}
|
|
236
|
+
function path_only_ids(routerPath = ROUTER) {
|
|
237
|
+
return pathOnlyRuleIds(_router(routerPath));
|
|
238
|
+
}
|
|
239
|
+
function no_trigger_ids(routerPath = ROUTER) {
|
|
240
|
+
return new Set(triggerlessRuleIds(_router(routerPath)));
|
|
241
|
+
}
|
|
242
|
+
function rule_workspaces_map(routerPath = ROUTER) {
|
|
243
|
+
const data = JSON.parse(fs2.readFileSync(routerPath, "utf-8"));
|
|
244
|
+
const map = /* @__PURE__ */ new Map();
|
|
245
|
+
for (const tier of ["tier_1", "tier_2"]) {
|
|
246
|
+
const entries = data[tier];
|
|
247
|
+
if (!Array.isArray(entries)) continue;
|
|
248
|
+
for (const e of entries) {
|
|
249
|
+
const obj = e;
|
|
250
|
+
const ws = Array.isArray(obj.workspaces) ? obj.workspaces.map((w) => String(w)) : [];
|
|
251
|
+
map.set(String(obj.id), ws);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return map;
|
|
255
|
+
}
|
|
256
|
+
function id_in_scope(rule_id, scope, kernel, wsMap, fallback_ws = []) {
|
|
257
|
+
if (scope === null || kernel.has(rule_id)) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
const ws = wsMap.get(rule_id) ?? fallback_ws;
|
|
261
|
+
if (ws.length === 0) {
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
return ws.some((w) => scope.includes(w));
|
|
265
|
+
}
|
|
266
|
+
function fm_workspaces(text) {
|
|
267
|
+
const [fm] = split_frontmatter(text);
|
|
268
|
+
const flow = /^workspaces:[ \t]*\[([^\]]*)\]/m.exec(fm);
|
|
269
|
+
if (flow) {
|
|
270
|
+
return flow[1].split(",").map((s) => s.trim().replace(/^["']|["']$/g, "")).filter((s) => s.length > 0);
|
|
271
|
+
}
|
|
272
|
+
const m = /^workspaces:[ \t]*\n((?:[ \t]+-[ \t]+.*(?:\n|$))+)/m.exec(fm);
|
|
273
|
+
if (!m) {
|
|
274
|
+
return [];
|
|
275
|
+
}
|
|
276
|
+
return [...m[1].matchAll(/-[ \t]+(\S+)/g)].map((x) => x[1]);
|
|
277
|
+
}
|
|
278
|
+
function split_frontmatter(text) {
|
|
279
|
+
if (text.startsWith("---\n")) {
|
|
280
|
+
const end = text.indexOf("\n---\n", 4);
|
|
281
|
+
if (end !== -1) {
|
|
282
|
+
return [text.slice(0, end + 5), text.slice(end + 5)];
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return ["", text];
|
|
286
|
+
}
|
|
287
|
+
function _description(fm) {
|
|
288
|
+
const m = /^description:\s*"?(.+?)"?\s*$/m.exec(fm);
|
|
289
|
+
return m ? m[1].trim() : "";
|
|
290
|
+
}
|
|
291
|
+
var _TRIGGER_HINT_LIMIT = 6;
|
|
292
|
+
function _trigger_hint(fm) {
|
|
293
|
+
const hits = [];
|
|
294
|
+
const re = /^\s*-\s*(?:keyword|phrase):\s*"?(.+?)"?\s*$/gm;
|
|
295
|
+
let m;
|
|
296
|
+
while ((m = re.exec(fm)) !== null) {
|
|
297
|
+
hits.push(m[1].trim());
|
|
298
|
+
if (hits.length >= _TRIGGER_HINT_LIMIT) {
|
|
299
|
+
break;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return hits.join(", ");
|
|
303
|
+
}
|
|
304
|
+
function _title(s) {
|
|
305
|
+
return s.replace(/[A-Za-z]+/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());
|
|
306
|
+
}
|
|
307
|
+
var THIN_ENTRY_MARKER = "> Load the body on a match.";
|
|
308
|
+
var THIN_BODY_POINTER_PREFIX = "Body: ";
|
|
309
|
+
var THIN_BODY_POINTER_RE = (() => {
|
|
310
|
+
const lit = THIN_BODY_POINTER_PREFIX.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
311
|
+
return new RegExp(`${lit}((?:(?!${lit}).)+\\.md)\\s*$`, "m");
|
|
312
|
+
})();
|
|
313
|
+
var BODY_LINK_PREFIX = "../../dist/agent-src/rules/";
|
|
314
|
+
function absoluteBodyLinkPrefix(packageRoot) {
|
|
315
|
+
return `${path2.join(path2.resolve(packageRoot), "dist", "agent-src", "rules")}${path2.sep}`;
|
|
316
|
+
}
|
|
317
|
+
function thin_entry(rule_id, text, bodyLinkPrefix = BODY_LINK_PREFIX) {
|
|
318
|
+
const [fm] = split_frontmatter(text);
|
|
319
|
+
const desc = _description(fm);
|
|
320
|
+
const hint = _trigger_hint(fm);
|
|
321
|
+
const title = _title(rule_id.replace(/-/g, " "));
|
|
322
|
+
const fires = hint ? ` Fires on: ${hint}.` : "";
|
|
323
|
+
return `## ${title}
|
|
324
|
+
${THIN_ENTRY_MARKER}${fires} ${desc} ${THIN_BODY_POINTER_PREFIX}${bodyLinkPrefix}${rule_id}.md
|
|
325
|
+
`;
|
|
326
|
+
}
|
|
327
|
+
var STUB_LAW_OPEN = "<!-- law: byte-copied from the rule, sha256 ";
|
|
328
|
+
var STUB_LAW_CLOSE = "<!-- /law -->";
|
|
329
|
+
function lawDigest(law) {
|
|
330
|
+
return createHash("sha256").update(law, "utf-8").digest("hex").slice(0, 16);
|
|
331
|
+
}
|
|
332
|
+
var StubLawError = class extends Error {
|
|
333
|
+
ruleId;
|
|
334
|
+
constructor(ruleId, message) {
|
|
335
|
+
super(message);
|
|
336
|
+
this.name = "StubLawError";
|
|
337
|
+
this.ruleId = ruleId;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
var STUB_LAW_MAX_CHARS = 2e3;
|
|
341
|
+
function thin_entry_with_law(rule_id, text, bodyLinkPrefix = BODY_LINK_PREFIX) {
|
|
342
|
+
const law = lawText(ruleBody(text));
|
|
343
|
+
if (law === null) {
|
|
344
|
+
throw new StubLawError(
|
|
345
|
+
rule_id,
|
|
346
|
+
`${rule_id} is a high-consequence class member with no law section \u2014 write one, or record it under \`no_stub\` in src/config/rule-consequence-class.json with the reason`
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
if (law.length > STUB_LAW_MAX_CHARS) {
|
|
350
|
+
throw new StubLawError(
|
|
351
|
+
rule_id,
|
|
352
|
+
`${rule_id} is a high-consequence class member whose law section is ${law.length} chars, over the ${STUB_LAW_MAX_CHARS} ceiling \u2014 a stub never ships a shortened copy, so either the law moves under the ceiling or the rule is recorded under \`no_stub\` in src/config/rule-consequence-class.json with the reason`
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
return thin_entry(rule_id, text, bodyLinkPrefix) + `
|
|
356
|
+
${STUB_LAW_OPEN}${lawDigest(law)} -->
|
|
357
|
+
${law}
|
|
358
|
+
${STUB_LAW_CLOSE}
|
|
359
|
+
`;
|
|
360
|
+
}
|
|
361
|
+
function build_thin(rules_dir = RULES_SOURCE, scope = null, announce = null, consequenceClass = null, roots = null) {
|
|
362
|
+
const routerPath = roots?.routerPath ?? (roots?.packageRoot === void 0 ? ROUTER : path2.join(roots.packageRoot, "dist", "router.json"));
|
|
363
|
+
const classRoot = roots?.packageRoot ?? REPO_ROOT;
|
|
364
|
+
const bodyLinkPrefix = roots?.bodyLinkPrefix ?? BODY_LINK_PREFIX;
|
|
365
|
+
const kernel = kernel_ids(routerPath);
|
|
366
|
+
const noTrigger = no_trigger_ids(routerPath);
|
|
367
|
+
const pathOnly = path_only_ids(routerPath);
|
|
368
|
+
const cls = consequenceClass ?? readConsequenceClass(classRoot);
|
|
369
|
+
const lawInStub = stubLawIds(cls);
|
|
370
|
+
const wsMap = scope !== null ? rule_workspaces_map(routerPath) : /* @__PURE__ */ new Map();
|
|
371
|
+
const out = /* @__PURE__ */ new Map();
|
|
372
|
+
for (const p of _globSortedMd(rules_dir)) {
|
|
373
|
+
const text = fs2.readFileSync(p, "utf-8");
|
|
374
|
+
const stem = path2.basename(p).replace(/\.md$/, "");
|
|
375
|
+
if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
const noStub = cls.no_stub[stem] !== void 0;
|
|
379
|
+
const full = kernel.has(stem) || noTrigger.has(stem) || pathOnly.has(stem) || noStub;
|
|
380
|
+
if (announce !== null && noTrigger.has(stem) && !kernel.has(stem)) {
|
|
381
|
+
announce(`D3: trigger-less auto rule ${path2.basename(p)} \u2014 kept full-bodied, never thinned`);
|
|
382
|
+
}
|
|
383
|
+
if (announce !== null && pathOnly.has(stem) && !kernel.has(stem) && !noTrigger.has(stem)) {
|
|
384
|
+
announce(
|
|
385
|
+
`E2: path-only auto rule ${path2.basename(p)} \u2014 kept full-bodied; its only triggers are path-shaped and the delivery concern is not bound on pre_tool_use`
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
if (full) {
|
|
389
|
+
out.set(path2.basename(p), text);
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
if (lawInStub.has(stem)) {
|
|
393
|
+
if (announce !== null) {
|
|
394
|
+
announce(
|
|
395
|
+
`LAW: high-consequence rule ${path2.basename(p)} \u2014 stub carries its own law section, byte-copied`
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
out.set(path2.basename(p), thin_entry_with_law(stem, text, bodyLinkPrefix));
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
out.set(path2.basename(p), thin_entry(stem, text, bodyLinkPrefix));
|
|
402
|
+
}
|
|
403
|
+
return out;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
export {
|
|
407
|
+
appendTxLog,
|
|
408
|
+
readRecentEntries,
|
|
409
|
+
splitFrontmatter,
|
|
410
|
+
ruleBody,
|
|
411
|
+
split_frontmatter,
|
|
412
|
+
THIN_ENTRY_MARKER,
|
|
413
|
+
absoluteBodyLinkPrefix,
|
|
414
|
+
build_thin
|
|
415
|
+
};
|
|
@@ -326,66 +326,6 @@ function update_json_under_lock(target, mutate, options = {}) {
|
|
|
326
326
|
}
|
|
327
327
|
}
|
|
328
328
|
|
|
329
|
-
// src/scripts/_lib/git_common_dir.ts
|
|
330
|
-
import fs2 from "node:fs";
|
|
331
|
-
import path2 from "node:path";
|
|
332
|
-
function realpath_or_self(p) {
|
|
333
|
-
try {
|
|
334
|
-
return fs2.realpathSync(p);
|
|
335
|
-
} catch {
|
|
336
|
-
return p;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
function git_dir(project_root) {
|
|
340
|
-
const dot_git = path2.join(project_root, ".git");
|
|
341
|
-
try {
|
|
342
|
-
const st = fs2.statSync(dot_git);
|
|
343
|
-
if (st.isDirectory()) {
|
|
344
|
-
return realpath_or_self(dot_git);
|
|
345
|
-
}
|
|
346
|
-
const m = fs2.readFileSync(dot_git, "utf-8").match(/^gitdir:\s*(.+)\s*$/m);
|
|
347
|
-
if (m === null) {
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
return realpath_or_self(path2.resolve(project_root, m[1].trim()));
|
|
351
|
-
} catch {
|
|
352
|
-
return null;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
function current_branch(project_root) {
|
|
356
|
-
const gd = git_dir(project_root);
|
|
357
|
-
if (gd === null) return null;
|
|
358
|
-
try {
|
|
359
|
-
const head = fs2.readFileSync(path2.join(gd, "HEAD"), "utf-8").trim();
|
|
360
|
-
const m = head.match(/^ref:\s*refs\/heads\/(.+)$/);
|
|
361
|
-
return m === null ? null : m[1].trim();
|
|
362
|
-
} catch {
|
|
363
|
-
return null;
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
function git_common_dir(project_root) {
|
|
367
|
-
const dot_git = path2.join(project_root, ".git");
|
|
368
|
-
try {
|
|
369
|
-
const st = fs2.statSync(dot_git);
|
|
370
|
-
if (st.isDirectory()) {
|
|
371
|
-
return realpath_or_self(dot_git);
|
|
372
|
-
}
|
|
373
|
-
const m = fs2.readFileSync(dot_git, "utf-8").match(/^gitdir:\s*(.+)\s*$/m);
|
|
374
|
-
if (m === null) {
|
|
375
|
-
return null;
|
|
376
|
-
}
|
|
377
|
-
const gitdir = path2.resolve(project_root, m[1].trim());
|
|
378
|
-
const commondir_file = path2.join(gitdir, "commondir");
|
|
379
|
-
if (fs2.existsSync(commondir_file)) {
|
|
380
|
-
const common = path2.resolve(gitdir, fs2.readFileSync(commondir_file, "utf-8").trim());
|
|
381
|
-
return realpath_or_self(common);
|
|
382
|
-
}
|
|
383
|
-
return realpath_or_self(gitdir);
|
|
384
|
-
} catch {
|
|
385
|
-
return null;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
329
|
export {
|
|
390
330
|
is_replay_mode,
|
|
391
331
|
atomic_write_json,
|
|
@@ -395,8 +335,5 @@ export {
|
|
|
395
335
|
prune_stale_session_states,
|
|
396
336
|
prune_legacy_state_file,
|
|
397
337
|
owns_session_state,
|
|
398
|
-
update_json_under_lock
|
|
399
|
-
git_dir,
|
|
400
|
-
current_branch,
|
|
401
|
-
git_common_dir
|
|
338
|
+
update_json_under_lock
|
|
402
339
|
};
|