mustflow 1.15.97
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/LICENSE +16 -0
- package/README.md +422 -0
- package/dist/cli/commands/check.js +73 -0
- package/dist/cli/commands/classify.js +104 -0
- package/dist/cli/commands/context.js +95 -0
- package/dist/cli/commands/contract-lint.js +74 -0
- package/dist/cli/commands/dashboard.js +654 -0
- package/dist/cli/commands/docs.js +382 -0
- package/dist/cli/commands/doctor.js +232 -0
- package/dist/cli/commands/explain.js +293 -0
- package/dist/cli/commands/help.js +148 -0
- package/dist/cli/commands/impact.js +120 -0
- package/dist/cli/commands/index.js +70 -0
- package/dist/cli/commands/init.js +986 -0
- package/dist/cli/commands/line-endings.js +102 -0
- package/dist/cli/commands/map.js +95 -0
- package/dist/cli/commands/run.js +442 -0
- package/dist/cli/commands/search.js +166 -0
- package/dist/cli/commands/status.js +65 -0
- package/dist/cli/commands/update.js +443 -0
- package/dist/cli/commands/verify.js +448 -0
- package/dist/cli/commands/version-sources.js +79 -0
- package/dist/cli/commands/version.js +57 -0
- package/dist/cli/i18n/en.js +702 -0
- package/dist/cli/i18n/es.js +702 -0
- package/dist/cli/i18n/fr.js +702 -0
- package/dist/cli/i18n/hi.js +702 -0
- package/dist/cli/i18n/ko.js +702 -0
- package/dist/cli/i18n/zh.js +702 -0
- package/dist/cli/index.js +218 -0
- package/dist/cli/lib/agent-context.js +342 -0
- package/dist/cli/lib/browser-open.js +58 -0
- package/dist/cli/lib/cli-output.js +36 -0
- package/dist/cli/lib/command-contract.js +1 -0
- package/dist/cli/lib/command-registry.js +107 -0
- package/dist/cli/lib/dashboard-html.js +1866 -0
- package/dist/cli/lib/dashboard-locale.js +309 -0
- package/dist/cli/lib/dashboard-preferences.js +405 -0
- package/dist/cli/lib/doc-review-ledger.js +226 -0
- package/dist/cli/lib/filesystem.js +125 -0
- package/dist/cli/lib/git-changes.js +13 -0
- package/dist/cli/lib/i18n.js +55 -0
- package/dist/cli/lib/local-index.js +1014 -0
- package/dist/cli/lib/locale-tags.js +4 -0
- package/dist/cli/lib/manifest-lock.js +131 -0
- package/dist/cli/lib/npm-version-check.js +97 -0
- package/dist/cli/lib/package-info.js +13 -0
- package/dist/cli/lib/preferences-options.js +8 -0
- package/dist/cli/lib/project-root.js +23 -0
- package/dist/cli/lib/repo-map.js +635 -0
- package/dist/cli/lib/reporter.js +8 -0
- package/dist/cli/lib/run-receipt.js +1 -0
- package/dist/cli/lib/template-i18n.js +265 -0
- package/dist/cli/lib/templates.js +188 -0
- package/dist/cli/lib/toml.js +1 -0
- package/dist/cli/lib/validation.js +1639 -0
- package/dist/cli/lib/version-sources.js +1 -0
- package/dist/core/authority-resolution.js +155 -0
- package/dist/core/change-classification.js +122 -0
- package/dist/core/change-verification.js +80 -0
- package/dist/core/check-issues.js +67 -0
- package/dist/core/command-classification.js +22 -0
- package/dist/core/command-contract-rules.js +27 -0
- package/dist/core/command-contract-validation.js +197 -0
- package/dist/core/command-cwd.js +12 -0
- package/dist/core/command-effects.js +182 -0
- package/dist/core/command-explanation.js +135 -0
- package/dist/core/command-intent-eligibility.js +76 -0
- package/dist/core/config-loading.js +54 -0
- package/dist/core/contract-lint.js +110 -0
- package/dist/core/contract-models.js +53 -0
- package/dist/core/dashboard-verification.js +132 -0
- package/dist/core/doc-review-triage.js +92 -0
- package/dist/core/line-endings.js +144 -0
- package/dist/core/public-json-contracts.js +112 -0
- package/dist/core/public-surface-explanation.js +49 -0
- package/dist/core/release-version-validation.js +53 -0
- package/dist/core/retention-explanation.js +74 -0
- package/dist/core/retention-policy.js +57 -0
- package/dist/core/run-receipt.js +77 -0
- package/dist/core/skill-route-alignment.js +100 -0
- package/dist/core/skill-route-explanation.js +117 -0
- package/dist/core/source-anchor-explanation.js +33 -0
- package/dist/core/source-anchor-status.js +269 -0
- package/dist/core/source-anchor-symbols.js +181 -0
- package/dist/core/source-anchor-validation.js +158 -0
- package/dist/core/source-anchors.js +194 -0
- package/dist/core/surface-decision-model.js +18 -0
- package/dist/core/toml.js +11 -0
- package/dist/core/verification-plan.js +41 -0
- package/dist/core/verification-scheduler.js +92 -0
- package/dist/core/version-impact.js +54 -0
- package/dist/core/version-sources.js +235 -0
- package/dist/core/version-sync-policy.js +85 -0
- package/examples/README.md +13 -0
- package/examples/docs-only/README.md +72 -0
- package/examples/host-instruction-conflicts/README.md +47 -0
- package/examples/minimal-js/README.md +98 -0
- package/examples/missing-command-contracts/README.md +70 -0
- package/examples/nested-repos/README.md +62 -0
- package/package.json +80 -0
- package/schemas/README.md +32 -0
- package/schemas/change-verification-report.schema.json +319 -0
- package/schemas/classify-report.schema.json +113 -0
- package/schemas/commands.schema.json +116 -0
- package/schemas/context-report.schema.json +341 -0
- package/schemas/contract-lint-report.schema.json +61 -0
- package/schemas/docs-review-list.schema.json +72 -0
- package/schemas/doctor-report.schema.json +175 -0
- package/schemas/explain-report.schema.json +471 -0
- package/schemas/impact-report.schema.json +121 -0
- package/schemas/line-endings-report.schema.json +63 -0
- package/schemas/run-receipt.schema.json +75 -0
- package/schemas/verify-report.schema.json +67 -0
- package/schemas/version-sources-report.schema.json +42 -0
- package/templates/default/common/.mustflow/config/commands.toml +251 -0
- package/templates/default/common/.mustflow/config/mustflow.toml +424 -0
- package/templates/default/common/.mustflow/config/preferences.toml +125 -0
- package/templates/default/common/gitignore.mustflow +9 -0
- package/templates/default/i18n.toml +483 -0
- package/templates/default/locales/en/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/en/.mustflow/context/PROJECT.md +66 -0
- package/templates/default/locales/en/.mustflow/docs/agent-workflow.md +345 -0
- package/templates/default/locales/en/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/en/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/en/.mustflow/skills/artifact-integrity-check/SKILL.md +121 -0
- package/templates/default/locales/en/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/en/.mustflow/skills/code-review/SKILL.md +115 -0
- package/templates/default/locales/en/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/en/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/en/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/en/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/en/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/en/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/en/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/en/.mustflow/skills/diff-risk-review/SKILL.md +143 -0
- package/templates/default/locales/en/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/en/.mustflow/skills/docs-update/SKILL.md +100 -0
- package/templates/default/locales/en/.mustflow/skills/external-prompt-injection-defense/SKILL.md +124 -0
- package/templates/default/locales/en/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/en/.mustflow/skills/failure-triage/SKILL.md +97 -0
- package/templates/default/locales/en/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/en/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/en/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/en/.mustflow/skills/multi-agent-work-coordination/SKILL.md +260 -0
- package/templates/default/locales/en/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/en/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/en/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/en/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/en/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/en/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/en/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/en/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/en/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/en/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/en/.mustflow/skills/security-privacy-review/SKILL.md +130 -0
- package/templates/default/locales/en/.mustflow/skills/security-regression-tests/SKILL.md +157 -0
- package/templates/default/locales/en/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/en/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/en/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/en/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/en/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/en/.mustflow/skills/test-maintenance/SKILL.md +122 -0
- package/templates/default/locales/en/.mustflow/skills/ui-quality-gate/SKILL.md +119 -0
- package/templates/default/locales/en/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/en/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/en/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/en/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/en/AGENTS.md +114 -0
- package/templates/default/locales/es/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/es/.mustflow/context/PROJECT.md +63 -0
- package/templates/default/locales/es/.mustflow/docs/agent-workflow.md +365 -0
- package/templates/default/locales/es/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/es/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/es/.mustflow/skills/artifact-integrity-check/SKILL.md +114 -0
- package/templates/default/locales/es/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/es/.mustflow/skills/code-review/SKILL.md +115 -0
- package/templates/default/locales/es/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/es/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/es/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/es/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/es/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/es/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/es/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/es/.mustflow/skills/diff-risk-review/SKILL.md +136 -0
- package/templates/default/locales/es/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/es/.mustflow/skills/docs-update/SKILL.md +97 -0
- package/templates/default/locales/es/.mustflow/skills/external-prompt-injection-defense/SKILL.md +116 -0
- package/templates/default/locales/es/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/es/.mustflow/skills/failure-triage/SKILL.md +97 -0
- package/templates/default/locales/es/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/es/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/es/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/es/.mustflow/skills/multi-agent-work-coordination/SKILL.md +260 -0
- package/templates/default/locales/es/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/es/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/es/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/es/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/es/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/es/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/es/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/es/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/es/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/es/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/es/.mustflow/skills/security-privacy-review/SKILL.md +116 -0
- package/templates/default/locales/es/.mustflow/skills/security-regression-tests/SKILL.md +131 -0
- package/templates/default/locales/es/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/es/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/es/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/es/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/es/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/es/.mustflow/skills/test-maintenance/SKILL.md +122 -0
- package/templates/default/locales/es/.mustflow/skills/ui-quality-gate/SKILL.md +117 -0
- package/templates/default/locales/es/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/es/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/es/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/es/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/es/AGENTS.md +83 -0
- package/templates/default/locales/fr/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/fr/.mustflow/context/PROJECT.md +63 -0
- package/templates/default/locales/fr/.mustflow/docs/agent-workflow.md +368 -0
- package/templates/default/locales/fr/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/fr/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/fr/.mustflow/skills/artifact-integrity-check/SKILL.md +114 -0
- package/templates/default/locales/fr/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/fr/.mustflow/skills/code-review/SKILL.md +115 -0
- package/templates/default/locales/fr/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/fr/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/fr/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/fr/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/fr/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/fr/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/fr/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/fr/.mustflow/skills/diff-risk-review/SKILL.md +136 -0
- package/templates/default/locales/fr/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/fr/.mustflow/skills/docs-update/SKILL.md +97 -0
- package/templates/default/locales/fr/.mustflow/skills/external-prompt-injection-defense/SKILL.md +116 -0
- package/templates/default/locales/fr/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/fr/.mustflow/skills/failure-triage/SKILL.md +97 -0
- package/templates/default/locales/fr/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/fr/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/fr/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/fr/.mustflow/skills/multi-agent-work-coordination/SKILL.md +260 -0
- package/templates/default/locales/fr/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/fr/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/fr/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/fr/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/fr/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/fr/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/fr/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/fr/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/fr/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/fr/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/fr/.mustflow/skills/security-privacy-review/SKILL.md +116 -0
- package/templates/default/locales/fr/.mustflow/skills/security-regression-tests/SKILL.md +131 -0
- package/templates/default/locales/fr/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/fr/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/fr/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/fr/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/fr/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/fr/.mustflow/skills/test-maintenance/SKILL.md +122 -0
- package/templates/default/locales/fr/.mustflow/skills/ui-quality-gate/SKILL.md +117 -0
- package/templates/default/locales/fr/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/fr/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/fr/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/fr/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/fr/AGENTS.md +84 -0
- package/templates/default/locales/hi/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/hi/.mustflow/context/PROJECT.md +65 -0
- package/templates/default/locales/hi/.mustflow/docs/agent-workflow.md +359 -0
- package/templates/default/locales/hi/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/hi/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/hi/.mustflow/skills/artifact-integrity-check/SKILL.md +114 -0
- package/templates/default/locales/hi/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/hi/.mustflow/skills/code-review/SKILL.md +115 -0
- package/templates/default/locales/hi/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/hi/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/hi/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/hi/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/hi/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/hi/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/hi/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/hi/.mustflow/skills/diff-risk-review/SKILL.md +136 -0
- package/templates/default/locales/hi/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/hi/.mustflow/skills/docs-update/SKILL.md +97 -0
- package/templates/default/locales/hi/.mustflow/skills/external-prompt-injection-defense/SKILL.md +116 -0
- package/templates/default/locales/hi/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/hi/.mustflow/skills/failure-triage/SKILL.md +97 -0
- package/templates/default/locales/hi/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/hi/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/hi/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/hi/.mustflow/skills/multi-agent-work-coordination/SKILL.md +260 -0
- package/templates/default/locales/hi/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/hi/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/hi/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/hi/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/hi/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/hi/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/hi/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/hi/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/hi/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/hi/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/hi/.mustflow/skills/security-privacy-review/SKILL.md +116 -0
- package/templates/default/locales/hi/.mustflow/skills/security-regression-tests/SKILL.md +131 -0
- package/templates/default/locales/hi/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/hi/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/hi/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/hi/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/hi/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/hi/.mustflow/skills/test-maintenance/SKILL.md +122 -0
- package/templates/default/locales/hi/.mustflow/skills/ui-quality-gate/SKILL.md +117 -0
- package/templates/default/locales/hi/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/hi/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/hi/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/hi/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/hi/AGENTS.md +83 -0
- package/templates/default/locales/ko/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/ko/.mustflow/context/PROJECT.md +66 -0
- package/templates/default/locales/ko/.mustflow/docs/agent-workflow.md +506 -0
- package/templates/default/locales/ko/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/ko/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/ko/.mustflow/skills/artifact-integrity-check/SKILL.md +114 -0
- package/templates/default/locales/ko/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/ko/.mustflow/skills/code-review/SKILL.md +118 -0
- package/templates/default/locales/ko/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/ko/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/ko/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/ko/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/ko/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/ko/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/ko/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/ko/.mustflow/skills/diff-risk-review/SKILL.md +136 -0
- package/templates/default/locales/ko/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/ko/.mustflow/skills/docs-update/SKILL.md +107 -0
- package/templates/default/locales/ko/.mustflow/skills/external-prompt-injection-defense/SKILL.md +116 -0
- package/templates/default/locales/ko/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/ko/.mustflow/skills/failure-triage/SKILL.md +119 -0
- package/templates/default/locales/ko/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/ko/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/ko/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/ko/.mustflow/skills/multi-agent-work-coordination/SKILL.md +259 -0
- package/templates/default/locales/ko/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/ko/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/ko/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/ko/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/ko/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/ko/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/ko/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/ko/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/ko/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/ko/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/ko/.mustflow/skills/security-privacy-review/SKILL.md +116 -0
- package/templates/default/locales/ko/.mustflow/skills/security-regression-tests/SKILL.md +131 -0
- package/templates/default/locales/ko/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/ko/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/ko/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/ko/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/ko/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/ko/.mustflow/skills/test-maintenance/SKILL.md +130 -0
- package/templates/default/locales/ko/.mustflow/skills/ui-quality-gate/SKILL.md +117 -0
- package/templates/default/locales/ko/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/ko/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/ko/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/ko/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/ko/AGENTS.md +85 -0
- package/templates/default/locales/zh/.mustflow/context/INDEX.md +39 -0
- package/templates/default/locales/zh/.mustflow/context/PROJECT.md +64 -0
- package/templates/default/locales/zh/.mustflow/docs/agent-workflow.md +310 -0
- package/templates/default/locales/zh/.mustflow/skills/INDEX.md +78 -0
- package/templates/default/locales/zh/.mustflow/skills/adapter-boundary/SKILL.md +193 -0
- package/templates/default/locales/zh/.mustflow/skills/artifact-integrity-check/SKILL.md +114 -0
- package/templates/default/locales/zh/.mustflow/skills/behavior-preserving-refactor/SKILL.md +182 -0
- package/templates/default/locales/zh/.mustflow/skills/code-review/SKILL.md +115 -0
- package/templates/default/locales/zh/.mustflow/skills/codebase-orientation/SKILL.md +115 -0
- package/templates/default/locales/zh/.mustflow/skills/command-pattern/SKILL.md +247 -0
- package/templates/default/locales/zh/.mustflow/skills/composition-over-inheritance/SKILL.md +176 -0
- package/templates/default/locales/zh/.mustflow/skills/contract-sync-check/SKILL.md +116 -0
- package/templates/default/locales/zh/.mustflow/skills/date-number-audit/SKILL.md +116 -0
- package/templates/default/locales/zh/.mustflow/skills/dependency-injection/SKILL.md +161 -0
- package/templates/default/locales/zh/.mustflow/skills/dependency-reality-check/SKILL.md +115 -0
- package/templates/default/locales/zh/.mustflow/skills/diff-risk-review/SKILL.md +136 -0
- package/templates/default/locales/zh/.mustflow/skills/docs-prose-review/SKILL.md +119 -0
- package/templates/default/locales/zh/.mustflow/skills/docs-update/SKILL.md +97 -0
- package/templates/default/locales/zh/.mustflow/skills/external-prompt-injection-defense/SKILL.md +116 -0
- package/templates/default/locales/zh/.mustflow/skills/facade-pattern/SKILL.md +210 -0
- package/templates/default/locales/zh/.mustflow/skills/failure-triage/SKILL.md +96 -0
- package/templates/default/locales/zh/.mustflow/skills/instruction-conflict-scope-check/SKILL.md +118 -0
- package/templates/default/locales/zh/.mustflow/skills/line-ending-hygiene/SKILL.md +111 -0
- package/templates/default/locales/zh/.mustflow/skills/migration-safety-check/SKILL.md +117 -0
- package/templates/default/locales/zh/.mustflow/skills/multi-agent-work-coordination/SKILL.md +260 -0
- package/templates/default/locales/zh/.mustflow/skills/null-object-pattern/SKILL.md +196 -0
- package/templates/default/locales/zh/.mustflow/skills/pattern-scout/SKILL.md +110 -0
- package/templates/default/locales/zh/.mustflow/skills/performance-budget-check/SKILL.md +121 -0
- package/templates/default/locales/zh/.mustflow/skills/project-context-authoring/SKILL.md +107 -0
- package/templates/default/locales/zh/.mustflow/skills/pure-core-imperative-shell/SKILL.md +212 -0
- package/templates/default/locales/zh/.mustflow/skills/readme-authoring/SKILL.md +115 -0
- package/templates/default/locales/zh/.mustflow/skills/repo-improvement-loop/SKILL.md +150 -0
- package/templates/default/locales/zh/.mustflow/skills/repro-first-debug/SKILL.md +112 -0
- package/templates/default/locales/zh/.mustflow/skills/requirement-regression-guard/SKILL.md +152 -0
- package/templates/default/locales/zh/.mustflow/skills/result-option/SKILL.md +186 -0
- package/templates/default/locales/zh/.mustflow/skills/security-privacy-review/SKILL.md +116 -0
- package/templates/default/locales/zh/.mustflow/skills/security-regression-tests/SKILL.md +131 -0
- package/templates/default/locales/zh/.mustflow/skills/skill-authoring/SKILL.md +110 -0
- package/templates/default/locales/zh/.mustflow/skills/source-freshness-check/SKILL.md +111 -0
- package/templates/default/locales/zh/.mustflow/skills/state-machine-pattern/SKILL.md +214 -0
- package/templates/default/locales/zh/.mustflow/skills/strategy-pattern/SKILL.md +215 -0
- package/templates/default/locales/zh/.mustflow/skills/structure-discovery-gate/SKILL.md +159 -0
- package/templates/default/locales/zh/.mustflow/skills/test-maintenance/SKILL.md +122 -0
- package/templates/default/locales/zh/.mustflow/skills/ui-quality-gate/SKILL.md +117 -0
- package/templates/default/locales/zh/.mustflow/skills/visual-review-artifact/SKILL.md +127 -0
- package/templates/default/locales/zh/.mustflow/skills/visual-review-artifact/assets/review-template.html +286 -0
- package/templates/default/locales/zh/.mustflow/skills/visual-review-artifact/resources.toml +7 -0
- package/templates/default/locales/zh/.mustflow/skills/web-asset-optimization/SKILL.md +108 -0
- package/templates/default/locales/zh/AGENTS.md +86 -0
- package/templates/default/manifest.toml +339 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { classifyChangePath } from './change-classification.js';
|
|
2
|
+
const SOURCE_FILES = [
|
|
3
|
+
'ROADMAP.md',
|
|
4
|
+
'README.md',
|
|
5
|
+
'.mustflow/docs/agent-workflow.md',
|
|
6
|
+
'.mustflow/config/commands.toml',
|
|
7
|
+
'.mustflow/config/preferences.toml',
|
|
8
|
+
];
|
|
9
|
+
const OVERVIEW_CLASSIFICATION = {
|
|
10
|
+
kind: 'public_surface_model',
|
|
11
|
+
category: 'policy',
|
|
12
|
+
isPublicSurface: false,
|
|
13
|
+
validationReasons: [],
|
|
14
|
+
affectedContracts: ['change classification', 'verification selection', 'future public-surface drift checks'],
|
|
15
|
+
updatePolicy: 'not_applicable',
|
|
16
|
+
driftChecks: ['docs', 'templates', 'translations', 'examples', 'schemas'],
|
|
17
|
+
};
|
|
18
|
+
function toPosixPath(value) {
|
|
19
|
+
return value.split('\\').join('/');
|
|
20
|
+
}
|
|
21
|
+
export function explainPublicSurface(relativePath) {
|
|
22
|
+
if (!relativePath) {
|
|
23
|
+
return {
|
|
24
|
+
kind: 'overview',
|
|
25
|
+
inputPath: null,
|
|
26
|
+
decision: 'public surfaces are classified from repository-relative paths',
|
|
27
|
+
reason: 'mustflow needs a shared model for README pages, docs-site pages, installed templates, generated examples, translations, and workflow roots before stronger drift checks can depend on it.',
|
|
28
|
+
effectiveAction: 'Use mf explain surface <path> to inspect how a changed file should affect future verification and contract checks.',
|
|
29
|
+
countsAsMustflowVerification: false,
|
|
30
|
+
sourceFiles: SOURCE_FILES,
|
|
31
|
+
surface: OVERVIEW_CLASSIFICATION,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const normalizedPath = toPosixPath(relativePath);
|
|
35
|
+
const surface = classifyChangePath(normalizedPath).surface;
|
|
36
|
+
const publicLabel = surface.isPublicSurface ? 'public surface' : 'non-public or internal surface';
|
|
37
|
+
return {
|
|
38
|
+
kind: 'classified',
|
|
39
|
+
inputPath: normalizedPath,
|
|
40
|
+
decision: `${normalizedPath} is classified as ${surface.kind}`,
|
|
41
|
+
reason: `The path matches the ${surface.category} ${publicLabel} rule.`,
|
|
42
|
+
effectiveAction: surface.validationReasons.length > 0
|
|
43
|
+
? `Consider verification reasons: ${surface.validationReasons.join(', ')}.`
|
|
44
|
+
: 'No specific public-surface verification reason is declared for this path yet.',
|
|
45
|
+
countsAsMustflowVerification: false,
|
|
46
|
+
sourceFiles: SOURCE_FILES,
|
|
47
|
+
surface,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { isRecord } from './config-loading.js';
|
|
4
|
+
import { readTomlFile } from './toml.js';
|
|
5
|
+
import { evaluateVersionSync } from './version-sync-policy.js';
|
|
6
|
+
export const PACKAGE_JSON_VERSION_SOURCE_PATH = 'package.json';
|
|
7
|
+
export const DEFAULT_TEMPLATE_MANIFEST_PATH = 'templates/default/manifest.toml';
|
|
8
|
+
function releaseVersioningSyncsTemplateVersion(preferencesToml) {
|
|
9
|
+
if (!preferencesToml || !isRecord(preferencesToml.release)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const { versioning } = preferencesToml.release;
|
|
13
|
+
return isRecord(versioning) && versioning.sync_template_version === true;
|
|
14
|
+
}
|
|
15
|
+
function readPackageJsonVersion(filePath) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
18
|
+
return isRecord(parsed) && typeof parsed.version === 'string' ? parsed.version : undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function readTomlRootVersion(filePath) {
|
|
25
|
+
try {
|
|
26
|
+
const parsed = readTomlFile(filePath);
|
|
27
|
+
return isRecord(parsed) && typeof parsed.version === 'string' ? parsed.version : undefined;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* mf:anchor core.release-version-validation
|
|
35
|
+
* purpose: Validate release version synchronization between package and installed template metadata.
|
|
36
|
+
* search: sync_template_version, package.json version, template manifest version
|
|
37
|
+
* invariant: Template version synchronization is checked only when the repository preference enables it.
|
|
38
|
+
* risk: dependency, data_consistency
|
|
39
|
+
*/
|
|
40
|
+
export function validateTemplateVersionSync(projectRoot, preferencesToml, changedPaths) {
|
|
41
|
+
const packageVersion = readPackageJsonVersion(path.join(projectRoot, PACKAGE_JSON_VERSION_SOURCE_PATH));
|
|
42
|
+
const templateVersion = readTomlRootVersion(path.join(projectRoot, DEFAULT_TEMPLATE_MANIFEST_PATH));
|
|
43
|
+
const syncTemplateVersion = releaseVersioningSyncsTemplateVersion(preferencesToml);
|
|
44
|
+
return evaluateVersionSync({
|
|
45
|
+
packageVersion,
|
|
46
|
+
templateVersion,
|
|
47
|
+
syncTemplateVersion,
|
|
48
|
+
changedPaths,
|
|
49
|
+
}).issues.map((issue) => ({
|
|
50
|
+
message: issue.message,
|
|
51
|
+
severity: issue.severity,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { isRecord, readPositiveInteger, readString, } from './config-loading.js';
|
|
2
|
+
import { readNestedRetentionTable, readRetentionTable, resolveRetentionLimits, resolveRunReceiptRetentionPolicy, } from './retention-policy.js';
|
|
3
|
+
const RETENTION_POLICY_SOURCE_FILES = [
|
|
4
|
+
'AGENTS.md',
|
|
5
|
+
'.mustflow/docs/agent-workflow.md',
|
|
6
|
+
'.mustflow/config/mustflow.toml',
|
|
7
|
+
];
|
|
8
|
+
function readBoolean(table, key) {
|
|
9
|
+
const value = table?.[key];
|
|
10
|
+
return typeof value === 'boolean' ? value : null;
|
|
11
|
+
}
|
|
12
|
+
function summarizeRawEvents(retention) {
|
|
13
|
+
const rawEvents = readNestedRetentionTable(retention, 'raw_events');
|
|
14
|
+
return {
|
|
15
|
+
store: rawEvents ? readString(rawEvents, 'store') ?? null : null,
|
|
16
|
+
maxFileMb: rawEvents ? readPositiveInteger(rawEvents, 'max_file_mb') ?? null : null,
|
|
17
|
+
maxTotalMb: rawEvents ? readPositiveInteger(rawEvents, 'max_total_mb') ?? null : null,
|
|
18
|
+
maxAgeDays: rawEvents ? readPositiveInteger(rawEvents, 'max_age_days') ?? null : null,
|
|
19
|
+
onLimit: rawEvents ? readString(rawEvents, 'on_limit') ?? null : null,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function summarizeKnowledge(retention, maxFileKb) {
|
|
23
|
+
const knowledge = readNestedRetentionTable(retention, 'knowledge');
|
|
24
|
+
return {
|
|
25
|
+
enabled: readBoolean(knowledge, 'enabled'),
|
|
26
|
+
store: knowledge ? readString(knowledge, 'store') ?? null : null,
|
|
27
|
+
maxFileKb,
|
|
28
|
+
maxTotalMb: knowledge ? readPositiveInteger(knowledge, 'max_total_mb') ?? null : null,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function summarizeRetention(mustflowToml) {
|
|
32
|
+
const retention = readRetentionTable(mustflowToml);
|
|
33
|
+
const limits = resolveRetentionLimits(mustflowToml);
|
|
34
|
+
const runReceipts = resolveRunReceiptRetentionPolicy(mustflowToml);
|
|
35
|
+
return {
|
|
36
|
+
enabled: readBoolean(retention, 'enabled') ?? false,
|
|
37
|
+
rawEvents: summarizeRawEvents(retention),
|
|
38
|
+
runReceipts,
|
|
39
|
+
knowledge: summarizeKnowledge(retention, limits.knowledgeMaxFileKb),
|
|
40
|
+
context: {
|
|
41
|
+
maxFileKb: limits.contextMaxFileKb,
|
|
42
|
+
},
|
|
43
|
+
repoMap: {
|
|
44
|
+
maxFileKb: limits.repoMapMaxFileKb,
|
|
45
|
+
failIfLarger: limits.repoMapFailIfLarger,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function describeRetentionDecision(retention) {
|
|
50
|
+
if (!retention.enabled) {
|
|
51
|
+
return {
|
|
52
|
+
decision: 'retention policy is not enabled',
|
|
53
|
+
reason: 'the [retention] table is missing or does not set enabled = true.',
|
|
54
|
+
effectiveAction: 'Treat retention as unavailable and avoid assuming raw events, run receipts, or knowledge files are preserved.',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
decision: 'retention policy is enabled',
|
|
59
|
+
reason: `run receipts are stored as ${retention.runReceipts.store} with stdout and stderr tails capped at ` +
|
|
60
|
+
`${retention.runReceipts.stdoutTailBytes} bytes and ${retention.runReceipts.stderrTailBytes} bytes.`,
|
|
61
|
+
effectiveAction: 'Use bounded run receipts for verification evidence, and do not treat raw event storage as available unless the configured store permits it.',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function explainRetentionPolicy(mustflowToml) {
|
|
65
|
+
const retention = summarizeRetention(isRecord(mustflowToml) ? mustflowToml : undefined);
|
|
66
|
+
const description = describeRetentionDecision(retention);
|
|
67
|
+
return {
|
|
68
|
+
kind: 'retention',
|
|
69
|
+
...description,
|
|
70
|
+
countsAsMustflowVerification: false,
|
|
71
|
+
sourceFiles: RETENTION_POLICY_SOURCE_FILES,
|
|
72
|
+
retention,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { isRecord, readPositiveInteger, readString } from './config-loading.js';
|
|
2
|
+
export const ALLOWED_RETENTION_STORES = new Set(['none', 'cache', 'repo_local_ignored']);
|
|
3
|
+
export const ALLOWED_RETENTION_ON_LIMIT = new Set(['report', 'compact_then_archive']);
|
|
4
|
+
export const DEFAULT_RETENTION_LIMITS = {
|
|
5
|
+
repoMapMaxFileKb: 128,
|
|
6
|
+
repoMapFailIfLarger: true,
|
|
7
|
+
runReceiptMaxFileKb: 128,
|
|
8
|
+
contextMaxFileKb: 8,
|
|
9
|
+
knowledgeMaxFileKb: 128,
|
|
10
|
+
};
|
|
11
|
+
export const DEFAULT_RUN_RECEIPT_TAIL_BYTES = 64 * 1024;
|
|
12
|
+
export function readRetentionTable(mustflowToml) {
|
|
13
|
+
return mustflowToml && isRecord(mustflowToml.retention) ? mustflowToml.retention : undefined;
|
|
14
|
+
}
|
|
15
|
+
export function readNestedRetentionTable(retention, key) {
|
|
16
|
+
if (!retention || !isRecord(retention[key])) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
return retention[key];
|
|
20
|
+
}
|
|
21
|
+
export function readRetentionStore(retention, tableName) {
|
|
22
|
+
const table = readNestedRetentionTable(retention, tableName);
|
|
23
|
+
return table ? readString(table, 'store') : undefined;
|
|
24
|
+
}
|
|
25
|
+
function readPositiveIntegerWithDefault(table, key, fallback) {
|
|
26
|
+
return table ? readPositiveInteger(table, key) ?? fallback : fallback;
|
|
27
|
+
}
|
|
28
|
+
function readBooleanWithDefault(table, key, fallback) {
|
|
29
|
+
const value = table?.[key];
|
|
30
|
+
return typeof value === 'boolean' ? value : fallback;
|
|
31
|
+
}
|
|
32
|
+
export function resolveRetentionLimits(mustflowToml) {
|
|
33
|
+
const retention = readRetentionTable(mustflowToml);
|
|
34
|
+
const repoMap = readNestedRetentionTable(retention, 'repo_map');
|
|
35
|
+
const runReceipts = readNestedRetentionTable(retention, 'run_receipts');
|
|
36
|
+
const context = readNestedRetentionTable(retention, 'context');
|
|
37
|
+
const knowledge = readNestedRetentionTable(retention, 'knowledge');
|
|
38
|
+
return {
|
|
39
|
+
repoMapMaxFileKb: readPositiveIntegerWithDefault(repoMap, 'max_file_kb', DEFAULT_RETENTION_LIMITS.repoMapMaxFileKb),
|
|
40
|
+
repoMapFailIfLarger: readBooleanWithDefault(repoMap, 'fail_if_larger', DEFAULT_RETENTION_LIMITS.repoMapFailIfLarger),
|
|
41
|
+
runReceiptMaxFileKb: readPositiveIntegerWithDefault(runReceipts, 'max_file_kb', DEFAULT_RETENTION_LIMITS.runReceiptMaxFileKb),
|
|
42
|
+
contextMaxFileKb: readPositiveIntegerWithDefault(context, 'max_file_kb', DEFAULT_RETENTION_LIMITS.contextMaxFileKb),
|
|
43
|
+
knowledgeMaxFileKb: readPositiveIntegerWithDefault(knowledge, 'max_file_kb', DEFAULT_RETENTION_LIMITS.knowledgeMaxFileKb),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function resolveRunReceiptRetentionPolicy(mustflowToml) {
|
|
47
|
+
const retention = readRetentionTable(mustflowToml);
|
|
48
|
+
const runReceipts = readNestedRetentionTable(retention, 'run_receipts');
|
|
49
|
+
return {
|
|
50
|
+
store: readString(runReceipts ?? {}, 'store') ?? 'repo_local_ignored',
|
|
51
|
+
maxFileKb: readPositiveIntegerWithDefault(runReceipts, 'max_file_kb', DEFAULT_RETENTION_LIMITS.runReceiptMaxFileKb),
|
|
52
|
+
maxItems: readPositiveIntegerWithDefault(runReceipts, 'max_items', 1),
|
|
53
|
+
maxTotalMb: readPositiveIntegerWithDefault(runReceipts, 'max_total_mb', 1),
|
|
54
|
+
stdoutTailBytes: readPositiveIntegerWithDefault(runReceipts, 'keep_stdout_tail_bytes', DEFAULT_RUN_RECEIPT_TAIL_BYTES),
|
|
55
|
+
stderrTailBytes: readPositiveIntegerWithDefault(runReceipts, 'keep_stderr_tail_bytes', DEFAULT_RUN_RECEIPT_TAIL_BYTES),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { DEFAULT_RUN_RECEIPT_TAIL_BYTES } from './retention-policy.js';
|
|
4
|
+
const RUN_RECEIPT_SCHEMA_VERSION = '1';
|
|
5
|
+
const RUN_RECEIPT_DIR = path.join('.mustflow', 'state', 'runs');
|
|
6
|
+
const LATEST_RUN_RECEIPT = 'latest.json';
|
|
7
|
+
function toPosixPath(value) {
|
|
8
|
+
return value.split(path.sep).join('/');
|
|
9
|
+
}
|
|
10
|
+
function truncateTextByBytes(text, maxBytes) {
|
|
11
|
+
const buffer = Buffer.from(text, 'utf8');
|
|
12
|
+
if (buffer.byteLength <= maxBytes) {
|
|
13
|
+
return { text, truncated: false };
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
text: buffer.subarray(buffer.byteLength - maxBytes).toString('utf8'),
|
|
17
|
+
truncated: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function summarizeOutput(output, maxOutputBytes, tailBytes) {
|
|
21
|
+
if (!output) {
|
|
22
|
+
return {
|
|
23
|
+
bytes: 0,
|
|
24
|
+
truncated: false,
|
|
25
|
+
tail: '',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const text = output.toString();
|
|
29
|
+
const bytes = Buffer.byteLength(text, 'utf8');
|
|
30
|
+
const tailLimit = Math.min(tailBytes, maxOutputBytes);
|
|
31
|
+
const tail = truncateTextByBytes(text, tailLimit);
|
|
32
|
+
return {
|
|
33
|
+
bytes,
|
|
34
|
+
truncated: tail.truncated,
|
|
35
|
+
tail: tail.text,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function getReceiptRelativePath() {
|
|
39
|
+
return toPosixPath(path.join(RUN_RECEIPT_DIR, LATEST_RUN_RECEIPT));
|
|
40
|
+
}
|
|
41
|
+
export function createRunReceipt(input) {
|
|
42
|
+
const relativeCwd = path.relative(input.projectRoot, input.cwd);
|
|
43
|
+
const stdoutTailBytes = input.stdoutTailBytes ?? DEFAULT_RUN_RECEIPT_TAIL_BYTES;
|
|
44
|
+
const stderrTailBytes = input.stderrTailBytes ?? DEFAULT_RUN_RECEIPT_TAIL_BYTES;
|
|
45
|
+
return {
|
|
46
|
+
schema_version: RUN_RECEIPT_SCHEMA_VERSION,
|
|
47
|
+
command: 'run',
|
|
48
|
+
intent: input.intent,
|
|
49
|
+
status: input.status,
|
|
50
|
+
timed_out: input.timedOut,
|
|
51
|
+
started_at: input.startedAt.toISOString(),
|
|
52
|
+
finished_at: input.finishedAt.toISOString(),
|
|
53
|
+
duration_ms: input.finishedAt.getTime() - input.startedAt.getTime(),
|
|
54
|
+
cwd: relativeCwd.length > 0 ? toPosixPath(relativeCwd) : '.',
|
|
55
|
+
lifecycle: input.lifecycle,
|
|
56
|
+
run_policy: input.runPolicy,
|
|
57
|
+
mode: input.mode,
|
|
58
|
+
argv: input.argv,
|
|
59
|
+
cmd: input.cmd,
|
|
60
|
+
timeout_seconds: input.timeoutSeconds,
|
|
61
|
+
max_output_bytes: input.maxOutputBytes,
|
|
62
|
+
success_exit_codes: input.successExitCodes,
|
|
63
|
+
exit_code: input.exitCode,
|
|
64
|
+
signal: input.signal,
|
|
65
|
+
error: input.error,
|
|
66
|
+
kill_method: input.killMethod,
|
|
67
|
+
stdout: summarizeOutput(input.stdout, input.maxOutputBytes, stdoutTailBytes),
|
|
68
|
+
stderr: summarizeOutput(input.stderr, input.maxOutputBytes, stderrTailBytes),
|
|
69
|
+
receipt_path: getReceiptRelativePath(),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function writeRunReceipt(projectRoot, receipt) {
|
|
73
|
+
const receiptDir = path.join(projectRoot, RUN_RECEIPT_DIR);
|
|
74
|
+
const latestPath = path.join(receiptDir, LATEST_RUN_RECEIPT);
|
|
75
|
+
mkdirSync(receiptDir, { recursive: true });
|
|
76
|
+
writeFileSync(latestPath, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
77
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const SKILL_ROUTE_SOURCE_FILES = [
|
|
2
|
+
'.mustflow/skills/INDEX.md',
|
|
3
|
+
'.mustflow/skills/*/SKILL.md',
|
|
4
|
+
'.mustflow/config/commands.toml',
|
|
5
|
+
'.mustflow/docs/agent-workflow.md',
|
|
6
|
+
];
|
|
7
|
+
const MARKDOWN_TABLE_SEPARATOR_PATTERN = /^:?-{3,}:?$/u;
|
|
8
|
+
export const SKILL_INDEX_ROUTE_COLUMN_COUNT = 7;
|
|
9
|
+
export const SKILL_INDEX_SKILL_PATH_COLUMN_INDEX = 1;
|
|
10
|
+
export const SKILL_INDEX_VERIFICATION_INTENTS_COLUMN_INDEX = 5;
|
|
11
|
+
export const SKILL_INDEX_ROUTE_COLUMNS = 'Trigger, Skill Document, Required Input, Edit Scope, Risk, Verification Intents, Expected Output';
|
|
12
|
+
function splitMarkdownTableRow(line) {
|
|
13
|
+
return line
|
|
14
|
+
.trim()
|
|
15
|
+
.replace(/^\|/u, '')
|
|
16
|
+
.replace(/\|$/u, '')
|
|
17
|
+
.split('|')
|
|
18
|
+
.map((cell) => cell.trim());
|
|
19
|
+
}
|
|
20
|
+
function isMarkdownTableSeparator(cells) {
|
|
21
|
+
return cells.length > 0 && cells.every((cell) => MARKDOWN_TABLE_SEPARATOR_PATTERN.test(cell));
|
|
22
|
+
}
|
|
23
|
+
export function readBacktickValues(value) {
|
|
24
|
+
return [...value.matchAll(/`([^`]+)`/gu)].map((match) => match[1].trim()).filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
export function findSkillIndexRoutePathColumn(cells) {
|
|
27
|
+
return cells.findIndex((cell) => readBacktickValues(cell).some((value) => value.startsWith('.mustflow/skills/') && value.endsWith('/SKILL.md')));
|
|
28
|
+
}
|
|
29
|
+
export function parseSkillIndexRoutes(content) {
|
|
30
|
+
const routes = [];
|
|
31
|
+
for (const line of content.split(/\r?\n/u)) {
|
|
32
|
+
if (!line.trim().startsWith('|')) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const cells = splitMarkdownTableRow(line);
|
|
36
|
+
if (isMarkdownTableSeparator(cells)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const skillPathColumn = findSkillIndexRoutePathColumn(cells);
|
|
40
|
+
if (skillPathColumn < 0) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const [skillPath] = readBacktickValues(cells[skillPathColumn]);
|
|
44
|
+
if (!skillPath) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
routes.push({
|
|
48
|
+
trigger: cells[0] ?? '',
|
|
49
|
+
skillPath,
|
|
50
|
+
requiredInput: cells[2] ?? '',
|
|
51
|
+
editScope: cells[3] ?? '',
|
|
52
|
+
risk: cells[4] ?? '',
|
|
53
|
+
commandIntents: readBacktickValues(cells[SKILL_INDEX_VERIFICATION_INTENTS_COLUMN_INDEX] ?? ''),
|
|
54
|
+
expectedOutput: cells[6] ?? '',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return routes;
|
|
58
|
+
}
|
|
59
|
+
function pluralize(count, singular, plural) {
|
|
60
|
+
return count === 1 ? singular : plural;
|
|
61
|
+
}
|
|
62
|
+
export function isSkillRouteAlignmentIssue(issue) {
|
|
63
|
+
return (issue.includes('.mustflow/skills/INDEX.md route') ||
|
|
64
|
+
issue.includes('.mustflow/skills/INDEX.md has duplicate route') ||
|
|
65
|
+
issue.endsWith(' is not listed in .mustflow/skills/INDEX.md'));
|
|
66
|
+
}
|
|
67
|
+
export function summarizeSkillRouteAlignment(issues) {
|
|
68
|
+
const skillRouteIssues = issues.filter(isSkillRouteAlignmentIssue);
|
|
69
|
+
const issueCount = skillRouteIssues.length;
|
|
70
|
+
return {
|
|
71
|
+
status: issueCount === 0 ? 'ok' : 'fail',
|
|
72
|
+
issueCount,
|
|
73
|
+
issues: skillRouteIssues,
|
|
74
|
+
summary: `${issueCount} skill index/body alignment ${pluralize(issueCount, 'issue', 'issues')}`,
|
|
75
|
+
action: issueCount === 0 ? null : 'mf check --strict',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function explainSkillRouteAlignment(issues) {
|
|
79
|
+
const alignment = summarizeSkillRouteAlignment(issues);
|
|
80
|
+
if (alignment.status === 'ok') {
|
|
81
|
+
return {
|
|
82
|
+
kind: 'skill_routes',
|
|
83
|
+
decision: 'skill index and skill bodies are aligned',
|
|
84
|
+
reason: 'strict validation found every skill route points to a procedure body and every skill body is listed in the skill index.',
|
|
85
|
+
effectiveAction: 'Use .mustflow/skills/INDEX.md to choose relevant skill procedures before editing.',
|
|
86
|
+
countsAsMustflowVerification: false,
|
|
87
|
+
sourceFiles: SKILL_ROUTE_SOURCE_FILES,
|
|
88
|
+
alignment,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
kind: 'skill_routes',
|
|
93
|
+
decision: 'skill index and skill bodies are not aligned',
|
|
94
|
+
reason: 'strict validation found skill routes or procedure bodies that do not agree with each other.',
|
|
95
|
+
effectiveAction: 'Fix the skill index/body mismatch, then run mf check --strict or mf doctor --strict.',
|
|
96
|
+
countsAsMustflowVerification: false,
|
|
97
|
+
sourceFiles: SKILL_ROUTE_SOURCE_FILES,
|
|
98
|
+
alignment,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parseSkillIndexRoutes } from './skill-route-alignment.js';
|
|
4
|
+
const SKILL_INDEX_PATH = '.mustflow/skills/INDEX.md';
|
|
5
|
+
const SKILL_ROUTE_SOURCE_FILES = [
|
|
6
|
+
SKILL_INDEX_PATH,
|
|
7
|
+
'.mustflow/skills/<skill>/SKILL.md',
|
|
8
|
+
'.mustflow/config/commands.toml',
|
|
9
|
+
];
|
|
10
|
+
function readFrontmatterLines(content) {
|
|
11
|
+
if (!content.startsWith('---')) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const end = content.indexOf('\n---', 3);
|
|
15
|
+
if (end < 0) {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
return content.slice(3, end).split(/\r?\n/u);
|
|
19
|
+
}
|
|
20
|
+
function readFrontmatterScalar(content, key) {
|
|
21
|
+
for (const line of readFrontmatterLines(content)) {
|
|
22
|
+
const match = /^\s*([^:#]+):\s*(.+?)\s*$/u.exec(line);
|
|
23
|
+
if (!match) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (match[1].trim() === key) {
|
|
27
|
+
return match[2].trim().replace(/^["']|["']$/gu, '') || null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
function readFrontmatterList(content, key) {
|
|
33
|
+
const lines = readFrontmatterLines(content);
|
|
34
|
+
const values = [];
|
|
35
|
+
let keyIndent;
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
const keyMatch = /^(\s*)([^:#]+):\s*$/u.exec(line);
|
|
38
|
+
if (keyMatch) {
|
|
39
|
+
keyIndent = keyMatch[2].trim() === key ? keyMatch[1].length : undefined;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (keyIndent === undefined) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const valueMatch = /^(\s*)-\s*(.+?)\s*$/u.exec(line);
|
|
46
|
+
if (!valueMatch || valueMatch[1].length <= keyIndent) {
|
|
47
|
+
keyIndent = undefined;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
values.push(valueMatch[2].trim().replace(/^["']|["']$/gu, ''));
|
|
51
|
+
}
|
|
52
|
+
return values;
|
|
53
|
+
}
|
|
54
|
+
function skillNameFromPath(skillPath) {
|
|
55
|
+
const match = /^\.mustflow\/skills\/([^/]+)\/SKILL\.md$/u.exec(skillPath);
|
|
56
|
+
return match?.[1] ?? skillPath;
|
|
57
|
+
}
|
|
58
|
+
function targetMatchesRoute(target, route, skillContent) {
|
|
59
|
+
const skillName = skillNameFromPath(route.skillPath);
|
|
60
|
+
const normalizedTarget = target.replace(/\\/gu, '/');
|
|
61
|
+
if (normalizedTarget === skillName || normalizedTarget === route.skillPath) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
if (!skillContent) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return (readFrontmatterScalar(skillContent, 'name') === target ||
|
|
68
|
+
readFrontmatterScalar(skillContent, 'skill_id') === target ||
|
|
69
|
+
readFrontmatterScalar(skillContent, 'mustflow_doc') === target);
|
|
70
|
+
}
|
|
71
|
+
function routeToSummary(route, skillContent) {
|
|
72
|
+
const declaredCommandIntents = skillContent ? readFrontmatterList(skillContent, 'command_intents') : [];
|
|
73
|
+
return {
|
|
74
|
+
skill: skillNameFromPath(route.skillPath),
|
|
75
|
+
skillPath: route.skillPath,
|
|
76
|
+
trigger: route.trigger,
|
|
77
|
+
requiredInput: route.requiredInput,
|
|
78
|
+
editScope: route.editScope,
|
|
79
|
+
risk: route.risk,
|
|
80
|
+
verificationIntents: route.commandIntents,
|
|
81
|
+
expectedOutput: route.expectedOutput,
|
|
82
|
+
declaredCommandIntents,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export function explainSkillRoute(projectRoot, target) {
|
|
86
|
+
const indexPath = path.join(projectRoot, ...SKILL_INDEX_PATH.split('/'));
|
|
87
|
+
const indexContent = existsSync(indexPath) ? readFileSync(indexPath, 'utf8') : '';
|
|
88
|
+
const routes = parseSkillIndexRoutes(indexContent);
|
|
89
|
+
for (const route of routes) {
|
|
90
|
+
const absoluteSkillPath = path.join(projectRoot, ...route.skillPath.split('/'));
|
|
91
|
+
const skillContent = existsSync(absoluteSkillPath) ? readFileSync(absoluteSkillPath, 'utf8') : null;
|
|
92
|
+
if (!targetMatchesRoute(target, route, skillContent)) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const summary = routeToSummary(route, skillContent);
|
|
96
|
+
return {
|
|
97
|
+
kind: 'skill_route',
|
|
98
|
+
inputSkill: target,
|
|
99
|
+
decision: `skill route "${summary.skill}" is declared`,
|
|
100
|
+
reason: 'the skill index contains a route for the requested skill and exposes its trigger, scope, risk, checks, and output contract.',
|
|
101
|
+
effectiveAction: `Read ${summary.skillPath} before editing work that matches: ${summary.trigger}`,
|
|
102
|
+
countsAsMustflowVerification: false,
|
|
103
|
+
sourceFiles: [SKILL_INDEX_PATH, route.skillPath, '.mustflow/config/commands.toml'],
|
|
104
|
+
route: summary,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
kind: 'skill_route',
|
|
109
|
+
inputSkill: target,
|
|
110
|
+
decision: `skill route "${target}" is not declared`,
|
|
111
|
+
reason: 'the skill index has no matching route for the requested folder name, skill_id, mustflow_doc, or skill path.',
|
|
112
|
+
effectiveAction: 'Use mf explain skills to inspect route alignment, then update .mustflow/skills/INDEX.md only if a real repeatable procedure exists.',
|
|
113
|
+
countsAsMustflowVerification: false,
|
|
114
|
+
sourceFiles: SKILL_ROUTE_SOURCE_FILES,
|
|
115
|
+
route: null,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { collectSourceAnchorSummaries } from './source-anchors.js';
|
|
2
|
+
const SOURCE_FILES = [
|
|
3
|
+
'ROADMAP.md',
|
|
4
|
+
'.mustflow/docs/agent-workflow.md',
|
|
5
|
+
'.mustflow/config/mustflow.toml',
|
|
6
|
+
'.mustflow/config/commands.toml',
|
|
7
|
+
];
|
|
8
|
+
export function explainSourceAnchor(projectRoot, anchorId) {
|
|
9
|
+
const anchors = collectSourceAnchorSummaries(projectRoot);
|
|
10
|
+
const anchor = anchors.find((candidate) => candidate.id === anchorId) ?? null;
|
|
11
|
+
if (!anchor) {
|
|
12
|
+
return {
|
|
13
|
+
kind: 'missing',
|
|
14
|
+
inputAnchor: anchorId,
|
|
15
|
+
decision: `source anchor "${anchorId}" is not indexed by direct source inspection`,
|
|
16
|
+
reason: 'mustflow found no structured inline anchor with that id in inspectable source files. Source anchors are optional and disabled for automatic source modification.',
|
|
17
|
+
effectiveAction: 'Use normal code search or add a short structured source anchor only when a human-approved code change calls for one.',
|
|
18
|
+
countsAsMustflowVerification: false,
|
|
19
|
+
sourceFiles: SOURCE_FILES,
|
|
20
|
+
anchor: null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
kind: 'found',
|
|
25
|
+
inputAnchor: anchorId,
|
|
26
|
+
decision: `source anchor "${anchorId}" is a navigation-only code coordinate`,
|
|
27
|
+
reason: 'structured source anchors help agents find important code locations, but they cannot define workflow rules, command permission, or verification authority.',
|
|
28
|
+
effectiveAction: 'Use this anchor to navigate to the source location, then trust the current code, tests, AGENTS.md, and commands.toml over the anchor text.',
|
|
29
|
+
countsAsMustflowVerification: false,
|
|
30
|
+
sourceFiles: SOURCE_FILES,
|
|
31
|
+
anchor,
|
|
32
|
+
};
|
|
33
|
+
}
|