@event4u/agent-config 9.9.0 → 9.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +212 -194
- package/README.md +13 -16
- package/agents/templates/.ai-council.yml.example +481 -0
- package/agents/templates/.ai-video.xml.example +247 -0
- package/dist/agent-src/commands/agent-status.md +12 -11
- package/dist/agent-src/commands/agents/user/accept.md +115 -30
- package/dist/agent-src/commands/agents/user/delete.md +147 -0
- package/dist/agent-src/commands/agents/user/review.md +65 -28
- package/dist/agent-src/commands/agents/user/show.md +82 -29
- package/dist/agent-src/commands/agents/user/update.md +2 -2
- package/dist/agent-src/commands/agents/user.md +16 -3
- package/dist/agent-src/commands/check-current-md.md +0 -10
- package/dist/agent-src/commands/condense.md +28 -97
- package/dist/agent-src/commands/cost/report.md +7 -0
- package/dist/agent-src/commands/fix/portability.md +0 -8
- package/dist/agent-src/commands/fix/refs.md +0 -8
- package/dist/agent-src/commands/humanize.md +2 -2
- package/dist/agent-src/commands/jira-ticket.md +1 -1
- package/dist/agent-src/commands/memory/load.md +11 -0
- package/dist/agent-src/commands/optimize/skills.md +1 -1
- package/dist/agent-src/commands/pr/create.md +4 -4
- package/dist/agent-src/commands/profile/show.md +3 -3
- package/dist/agent-src/commands/rule-compliance-audit.md +5 -4
- package/dist/agent-src/commands/security-audit-config.md +1 -1
- package/dist/agent-src/commands/sync/gitignore/fix.md +1 -1
- package/dist/agent-src/commands/tdd.md +21 -0
- package/dist/agent-src/commands/team/delegate.md +2 -2
- package/dist/agent-src/commands/team-knowledge/bootstrap.md +9 -8
- package/dist/agent-src/commands/team-knowledge/consolidate.md +8 -7
- package/dist/agent-src/commands/team.md +4 -1
- package/dist/agent-src/commands/upstream-contribute.md +0 -1
- package/dist/agent-src/contexts/authority/commit-mechanics.md +7 -0
- package/dist/agent-src/contexts/authority/destructive-mechanics.md +16 -0
- package/dist/agent-src/contexts/authority/scope-mechanics.md +61 -0
- package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +20 -18
- package/dist/agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/slash-command-routing-policy-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/source-of-truth-mechanics.md +9 -10
- package/dist/agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +1 -1
- package/dist/agent-src/contexts/communication/rules-auto/user-interaction-mechanics.md +11 -0
- package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +26 -15
- package/dist/agent-src/contexts/contracts/command-suggestion-flow.md +3 -0
- package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +67 -37
- package/dist/agent-src/contexts/execution/auto-orchestration-activation.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-examples.md +1 -1
- package/dist/agent-src/contexts/execution/autonomy-mechanics.md +7 -6
- package/dist/agent-src/contexts/execution/evidence-discipline.md +92 -77
- package/dist/agent-src/contexts/execution/orchestration-benchmark-gate.md +22 -21
- package/dist/agent-src/contexts/execution/orchestration-telemetry.md +24 -0
- package/dist/agent-src/contexts/execution/project-intelligence.md +122 -103
- package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +23 -21
- package/dist/agent-src/contexts/execution/subagent-response-contract.md +5 -5
- package/dist/agent-src/contexts/execution/subagent-routing.md +11 -0
- package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +13 -13
- package/dist/agent-src/contexts/execution/subagent-steering.md +36 -34
- package/dist/agent-src/contexts/execution/toolchain-resolver.md +1 -1
- package/dist/agent-src/contexts/execution/user-memory-channels.md +189 -0
- package/dist/agent-src/contexts/execution/verification-mechanics.md +9 -0
- package/dist/agent-src/contexts/model-recommendations.md +3 -2
- package/dist/agent-src/contexts/subagent-configuration.md +3 -3
- package/dist/agent-src/ghostwriter/README.md +2 -2
- package/dist/agent-src/packs/README.md +1 -1
- package/dist/agent-src/personas/README.md +5 -5
- package/dist/agent-src/personas/_template-specialist/persona.md +3 -3
- package/dist/agent-src/personas/backend-architect.md +24 -23
- package/dist/agent-src/personas/eloquent-tamer.md +30 -30
- package/dist/agent-src/personas/frontend-engineer.md +30 -30
- package/dist/agent-src/personas/product-owner.md +41 -38
- package/dist/agent-src/personas/qa.md +13 -13
- package/dist/agent-src/personas/security-engineer.md +22 -22
- package/dist/agent-src/presets/README.md +3 -3
- package/dist/agent-src/profiles/README.md +3 -3
- package/dist/agent-src/rules/active-remediation.md +2 -2
- package/dist/agent-src/rules/artifact-engagement-recording.md +4 -4
- package/dist/agent-src/rules/ask-when-uncertain.md +0 -4
- package/dist/agent-src/rules/augment-edit-discipline.md +1 -1
- package/dist/agent-src/rules/broken-access-control.md +4 -4
- package/dist/agent-src/rules/code-comment-discipline.md +1 -1
- package/dist/agent-src/rules/code-provenance.md +2 -2
- package/dist/agent-src/rules/commit-policy.md +4 -9
- package/dist/agent-src/rules/communication-through-line.md +5 -5
- package/dist/agent-src/rules/decision-revisit-gate.md +1 -1
- package/dist/agent-src/rules/design-fidelity.md +1 -1
- package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +1 -1
- package/dist/agent-src/rules/domain-safety-pii.md +1 -1
- package/dist/agent-src/rules/external-code-graph-interop.md +1 -1
- package/dist/agent-src/rules/fast-path-marker-visibility.md +43 -7
- package/dist/agent-src/rules/finance-safety-floor.md +1 -1
- package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -3
- package/dist/agent-src/rules/history-discipline.md +1 -1
- package/dist/agent-src/rules/legal-safety-floor.md +1 -1
- package/dist/agent-src/rules/lethal-trifecta-guard.md +5 -5
- package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +10 -8
- package/dist/agent-src/rules/media-governance-routing.md +13 -13
- package/dist/agent-src/rules/media-sync-ground-truth.md +29 -11
- package/dist/agent-src/rules/no-cheap-questions.md +7 -7
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +29 -18
- package/dist/agent-src/rules/non-destructive-by-default.md +5 -23
- package/dist/agent-src/rules/onboarding-gate.md +14 -4
- package/dist/agent-src/rules/persona-governance.md +2 -2
- package/dist/agent-src/rules/prefer-enums-over-literals.md +9 -9
- package/dist/agent-src/rules/preservation-guard.md +10 -2
- package/dist/agent-src/rules/question-not-instruction.md +1 -1
- package/dist/agent-src/rules/roadmap-progress-sync.md +6 -6
- package/dist/agent-src/rules/rule-type-governance.md +1 -1
- package/dist/agent-src/rules/scale-discipline.md +1 -1
- package/dist/agent-src/rules/scope-control.md +1 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +1 -1
- package/dist/agent-src/rules/security-sensitive-stop.md +17 -11
- package/dist/agent-src/rules/senior-engineering-discipline.md +17 -17
- package/dist/agent-src/rules/session-canary.md +1 -1
- package/dist/agent-src/rules/skill-quality.md +1 -1
- package/dist/agent-src/rules/source-confidentiality.md +21 -19
- package/dist/agent-src/rules/source-of-truth.md +6 -5
- package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -2
- package/dist/agent-src/rules/strategy-safety-floor.md +1 -1
- package/dist/agent-src/rules/think-before-action.md +5 -5
- package/dist/agent-src/rules/token-budget-discipline.md +5 -3
- package/dist/agent-src/rules/token-efficiency.md +2 -2
- package/dist/agent-src/rules/untrusted-input-defense.md +4 -4
- package/dist/agent-src/rules/user-interaction.md +12 -0
- package/dist/agent-src/rules/verify-before-complete.md +4 -24
- package/dist/agent-src/skills/adversarial-review/SKILL.md +2 -2
- package/dist/agent-src/skills/agent-security-review/SKILL.md +52 -45
- package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +20 -20
- package/dist/agent-src/skills/ai-council/SKILL.md +185 -128
- package/dist/agent-src/skills/analysis-skill-router/SKILL.md +3 -3
- package/dist/agent-src/skills/api-endpoint/SKILL.md +2 -2
- package/dist/agent-src/skills/artisan-commands/SKILL.md +2 -2
- package/dist/agent-src/skills/async-python-patterns/SKILL.md +8 -7
- package/dist/agent-src/skills/authz-review/SKILL.md +16 -15
- package/dist/agent-src/skills/aws-infrastructure/SKILL.md +5 -5
- package/dist/agent-src/skills/blade-ui/SKILL.md +1 -1
- package/dist/agent-src/skills/bug-analyzer/SKILL.md +30 -12
- package/dist/agent-src/skills/code-intelligence/SKILL.md +0 -1
- package/dist/agent-src/skills/code-intelligence/evals/triggers.json +52 -0
- package/dist/agent-src/skills/code-review/SKILL.md +6 -6
- package/dist/agent-src/skills/command-routing/SKILL.md +5 -4
- package/dist/agent-src/skills/composer-packages/SKILL.md +2 -2
- package/dist/agent-src/skills/condense-memory/SKILL.md +43 -41
- package/dist/agent-src/skills/context-document/SKILL.md +23 -21
- package/dist/agent-src/skills/copilot-config/SKILL.md +6 -1
- package/dist/agent-src/skills/decision-record/SKILL.md +20 -18
- package/dist/agent-src/skills/design-intelligence/SKILL.md +4 -4
- package/dist/agent-src/skills/design-review/SKILL.md +15 -14
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +28 -25
- package/dist/agent-src/skills/devcontainer/SKILL.md +2 -2
- package/dist/agent-src/skills/docker/SKILL.md +1 -1
- package/dist/agent-src/skills/docx-authoring/evals/triggers.json +52 -0
- package/dist/agent-src/skills/emit-tickets/SKILL.md +2 -2
- package/dist/agent-src/skills/error-handling-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/estimate-ticket/SKILL.md +2 -2
- package/dist/agent-src/skills/evaluate-llm-feature/SKILL.md +0 -1
- package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +52 -0
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +21 -7
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/feature-planning/SKILL.md +2 -2
- package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +3 -3
- package/dist/agent-src/skills/flux/SKILL.md +1 -1
- package/dist/agent-src/skills/frontend-render-security/SKILL.md +13 -13
- package/dist/agent-src/skills/git-workflow/SKILL.md +33 -33
- package/dist/agent-src/skills/grafana/SKILL.md +5 -0
- package/dist/agent-src/skills/humanizer/SKILL.md +83 -66
- package/dist/agent-src/skills/humanizer/data/patterns.md +14 -14
- package/dist/agent-src/skills/humanizer/references/anti-aiisms.md +4 -4
- package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +82 -37
- package/dist/agent-src/skills/judge-bug-hunter/SKILL.md +17 -5
- package/dist/agent-src/skills/judge-injection-defense/SKILL.md +63 -25
- package/dist/agent-src/skills/judge-security-auditor/SKILL.md +2 -0
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +72 -28
- package/dist/agent-src/skills/laravel-horizon/SKILL.md +5 -0
- package/dist/agent-src/skills/laravel-mail/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-middleware/SKILL.md +5 -4
- package/dist/agent-src/skills/laravel-notifications/SKILL.md +10 -9
- package/dist/agent-src/skills/laravel-pennant/SKILL.md +1 -1
- package/dist/agent-src/skills/laravel-pulse/SKILL.md +9 -8
- package/dist/agent-src/skills/laravel-reverb/SKILL.md +6 -5
- package/dist/agent-src/skills/laravel-scheduling/SKILL.md +6 -1
- package/dist/agent-src/skills/laravel-validation/SKILL.md +12 -0
- package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +7 -7
- package/dist/agent-src/skills/learning-tutor/SKILL.md +44 -43
- package/dist/agent-src/skills/learning-tutor/evals/triggers.json +52 -0
- package/dist/agent-src/skills/license-compliance-audit/SKILL.md +7 -7
- package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +3 -3
- package/dist/agent-src/skills/license-compliance-credits/SKILL.md +4 -4
- package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +0 -1
- package/dist/agent-src/skills/memory-consolidation/SKILL.md +69 -64
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -6
- package/dist/agent-src/skills/pdf-tools/evals/triggers.json +52 -0
- package/dist/agent-src/skills/performance-analysis/SKILL.md +7 -3
- package/dist/agent-src/skills/persona-improvement/SKILL.md +0 -2
- package/dist/agent-src/skills/persona-improvement/evals/triggers.json +52 -0
- package/dist/agent-src/skills/php-coder/SKILL.md +10 -0
- package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +129 -120
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +36 -35
- package/dist/agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +45 -41
- package/dist/agent-src/skills/project-analysis-core/SKILL.md +4 -4
- package/dist/agent-src/skills/project-analysis-hypothesis-driven/SKILL.md +3 -3
- package/dist/agent-src/skills/project-analysis-react/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-symfony/SKILL.md +1 -1
- package/dist/agent-src/skills/project-analysis-zend-laminas/SKILL.md +2 -2
- package/dist/agent-src/skills/prompt-engineering-patterns/SKILL.md +1 -1
- package/dist/agent-src/skills/prompt-validator/SKILL.md +39 -39
- package/dist/agent-src/skills/quality-tools/SKILL.md +15 -15
- package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +55 -19
- package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +29 -27
- package/dist/agent-src/skills/readme-writing-package/SKILL.md +2 -2
- package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +25 -25
- package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -5
- package/dist/agent-src/skills/refine-prompt/SKILL.md +1 -1
- package/dist/agent-src/skills/refine-ticket/SKILL.md +20 -2
- package/dist/agent-src/skills/repomix-packer/SKILL.md +1 -1
- package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
- package/dist/agent-src/skills/roadmap-management/SKILL.md +80 -66
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +84 -77
- package/dist/agent-src/skills/rule-refactor/SKILL.md +1 -1
- package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +52 -0
- package/dist/agent-src/skills/security-audit/SKILL.md +26 -9
- package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +38 -16
- package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +14 -11
- package/dist/agent-src/skills/skill-writing/SKILL.md +9 -8
- package/dist/agent-src/skills/song-to-script/SKILL.md +93 -85
- package/dist/agent-src/skills/sql-writing/SKILL.md +2 -2
- package/dist/agent-src/skills/stakeholder-tradeoff/SKILL.md +4 -3
- package/dist/agent-src/skills/standards-from-config/SKILL.md +61 -43
- package/dist/agent-src/skills/subagent-orchestration/SKILL.md +22 -8
- package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +28 -2
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +13 -13
- package/dist/agent-src/skills/systematic-debugging/SKILL.md +22 -21
- package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
- package/dist/agent-src/skills/technical-specification/SKILL.md +5 -0
- package/dist/agent-src/skills/terraform/SKILL.md +2 -2
- package/dist/agent-src/skills/terragrunt/SKILL.md +8 -8
- package/dist/agent-src/skills/testing-anti-patterns/process-anti-patterns.md +1 -1
- package/dist/agent-src/skills/threat-modeling/SKILL.md +19 -13
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
- package/dist/agent-src/skills/upstream-contribute/SKILL.md +0 -1
- package/dist/agent-src/skills/using-git-worktrees/SKILL.md +9 -9
- package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -1
- package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +4 -6
- package/dist/agent-src/skills/verify-repair-loop/SKILL.md +67 -61
- package/dist/agent-src/skills/video-director/SKILL.md +7 -7
- package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +3 -3
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/contexts/knowledge-pages.md +47 -45
- package/dist/agent-src/templates/contexts/lesson-card.md +2 -2
- package/dist/agent-src/templates/contexts/tenant-boundaries.md +2 -2
- package/dist/agent-src/templates/contexts.md +1 -1
- package/dist/agent-src/templates/features.md +1 -1
- package/dist/agent-src/templates/roadmaps.md +125 -116
- package/dist/agent-src/templates/rule.md +2 -1
- package/dist/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/dist/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/dist/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/dist/agent-src/user-types/README.md +8 -8
- package/dist/agent-src/user-types/galabau-field-crew.md +34 -33
- package/dist/agent-src/user-types/metalworking-shop.md +35 -34
- package/dist/agent-src/user-types/truck-driver.md +22 -20
- package/dist/cli/initRouting.js +74 -11
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +14 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/python/workspace_roles.js +2 -2
- package/dist/cli/python/workspace_roles.js.map +1 -1
- package/dist/cli-delegate/chunk-4SV3XGFA.js +6910 -0
- package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
- package/dist/cli-delegate/chunk-7DSAMZFU.js +356 -0
- package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
- package/dist/cli-delegate/chunk-BJGXZNPM.js +266 -0
- package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
- package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
- package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
- package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
- package/dist/cli-delegate/chunk-IR7P7JWA.js +872 -0
- package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
- package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
- package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
- package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
- package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
- package/dist/cli-delegate/chunk-RDGRHAAB.js +259 -0
- package/dist/cli-delegate/chunk-TFG57JJM.js +1969 -0
- package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
- package/dist/cli-delegate/chunk-YMFO6FDN.js +10603 -0
- package/dist/cli-delegate/cmd_analyze_session.js +294 -0
- package/dist/cli-delegate/cmd_conformance.js +646 -0
- package/dist/cli-delegate/cmd_converge.js +326 -0
- package/dist/cli-delegate/cmd_doctor.js +144 -0
- package/dist/cli-delegate/cmd_explain.js +2508 -0
- package/dist/cli-delegate/cmd_export.js +296 -0
- package/dist/cli-delegate/cmd_fleet.js +332 -0
- package/dist/cli-delegate/cmd_memory_get.js +3878 -0
- package/dist/cli-delegate/cmd_migrate.js +11 -0
- package/dist/cli-delegate/cmd_preflight.js +270 -0
- package/dist/cli-delegate/cmd_prune.js +444 -0
- package/dist/cli-delegate/cmd_refresh.js +28 -0
- package/dist/cli-delegate/cmd_settings_check.js +574 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +223 -0
- package/dist/cli-delegate/cmd_sync.js +264 -0
- package/dist/cli-delegate/cmd_uninstall.js +656 -0
- package/dist/cli-delegate/cmd_update.js +425 -0
- package/dist/cli-delegate/cmd_upgrade.js +444 -0
- package/dist/cli-delegate/cmd_validate.js +305 -0
- package/dist/cli-delegate/cmd_versions.js +370 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +100 -67
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -4
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +16 -10
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +7 -5
- package/dist/hooks/dispatch.js +186 -12
- package/dist/install/emit_host_rules_cli.js +2 -1
- package/dist/install/emit_host_rules_cli.js.map +1 -1
- package/dist/install/install.mjs +418 -378
- package/dist/install/rule_scope.js +5 -1
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/toolDetection.js +40 -12
- package/dist/install/toolDetection.js.map +1 -1
- package/dist/install/wizard-plan.js +2 -2
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +2194 -1003
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/compile_time_toggles.js +48 -0
- package/dist/scripts/_lib/compile_time_toggles.js.map +1 -0
- package/dist/scripts/condense.js +234 -217
- package/dist/scripts/condense.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -0
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/userMd/utils.js +30 -0
- package/dist/shared/userMd/utils.js.map +1 -1
- package/dist/ui/assets/index-BpSQt5vm.js.map +1 -1
- package/docs/guidelines/agent-infra/api-cost-levers.md +56 -5
- package/docs/guidelines/agent-infra/simplicity-and-goal-demos.md +93 -33
- package/package.json +4 -2
- package/src/agent-src/templates/scripts/pr_risk_review.ts +0 -0
- package/src/agent-src/templates/scripts/telemetry/aggregator.ts +0 -0
- package/src/agent-src/templates/scripts/tier_usage_report.ts +2 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +30 -30
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +22 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +21 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +179 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +155 -4
- package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/src/config/agent-settings.template.yml +32 -2
- package/src/config/ci-local-parity.yml +142 -0
- package/src/config/discovery/packs.yml +7 -0
- package/src/config/evaluator-budgets.json +1 -1
- package/src/config/gate-coverage.yml +127 -0
- package/src/config/pack-size-budget.json +27 -0
- package/src/config/preamble-payload-budget.json +44 -0
- package/src/install/emit_host_rules_cli.ts +2 -1
- package/src/install/rule_scope.ts +5 -1
- package/src/install/toolDetection.ts +39 -8
- package/src/install/wizard-plan.ts +2 -2
- package/src/scripts/_cli/cmd_conformance.ts +2 -1
- package/src/scripts/_cli/cmd_converge.ts +2 -1
- package/src/scripts/_cli/cmd_doctor.ts +292 -15
- package/src/scripts/_cli/cmd_export.ts +2 -1
- package/src/scripts/_cli/cmd_fleet.ts +2 -1
- package/src/scripts/_cli/cmd_migrate.ts +2 -1
- package/src/scripts/_cli/cmd_preflight.ts +2 -1
- package/src/scripts/_cli/cmd_refresh.ts +2 -1
- package/src/scripts/_cli/cmd_update.ts +2 -1
- package/src/scripts/_cli/cmd_upgrade.ts +2 -1
- package/src/scripts/_cli/cmd_versions.ts +2 -1
- package/src/scripts/_cli/detection_report.ts +480 -0
- package/src/scripts/_dispatch.bash +52 -14
- package/src/scripts/_lib/agent_user_profile.ts +381 -0
- package/src/scripts/_lib/agents_overlay.ts +9 -0
- package/src/scripts/_lib/anchor_eval.ts +311 -0
- package/src/scripts/_lib/cc_transcript.ts +316 -0
- package/src/scripts/_lib/changelog_eras.ts +103 -9
- package/src/scripts/_lib/compile_time_toggles.ts +79 -0
- package/src/scripts/_lib/confusables.ts +101 -0
- package/src/scripts/_lib/duplicate_scope_census.ts +77 -0
- package/src/scripts/_lib/environment_detector.ts +441 -0
- package/src/scripts/_lib/managed_agents_folder.ts +181 -0
- package/src/scripts/_lib/package_root.ts +72 -0
- package/src/scripts/_lib/payload_hash_drift.ts +126 -0
- package/src/scripts/_lib/preservation_migration.ts +291 -0
- package/src/scripts/_lib/retrieval_sanitize.ts +166 -2
- package/src/scripts/_lib/scan_scope.ts +115 -0
- package/src/scripts/_lib/user_global_memory_audit.ts +187 -0
- package/src/scripts/_lib/user_global_observations.ts +830 -0
- package/src/scripts/_lib/user_global_revocations.ts +110 -0
- package/src/scripts/_lib/user_memory_gate_counters.ts +291 -0
- package/src/scripts/ai_council/blind_review.ts +0 -0
- package/src/scripts/ai_council/budget_guard.ts +90 -11
- package/src/scripts/ai_council/bundler.ts +2 -2
- package/src/scripts/ai_council/clients.ts +59 -3
- package/src/scripts/ai_council/config.ts +53 -7
- package/src/scripts/ai_council/modes.ts +68 -2
- package/src/scripts/ai_council/orchestrator.ts +54 -9
- package/src/scripts/ai_council/transport_resolver.ts +331 -0
- package/src/scripts/ai_team/team_dispatch.ts +17 -6
- package/src/scripts/anchor_eval_falsify.ts +198 -0
- package/src/scripts/anchor_scoring_run.ts +239 -0
- package/src/scripts/annotate_discovery.ts +1 -65
- package/src/scripts/bench_quality_run.ts +168 -4
- package/src/scripts/cache_realization_report.ts +782 -0
- package/src/scripts/check_artefact_count_messaging.ts +5 -1
- package/src/scripts/check_augment_description_cap.ts +15 -4
- package/src/scripts/check_bundle_path_leakage.ts +10 -4
- package/src/scripts/check_ci_local_parity.ts +317 -0
- package/src/scripts/check_condensation.ts +96 -191
- package/src/scripts/check_context_paths.ts +38 -9
- package/src/scripts/check_dependency_floors.ts +153 -0
- package/src/scripts/check_gate_coverage.ts +299 -0
- package/src/scripts/check_iron_law_prominence.ts +22 -1
- package/src/scripts/check_kernel_prefix_stability.ts +0 -0
- package/src/scripts/check_no_new_legacy_path.ts +16 -6
- package/src/scripts/check_no_roadmap_refs.ts +22 -9
- package/src/scripts/check_originality_freshness.ts +167 -0
- package/src/scripts/check_pack_size.ts +188 -0
- package/src/scripts/check_preamble_payload_budget.ts +130 -0
- package/src/scripts/check_proposal.ts +0 -0
- package/src/scripts/check_references.ts +0 -1
- package/src/scripts/check_safety_floor_untouched.ts +171 -24
- package/src/scripts/check_site_links.ts +62 -3
- package/src/scripts/ci_status.ts +0 -0
- package/src/scripts/cluster_near_miss_patterns.ts +0 -0
- package/src/scripts/code_graph/build.ts +0 -0
- package/src/scripts/command_suggester/types.ts +0 -0
- package/src/scripts/compile_router.ts +10 -14
- package/src/scripts/condense.sh +3 -4
- package/src/scripts/condense.ts +247 -228
- package/src/scripts/cost/track.mjs +168 -33
- package/src/scripts/cost_summary.ts +33 -1
- package/src/scripts/council_cli.ts +51 -5
- package/src/scripts/discovery_graph.ts +0 -0
- package/src/scripts/encoding_corpus.ts +500 -0
- package/src/scripts/encoding_corpus_report.ts +216 -0
- package/src/scripts/evaluator_umbrella.sh +34 -1
- package/src/scripts/generate_index.ts +19 -2
- package/src/scripts/install-hooks.sh +2 -2
- package/src/scripts/learning_sidecar.ts +0 -0
- package/src/scripts/lint_confusables.ts +10 -72
- package/src/scripts/lint_eval_fixture_citations.ts +113 -0
- package/src/scripts/lint_featured_skills.ts +0 -0
- package/src/scripts/lint_hidden_unicode.ts +208 -0
- package/src/scripts/lint_load_context.ts +17 -5
- package/src/scripts/lint_new_skill_gate.ts +9 -3
- package/src/scripts/lint_no_python_twin_rationale.ts +17 -2
- package/src/scripts/lint_originality.ts +1 -1
- package/src/scripts/lint_skill_originality.ts +1 -1
- package/src/scripts/lint_ticket_buildable.ts +1 -1
- package/src/scripts/lint_ui_stack_bundles.ts +170 -0
- package/src/scripts/mcp_server/tools.ts +4 -4
- package/src/scripts/measure_scope_dedup.ts +224 -0
- package/src/scripts/memory_lookup.ts +0 -0
- package/src/scripts/mine_session.ts +98 -0
- package/src/scripts/orchestration_payload_hash_drift.ts +145 -0
- package/src/scripts/preamble_byte_census.ts +574 -0
- package/src/scripts/probe_skill_registration.ts +2 -2
- package/src/scripts/redact_hook_capture.ts +13 -0
- package/src/scripts/release.ts +65 -10
- package/src/scripts/router_telemetry.ts +1 -1
- package/src/scripts/second_brain_retrieval.ts +14 -4
- package/src/scripts/skill_linter.ts +5 -0
- package/src/scripts/surface-tiers.yml +2 -0
- package/src/scripts/validate_pack_yaml.ts +0 -0
- package/src/server/schemas/settings.ts +8 -0
- package/src/shared/userMd/utils.ts +31 -0
- package/dist/agent-src/rules/telegraph-speak.md +0 -87
package/dist/scripts/condense.js
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
/**
|
|
3
|
-
* Agent-config sync —
|
|
3
|
+
* Agent-config sync — project the artefact roots under src/ → dist/agent-src/
|
|
4
4
|
* and project dist/agent-src/ → .augment/ (copies for rules by default,
|
|
5
5
|
* symlinks for the rest; opt into rule symlinks via
|
|
6
6
|
* augment.rules_use_symlinks in .agent-settings.yml).
|
|
7
7
|
*
|
|
8
8
|
* Ported from the retired Python `src/scripts/condense.py` (ADR-200 — Python→TS
|
|
9
|
-
* migration, Phase 5)
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* `--
|
|
13
|
-
*
|
|
14
|
-
*
|
|
9
|
+
* migration, Phase 5), which mirrored the Python CLI surface exactly.
|
|
10
|
+
* ADR-201 then narrowed it: `.md` is copied verbatim + path-rewritten instead of
|
|
11
|
+
* rewritten by an agent, so the condensation-hash cache and its subcommands
|
|
12
|
+
* (`--check-hashes`, `--clean-hashes`, `--mark-done`, `--mark-all-done`) are gone —
|
|
13
|
+
* staleness is read off the projection itself. Remaining surface: `--sync`,
|
|
14
|
+
* `--list`, `--changed`, `--check`, `--generate-tools`, `--clean-tools`,
|
|
15
|
+
* `--project-augment`.
|
|
15
16
|
*
|
|
16
17
|
* Path handling note: the retired Python implementation uses `pathlib.Path` objects.
|
|
17
18
|
* This twin uses absolute path strings (the host filesystem on the
|
|
@@ -22,11 +23,11 @@
|
|
|
22
23
|
* multi-root helper functions (iter_all_sources, resolve_logical,
|
|
23
24
|
* artefact_roots) are exposed through a mutable module-state object so the
|
|
24
25
|
* pytest suite's monkeypatch pattern — reassigning `condense.PROJECT_ROOT`,
|
|
25
|
-
* `condense.
|
|
26
|
+
* `condense.TARGET_DIR`, `condense.iter_all_sources`, … — has a faithful TS
|
|
26
27
|
* equivalent. Tests mutate `MODULE_STATE` via the exported setters.
|
|
27
28
|
*/
|
|
28
|
-
import * as crypto from 'node:crypto';
|
|
29
29
|
import * as fs from 'node:fs';
|
|
30
|
+
import * as os from 'node:os';
|
|
30
31
|
import * as path from 'node:path';
|
|
31
32
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
32
33
|
import * as YAML from 'yaml';
|
|
@@ -34,6 +35,7 @@ import { artefact_roots as _agent_src_artefact_roots, iter_all_sources as _agent
|
|
|
34
35
|
import { build_claude_hook_matrix } from './_lib/claude_settings_hooks.js';
|
|
35
36
|
import { is_claude_builtin_name } from './_lib/claude_builtin_names.js';
|
|
36
37
|
import { project_settings_path, load_agent_settings } from './_lib/agent_settings.js';
|
|
38
|
+
import { rule_is_compile_enabled } from './_lib/compile_time_toggles.js';
|
|
37
39
|
import { info, success, flush_summary, resolve_level } from './_lib/script_output.js';
|
|
38
40
|
import { TIER_TO_CLAUDE_MODEL as _TIER_TO_CLAUDE_MODEL, MODEL_TIER_RE as _MODEL_TIER_RE, } from './_lib/model_tier.js';
|
|
39
41
|
// The Python module imports `_SLUG_PREFIX_RE` from `_lib.agent_src`. The TS
|
|
@@ -201,7 +203,7 @@ function _stripChars(s, chars) {
|
|
|
201
203
|
// =============================================================================
|
|
202
204
|
// Module state — mutable mirror of the Python module-level constants & hooks.
|
|
203
205
|
//
|
|
204
|
-
// The pytest suite reassigns `condense.PROJECT_ROOT`, `condense.
|
|
206
|
+
// The pytest suite reassigns `condense.PROJECT_ROOT`, `condense.TARGET_DIR`,
|
|
205
207
|
// `condense.TARGET_DIR`, `condense.SOURCE_DIR`, `condense.RULES_SOURCE`,
|
|
206
208
|
// `condense.SKILLS_SOURCE`, `condense.COMMANDS_SOURCE`,
|
|
207
209
|
// `condense.CLAUDE_SKILLS_DIR`, `condense.AUGMENT_DIR`, `condense.SETTINGS_FILE`,
|
|
@@ -221,7 +223,6 @@ function _deriveState(root) {
|
|
|
221
223
|
SOURCE_DIR: path.join(root, '.agent-src.uncondensed'),
|
|
222
224
|
TARGET_DIR: path.join(root, 'dist/agent-src'),
|
|
223
225
|
AUGMENT_DIR: path.join(root, '.augment'),
|
|
224
|
-
HASH_FILE: path.join(root, 'internal', '.condensation-hashes.json'),
|
|
225
226
|
SETTINGS_FILE: project_settings_path(root),
|
|
226
227
|
RULES_SOURCE: path.join(root, 'dist/agent-src', 'rules'),
|
|
227
228
|
SKILLS_SOURCE: path.join(root, 'dist/agent-src', 'skills'),
|
|
@@ -334,118 +335,100 @@ function _read_augment_rules_use_symlinks() {
|
|
|
334
335
|
}
|
|
335
336
|
return false;
|
|
336
337
|
}
|
|
337
|
-
|
|
338
|
+
/**
|
|
339
|
+
* Per-tool user-scope rule directory, for the scope-dedup below. Only tools
|
|
340
|
+
* whose host reads a user-scope rules directory can have a redundant twin;
|
|
341
|
+
* everything else has nothing to de-duplicate against.
|
|
342
|
+
*/
|
|
343
|
+
const USER_SCOPE_RULE_DIRS = {
|
|
344
|
+
'.claude/rules': path.join('.claude', 'rules'),
|
|
345
|
+
};
|
|
346
|
+
function _read_projection_scope_dedup() {
|
|
338
347
|
const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
|
|
339
|
-
const
|
|
340
|
-
if (typeof
|
|
341
|
-
|
|
342
|
-
!Array.isArray(lean) &&
|
|
343
|
-
String(lean['mode'] ?? '')
|
|
344
|
-
.trim()
|
|
345
|
-
.toLowerCase() === 'thin') {
|
|
346
|
-
return 'thin';
|
|
348
|
+
const projection = data['projection'];
|
|
349
|
+
if (typeof projection !== 'object' || projection === null || Array.isArray(projection)) {
|
|
350
|
+
return false;
|
|
347
351
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
export function file_hash(filepath) {
|
|
352
|
-
const h = crypto.createHash('sha256');
|
|
353
|
-
h.update(fs.readFileSync(filepath));
|
|
354
|
-
return h.digest('hex');
|
|
355
|
-
}
|
|
356
|
-
const _DEP_FRONTMATTER_KEYS = ['skills', 'rules'];
|
|
357
|
-
function _slug_to_logical(slug) {
|
|
358
|
-
for (const cand of [`skills/${slug}/SKILL.md`, `rules/${slug}.md`]) {
|
|
359
|
-
if (_resolve_source(cand) !== null) {
|
|
360
|
-
return cand;
|
|
361
|
-
}
|
|
352
|
+
const value = projection['scope_dedup'];
|
|
353
|
+
if (typeof value === 'boolean') {
|
|
354
|
+
return value;
|
|
362
355
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
function _direct_includes(relative) {
|
|
366
|
-
const source = _resolve_source(relative);
|
|
367
|
-
if (source === null) {
|
|
368
|
-
return [];
|
|
356
|
+
if (typeof value === 'string') {
|
|
357
|
+
return ['true', 'yes', 'on', '1'].includes(value.trim().toLowerCase());
|
|
369
358
|
}
|
|
370
|
-
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Rules whose user-scope twin is BYTE-IDENTICAL to the source, i.e. safe to
|
|
363
|
+
* skip at project scope: the host still loads the same text, once instead of
|
|
364
|
+
* twice, so nothing the model sees changes.
|
|
365
|
+
*
|
|
366
|
+
* Byte-identity is the whole safety argument and is not negotiable. Keying on
|
|
367
|
+
* the filename alone would silently let a stale globally-installed copy win
|
|
368
|
+
* whenever the two scopes hold different versions — which is the NORMAL state
|
|
369
|
+
* while developing the package (measured: 110/110 shared filenames differing in
|
|
370
|
+
* bytes). This is deliberately not the thin-projection mechanism: no rule
|
|
371
|
+
* becomes trigger-gated, so the quality floor that disabled thin projection
|
|
372
|
+
* does not apply here.
|
|
373
|
+
*/
|
|
374
|
+
function _dedupable_rules(tool_dir, rules, userHome) {
|
|
375
|
+
const relative = USER_SCOPE_RULE_DIRS[tool_dir];
|
|
376
|
+
if (relative === undefined) {
|
|
377
|
+
return new Set();
|
|
378
|
+
}
|
|
379
|
+
// A hostile or simply absent $HOME must make the dedup inert, not
|
|
380
|
+
// adventurous. In a container `$HOME` is often unset (so `homedir()` can
|
|
381
|
+
// resolve to `/`) or world-writable, and this function decides which rules
|
|
382
|
+
// to STOP emitting — reading an unexpected tree there is how a projection
|
|
383
|
+
// silently loses a rule. Council review of PR #1055 raised exactly this.
|
|
384
|
+
let userDirStat;
|
|
385
|
+
const userDir = path.join(userHome, relative);
|
|
371
386
|
try {
|
|
372
|
-
|
|
387
|
+
userDirStat = fs.statSync(userDir);
|
|
373
388
|
}
|
|
374
389
|
catch {
|
|
375
|
-
return
|
|
390
|
+
return new Set();
|
|
376
391
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
const value = meta[key];
|
|
380
|
-
if (!Array.isArray(value)) {
|
|
381
|
-
continue;
|
|
382
|
-
}
|
|
383
|
-
for (const item of value) {
|
|
384
|
-
if (typeof item !== 'string') {
|
|
385
|
-
continue;
|
|
386
|
-
}
|
|
387
|
-
const logical = _slug_to_logical(item.trim());
|
|
388
|
-
if (logical !== null && logical !== relative) {
|
|
389
|
-
deps.push(logical);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
+
if (!userDirStat.isDirectory()) {
|
|
393
|
+
return new Set();
|
|
392
394
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
return '';
|
|
399
|
-
}
|
|
400
|
-
const own = file_hash(source);
|
|
401
|
-
if (_seen !== null && _seen.has(relative)) {
|
|
402
|
-
return own; // cycle — fold own content only
|
|
395
|
+
// World-writable user scope: anyone on the box could plant a byte-identical
|
|
396
|
+
// twin and thereby delete a rule from the project projection. Refuse.
|
|
397
|
+
if ((userDirStat.mode & 0o002) !== 0) {
|
|
398
|
+
_print(` ⚠️ ${tool_dir}: user-scope rules dir is world-writable — scope-dedup skipped`);
|
|
399
|
+
return new Set();
|
|
403
400
|
}
|
|
404
|
-
const
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
const seenNext = new Set(_seen ?? []);
|
|
409
|
-
seenNext.add(relative);
|
|
410
|
-
const parts = [own, ...deps.map((dep) => effective_hash(dep, seenNext))];
|
|
411
|
-
return crypto.createHash('sha256').update(parts.join('\n'), 'utf-8').digest('hex');
|
|
412
|
-
}
|
|
413
|
-
export function load_hashes() {
|
|
414
|
-
if (_exists(MODULE_STATE.HASH_FILE)) {
|
|
401
|
+
const skip = new Set();
|
|
402
|
+
for (const rule of rules) {
|
|
403
|
+
const twin = path.join(userDir, rule);
|
|
404
|
+
const source = path.join(MODULE_STATE.RULES_SOURCE, rule);
|
|
415
405
|
try {
|
|
416
|
-
|
|
406
|
+
if (!_isFile(twin) || !_isFile(source))
|
|
407
|
+
continue;
|
|
408
|
+
if (fs.readFileSync(twin).equals(fs.readFileSync(source))) {
|
|
409
|
+
skip.add(rule);
|
|
410
|
+
}
|
|
417
411
|
}
|
|
418
412
|
catch {
|
|
419
|
-
|
|
413
|
+
// An unreadable twin is simply not de-duplicable — emit the project copy.
|
|
420
414
|
}
|
|
421
415
|
}
|
|
422
|
-
return
|
|
423
|
-
}
|
|
424
|
-
export function save_hashes(hashes) {
|
|
425
|
-
_mkdirp(path.dirname(MODULE_STATE.HASH_FILE));
|
|
426
|
-
_writeText(MODULE_STATE.HASH_FILE, _jsonDumpsSorted(hashes) + '\n');
|
|
416
|
+
return skip;
|
|
427
417
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
const
|
|
431
|
-
if (
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
const source_file = _resolve_source(relative_path);
|
|
439
|
-
if (source_file === null || !_exists(source_file)) {
|
|
440
|
-
_print(`❌ Source file not found: ${relative_path}`);
|
|
441
|
-
process.exit(1);
|
|
418
|
+
function _lean_projection_mode() {
|
|
419
|
+
const data = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
|
|
420
|
+
const lean = data['lean_projection'];
|
|
421
|
+
if (typeof lean === 'object' &&
|
|
422
|
+
lean !== null &&
|
|
423
|
+
!Array.isArray(lean) &&
|
|
424
|
+
String(lean['mode'] ?? '')
|
|
425
|
+
.trim()
|
|
426
|
+
.toLowerCase() === 'thin') {
|
|
427
|
+
return 'thin';
|
|
442
428
|
}
|
|
443
|
-
|
|
444
|
-
const hashes = load_hashes();
|
|
445
|
-
hashes[relative_path] = effective_hash(relative_path);
|
|
446
|
-
save_hashes(hashes);
|
|
447
|
-
_print(`✅ Marked as condensed: ${relative_path}`);
|
|
429
|
+
return 'eager-all';
|
|
448
430
|
}
|
|
431
|
+
// --- hashing -----------------------------------------------------------------
|
|
449
432
|
export function apply_path_rewriter(relative_path) {
|
|
450
433
|
const target = path.join(MODULE_STATE.TARGET_DIR, relative_path);
|
|
451
434
|
if (!_exists(target) || !relative_path.endsWith('.md')) {
|
|
@@ -459,57 +442,63 @@ export function apply_path_rewriter(relative_path) {
|
|
|
459
442
|
_writeText(target, rewritten);
|
|
460
443
|
return true;
|
|
461
444
|
}
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
445
|
+
/**
|
|
446
|
+
* Whether the projection of `relative` is out of date.
|
|
447
|
+
*
|
|
448
|
+
* Post-ADR-201 the projection IS `rewrite(source)` — a pure function of the
|
|
449
|
+
* source's own bytes and its own relative path. So staleness is *observable in
|
|
450
|
+
* the output* rather than inferred from a stored source hash, which is both
|
|
451
|
+
* simpler and strictly stronger: the old hash cache could only tell you the
|
|
452
|
+
* source had moved since someone last claimed to have condensed it. It never
|
|
453
|
+
* looked at dist, so a hand-edited or half-written projection read as current.
|
|
454
|
+
*
|
|
455
|
+
* The dropped dependency-folding (`effective_hash` mixed in the hashes of
|
|
456
|
+
* `skills:` / `rules:` frontmatter deps) has no counterpart here, and needs
|
|
457
|
+
* none: an LLM rewrite could be influenced by a dependency's content, a pure
|
|
458
|
+
* rewrite cannot. Probed rather than assumed — the whole rewriter chain
|
|
459
|
+
* (`_depth_prefix`, `_split_frontmatter`, `_rewrite_body_links`,
|
|
460
|
+
* `_rewrite_frontmatter_lines`, `_parse_trust_and_owner`,
|
|
461
|
+
* `_inject_hrr_banner`) touches no file but its own input.
|
|
462
|
+
*/
|
|
463
|
+
export function is_projection_stale(relative) {
|
|
464
|
+
const source = _resolve_source(relative);
|
|
465
|
+
if (source === null) {
|
|
466
|
+
// No source at all — a leftover in dist. `check_sync` owns that verdict.
|
|
467
|
+
return false;
|
|
468
|
+
}
|
|
469
|
+
if (skip_compile_disabled_rule(relative)) {
|
|
470
|
+
// Deliberately absent from the projection, not out of date.
|
|
471
|
+
return false;
|
|
471
472
|
}
|
|
472
|
-
|
|
473
|
-
|
|
473
|
+
const target = path.join(MODULE_STATE.TARGET_DIR, relative);
|
|
474
|
+
if (!_exists(target)) {
|
|
475
|
+
return true; // never projected
|
|
476
|
+
}
|
|
477
|
+
return _readText(target) !== _rewrite_paths(_readText(source), relative);
|
|
474
478
|
}
|
|
475
479
|
export function list_changed_md(_source_dir) {
|
|
476
480
|
// _source_dir retained for signature compatibility but ignored (multi-root).
|
|
477
|
-
const hashes = load_hashes();
|
|
478
481
|
const changed = [];
|
|
479
|
-
|
|
480
|
-
|
|
482
|
+
const seen = new Set();
|
|
483
|
+
for (const [, relative] of _iter_sources()) {
|
|
484
|
+
if (seen.has(relative)) {
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
seen.add(relative);
|
|
488
|
+
// Resolve through `_resolve_source` rather than trusting the iterator's
|
|
489
|
+
// physical hit: `src/` and `src/agent-src/` are both artefact roots, so
|
|
490
|
+
// one relative path can name two unrelated files and only the resolver
|
|
491
|
+
// knows which one wins.
|
|
492
|
+
const source = _resolve_source(relative);
|
|
493
|
+
if (source === null || !should_condense(source)) {
|
|
481
494
|
continue;
|
|
482
495
|
}
|
|
483
|
-
|
|
484
|
-
const stored_hash = hashes[relative];
|
|
485
|
-
if (stored_hash !== current_hash) {
|
|
496
|
+
if (is_projection_stale(relative)) {
|
|
486
497
|
changed.push(relative);
|
|
487
498
|
}
|
|
488
499
|
}
|
|
489
500
|
return changed;
|
|
490
501
|
}
|
|
491
|
-
export function find_stale_hashes(_source_dir) {
|
|
492
|
-
const hashes = load_hashes();
|
|
493
|
-
const stale = [];
|
|
494
|
-
for (const relative of Object.keys(hashes).sort((a, b) => (a < b ? -1 : a > b ? 1 : 0))) {
|
|
495
|
-
if (_resolve_source(relative) === null) {
|
|
496
|
-
stale.push(relative);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
return stale;
|
|
500
|
-
}
|
|
501
|
-
export function clean_stale_hashes(_source_dir) {
|
|
502
|
-
const stale = find_stale_hashes(_source_dir);
|
|
503
|
-
if (stale.length === 0) {
|
|
504
|
-
return 0;
|
|
505
|
-
}
|
|
506
|
-
const hashes = load_hashes();
|
|
507
|
-
for (const relative of stale) {
|
|
508
|
-
delete hashes[relative];
|
|
509
|
-
}
|
|
510
|
-
save_hashes(hashes);
|
|
511
|
-
return stale.length;
|
|
512
|
-
}
|
|
513
502
|
export function should_condense(filepath) {
|
|
514
503
|
if (path.extname(filepath) !== '.md') {
|
|
515
504
|
return false;
|
|
@@ -579,19 +568,61 @@ export function cleanup_stale(_source_dir, target_dir) {
|
|
|
579
568
|
}
|
|
580
569
|
return deleted;
|
|
581
570
|
}
|
|
571
|
+
/** ADR-201 (accepted 2026-07-29): `.md` is COPIED + path-rewritten, never rewritten
|
|
572
|
+
* by an LLM. Set false to restore the pre-ADR-201 behaviour, where `.md` was skipped
|
|
573
|
+
* here and an agent wrote the condensed body into `dist/` by hand.
|
|
574
|
+
*
|
|
575
|
+
* Measured basis for the removal: 0/429 artifacts saved ≥500 tok, aggregate 0.86%,
|
|
576
|
+
* 267/429 byte-identical, and −36 tok on the always-loaded kernel (condensation made
|
|
577
|
+
* the per-request surface *worse*). Determinism failed by construction: the hash
|
|
578
|
+
* covered the source, never the output, so drift was undetectable — observed live.
|
|
579
|
+
*
|
|
580
|
+
* Council verdict A: `dist/agent-src/` STAYS as a deterministically-produced,
|
|
581
|
+
* git-diffable artifact. Only the *manner* of derivation changes. */
|
|
582
|
+
export const COPY_MD_VERBATIM = true;
|
|
583
|
+
/** True when `relative` is a rule whose compile-time toggle is off, so the projector
|
|
584
|
+
* must not emit it. Exported for the coupling test — without a pinned test the
|
|
585
|
+
* second half of "dormancy" would be asserted rather than enforced, which is the
|
|
586
|
+
* exact failure ADR telegraph/0002 § part 1 records. */
|
|
587
|
+
export function skip_compile_disabled_rule(relative) {
|
|
588
|
+
const posix = relative.split(path.sep).join('/');
|
|
589
|
+
if (!posix.startsWith('rules/') || !posix.endsWith('.md')) {
|
|
590
|
+
return false;
|
|
591
|
+
}
|
|
592
|
+
const rule_id = path.basename(posix, '.md');
|
|
593
|
+
const settings = load_agent_settings({ project_path: MODULE_STATE.SETTINGS_FILE });
|
|
594
|
+
return !rule_is_compile_enabled(rule_id, settings);
|
|
595
|
+
}
|
|
582
596
|
export function sync_non_md(_source_dir, target_dir) {
|
|
583
597
|
let copied = 0;
|
|
584
598
|
const seen = new Set();
|
|
585
599
|
for (const [source_file, relative] of _iter_sources()) {
|
|
586
|
-
if (should_condense(source_file)) {
|
|
587
|
-
continue; // .md
|
|
600
|
+
if (!COPY_MD_VERBATIM && should_condense(source_file)) {
|
|
601
|
+
continue; // pre-ADR-201: .md was condensed by the agent, not copied here
|
|
588
602
|
}
|
|
589
603
|
if (seen.has(relative)) {
|
|
590
604
|
continue;
|
|
591
605
|
}
|
|
606
|
+
// ADR telegraph/0002 § part 1: a compile-time-disabled RULE must not be
|
|
607
|
+
// emitted at all. Router membership alone was never zero-cost — the host
|
|
608
|
+
// reads the projected FILE, so a rule dropped from router.json while its
|
|
609
|
+
// body still shipped kept costing its full token price. One switch, both
|
|
610
|
+
// surfaces. Unknown ids are always emitted (the map gates, it does not
|
|
611
|
+
// allowlist), so this is a no-op for every rule but the gated ones.
|
|
612
|
+
if (skip_compile_disabled_rule(relative)) {
|
|
613
|
+
continue;
|
|
614
|
+
}
|
|
592
615
|
seen.add(relative);
|
|
593
616
|
const target_file = path.join(target_dir, relative);
|
|
594
617
|
copy_file(source_file, target_file);
|
|
618
|
+
// ADR-201: a copied `.md` still needs the ONE deterministic transform the
|
|
619
|
+
// removal deliberately preserves — `apply_path_rewriter` fixes relative
|
|
620
|
+
// links so they resolve from the DELIVERED location (`../../docs/…` →
|
|
621
|
+
// `../docs/…`, ~38 artifacts). Without this the projection's links break.
|
|
622
|
+
// Idempotent: it returns false when nothing changed.
|
|
623
|
+
if (COPY_MD_VERBATIM && relative.endsWith('.md')) {
|
|
624
|
+
apply_path_rewriter(relative);
|
|
625
|
+
}
|
|
595
626
|
_print(` Copied: ${relative}`);
|
|
596
627
|
copied += 1;
|
|
597
628
|
}
|
|
@@ -621,6 +652,12 @@ export function check_sync(_source_dir, target_dir) {
|
|
|
621
652
|
continue;
|
|
622
653
|
}
|
|
623
654
|
seen.add(relative);
|
|
655
|
+
// A compile-disabled rule is deliberately absent from the projection,
|
|
656
|
+
// so demanding a counterpart would report the intended state as a defect.
|
|
657
|
+
// Same predicate the projector and the router compiler use.
|
|
658
|
+
if (skip_compile_disabled_rule(relative)) {
|
|
659
|
+
continue;
|
|
660
|
+
}
|
|
624
661
|
if (!_exists(path.join(target_dir, relative))) {
|
|
625
662
|
missing.push(relative);
|
|
626
663
|
}
|
|
@@ -631,7 +668,10 @@ export function check_sync(_source_dir, target_dir) {
|
|
|
631
668
|
continue;
|
|
632
669
|
}
|
|
633
670
|
const relative = _relativeToPosix(target_file, target_dir);
|
|
634
|
-
|
|
671
|
+
// Two ways a projected file is stale: no source at all, or a source
|
|
672
|
+
// that is compile-disabled — the second is how a re-enabled-then-
|
|
673
|
+
// disabled rule leaves weight behind.
|
|
674
|
+
if (_resolve_source(relative) === null || skip_compile_disabled_rule(relative)) {
|
|
635
675
|
stale.push(relative);
|
|
636
676
|
}
|
|
637
677
|
}
|
|
@@ -898,6 +938,12 @@ function _scoped_rule_basenames() {
|
|
|
898
938
|
return _iterdirSorted(MODULE_STATE.RULES_SOURCE)
|
|
899
939
|
.filter((p) => p.endsWith('.md') && _isFile(p))
|
|
900
940
|
.filter((p) => rule_in_scope(p, scope, pack_scope))
|
|
941
|
+
// A compile-disabled rule has no dist/agent-src/ counterpart, so a per-tool
|
|
942
|
+
// symlink to it would dangle. The source file still exists, which is why the
|
|
943
|
+
// scope filters alone let it through — the toggle is a separate axis and this
|
|
944
|
+
// is its fourth consumer, after the router compiler, the dist writer, and
|
|
945
|
+
// check_sync. Same predicate in all four; that is the point.
|
|
946
|
+
.filter((p) => !skip_compile_disabled_rule(`rules/${path.basename(p)}`))
|
|
901
947
|
.map((p) => path.basename(p))
|
|
902
948
|
.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
|
|
903
949
|
}
|
|
@@ -911,18 +957,27 @@ export function generate_rule_symlinks() {
|
|
|
911
957
|
// a consumer actually enables it, mirroring an unmet import.
|
|
912
958
|
throw new Error('lean_projection.mode=thin requires project_thin_rules (not ported in condense.ts)');
|
|
913
959
|
}
|
|
960
|
+
const dedup_on = _read_projection_scope_dedup();
|
|
961
|
+
const user_home = process.env['HOME'] ?? os.homedir();
|
|
962
|
+
const skipped_per_tool = {};
|
|
914
963
|
let total = 0;
|
|
915
964
|
for (const [tool_dir, rel_prefix] of Object.entries(tool_dirs)) {
|
|
916
965
|
const target_dir = path.join(MODULE_STATE.PROJECT_ROOT, tool_dir);
|
|
966
|
+
const skip = dedup_on ? _dedupable_rules(tool_dir, rules, user_home) : new Set();
|
|
967
|
+
skipped_per_tool[tool_dir] = skip;
|
|
917
968
|
_mkdirp(target_dir);
|
|
918
|
-
// Clean stale symlinks
|
|
969
|
+
// Clean stale symlinks — a rule that became de-duplicable this run is
|
|
970
|
+
// stale at project scope too, so it has to go with the rest.
|
|
919
971
|
for (const item of _iterdirSorted(target_dir)) {
|
|
920
972
|
const name = path.basename(item);
|
|
921
|
-
if (_isSymlink(item) && !rules.includes(name) && name !== 'README.md') {
|
|
973
|
+
if (_isSymlink(item) && (!rules.includes(name) || skip.has(name)) && name !== 'README.md') {
|
|
922
974
|
fs.unlinkSync(item);
|
|
923
975
|
}
|
|
924
976
|
}
|
|
925
977
|
for (const rule of rules) {
|
|
978
|
+
if (skip.has(rule)) {
|
|
979
|
+
continue;
|
|
980
|
+
}
|
|
926
981
|
const link = path.join(target_dir, rule);
|
|
927
982
|
if (_existsOrSymlink(link)) {
|
|
928
983
|
fs.unlinkSync(link);
|
|
@@ -939,9 +994,23 @@ export function generate_rule_symlinks() {
|
|
|
939
994
|
const source_count = rules.length;
|
|
940
995
|
for (const tool_dir of Object.keys(tool_dirs)) {
|
|
941
996
|
const target_dir = path.join(MODULE_STATE.PROJECT_ROOT, tool_dir);
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
997
|
+
// Count only the RULES this run emitted, not every `.md` in the tree.
|
|
998
|
+
// Some tool trees legitimately receive other artefact classes — the cline
|
|
999
|
+
// tree also carries `*.subagent.md` — and counting those produced a
|
|
1000
|
+
// permanent "111 rules (expected 110)" warning that was pure noise. A
|
|
1001
|
+
// warning that is always on is a warning nobody reads.
|
|
1002
|
+
const emitted = new Set(rules);
|
|
1003
|
+
const tool_count = _iterdirSorted(target_dir).filter((f) => emitted.has(path.basename(f))).length;
|
|
1004
|
+
// Expect the de-duplicated count, not the source count: a skipped rule is
|
|
1005
|
+
// an intended absence, so warning on it would train the reader to ignore
|
|
1006
|
+
// this line — which is how a real drift gets missed.
|
|
1007
|
+
const skipped = (skipped_per_tool[tool_dir] ?? new Set()).size;
|
|
1008
|
+
const expected = source_count - skipped;
|
|
1009
|
+
if (tool_count !== expected) {
|
|
1010
|
+
_print(` ⚠️ ${tool_dir}: ${tool_count} rules (expected ${expected})`);
|
|
1011
|
+
}
|
|
1012
|
+
if (skipped > 0) {
|
|
1013
|
+
_print(` ℹ️ ${tool_dir}: ${skipped} rule(s) skipped — byte-identical twin already installed at user scope`);
|
|
945
1014
|
}
|
|
946
1015
|
}
|
|
947
1016
|
info(` ✅ Created ${total} rule symlinks across ${Object.keys(tool_dirs).length} tool directories (${source_count} rules each)`);
|
|
@@ -2056,7 +2125,7 @@ function _print(line) {
|
|
|
2056
2125
|
}
|
|
2057
2126
|
export function main(argv = process.argv.slice(2)) {
|
|
2058
2127
|
if (!_exists(MODULE_STATE.SOURCE_DIR) && !_any_source_root_exists()) {
|
|
2059
|
-
_print(`❌ No source directory found (looked at ${MODULE_STATE.SOURCE_DIR}
|
|
2128
|
+
_print(`❌ No source directory found (looked at the artefact roots under src/ and ${MODULE_STATE.SOURCE_DIR})`);
|
|
2060
2129
|
return 1;
|
|
2061
2130
|
}
|
|
2062
2131
|
const arg = argv.length > 0 ? argv[0] : '--sync';
|
|
@@ -2070,28 +2139,18 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
2070
2139
|
else if (arg === '--changed') {
|
|
2071
2140
|
const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
|
|
2072
2141
|
if (changed.length === 0) {
|
|
2073
|
-
_print('✅
|
|
2142
|
+
_print('✅ Every .md projection matches its source');
|
|
2074
2143
|
return 0;
|
|
2075
2144
|
}
|
|
2076
|
-
_print(`📝 ${changed.length} .md
|
|
2145
|
+
_print(`📝 ${changed.length} .md projection(s) out of date — run 'task sync':\n`);
|
|
2077
2146
|
for (const f of changed) {
|
|
2078
2147
|
_print(` ${f}`);
|
|
2079
2148
|
}
|
|
2080
2149
|
}
|
|
2081
|
-
else if (arg === '--mark-done') {
|
|
2082
|
-
if (argv.length < 2) {
|
|
2083
|
-
_print('Usage: python scripts/condense.py --mark-done <relative-path>');
|
|
2084
|
-
return 1;
|
|
2085
|
-
}
|
|
2086
|
-
mark_done(argv[1]);
|
|
2087
|
-
}
|
|
2088
|
-
else if (arg === '--mark-all-done') {
|
|
2089
|
-
mark_all_done();
|
|
2090
|
-
}
|
|
2091
2150
|
else if (arg === '--check') {
|
|
2092
2151
|
const [missing, stale] = check_sync(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
|
|
2093
2152
|
if (missing.length === 0 && stale.length === 0) {
|
|
2094
|
-
_print('✅ dist/agent-src/ is in sync with
|
|
2153
|
+
_print('✅ dist/agent-src/ is in sync with the artefact roots under src/');
|
|
2095
2154
|
return 0;
|
|
2096
2155
|
}
|
|
2097
2156
|
if (missing.length > 0) {
|
|
@@ -2106,73 +2165,31 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
2106
2165
|
_print(` ${f}`);
|
|
2107
2166
|
}
|
|
2108
2167
|
}
|
|
2109
|
-
_print(`\nRun 'task sync'
|
|
2168
|
+
_print(`\nRun 'task sync' — the projection is a deterministic copy, so it needs no agent step.`);
|
|
2110
2169
|
return 1;
|
|
2111
2170
|
}
|
|
2112
2171
|
else if (arg === '--sync') {
|
|
2113
|
-
|
|
2172
|
+
// SOURCE_DIR is the pre-ADR-051 single root, kept only as a fallback probe;
|
|
2173
|
+
// the real inputs are the artefact roots the multi-root iterator walks.
|
|
2174
|
+
_print(`Source: the artefact roots under src/`);
|
|
2114
2175
|
_print(`Target: ${MODULE_STATE.TARGET_DIR}\n`);
|
|
2115
2176
|
_print('--- Syncing non-.md files ---');
|
|
2116
2177
|
const copied = sync_non_md(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
|
|
2117
2178
|
_print(`\n--- Cleanup stale files ---`);
|
|
2118
2179
|
const deleted = cleanup_stale(MODULE_STATE.SOURCE_DIR, MODULE_STATE.TARGET_DIR);
|
|
2119
|
-
const hashes = load_hashes();
|
|
2120
|
-
const stale_keys = Object.keys(hashes).filter((k) => _resolve_source(k) === null);
|
|
2121
|
-
for (const k of stale_keys) {
|
|
2122
|
-
delete hashes[k];
|
|
2123
|
-
}
|
|
2124
|
-
if (stale_keys.length > 0) {
|
|
2125
|
-
save_hashes(hashes);
|
|
2126
|
-
_print(` Cleaned ${stale_keys.length} stale hash entries`);
|
|
2127
|
-
}
|
|
2128
2180
|
const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
|
|
2129
2181
|
_print(`\n✅ Done: ${copied} copied, ${deleted} stale deleted`);
|
|
2130
2182
|
if (changed.length > 0) {
|
|
2131
|
-
|
|
2183
|
+
// --sync writes .md itself, so anything still stale here is a bug in
|
|
2184
|
+
// the projector, not work left for a follow-up step.
|
|
2185
|
+
_print(`❌ ${changed.length} .md projection(s) still out of date after sync (run --changed)`);
|
|
2132
2186
|
}
|
|
2133
2187
|
else {
|
|
2134
|
-
_print(`✅
|
|
2188
|
+
_print(`✅ Every .md projection matches its source`);
|
|
2135
2189
|
}
|
|
2136
2190
|
_print(`\n--- Projecting dist/agent-src/ → .augment/ ---`);
|
|
2137
2191
|
project_to_augment();
|
|
2138
2192
|
}
|
|
2139
|
-
else if (arg === '--check-hashes') {
|
|
2140
|
-
let has_issues = false;
|
|
2141
|
-
const changed = list_changed_md(MODULE_STATE.SOURCE_DIR);
|
|
2142
|
-
const stale = find_stale_hashes(MODULE_STATE.SOURCE_DIR);
|
|
2143
|
-
if (stale.length > 0) {
|
|
2144
|
-
has_issues = true;
|
|
2145
|
-
_print(`⚠️ ${stale.length} stale hash(es) for deleted source files:\n`);
|
|
2146
|
-
for (const f of stale) {
|
|
2147
|
-
_print(` ${f}`);
|
|
2148
|
-
}
|
|
2149
|
-
_print(`\nRun 'task sync-clean-hashes' to remove them.\n`);
|
|
2150
|
-
}
|
|
2151
|
-
if (changed.length > 0) {
|
|
2152
|
-
has_issues = true;
|
|
2153
|
-
_print(`❌ ${changed.length} .md file(s) need recondensation:\n`);
|
|
2154
|
-
for (const f of changed) {
|
|
2155
|
-
const stored = load_hashes()[f];
|
|
2156
|
-
const reason = stored === undefined ? 'no hash stored' : 'hash mismatch';
|
|
2157
|
-
_print(` ${f} (${reason})`);
|
|
2158
|
-
}
|
|
2159
|
-
_print(`\nRun '/condense' command to recondense these files.`);
|
|
2160
|
-
}
|
|
2161
|
-
if (!has_issues) {
|
|
2162
|
-
_print('✅ All condensation hashes are clean (no stale, no mismatches)');
|
|
2163
|
-
return 0;
|
|
2164
|
-
}
|
|
2165
|
-
return 1;
|
|
2166
|
-
}
|
|
2167
|
-
else if (arg === '--clean-hashes') {
|
|
2168
|
-
const count = clean_stale_hashes(MODULE_STATE.SOURCE_DIR);
|
|
2169
|
-
if (count) {
|
|
2170
|
-
_print(`✅ Removed ${count} stale hash(es)`);
|
|
2171
|
-
}
|
|
2172
|
-
else {
|
|
2173
|
-
_print('✅ No stale hashes found');
|
|
2174
|
-
}
|
|
2175
|
-
}
|
|
2176
2193
|
else if (arg === '--generate-tools') {
|
|
2177
2194
|
generate_tools();
|
|
2178
2195
|
}
|
|
@@ -2183,7 +2200,7 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
2183
2200
|
project_to_augment();
|
|
2184
2201
|
}
|
|
2185
2202
|
else {
|
|
2186
|
-
_print('Usage:
|
|
2203
|
+
_print('Usage: condense [--sync|--list|--changed|--check|--generate-tools|--clean-tools|--project-augment]');
|
|
2187
2204
|
return 1;
|
|
2188
2205
|
}
|
|
2189
2206
|
return 0;
|