devflow-kit 1.8.2 → 2.0.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/CHANGELOG.md +191 -6
- package/LICENSE +1 -1
- package/README.md +139 -219
- package/dist/cli/agents-view/index.js +9 -0
- package/dist/cli/agents-view/render.js +310 -0
- package/dist/cli/agents-view/state.js +423 -0
- package/dist/cli/agents-view/terminal.js +179 -0
- package/dist/cli/commands/agents.js +585 -0
- package/dist/cli/commands/ambient.js +231 -0
- package/dist/cli/commands/capture.js +133 -0
- package/dist/cli/commands/compliance-prompts.js +174 -0
- package/dist/cli/commands/compliance.js +337 -0
- package/dist/cli/commands/context.js +66 -0
- package/dist/cli/commands/debug.js +122 -0
- package/dist/cli/commands/flags.js +119 -0
- package/dist/cli/commands/hud.js +229 -0
- package/dist/cli/commands/init-seed.js +226 -0
- package/dist/cli/commands/init.js +1786 -0
- package/dist/cli/commands/knowledge/index.js +25 -0
- package/dist/cli/commands/knowledge/list.js +115 -0
- package/dist/cli/commands/knowledge/toggle.js +84 -0
- package/dist/cli/commands/learning.js +311 -0
- package/dist/cli/commands/legacy-hooks.js +40 -0
- package/dist/cli/commands/memory.js +349 -0
- package/dist/cli/commands/proxy.js +1435 -0
- package/dist/cli/commands/rules.js +334 -0
- package/dist/cli/commands/safe-delete.js +140 -0
- package/dist/cli/commands/security.js +179 -0
- package/dist/cli/commands/skills.js +140 -0
- package/dist/cli/commands/uninstall.js +1214 -0
- package/dist/cli.js +35 -10
- package/dist/commands/bug-analysis.md +400 -0
- package/dist/commands/code-review.md +403 -0
- package/dist/commands/debug.md +282 -0
- package/dist/commands/dynamic-build.md +972 -0
- package/dist/commands/dynamic-plan.md +383 -0
- package/dist/commands/dynamic-profile.md +206 -0
- package/dist/commands/dynamic-tickets.md +583 -0
- package/dist/commands/explore.md +208 -0
- package/dist/commands/implement.md +590 -0
- package/dist/commands/plan.md +570 -0
- package/dist/commands/release.md +206 -0
- package/dist/commands/research.md +212 -0
- package/dist/commands/resolve.md +731 -0
- package/dist/commands/self-review.md +251 -0
- package/dist/core/agent-frontmatter.js +209 -0
- package/dist/core/agent-models.js +556 -0
- package/dist/core/agent-state.js +44 -0
- package/dist/core/assets.js +39 -0
- package/dist/core/cache.js +205 -0
- package/dist/core/codex-auth-inspect.js +128 -0
- package/dist/core/compliance-compose.js +458 -0
- package/dist/core/compliance.js +165 -0
- package/dist/core/external-models.js +76 -0
- package/dist/core/feature-config.js +125 -0
- package/dist/core/flags.js +309 -0
- package/dist/core/fs-atomic.js +74 -0
- package/dist/core/git.js +61 -0
- package/dist/core/learning-queue-cleanup.js +92 -0
- package/dist/core/learning-tuning-config.js +78 -0
- package/dist/core/manifest.js +171 -0
- package/dist/core/migrations.js +330 -0
- package/dist/core/model-discovery.js +655 -0
- package/dist/core/observation-io.js +50 -0
- package/dist/core/observations.js +109 -0
- package/dist/core/orphan-sweep.js +92 -0
- package/dist/core/paths.js +48 -0
- package/dist/core/plugins.js +525 -0
- package/dist/core/project-paths.js +159 -0
- package/dist/core/proxy-log.js +165 -0
- package/dist/core/proxy-state.js +305 -0
- package/dist/core/safe-delete-install.js +191 -0
- package/dist/core/teammate-mode-cleanup.js +33 -0
- package/dist/hud/colors.js +13 -2
- package/dist/hud/components/config-counts.js +2 -2
- package/dist/hud/components/context-usage.js +2 -2
- package/dist/hud/components/learning-counts.js +92 -0
- package/dist/hud/components/session-cost.js +10 -2
- package/dist/hud/components/usage-quota.js +43 -8
- package/dist/hud/components/version-badge.js +17 -7
- package/dist/hud/config.js +4 -2
- package/dist/hud/cost-history.js +281 -0
- package/dist/hud/git.js +112 -71
- package/dist/hud/index.js +47 -4
- package/dist/hud/render.js +8 -20
- package/dist/hud/transcript.js +5 -6
- package/dist/targets/claude-code/claude-paths.js +106 -0
- package/dist/targets/claude-code/compliance-install.js +305 -0
- package/dist/targets/claude-code/hooks.js +9 -0
- package/dist/targets/claude-code/installer.js +458 -0
- package/dist/targets/claude-code/legacy.js +239 -0
- package/dist/targets/claude-code/post-install.js +971 -0
- package/package.json +23 -17
- package/src/assets/agents/code.md +244 -0
- package/src/assets/agents/design.md +113 -0
- package/src/assets/agents/diagnose.md +210 -0
- package/src/assets/agents/evaluate.md +117 -0
- package/src/assets/agents/git.md +938 -0
- package/src/assets/agents/knowledge.md +89 -0
- package/src/assets/agents/learning.md +203 -0
- package/src/assets/agents/research.md +134 -0
- package/src/assets/agents/review.md +220 -0
- package/src/assets/agents/scrutinize.md +95 -0
- package/src/assets/agents/simplify.md +108 -0
- package/src/assets/agents/skim.md +136 -0
- package/src/assets/agents/synthesize.md +402 -0
- package/src/assets/agents/test.md +155 -0
- package/src/assets/agents/triage.md +141 -0
- package/src/assets/agents/validate.md +103 -0
- package/src/assets/commands/_partials/_compliance.mds +5 -0
- package/src/assets/commands/_partials/_decisions.mds +20 -0
- package/src/assets/commands/_partials/_engine.mds +244 -0
- package/src/assets/commands/_partials/_factory.mds +216 -0
- package/src/assets/commands/_partials/_knowledge.mds +95 -0
- package/src/assets/commands/_partials/_plan_contract.mds +51 -0
- package/src/assets/commands/_partials/_preamble.mds +82 -0
- package/src/assets/commands/_partials/_publication.mds +7 -0
- package/src/assets/commands/_partials/_roster.mds +31 -0
- package/src/assets/commands/_partials/_ticket_template.mds +59 -0
- package/src/assets/commands/_partials/_wave.mds +123 -0
- package/src/assets/commands/bug-analysis.mds +353 -0
- package/src/assets/commands/code-review.mds +355 -0
- package/src/assets/commands/debug.mds +224 -0
- package/src/assets/commands/dynamic-build.mds +534 -0
- package/src/assets/commands/dynamic-plan.mds +244 -0
- package/src/assets/commands/dynamic-profile.mds +132 -0
- package/src/assets/commands/dynamic-tickets.mds +226 -0
- package/src/assets/commands/explore.mds +150 -0
- package/src/assets/commands/implement.mds +496 -0
- package/src/assets/commands/plan.mds +523 -0
- package/src/assets/commands/release.md +206 -0
- package/src/assets/commands/research.mds +164 -0
- package/src/assets/commands/resolve.mds +636 -0
- package/src/assets/commands/self-review.mds +156 -0
- package/src/assets/rules/accessibility.md +11 -0
- package/src/assets/rules/compliance.md +15 -0
- package/src/assets/rules/engineering.md +13 -0
- package/src/assets/rules/go.md +12 -0
- package/src/assets/rules/java.md +12 -0
- package/src/assets/rules/python.md +12 -0
- package/src/assets/rules/quality.md +14 -0
- package/src/assets/rules/react.md +11 -0
- package/src/assets/rules/reliability.md +12 -0
- package/src/assets/rules/rust.md +12 -0
- package/src/assets/rules/security.md +12 -0
- package/src/assets/rules/typescript.md +12 -0
- package/src/assets/rules/ui-design.md +11 -0
- package/src/assets/scripts/hooks/assets/orchestrator-charter.md +21 -0
- package/src/assets/scripts/hooks/background-memory-update +460 -0
- package/src/assets/scripts/hooks/capture-prompt +87 -0
- package/src/assets/scripts/hooks/capture-question +153 -0
- package/src/assets/scripts/hooks/capture-turn +105 -0
- package/src/assets/scripts/hooks/debug-trace +75 -0
- package/src/assets/scripts/hooks/decisions-usage-scan.cjs +131 -0
- package/src/assets/scripts/hooks/ensure-devflow-init +39 -0
- package/src/assets/scripts/hooks/ensure-proxy +294 -0
- package/src/assets/scripts/hooks/ensure-root-gitignore +116 -0
- package/src/assets/scripts/hooks/get-mtime +23 -0
- package/src/assets/scripts/hooks/git-marker +16 -0
- package/src/assets/scripts/hooks/hook-bootstrap +25 -0
- package/src/assets/scripts/hooks/hook-log-init +41 -0
- package/src/assets/scripts/hooks/json-helper.cjs +725 -0
- package/src/assets/scripts/hooks/json-parse +243 -0
- package/src/assets/scripts/hooks/learning-lock +44 -0
- package/src/assets/scripts/hooks/lib/decisions-format.cjs +301 -0
- package/src/assets/scripts/hooks/lib/mkdir-lock.cjs +106 -0
- package/src/assets/scripts/hooks/lib/project-paths.cjs +230 -0
- package/src/assets/scripts/hooks/lib/render-decisions.cjs +398 -0
- package/src/assets/scripts/hooks/lib/safe-path.cjs +29 -0
- package/src/assets/scripts/hooks/log-paths +24 -0
- package/src/assets/scripts/hooks/memory-worker +101 -0
- package/src/assets/scripts/hooks/pre-compact-memory +126 -0
- package/src/assets/scripts/hooks/preamble +77 -0
- package/src/assets/scripts/hooks/queue-append +120 -0
- package/src/assets/scripts/hooks/resolve-project-root +37 -0
- package/src/assets/scripts/hooks/run-hook +31 -0
- package/src/assets/scripts/hooks/session-start-context +180 -0
- package/src/assets/scripts/hooks/session-start-memory +318 -0
- package/src/assets/scripts/hooks/session-start-orchestrator +54 -0
- package/src/assets/scripts/hud.sh +5 -0
- package/src/assets/scripts/redact-secrets.cjs +410 -0
- package/src/assets/skills/accessibility/SKILL.md +145 -0
- package/src/assets/skills/accessibility/references/patterns.md +398 -0
- package/src/assets/skills/accessibility/references/sources.md +26 -0
- package/src/assets/skills/accessibility/references/violations.md +358 -0
- package/src/assets/skills/apply-decisions/SKILL.md +100 -0
- package/src/assets/skills/apply-feature-knowledge/SKILL.md +69 -0
- package/src/assets/skills/architecture/SKILL.md +138 -0
- package/src/assets/skills/architecture/references/patterns.md +378 -0
- package/src/assets/skills/architecture/references/sources.md +41 -0
- package/src/assets/skills/architecture/references/violations.md +314 -0
- package/src/assets/skills/boundary-validation/SKILL.md +119 -0
- package/src/assets/skills/boundary-validation/references/detection.md +283 -0
- package/src/assets/skills/boundary-validation/references/patterns.md +283 -0
- package/src/assets/skills/boundary-validation/references/sources.md +41 -0
- package/src/assets/skills/boundary-validation/references/violations.md +211 -0
- package/src/assets/skills/complexity/SKILL.md +150 -0
- package/src/assets/skills/compliance/SKILL.md +121 -0
- package/src/assets/skills/compliance/frameworks/gdpr/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/gdpr/reference.md +50 -0
- package/src/assets/skills/compliance/frameworks/hipaa/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/hipaa/reference.md +44 -0
- package/src/assets/skills/compliance/frameworks/iso-27001/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/iso-27001/reference.md +45 -0
- package/src/assets/skills/compliance/frameworks/pci-dss/fragment.md +11 -0
- package/src/assets/skills/compliance/frameworks/pci-dss/reference.md +55 -0
- package/src/assets/skills/compliance/frameworks/soc2/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/soc2/reference.md +53 -0
- package/src/assets/skills/compliance/frameworks/sox/fragment.md +10 -0
- package/src/assets/skills/compliance/frameworks/sox/reference.md +67 -0
- package/src/assets/skills/compliance/references/detection.md +108 -0
- package/src/assets/skills/compliance/references/sources.md +28 -0
- package/src/assets/skills/consistency/SKILL.md +140 -0
- package/src/assets/skills/database/SKILL.md +134 -0
- package/src/assets/skills/dependencies/SKILL.md +141 -0
- package/src/assets/skills/dependency-research/SKILL.md +133 -0
- package/src/assets/skills/dependency-research/references/evaluation-criteria.md +101 -0
- package/src/assets/skills/design-review/SKILL.md +155 -0
- package/src/assets/skills/design-review/references/anti-patterns.md +207 -0
- package/src/assets/skills/docs-framework/SKILL.md +190 -0
- package/src/assets/skills/docs-framework/references/patterns.md +381 -0
- package/src/assets/skills/docs-framework/references/violations.md +221 -0
- package/src/assets/skills/documentation/SKILL.md +126 -0
- package/src/assets/skills/feature-knowledge/SKILL.md +341 -0
- package/src/assets/skills/gap-analysis/SKILL.md +151 -0
- package/src/assets/skills/gap-analysis/references/check-layers.md +125 -0
- package/src/assets/skills/git/SKILL.md +287 -0
- package/src/assets/skills/git/references/github-api.md +666 -0
- package/src/assets/skills/git/references/patterns.md +324 -0
- package/src/assets/skills/git/references/sources.md +16 -0
- package/src/assets/skills/git/references/violations.md +128 -0
- package/src/assets/skills/go/SKILL.md +147 -0
- package/src/assets/skills/go/references/concurrency.md +335 -0
- package/src/assets/skills/go/references/patterns.md +278 -0
- package/src/assets/skills/go/references/sources.md +41 -0
- package/src/assets/skills/go/references/violations.md +262 -0
- package/src/assets/skills/java/SKILL.md +148 -0
- package/src/assets/skills/java/references/modern-java.md +335 -0
- package/src/assets/skills/java/references/patterns.md +311 -0
- package/src/assets/skills/java/references/sources.md +44 -0
- package/src/assets/skills/java/references/violations.md +257 -0
- package/src/assets/skills/patterns/SKILL.md +162 -0
- package/src/assets/skills/performance/SKILL.md +135 -0
- package/src/assets/skills/performance/references/patterns.md +516 -0
- package/src/assets/skills/performance/references/sources.md +41 -0
- package/src/assets/skills/performance/references/violations.md +417 -0
- package/src/assets/skills/python/SKILL.md +156 -0
- package/src/assets/skills/python/references/async.md +255 -0
- package/src/assets/skills/python/references/patterns.md +280 -0
- package/src/assets/skills/python/references/sources.md +41 -0
- package/src/assets/skills/python/references/violations.md +272 -0
- package/src/assets/skills/qa/SKILL.md +136 -0
- package/src/assets/skills/qa/references/browser-testing.md +97 -0
- package/src/assets/skills/qa/references/patterns.md +118 -0
- package/src/assets/skills/qa/references/scenario-templates.md +102 -0
- package/src/assets/skills/qa/references/sources.md +30 -0
- package/src/assets/skills/qa/references/violations.md +98 -0
- package/src/assets/skills/quality-gates/SKILL.md +152 -0
- package/src/assets/skills/quality-gates/references/stub-detection.md +135 -0
- package/src/assets/skills/react/SKILL.md +143 -0
- package/src/assets/skills/react/references/error-handling.md +179 -0
- package/src/assets/skills/react/references/forms.md +214 -0
- package/src/assets/skills/react/references/hooks.md +193 -0
- package/src/assets/skills/react/references/patterns.md +1336 -0
- package/src/assets/skills/react/references/sources.md +35 -0
- package/src/assets/skills/react/references/violations.md +570 -0
- package/src/assets/skills/regression/SKILL.md +146 -0
- package/src/assets/skills/reliability/SKILL.md +153 -0
- package/src/assets/skills/reliability/references/detection.md +66 -0
- package/src/assets/skills/reliability/references/patterns.md +151 -0
- package/src/assets/skills/reliability/references/sources.md +27 -0
- package/src/assets/skills/reliability/references/violations.md +125 -0
- package/src/assets/skills/research-codebase/SKILL.md +135 -0
- package/src/assets/skills/research-competitor/SKILL.md +145 -0
- package/src/assets/skills/research-external/SKILL.md +141 -0
- package/src/assets/skills/research-market/SKILL.md +145 -0
- package/src/assets/skills/research-technology/SKILL.md +180 -0
- package/src/assets/skills/review-methodology/SKILL.md +121 -0
- package/src/assets/skills/review-methodology/references/patterns.md +186 -0
- package/src/assets/skills/review-methodology/references/report-template.md +142 -0
- package/src/assets/skills/review-methodology/references/violations.md +125 -0
- package/src/assets/skills/rust/SKILL.md +148 -0
- package/src/assets/skills/rust/references/ownership.md +278 -0
- package/src/assets/skills/rust/references/patterns.md +247 -0
- package/src/assets/skills/rust/references/sources.md +46 -0
- package/src/assets/skills/rust/references/violations.md +252 -0
- package/src/assets/skills/security/SKILL.md +121 -0
- package/src/assets/skills/security/references/patterns.md +271 -0
- package/src/assets/skills/security/references/sources.md +41 -0
- package/src/assets/skills/security/references/violations.md +241 -0
- package/src/assets/skills/software-design/SKILL.md +143 -0
- package/src/assets/skills/software-design/references/checklist.md +259 -0
- package/src/assets/skills/software-design/references/code-smell-violations.md +189 -0
- package/src/assets/skills/software-design/references/patterns.md +359 -0
- package/src/assets/skills/software-design/references/sources.md +41 -0
- package/src/assets/skills/software-design/references/violations.md +341 -0
- package/src/assets/skills/test-driven-development/SKILL.md +197 -0
- package/src/assets/skills/testing/SKILL.md +139 -0
- package/src/assets/skills/testing/references/patterns.md +346 -0
- package/src/assets/skills/testing/references/sources.md +53 -0
- package/src/assets/skills/testing/references/violations.md +322 -0
- package/src/assets/skills/typescript/SKILL.md +150 -0
- package/src/assets/skills/typescript/references/async.md +333 -0
- package/src/assets/skills/typescript/references/patterns.md +440 -0
- package/src/assets/skills/typescript/references/sources.md +41 -0
- package/src/assets/skills/typescript/references/type-guards.md +333 -0
- package/src/assets/skills/typescript/references/utility-types.md +255 -0
- package/src/assets/skills/typescript/references/violations.md +285 -0
- package/src/assets/skills/ui-design/SKILL.md +144 -0
- package/src/assets/skills/ui-design/references/patterns.md +341 -0
- package/src/assets/skills/ui-design/references/sources.md +41 -0
- package/src/assets/skills/ui-design/references/violations.md +312 -0
- package/src/assets/skills/worktree-support/SKILL.md +92 -0
- package/src/targets/claude-code/templates/claudeignore.template +188 -0
- package/src/targets/claude-code/templates/settings.json +86 -0
- package/dist/cli.d.ts +0 -3
- package/dist/commands/ambient.d.ts +0 -18
- package/dist/commands/ambient.js +0 -137
- package/dist/commands/hud.d.ts +0 -22
- package/dist/commands/hud.js +0 -180
- package/dist/commands/init.d.ts +0 -16
- package/dist/commands/init.js +0 -738
- package/dist/commands/list.d.ts +0 -24
- package/dist/commands/list.js +0 -89
- package/dist/commands/memory.d.ts +0 -22
- package/dist/commands/memory.js +0 -175
- package/dist/commands/skills.d.ts +0 -11
- package/dist/commands/skills.js +0 -116
- package/dist/commands/uninstall.d.ts +0 -22
- package/dist/commands/uninstall.js +0 -558
- package/dist/hud/cache.d.ts +0 -14
- package/dist/hud/cache.js +0 -54
- package/dist/hud/colors.d.ts +0 -23
- package/dist/hud/components/config-counts.d.ts +0 -8
- package/dist/hud/components/context-usage.d.ts +0 -8
- package/dist/hud/components/diff-stats.d.ts +0 -3
- package/dist/hud/components/directory.d.ts +0 -3
- package/dist/hud/components/git-ahead-behind.d.ts +0 -3
- package/dist/hud/components/git-branch.d.ts +0 -3
- package/dist/hud/components/model.d.ts +0 -3
- package/dist/hud/components/release-info.d.ts +0 -3
- package/dist/hud/components/session-cost.d.ts +0 -3
- package/dist/hud/components/session-duration.d.ts +0 -3
- package/dist/hud/components/todo-progress.d.ts +0 -3
- package/dist/hud/components/usage-quota.d.ts +0 -3
- package/dist/hud/components/version-badge.d.ts +0 -3
- package/dist/hud/components/worktree-count.d.ts +0 -3
- package/dist/hud/config.d.ts +0 -10
- package/dist/hud/credentials.d.ts +0 -17
- package/dist/hud/credentials.js +0 -99
- package/dist/hud/git.d.ts +0 -7
- package/dist/hud/index.d.ts +0 -2
- package/dist/hud/render.d.ts +0 -7
- package/dist/hud/stdin.d.ts +0 -6
- package/dist/hud/transcript.d.ts +0 -7
- package/dist/hud/types.d.ts +0 -116
- package/dist/hud/usage-api.d.ts +0 -7
- package/dist/hud/usage-api.js +0 -84
- package/dist/plugins.d.ts +0 -46
- package/dist/plugins.js +0 -233
- package/dist/utils/cli.d.ts +0 -5
- package/dist/utils/cli.js +0 -14
- package/dist/utils/git.d.ts +0 -11
- package/dist/utils/git.js +0 -36
- package/dist/utils/installer.d.ts +0 -41
- package/dist/utils/installer.js +0 -195
- package/dist/utils/manifest.d.ts +0 -46
- package/dist/utils/manifest.js +0 -100
- package/dist/utils/paths.d.ts +0 -42
- package/dist/utils/paths.js +0 -106
- package/dist/utils/post-install.d.ts +0 -87
- package/dist/utils/post-install.js +0 -546
- package/dist/utils/safe-delete-install.d.ts +0 -29
- package/dist/utils/safe-delete-install.js +0 -191
- package/dist/utils/safe-delete.d.ts +0 -12
- package/plugins/devflow-accessibility/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-accessibility/skills/accessibility/SKILL.md +0 -229
- package/plugins/devflow-accessibility/skills/accessibility/references/patterns.md +0 -670
- package/plugins/devflow-accessibility/skills/accessibility/references/violations.md +0 -419
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +0 -33
- package/plugins/devflow-ambient/README.md +0 -68
- package/plugins/devflow-ambient/agents/coder.md +0 -135
- package/plugins/devflow-ambient/agents/reviewer.md +0 -165
- package/plugins/devflow-ambient/agents/scrutinizer.md +0 -82
- package/plugins/devflow-ambient/agents/shepherd.md +0 -108
- package/plugins/devflow-ambient/agents/simplifier.md +0 -102
- package/plugins/devflow-ambient/agents/skimmer.md +0 -143
- package/plugins/devflow-ambient/agents/validator.md +0 -86
- package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +0 -145
- package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +0 -74
- package/plugins/devflow-ambient/skills/debug-orchestration/SKILL.md +0 -69
- package/plugins/devflow-ambient/skills/implementation-orchestration/SKILL.md +0 -92
- package/plugins/devflow-ambient/skills/plan-orchestration/SKILL.md +0 -71
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +0 -19
- package/plugins/devflow-audit-claude/README.md +0 -46
- package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +0 -134
- package/plugins/devflow-audit-claude/commands/audit-claude.md +0 -89
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +0 -38
- package/plugins/devflow-code-review/README.md +0 -73
- package/plugins/devflow-code-review/agents/git.md +0 -277
- package/plugins/devflow-code-review/agents/reviewer.md +0 -165
- package/plugins/devflow-code-review/agents/synthesizer.md +0 -211
- package/plugins/devflow-code-review/commands/code-review-teams.md +0 -285
- package/plugins/devflow-code-review/commands/code-review.md +0 -163
- package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +0 -153
- package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +0 -873
- package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +0 -575
- package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +0 -143
- package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +0 -140
- package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +0 -134
- package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +0 -141
- package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +0 -125
- package/plugins/devflow-code-review/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-code-review/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +0 -154
- package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +0 -503
- package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +0 -354
- package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +0 -146
- package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +0 -119
- package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +0 -186
- package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +0 -142
- package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +0 -125
- package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +0 -156
- package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +0 -507
- package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +0 -237
- package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +0 -183
- package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +0 -220
- package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +0 -221
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +0 -31
- package/plugins/devflow-core-skills/README.md +0 -50
- package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +0 -162
- package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +0 -276
- package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +0 -576
- package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +0 -369
- package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +0 -143
- package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +0 -346
- package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +0 -221
- package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +0 -122
- package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +0 -289
- package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +0 -18
- package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +0 -158
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +0 -115
- package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +0 -77
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +0 -127
- package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +0 -96
- package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +0 -153
- package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +0 -572
- package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +0 -298
- package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +0 -148
- package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +0 -283
- package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +0 -361
- package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +0 -224
- package/plugins/devflow-core-skills/skills/search-first/SKILL.md +0 -133
- package/plugins/devflow-core-skills/skills/search-first/references/evaluation-criteria.md +0 -101
- package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +0 -137
- package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +0 -183
- package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +0 -149
- package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +0 -220
- package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +0 -108
- package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +0 -221
- package/plugins/devflow-debug/.claude-plugin/plugin.json +0 -26
- package/plugins/devflow-debug/README.md +0 -65
- package/plugins/devflow-debug/agents/git.md +0 -277
- package/plugins/devflow-debug/agents/synthesizer.md +0 -211
- package/plugins/devflow-debug/commands/debug-teams.md +0 -245
- package/plugins/devflow-debug/commands/debug.md +0 -174
- package/plugins/devflow-debug/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-debug/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-debug/skills/git-safety/SKILL.md +0 -122
- package/plugins/devflow-debug/skills/git-safety/references/detection.md +0 -290
- package/plugins/devflow-debug/skills/git-safety/references/patterns.md +0 -289
- package/plugins/devflow-debug/skills/git-safety/references/violations.md +0 -18
- package/plugins/devflow-debug/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-debug/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-frontend-design/skills/frontend-design/SKILL.md +0 -254
- package/plugins/devflow-frontend-design/skills/frontend-design/references/patterns.md +0 -511
- package/plugins/devflow-frontend-design/skills/frontend-design/references/violations.md +0 -453
- package/plugins/devflow-go/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-go/skills/go/SKILL.md +0 -187
- package/plugins/devflow-go/skills/go/references/concurrency.md +0 -312
- package/plugins/devflow-go/skills/go/references/patterns.md +0 -232
- package/plugins/devflow-go/skills/go/references/violations.md +0 -205
- package/plugins/devflow-implement/.claude-plugin/plugin.json +0 -35
- package/plugins/devflow-implement/README.md +0 -71
- package/plugins/devflow-implement/agents/coder.md +0 -135
- package/plugins/devflow-implement/agents/git.md +0 -277
- package/plugins/devflow-implement/agents/scrutinizer.md +0 -82
- package/plugins/devflow-implement/agents/shepherd.md +0 -108
- package/plugins/devflow-implement/agents/simplifier.md +0 -102
- package/plugins/devflow-implement/agents/skimmer.md +0 -143
- package/plugins/devflow-implement/agents/synthesizer.md +0 -211
- package/plugins/devflow-implement/agents/validator.md +0 -86
- package/plugins/devflow-implement/commands/implement-teams.md +0 -620
- package/plugins/devflow-implement/commands/implement.md +0 -430
- package/plugins/devflow-implement/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-implement/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +0 -162
- package/plugins/devflow-implement/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-implement/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-implement/skills/self-review/SKILL.md +0 -149
- package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +0 -135
- package/plugins/devflow-java/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-java/skills/java/SKILL.md +0 -183
- package/plugins/devflow-java/skills/java/references/modern-java.md +0 -270
- package/plugins/devflow-java/skills/java/references/patterns.md +0 -235
- package/plugins/devflow-java/skills/java/references/violations.md +0 -213
- package/plugins/devflow-python/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-python/skills/python/SKILL.md +0 -188
- package/plugins/devflow-python/skills/python/references/async.md +0 -220
- package/plugins/devflow-python/skills/python/references/patterns.md +0 -226
- package/plugins/devflow-python/skills/python/references/violations.md +0 -204
- package/plugins/devflow-react/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-react/skills/react/SKILL.md +0 -276
- package/plugins/devflow-react/skills/react/references/patterns.md +0 -1331
- package/plugins/devflow-react/skills/react/references/violations.md +0 -565
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +0 -29
- package/plugins/devflow-resolve/README.md +0 -65
- package/plugins/devflow-resolve/agents/git.md +0 -277
- package/plugins/devflow-resolve/agents/resolver.md +0 -131
- package/plugins/devflow-resolve/agents/simplifier.md +0 -102
- package/plugins/devflow-resolve/commands/resolve-teams.md +0 -307
- package/plugins/devflow-resolve/commands/resolve.md +0 -246
- package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +0 -162
- package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +0 -1063
- package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +0 -483
- package/plugins/devflow-resolve/skills/knowledge-persistence/SKILL.md +0 -128
- package/plugins/devflow-resolve/skills/knowledge-persistence/references/examples.md +0 -44
- package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +0 -156
- package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +0 -287
- package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +0 -507
- package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +0 -237
- package/plugins/devflow-rust/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-rust/skills/rust/SKILL.md +0 -193
- package/plugins/devflow-rust/skills/rust/references/ownership.md +0 -242
- package/plugins/devflow-rust/skills/rust/references/patterns.md +0 -210
- package/plugins/devflow-rust/skills/rust/references/violations.md +0 -191
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +0 -26
- package/plugins/devflow-self-review/README.md +0 -38
- package/plugins/devflow-self-review/agents/scrutinizer.md +0 -82
- package/plugins/devflow-self-review/agents/simplifier.md +0 -102
- package/plugins/devflow-self-review/agents/validator.md +0 -86
- package/plugins/devflow-self-review/commands/self-review.md +0 -132
- package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +0 -162
- package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +0 -276
- package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +0 -303
- package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +0 -576
- package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +0 -369
- package/plugins/devflow-self-review/skills/self-review/SKILL.md +0 -149
- package/plugins/devflow-self-review/skills/self-review/references/patterns.md +0 -405
- package/plugins/devflow-self-review/skills/self-review/references/report-template.md +0 -253
- package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +0 -135
- package/plugins/devflow-self-review/skills/self-review/references/violations.md +0 -308
- package/plugins/devflow-specify/.claude-plugin/plugin.json +0 -25
- package/plugins/devflow-specify/README.md +0 -46
- package/plugins/devflow-specify/agents/skimmer.md +0 -143
- package/plugins/devflow-specify/agents/synthesizer.md +0 -211
- package/plugins/devflow-specify/commands/specify-teams.md +0 -321
- package/plugins/devflow-specify/commands/specify.md +0 -186
- package/plugins/devflow-specify/skills/agent-teams/SKILL.md +0 -124
- package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +0 -104
- package/plugins/devflow-specify/skills/agent-teams/references/communication.md +0 -122
- package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +0 -217
- package/plugins/devflow-typescript/.claude-plugin/plugin.json +0 -21
- package/plugins/devflow-typescript/skills/typescript/SKILL.md +0 -176
- package/plugins/devflow-typescript/skills/typescript/references/patterns.md +0 -1105
- package/plugins/devflow-typescript/skills/typescript/references/violations.md +0 -433
- package/scripts/hooks/ambient-prompt +0 -50
- package/scripts/hooks/background-memory-update +0 -257
- package/scripts/hooks/ensure-memory-gitignore +0 -17
- package/scripts/hooks/pre-compact-memory +0 -87
- package/scripts/hooks/run-hook +0 -23
- package/scripts/hooks/session-start-memory +0 -165
- package/scripts/hooks/stop-update-memory +0 -85
- package/scripts/hud/cache.d.ts +0 -14
- package/scripts/hud/cache.d.ts.map +0 -1
- package/scripts/hud/cache.js +0 -54
- package/scripts/hud/cache.js.map +0 -1
- package/scripts/hud/colors.d.ts +0 -23
- package/scripts/hud/colors.d.ts.map +0 -1
- package/scripts/hud/colors.js +0 -62
- package/scripts/hud/colors.js.map +0 -1
- package/scripts/hud/components/config-counts.d.ts +0 -8
- package/scripts/hud/components/config-counts.d.ts.map +0 -1
- package/scripts/hud/components/config-counts.js +0 -91
- package/scripts/hud/components/config-counts.js.map +0 -1
- package/scripts/hud/components/context-usage.d.ts +0 -8
- package/scripts/hud/components/context-usage.d.ts.map +0 -1
- package/scripts/hud/components/context-usage.js +0 -49
- package/scripts/hud/components/context-usage.js.map +0 -1
- package/scripts/hud/components/diff-stats.d.ts +0 -3
- package/scripts/hud/components/diff-stats.d.ts.map +0 -1
- package/scripts/hud/components/diff-stats.js +0 -36
- package/scripts/hud/components/diff-stats.js.map +0 -1
- package/scripts/hud/components/directory.d.ts +0 -3
- package/scripts/hud/components/directory.d.ts.map +0 -1
- package/scripts/hud/components/directory.js +0 -10
- package/scripts/hud/components/directory.js.map +0 -1
- package/scripts/hud/components/git-ahead-behind.d.ts +0 -3
- package/scripts/hud/components/git-ahead-behind.d.ts.map +0 -1
- package/scripts/hud/components/git-ahead-behind.js +0 -16
- package/scripts/hud/components/git-ahead-behind.js.map +0 -1
- package/scripts/hud/components/git-branch.d.ts +0 -3
- package/scripts/hud/components/git-branch.d.ts.map +0 -1
- package/scripts/hud/components/git-branch.js +0 -14
- package/scripts/hud/components/git-branch.js.map +0 -1
- package/scripts/hud/components/model.d.ts +0 -3
- package/scripts/hud/components/model.d.ts.map +0 -1
- package/scripts/hud/components/model.js +0 -21
- package/scripts/hud/components/model.js.map +0 -1
- package/scripts/hud/components/release-info.d.ts +0 -3
- package/scripts/hud/components/release-info.d.ts.map +0 -1
- package/scripts/hud/components/release-info.js +0 -9
- package/scripts/hud/components/release-info.js.map +0 -1
- package/scripts/hud/components/session-cost.d.ts +0 -3
- package/scripts/hud/components/session-cost.d.ts.map +0 -1
- package/scripts/hud/components/session-cost.js +0 -9
- package/scripts/hud/components/session-cost.js.map +0 -1
- package/scripts/hud/components/session-duration.d.ts +0 -3
- package/scripts/hud/components/session-duration.d.ts.map +0 -1
- package/scripts/hud/components/session-duration.js +0 -18
- package/scripts/hud/components/session-duration.js.map +0 -1
- package/scripts/hud/components/todo-progress.d.ts +0 -3
- package/scripts/hud/components/todo-progress.d.ts.map +0 -1
- package/scripts/hud/components/todo-progress.js +0 -11
- package/scripts/hud/components/todo-progress.js.map +0 -1
- package/scripts/hud/components/usage-quota.d.ts +0 -3
- package/scripts/hud/components/usage-quota.d.ts.map +0 -1
- package/scripts/hud/components/usage-quota.js +0 -45
- package/scripts/hud/components/usage-quota.js.map +0 -1
- package/scripts/hud/components/version-badge.d.ts +0 -3
- package/scripts/hud/components/version-badge.d.ts.map +0 -1
- package/scripts/hud/components/version-badge.js +0 -80
- package/scripts/hud/components/version-badge.js.map +0 -1
- package/scripts/hud/components/worktree-count.d.ts +0 -3
- package/scripts/hud/components/worktree-count.d.ts.map +0 -1
- package/scripts/hud/components/worktree-count.js +0 -8
- package/scripts/hud/components/worktree-count.js.map +0 -1
- package/scripts/hud/config.d.ts +0 -10
- package/scripts/hud/config.d.ts.map +0 -1
- package/scripts/hud/config.js +0 -55
- package/scripts/hud/config.js.map +0 -1
- package/scripts/hud/credentials.d.ts +0 -17
- package/scripts/hud/credentials.d.ts.map +0 -1
- package/scripts/hud/credentials.js +0 -99
- package/scripts/hud/credentials.js.map +0 -1
- package/scripts/hud/git.d.ts +0 -7
- package/scripts/hud/git.d.ts.map +0 -1
- package/scripts/hud/git.js +0 -153
- package/scripts/hud/git.js.map +0 -1
- package/scripts/hud/index.d.ts +0 -2
- package/scripts/hud/index.d.ts.map +0 -1
- package/scripts/hud/index.js +0 -81
- package/scripts/hud/index.js.map +0 -1
- package/scripts/hud/render.d.ts +0 -7
- package/scripts/hud/render.d.ts.map +0 -1
- package/scripts/hud/render.js +0 -111
- package/scripts/hud/render.js.map +0 -1
- package/scripts/hud/stdin.d.ts +0 -6
- package/scripts/hud/stdin.d.ts.map +0 -1
- package/scripts/hud/stdin.js +0 -25
- package/scripts/hud/stdin.js.map +0 -1
- package/scripts/hud/transcript.d.ts +0 -7
- package/scripts/hud/transcript.d.ts.map +0 -1
- package/scripts/hud/transcript.js +0 -130
- package/scripts/hud/transcript.js.map +0 -1
- package/scripts/hud/types.d.ts +0 -116
- package/scripts/hud/types.d.ts.map +0 -1
- package/scripts/hud/types.js +0 -2
- package/scripts/hud/types.js.map +0 -1
- package/scripts/hud/usage-api.d.ts +0 -7
- package/scripts/hud/usage-api.d.ts.map +0 -1
- package/scripts/hud/usage-api.js +0 -84
- package/scripts/hud/usage-api.js.map +0 -1
- package/scripts/hud.sh +0 -5
- package/shared/agents/coder.md +0 -135
- package/shared/agents/git.md +0 -277
- package/shared/agents/resolver.md +0 -131
- package/shared/agents/reviewer.md +0 -165
- package/shared/agents/scrutinizer.md +0 -82
- package/shared/agents/shepherd.md +0 -108
- package/shared/agents/simplifier.md +0 -102
- package/shared/agents/skimmer.md +0 -143
- package/shared/agents/synthesizer.md +0 -211
- package/shared/agents/validator.md +0 -86
- package/shared/skills/accessibility/SKILL.md +0 -229
- package/shared/skills/accessibility/references/detection.md +0 -171
- package/shared/skills/accessibility/references/patterns.md +0 -670
- package/shared/skills/accessibility/references/violations.md +0 -419
- package/shared/skills/agent-teams/SKILL.md +0 -124
- package/shared/skills/agent-teams/references/cleanup.md +0 -104
- package/shared/skills/agent-teams/references/communication.md +0 -122
- package/shared/skills/agent-teams/references/team-patterns.md +0 -217
- package/shared/skills/ambient-router/SKILL.md +0 -145
- package/shared/skills/ambient-router/references/skill-catalog.md +0 -74
- package/shared/skills/architecture-patterns/SKILL.md +0 -153
- package/shared/skills/architecture-patterns/references/detection.md +0 -337
- package/shared/skills/architecture-patterns/references/patterns.md +0 -873
- package/shared/skills/architecture-patterns/references/violations.md +0 -575
- package/shared/skills/complexity-patterns/SKILL.md +0 -143
- package/shared/skills/complexity-patterns/references/detection.md +0 -264
- package/shared/skills/complexity-patterns/references/patterns.md +0 -487
- package/shared/skills/complexity-patterns/references/violations.md +0 -361
- package/shared/skills/consistency-patterns/SKILL.md +0 -140
- package/shared/skills/consistency-patterns/references/detection.md +0 -207
- package/shared/skills/consistency-patterns/references/patterns.md +0 -202
- package/shared/skills/consistency-patterns/references/violations.md +0 -213
- package/shared/skills/core-patterns/SKILL.md +0 -162
- package/shared/skills/core-patterns/references/checklist.md +0 -276
- package/shared/skills/core-patterns/references/code-smell-violations.md +0 -144
- package/shared/skills/core-patterns/references/detection.md +0 -303
- package/shared/skills/core-patterns/references/patterns.md +0 -576
- package/shared/skills/core-patterns/references/violations.md +0 -369
- package/shared/skills/database-patterns/SKILL.md +0 -134
- package/shared/skills/database-patterns/references/detection.md +0 -208
- package/shared/skills/database-patterns/references/patterns.md +0 -394
- package/shared/skills/database-patterns/references/violations.md +0 -332
- package/shared/skills/debug-orchestration/SKILL.md +0 -69
- package/shared/skills/dependencies-patterns/SKILL.md +0 -141
- package/shared/skills/dependencies-patterns/references/detection.md +0 -181
- package/shared/skills/dependencies-patterns/references/patterns.md +0 -225
- package/shared/skills/dependencies-patterns/references/violations.md +0 -247
- package/shared/skills/docs-framework/SKILL.md +0 -143
- package/shared/skills/docs-framework/references/patterns.md +0 -346
- package/shared/skills/docs-framework/references/violations.md +0 -221
- package/shared/skills/documentation-patterns/SKILL.md +0 -125
- package/shared/skills/documentation-patterns/references/detection.md +0 -190
- package/shared/skills/documentation-patterns/references/patterns.md +0 -189
- package/shared/skills/documentation-patterns/references/violations.md +0 -163
- package/shared/skills/frontend-design/SKILL.md +0 -254
- package/shared/skills/frontend-design/references/detection.md +0 -184
- package/shared/skills/frontend-design/references/patterns.md +0 -511
- package/shared/skills/frontend-design/references/violations.md +0 -453
- package/shared/skills/git-safety/SKILL.md +0 -122
- package/shared/skills/git-safety/references/detection.md +0 -290
- package/shared/skills/git-safety/references/patterns.md +0 -289
- package/shared/skills/git-safety/references/violations.md +0 -18
- package/shared/skills/git-workflow/SKILL.md +0 -158
- package/shared/skills/git-workflow/references/commit-patterns.md +0 -115
- package/shared/skills/git-workflow/references/commit-violations.md +0 -77
- package/shared/skills/git-workflow/references/pr-patterns.md +0 -127
- package/shared/skills/git-workflow/references/pr-violations.md +0 -96
- package/shared/skills/github-patterns/SKILL.md +0 -153
- package/shared/skills/github-patterns/references/patterns.md +0 -572
- package/shared/skills/github-patterns/references/violations.md +0 -298
- package/shared/skills/go/SKILL.md +0 -187
- package/shared/skills/go/references/concurrency.md +0 -312
- package/shared/skills/go/references/detection.md +0 -129
- package/shared/skills/go/references/patterns.md +0 -232
- package/shared/skills/go/references/violations.md +0 -205
- package/shared/skills/implementation-orchestration/SKILL.md +0 -92
- package/shared/skills/implementation-patterns/SKILL.md +0 -162
- package/shared/skills/implementation-patterns/references/patterns.md +0 -1063
- package/shared/skills/implementation-patterns/references/violations.md +0 -483
- package/shared/skills/input-validation/SKILL.md +0 -148
- package/shared/skills/input-validation/references/detection.md +0 -283
- package/shared/skills/input-validation/references/patterns.md +0 -361
- package/shared/skills/input-validation/references/violations.md +0 -224
- package/shared/skills/java/SKILL.md +0 -183
- package/shared/skills/java/references/detection.md +0 -120
- package/shared/skills/java/references/modern-java.md +0 -270
- package/shared/skills/java/references/patterns.md +0 -235
- package/shared/skills/java/references/violations.md +0 -213
- package/shared/skills/knowledge-persistence/SKILL.md +0 -128
- package/shared/skills/knowledge-persistence/references/examples.md +0 -44
- package/shared/skills/performance-patterns/SKILL.md +0 -154
- package/shared/skills/performance-patterns/references/detection.md +0 -351
- package/shared/skills/performance-patterns/references/patterns.md +0 -503
- package/shared/skills/performance-patterns/references/violations.md +0 -354
- package/shared/skills/plan-orchestration/SKILL.md +0 -71
- package/shared/skills/python/SKILL.md +0 -188
- package/shared/skills/python/references/async.md +0 -220
- package/shared/skills/python/references/detection.md +0 -128
- package/shared/skills/python/references/patterns.md +0 -226
- package/shared/skills/python/references/violations.md +0 -204
- package/shared/skills/react/SKILL.md +0 -276
- package/shared/skills/react/references/patterns.md +0 -1331
- package/shared/skills/react/references/violations.md +0 -565
- package/shared/skills/regression-patterns/SKILL.md +0 -146
- package/shared/skills/regression-patterns/references/detection.md +0 -237
- package/shared/skills/regression-patterns/references/patterns.md +0 -226
- package/shared/skills/regression-patterns/references/violations.md +0 -225
- package/shared/skills/review-methodology/SKILL.md +0 -119
- package/shared/skills/review-methodology/references/patterns.md +0 -186
- package/shared/skills/review-methodology/references/report-template.md +0 -142
- package/shared/skills/review-methodology/references/violations.md +0 -125
- package/shared/skills/rust/SKILL.md +0 -193
- package/shared/skills/rust/references/detection.md +0 -131
- package/shared/skills/rust/references/ownership.md +0 -242
- package/shared/skills/rust/references/patterns.md +0 -210
- package/shared/skills/rust/references/violations.md +0 -191
- package/shared/skills/search-first/SKILL.md +0 -133
- package/shared/skills/search-first/references/evaluation-criteria.md +0 -101
- package/shared/skills/security-patterns/SKILL.md +0 -156
- package/shared/skills/security-patterns/references/detection.md +0 -287
- package/shared/skills/security-patterns/references/patterns.md +0 -507
- package/shared/skills/security-patterns/references/violations.md +0 -237
- package/shared/skills/self-review/SKILL.md +0 -149
- package/shared/skills/self-review/references/patterns.md +0 -405
- package/shared/skills/self-review/references/report-template.md +0 -253
- package/shared/skills/self-review/references/stub-detection.md +0 -135
- package/shared/skills/self-review/references/violations.md +0 -308
- package/shared/skills/test-driven-development/SKILL.md +0 -137
- package/shared/skills/test-driven-development/references/rationalization-prevention.md +0 -111
- package/shared/skills/test-patterns/SKILL.md +0 -183
- package/shared/skills/test-patterns/references/detection.md +0 -149
- package/shared/skills/test-patterns/references/patterns.md +0 -220
- package/shared/skills/test-patterns/references/report-template.md +0 -108
- package/shared/skills/test-patterns/references/violations.md +0 -221
- package/shared/skills/typescript/SKILL.md +0 -176
- package/shared/skills/typescript/references/patterns.md +0 -1105
- package/shared/skills/typescript/references/violations.md +0 -433
- package/src/templates/claudeignore.template +0 -188
- package/src/templates/settings.json +0 -59
- /package/dist/{utils → core}/safe-delete.js +0 -0
- /package/{plugins/devflow-accessibility → src/assets}/skills/accessibility/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/architecture-patterns → src/assets/skills/architecture}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/complexity-patterns → src/assets/skills/complexity}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/consistency-patterns → src/assets/skills/consistency}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/database-patterns → src/assets/skills/database}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/dependencies-patterns → src/assets/skills/dependencies}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/documentation-patterns → src/assets/skills/documentation}/references/violations.md +0 -0
- /package/{plugins/devflow-core-skills/skills/git-safety → src/assets/skills/git}/references/detection.md +0 -0
- /package/{plugins/devflow-go → src/assets}/skills/go/references/detection.md +0 -0
- /package/{plugins/devflow-java → src/assets}/skills/java/references/detection.md +0 -0
- /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/patterns.md +0 -0
- /package/{plugins/devflow-implement/skills/implementation-patterns → src/assets/skills/patterns}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/performance-patterns → src/assets/skills/performance}/references/detection.md +0 -0
- /package/{plugins/devflow-python → src/assets}/skills/python/references/detection.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/patterns.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/report-template.md +0 -0
- /package/{plugins/devflow-implement/skills/self-review → src/assets/skills/quality-gates}/references/violations.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/patterns.md +0 -0
- /package/{plugins/devflow-code-review/skills/regression-patterns → src/assets/skills/regression}/references/violations.md +0 -0
- /package/{plugins/devflow-rust → src/assets}/skills/rust/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/security-patterns → src/assets/skills/security}/references/detection.md +0 -0
- /package/{plugins/devflow-core-skills/skills/core-patterns → src/assets/skills/software-design}/references/detection.md +0 -0
- /package/{plugins/devflow-core-skills → src/assets}/skills/test-driven-development/references/rationalization-prevention.md +0 -0
- /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/detection.md +0 -0
- /package/{plugins/devflow-code-review/skills/test-patterns → src/assets/skills/testing}/references/report-template.md +0 -0
- /package/{plugins/devflow-frontend-design/skills/frontend-design → src/assets/skills/ui-design}/references/detection.md +0 -0
- /package/src/{templates → targets/claude-code/templates}/managed-settings.json +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file learning-queue-cleanup.ts
|
|
3
|
+
*
|
|
4
|
+
* Shared cleanup helpers for `.devflow/learning/`. Imported solely by
|
|
5
|
+
* `src/cli/commands/learning.ts`:
|
|
6
|
+
* - `sweepLegacyDreamMarkers` — used by `devflow learning --reset`
|
|
7
|
+
* - `drainLearningQueue` — used by `devflow learning --clear` / `--disable`
|
|
8
|
+
*/
|
|
9
|
+
import { promises as fs } from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { getLearningPendingTurnsPath, getLearningPendingTurnsProcessingPath, } from './project-paths.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Legacy marker-pipeline sweep
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Fixed-name stamps left by the retired dream marker pipeline. */
|
|
16
|
+
const LEGACY_FIXED_STAMPS = ['.decisions-runs-today', '.curation-last', '.processor-spawned-at'];
|
|
17
|
+
/** Per-session marker variants: (decisions|curation).*.{json,processing,retries,failed} */
|
|
18
|
+
function isLegacyPerSessionMarker(name) {
|
|
19
|
+
return ((name.startsWith('decisions.') || name.startsWith('curation.')) &&
|
|
20
|
+
(name.endsWith('.json') || name.endsWith('.processing') || name.endsWith('.retries') || name.endsWith('.failed')));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Sweep legacy marker-pipeline files from a `.devflow/learning/` directory:
|
|
24
|
+
* the fixed-name stamps above, plus per-session `decisions.*`/`curation.*`
|
|
25
|
+
* markers. Never touches `learning.json` or the live
|
|
26
|
+
* `.pending-turns.jsonl`/`.pending-turns.processing` queue files.
|
|
27
|
+
*
|
|
28
|
+
* ENOENT-idempotent (missing learning dir or already-removed files are not
|
|
29
|
+
* errors). Non-ENOENT errors are rethrown — callers that need best-effort
|
|
30
|
+
* semantics (e.g. `--reset`, which must still finish releasing its lock)
|
|
31
|
+
* should wrap the call in their own try/catch.
|
|
32
|
+
*
|
|
33
|
+
* @returns number of files removed
|
|
34
|
+
*/
|
|
35
|
+
export async function sweepLegacyDreamMarkers(learningDir) {
|
|
36
|
+
let removed = 0;
|
|
37
|
+
for (const name of LEGACY_FIXED_STAMPS) {
|
|
38
|
+
try {
|
|
39
|
+
await fs.unlink(path.join(learningDir, name));
|
|
40
|
+
removed++;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
const code = err.code;
|
|
44
|
+
if (code !== 'ENOENT')
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const entries = await fs.readdir(learningDir);
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
if (isLegacyPerSessionMarker(entry)) {
|
|
52
|
+
try {
|
|
53
|
+
await fs.unlink(path.join(learningDir, entry));
|
|
54
|
+
removed++;
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const code = err.code;
|
|
58
|
+
if (code !== 'ENOENT')
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
const code = err.code;
|
|
66
|
+
if (code !== 'ENOENT')
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
return removed;
|
|
70
|
+
}
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
// Live queue drain
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
/**
|
|
75
|
+
* Drain the learning (decisions-detection) pending-turns queue so stale turns
|
|
76
|
+
* don't process later — used by both `--clear` and `--disable`. A mid-run
|
|
77
|
+
* Learning agent whose claimed batch vanishes aborts without changes, which is
|
|
78
|
+
* the desired outcome in both cases. ENOENT-tolerant; other errors propagate.
|
|
79
|
+
*/
|
|
80
|
+
export async function drainLearningQueue(gitRoot) {
|
|
81
|
+
await Promise.all([
|
|
82
|
+
fs.unlink(getLearningPendingTurnsPath(gitRoot)).catch((e) => {
|
|
83
|
+
if (e.code !== 'ENOENT')
|
|
84
|
+
throw e;
|
|
85
|
+
}),
|
|
86
|
+
fs.unlink(getLearningPendingTurnsProcessingPath(gitRoot)).catch((e) => {
|
|
87
|
+
if (e.code !== 'ENOENT')
|
|
88
|
+
throw e;
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=learning-queue-cleanup.js.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { getDevFlowDirectory } from '../targets/claude-code/claude-paths.js';
|
|
4
|
+
import { getLearningTuningConfigPath } from './project-paths.js';
|
|
5
|
+
const VALID_MODELS = new Set(['opus', 'sonnet', 'haiku']);
|
|
6
|
+
function isValidModel(value) {
|
|
7
|
+
return typeof value === 'string' && VALID_MODELS.has(value);
|
|
8
|
+
}
|
|
9
|
+
const DEFAULTS = {
|
|
10
|
+
model: 'opus',
|
|
11
|
+
debug: false,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Apply a single JSON config layer onto a LearningTuningConfig, returning a new object.
|
|
15
|
+
* Skips fields with wrong types. Swallows parse errors — callers see defaults.
|
|
16
|
+
* Unknown fields (e.g. an old config still on disk with extra knobs) are
|
|
17
|
+
* silently ignored, not an error.
|
|
18
|
+
*/
|
|
19
|
+
export function applyLearningTuningConfigLayer(config, json) {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(json);
|
|
22
|
+
// Object-shape guard mirrors coerceConfig in feature-config.ts: a JSON
|
|
23
|
+
// array, null, or primitive can't be treated as a config record.
|
|
24
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
25
|
+
return { ...config };
|
|
26
|
+
}
|
|
27
|
+
const raw = parsed;
|
|
28
|
+
return {
|
|
29
|
+
// Only accept a model value that belongs to the closed LearningModelAlias domain.
|
|
30
|
+
model: isValidModel(raw.model) ? raw.model : config.model,
|
|
31
|
+
debug: typeof raw.debug === 'boolean' ? raw.debug : config.debug,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return { ...config };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Read a JSON config file and return its contents as a string, or null if absent.
|
|
40
|
+
* Returns null (not throws) on ENOENT or any other read error.
|
|
41
|
+
*/
|
|
42
|
+
function readConfigFile(filePath) {
|
|
43
|
+
try {
|
|
44
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
if (err.code !== 'ENOENT') {
|
|
48
|
+
// Warn but don't crash — callers fall back to defaults.
|
|
49
|
+
console.warn(`[learning-tuning-config] warning: could not read ${filePath}: ${err.message}`);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Load and merge learning agent tuning configuration.
|
|
56
|
+
*
|
|
57
|
+
* Priority (highest wins): project config → global config → defaults.
|
|
58
|
+
*
|
|
59
|
+
* - Global: `~/.devflow/learning.json`
|
|
60
|
+
* - Project: `<cwd>/.devflow/learning/learning.json`
|
|
61
|
+
*
|
|
62
|
+
* Invalid JSON in either file is silently ignored and treated as absent.
|
|
63
|
+
*/
|
|
64
|
+
export function loadLearningTuningConfig(cwd) {
|
|
65
|
+
const globalConfigPath = path.join(getDevFlowDirectory(), 'learning.json');
|
|
66
|
+
const projectConfigPath = getLearningTuningConfigPath(cwd);
|
|
67
|
+
let config = { ...DEFAULTS };
|
|
68
|
+
const globalJson = readConfigFile(globalConfigPath);
|
|
69
|
+
if (globalJson !== null) {
|
|
70
|
+
config = applyLearningTuningConfigLayer(config, globalJson);
|
|
71
|
+
}
|
|
72
|
+
const projectJson = readConfigFile(projectConfigPath);
|
|
73
|
+
if (projectJson !== null) {
|
|
74
|
+
config = applyLearningTuningConfigLayer(config, projectJson);
|
|
75
|
+
}
|
|
76
|
+
return config;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=learning-tuning-config.js.map
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { LEGACY_PLUGIN_NAMES, DELETED_PLUGIN_NAMES } from './plugins.js';
|
|
4
|
+
import { VIEW_MODES } from './flags.js';
|
|
5
|
+
import { normalizeComplianceFeature } from './compliance.js';
|
|
6
|
+
/**
|
|
7
|
+
* Read and parse the manifest file. Returns null if missing or corrupt.
|
|
8
|
+
*/
|
|
9
|
+
export async function readManifest(devflowDir) {
|
|
10
|
+
const manifestPath = path.join(devflowDir, 'manifest.json');
|
|
11
|
+
try {
|
|
12
|
+
const content = await fs.readFile(manifestPath, 'utf-8');
|
|
13
|
+
const data = JSON.parse(content);
|
|
14
|
+
const features = data.features;
|
|
15
|
+
if (!data.version ||
|
|
16
|
+
!Array.isArray(data.plugins) ||
|
|
17
|
+
!data.scope ||
|
|
18
|
+
typeof features !== 'object' ||
|
|
19
|
+
features === null ||
|
|
20
|
+
typeof features.ambient !== 'boolean' ||
|
|
21
|
+
typeof features.memory !== 'boolean' ||
|
|
22
|
+
typeof data.installedAt !== 'string' ||
|
|
23
|
+
typeof data.updatedAt !== 'string') {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// Self-heal: rename features.kb → features.knowledge on disk
|
|
27
|
+
const knowledge = typeof features.knowledge === 'boolean' ? features.knowledge
|
|
28
|
+
: typeof features.kb === 'boolean' ? features.kb
|
|
29
|
+
: false;
|
|
30
|
+
// Self-heal: rename features.decisions → features.learning on disk
|
|
31
|
+
// Coalesce: features.learning wins; fall back to features.decisions; default false.
|
|
32
|
+
const learning = typeof features.learning === 'boolean' ? features.learning
|
|
33
|
+
: typeof features.decisions === 'boolean' ? features.decisions
|
|
34
|
+
: false;
|
|
35
|
+
const needsHeal = features.kb !== undefined || features.decisions !== undefined;
|
|
36
|
+
const SECURITY_MODES = ['none', 'user', 'managed'];
|
|
37
|
+
// Self-heal: non-string-array or absent knownFlags/knownPlugins → undefined (never partial/garbage)
|
|
38
|
+
const asStringArray = (val) => Array.isArray(val) && val.every(e => typeof e === 'string')
|
|
39
|
+
? val
|
|
40
|
+
: undefined;
|
|
41
|
+
const knownFlags = asStringArray(features.knownFlags);
|
|
42
|
+
const knownPlugins = asStringArray(data.knownPlugins);
|
|
43
|
+
const manifest = {
|
|
44
|
+
version: data.version,
|
|
45
|
+
plugins: data.plugins,
|
|
46
|
+
scope: data.scope,
|
|
47
|
+
knownPlugins,
|
|
48
|
+
features: {
|
|
49
|
+
ambient: features.ambient,
|
|
50
|
+
memory: features.memory,
|
|
51
|
+
hud: typeof features.hud === 'boolean' ? features.hud : false,
|
|
52
|
+
knowledge,
|
|
53
|
+
learning,
|
|
54
|
+
rules: typeof features.rules === 'boolean' ? features.rules : true,
|
|
55
|
+
flags: Array.isArray(features.flags) ? features.flags : [],
|
|
56
|
+
knownFlags,
|
|
57
|
+
viewMode: typeof features.viewMode === 'string' && VIEW_MODES.includes(features.viewMode)
|
|
58
|
+
? features.viewMode
|
|
59
|
+
: undefined,
|
|
60
|
+
security: typeof features.security === 'string' && SECURITY_MODES.includes(features.security)
|
|
61
|
+
? features.security
|
|
62
|
+
: undefined,
|
|
63
|
+
// Self-heal: absent proxy field defaults to false (applies ADR-014 self-heal idiom)
|
|
64
|
+
proxy: typeof features.proxy === 'boolean' ? features.proxy : false,
|
|
65
|
+
// Self-heal: absent/malformed compliance → {enabled:false, frameworks:[]}
|
|
66
|
+
// (applies ADR-014 self-heal idiom; normalizeComplianceFeature is in TOLERANT section)
|
|
67
|
+
compliance: normalizeComplianceFeature(features.compliance),
|
|
68
|
+
},
|
|
69
|
+
installedAt: data.installedAt,
|
|
70
|
+
updatedAt: data.updatedAt,
|
|
71
|
+
};
|
|
72
|
+
if (needsHeal) {
|
|
73
|
+
await writeManifest(devflowDir, manifest);
|
|
74
|
+
}
|
|
75
|
+
return manifest;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Write manifest to disk. Creates parent directory if needed.
|
|
83
|
+
*/
|
|
84
|
+
export async function writeManifest(devflowDir, data) {
|
|
85
|
+
await fs.mkdir(devflowDir, { recursive: true });
|
|
86
|
+
const manifestPath = path.join(devflowDir, 'manifest.json');
|
|
87
|
+
await fs.writeFile(manifestPath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Update a single feature field in the manifest. No-op when no manifest exists.
|
|
91
|
+
* Reads, mutates, and writes atomically. The `updatedAt` timestamp is always refreshed.
|
|
92
|
+
*
|
|
93
|
+
* Use this in toggle commands (ambient, hud, memory, decisions, security) instead of
|
|
94
|
+
* the repeated read → if-exists → mutate → write pattern.
|
|
95
|
+
*/
|
|
96
|
+
export async function syncManifestFeature(devflowDir, key, value) {
|
|
97
|
+
const manifest = await readManifest(devflowDir);
|
|
98
|
+
if (!manifest)
|
|
99
|
+
return;
|
|
100
|
+
manifest.features[key] = value;
|
|
101
|
+
manifest.updatedAt = new Date().toISOString();
|
|
102
|
+
await writeManifest(devflowDir, manifest);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Merge new plugins into existing plugin list (union, no duplicates).
|
|
106
|
+
* Preserves order: existing plugins first, then new ones appended.
|
|
107
|
+
*/
|
|
108
|
+
export function mergeManifestPlugins(existing, newPlugins) {
|
|
109
|
+
const merged = [...existing];
|
|
110
|
+
for (const plugin of newPlugins) {
|
|
111
|
+
if (!merged.includes(plugin)) {
|
|
112
|
+
merged.push(plugin);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return merged;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Compare two semver strings. Returns -1, 0, or 1.
|
|
119
|
+
* Handles simple x.y.z versions; returns null for unparseable input.
|
|
120
|
+
*
|
|
121
|
+
* Note: Pre-release suffixes (e.g., `-beta.1`, `-rc.2`) are silently ignored.
|
|
122
|
+
* `1.0.0-beta.1` and `1.0.0` compare as equal. Build metadata is also ignored.
|
|
123
|
+
*/
|
|
124
|
+
function compareSemver(a, b) {
|
|
125
|
+
const parse = (v) => {
|
|
126
|
+
const match = v.match(/^v?(\d+)\.(\d+)\.(\d+)/);
|
|
127
|
+
return match ? [Number(match[1]), Number(match[2]), Number(match[3])] : [];
|
|
128
|
+
};
|
|
129
|
+
const pa = parse(a);
|
|
130
|
+
const pb = parse(b);
|
|
131
|
+
if (pa.length === 0 || pb.length === 0)
|
|
132
|
+
return null;
|
|
133
|
+
for (let i = 0; i < 3; i++) {
|
|
134
|
+
if (pa[i] > pb[i])
|
|
135
|
+
return 1;
|
|
136
|
+
if (pa[i] < pb[i])
|
|
137
|
+
return -1;
|
|
138
|
+
}
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolve the final plugin list for a manifest write.
|
|
143
|
+
* On partial installs (--plugin flag), merge newly installed plugins into
|
|
144
|
+
* the existing manifest's plugin list. On full installs, replace entirely.
|
|
145
|
+
*/
|
|
146
|
+
export function resolvePluginList(installedPluginNames, existingManifest, isPartialInstall) {
|
|
147
|
+
if (existingManifest && isPartialInstall) {
|
|
148
|
+
const deletedSet = new Set(DELETED_PLUGIN_NAMES);
|
|
149
|
+
const cleaned = existingManifest.plugins
|
|
150
|
+
.filter(p => !deletedSet.has(p))
|
|
151
|
+
.map(p => LEGACY_PLUGIN_NAMES[p] ?? p);
|
|
152
|
+
return mergeManifestPlugins(cleaned, installedPluginNames);
|
|
153
|
+
}
|
|
154
|
+
return installedPluginNames;
|
|
155
|
+
}
|
|
156
|
+
export function detectUpgrade(currentVersion, installedVersion) {
|
|
157
|
+
if (!installedVersion) {
|
|
158
|
+
return { isUpgrade: false, isDowngrade: false, isSameVersion: false, previousVersion: null };
|
|
159
|
+
}
|
|
160
|
+
const cmp = compareSemver(currentVersion, installedVersion);
|
|
161
|
+
if (cmp === null) {
|
|
162
|
+
return { isUpgrade: false, isDowngrade: false, isSameVersion: false, previousVersion: installedVersion };
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
isUpgrade: cmp > 0,
|
|
166
|
+
isDowngrade: cmp < 0,
|
|
167
|
+
isSameVersion: cmp === 0,
|
|
168
|
+
previousVersion: installedVersion,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file migrations.ts
|
|
3
|
+
*
|
|
4
|
+
* Run-once migration registry for devflow init. Migrations execute at most once
|
|
5
|
+
* per machine (global scope) or once per machine across all discovered projects
|
|
6
|
+
* (per-project scope). State is persisted at ~/.devflow/migrations.json.
|
|
7
|
+
*
|
|
8
|
+
* Registry holds 2.x entries only (first: canonicalise-agent-keys-v1). To add a
|
|
9
|
+
* migration, append an entry to MIGRATIONS below. No 1.x → 2.0 upgrade path.
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from 'fs';
|
|
12
|
+
import * as path from 'path';
|
|
13
|
+
import * as os from 'os';
|
|
14
|
+
import { writeFileAtomicExclusive } from './fs-atomic.js';
|
|
15
|
+
import { getMemoryDir } from './project-paths.js';
|
|
16
|
+
import { LEGACY_AGENT_KEYS, canonicaliseAgentKeys, parseAgentMappingEnvelope } from './agent-models.js';
|
|
17
|
+
/**
|
|
18
|
+
* D31: Registry pattern over scattered `if (!applied.includes(...))` conditionals.
|
|
19
|
+
*
|
|
20
|
+
* A typed array of Migration entries provides:
|
|
21
|
+
* - Single authoritative list of all one-time migrations (no hunting across files)
|
|
22
|
+
* - Explicit scope field that drives the runner's dispatch logic without branching
|
|
23
|
+
* on migration IDs
|
|
24
|
+
* - Append-only growth: adding a migration = adding an entry here, nothing else
|
|
25
|
+
*
|
|
26
|
+
* The `scope` field distinguishes global (one run per machine, no project context
|
|
27
|
+
* needed) from per-project (sweeps every discovered Claude-enabled project root).
|
|
28
|
+
*
|
|
29
|
+
* Append new migrations here.
|
|
30
|
+
*
|
|
31
|
+
* KNOWN ISSUE (out of scope for this wave): the migration runner retries a
|
|
32
|
+
* THROWING migration on every `devflow init`, forever, with no cap or backoff.
|
|
33
|
+
* This was acceptable with an empty MIGRATIONS registry (D37: the vacuous-truth
|
|
34
|
+
* case); this registry's first real entry is added below. Fix deferred.
|
|
35
|
+
*
|
|
36
|
+
* Note how that interacts with `canonicalise-agent-keys-v1`: runGlobalMigration
|
|
37
|
+
* marks a migration applied for ANY non-throwing return, and that entry never
|
|
38
|
+
* throws — it catches every I/O and parse failure and returns it as a *warning*.
|
|
39
|
+
* So it does NOT hit the unbounded-retry path. It hits the opposite one: a
|
|
40
|
+
* transient EACCES or a failed write records the migration as applied and it
|
|
41
|
+
* never runs again, leaving legacy keys on disk permanently.
|
|
42
|
+
*
|
|
43
|
+
* That is survivable by design rather than by luck: `readAgentMapping` applies
|
|
44
|
+
* canonicaliseAgentKeys on EVERY read, so a user whose disk migration silently
|
|
45
|
+
* failed still resolves their overrides correctly, and the next write persists
|
|
46
|
+
* the canonical keys. The disk file self-heals; only the one-time rewrite is
|
|
47
|
+
* lost. A future fix should make genuine I/O failure (as distinct from
|
|
48
|
+
* "malformed file, skip it") throw so the runner retries it.
|
|
49
|
+
*/
|
|
50
|
+
export const MIGRATIONS = [
|
|
51
|
+
{
|
|
52
|
+
id: 'canonicalise-agent-keys-v1',
|
|
53
|
+
description: 'Rename legacy agent keys in ~/.devflow/agent-models.json to their canonical names',
|
|
54
|
+
scope: 'global',
|
|
55
|
+
async run(ctx) {
|
|
56
|
+
const infos = [];
|
|
57
|
+
const warnings = [];
|
|
58
|
+
// Fast path: no legacy keys defined — skip without touching the file.
|
|
59
|
+
if (Object.keys(LEGACY_AGENT_KEYS).length === 0)
|
|
60
|
+
return { infos, warnings };
|
|
61
|
+
const filePath = path.join(ctx.devflowDir, 'agent-models.json');
|
|
62
|
+
// parseAgentMappingEnvelope handles IO, BOM-strip, JSON parse, and shape validation.
|
|
63
|
+
// Raw read intentionally avoids readAgentMapping (which would drop unknown fields).
|
|
64
|
+
const envelope = await parseAgentMappingEnvelope(filePath);
|
|
65
|
+
if (envelope.kind === 'skip')
|
|
66
|
+
return { infos, warnings };
|
|
67
|
+
if (envelope.kind === 'warn') {
|
|
68
|
+
warnings.push(`canonicalise-agent-keys-v1: ${envelope.message}`);
|
|
69
|
+
return { infos, warnings };
|
|
70
|
+
}
|
|
71
|
+
const onWarning = (msg) => warnings.push(msg);
|
|
72
|
+
const { agents: migrated, didMutate, renamed, dropped, guardDropped } = canonicaliseAgentKeys(envelope.rawAgents, onWarning);
|
|
73
|
+
if (!didMutate)
|
|
74
|
+
return { infos, warnings };
|
|
75
|
+
// Write back with the canonical keys, preserving the rest of the envelope.
|
|
76
|
+
// Idempotent under concurrent execution (no lock needed; see D31 comment above).
|
|
77
|
+
const updated = { ...envelope.envelope, agents: migrated };
|
|
78
|
+
try {
|
|
79
|
+
await writeFileAtomicExclusive(filePath, JSON.stringify(updated, null, 2) + '\n');
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
warnings.push(`canonicalise-agent-keys-v1: failed to write ${filePath}: ${err.message}`);
|
|
83
|
+
return { infos, warnings };
|
|
84
|
+
}
|
|
85
|
+
if (renamed.length > 0) {
|
|
86
|
+
infos.push(`Migrated agent-models.json: renamed ${renamed.map(k => `'${k}' → '${LEGACY_AGENT_KEYS[k]}'`).join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
if (dropped.length > 0) {
|
|
89
|
+
warnings.push(`canonicalise-agent-keys-v1: dropped legacy key(s) ${dropped.map(k => `'${k}'`).join(', ')} — canonical key already present, existing value kept`);
|
|
90
|
+
}
|
|
91
|
+
if (guardDropped.length > 0) {
|
|
92
|
+
warnings.push(`canonicalise-agent-keys-v1: dropped legacy key(s) ${guardDropped.map(k => `'${k}'`).join(', ')} — skipped due to prototype-pollution guard`);
|
|
93
|
+
}
|
|
94
|
+
return { infos, warnings };
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
const MIGRATIONS_FILE = 'migrations.json';
|
|
99
|
+
/**
|
|
100
|
+
* D30: State lives at `~/.devflow/migrations.json` (scope-independent) rather
|
|
101
|
+
* than the install manifest because:
|
|
102
|
+
*
|
|
103
|
+
* - The install manifest is scope-specific: user-scope manifests live at
|
|
104
|
+
* `~/.devflow/manifest.json` while local-scope manifests live at
|
|
105
|
+
* `.devflow/manifest.json` inside the repo. A migration that runs on user-scope
|
|
106
|
+
* init wouldn't be recorded in a local-scope manifest, so the migration would
|
|
107
|
+
* re-run on the next local-scope init.
|
|
108
|
+
* - Migration state is machine-wide: once a global migration runs on a machine it
|
|
109
|
+
* should never re-run regardless of which project or scope triggered devflow init.
|
|
110
|
+
* - `~/.devflow/migrations.json` is always writable (home-dir location), whereas
|
|
111
|
+
* local-scope devflowDir may be inside a read-only checkout.
|
|
112
|
+
*
|
|
113
|
+
* @param devflowDir - absolute path to `~/.devflow` (always the home-dir location)
|
|
114
|
+
*/
|
|
115
|
+
export async function readAppliedMigrations(devflowDir) {
|
|
116
|
+
const filePath = path.join(devflowDir, MIGRATIONS_FILE);
|
|
117
|
+
try {
|
|
118
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
119
|
+
const parsed = JSON.parse(raw);
|
|
120
|
+
if (!Array.isArray(parsed.applied))
|
|
121
|
+
return [];
|
|
122
|
+
return parsed.applied;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// File missing or malformed — treat as empty
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Write applied migration IDs to `~/.devflow/migrations.json` atomically.
|
|
131
|
+
* Uses exclusive-create tmp + rename so readers never observe a partial file
|
|
132
|
+
* and a stale tmp from a previous crash does not silently overwrite good data.
|
|
133
|
+
*
|
|
134
|
+
* Delegates to `writeFileAtomicExclusive` in fs-atomic.ts (D34/D39: canonical
|
|
135
|
+
* TS atomic-write helper with race-tolerant unlink before retry).
|
|
136
|
+
*
|
|
137
|
+
* @param devflowDir - absolute path to `~/.devflow`
|
|
138
|
+
* @param ids - full list of applied migration IDs (cumulative, not incremental)
|
|
139
|
+
*/
|
|
140
|
+
export async function writeAppliedMigrations(devflowDir, ids) {
|
|
141
|
+
await fs.mkdir(devflowDir, { recursive: true });
|
|
142
|
+
const filePath = path.join(devflowDir, MIGRATIONS_FILE);
|
|
143
|
+
const data = { applied: ids };
|
|
144
|
+
const content = JSON.stringify(data, null, 2) + '\n';
|
|
145
|
+
await writeFileAtomicExclusive(filePath, content);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Surface migration result infos, warnings, failures, and newly-applied IDs
|
|
149
|
+
* to the user via the provided logger.
|
|
150
|
+
*
|
|
151
|
+
* Extracted from runMigrationsWithFallback (init.ts) so reporting can be
|
|
152
|
+
* tested independently of the project-list routing logic.
|
|
153
|
+
*/
|
|
154
|
+
export function reportMigrationResult(result, logger, verbose) {
|
|
155
|
+
for (const f of result.failures) {
|
|
156
|
+
// D33: Non-fatal — warn but continue; migration will retry on next init
|
|
157
|
+
const where = f.project ? ` in ${path.basename(f.project)}` : '';
|
|
158
|
+
logger.warn(`Migration '${f.id}'${where} failed: ${f.error.message}`);
|
|
159
|
+
}
|
|
160
|
+
for (const info of result.infos) {
|
|
161
|
+
logger.info(info);
|
|
162
|
+
}
|
|
163
|
+
for (const warn of result.warnings) {
|
|
164
|
+
logger.warn(warn);
|
|
165
|
+
}
|
|
166
|
+
if (result.newlyApplied.length > 0) {
|
|
167
|
+
logger.success(`Applied ${result.newlyApplied.length} migration(s)`);
|
|
168
|
+
}
|
|
169
|
+
if (verbose) {
|
|
170
|
+
for (const id of result.newlyApplied)
|
|
171
|
+
logger.info(` ✓ ${id}`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Process an array of items with at most `limit` concurrent Promises.
|
|
176
|
+
* Returns PromiseSettledResult for every item in the original order.
|
|
177
|
+
*/
|
|
178
|
+
async function pooled(items, limit, fn) {
|
|
179
|
+
const results = [];
|
|
180
|
+
for (let i = 0; i < items.length; i += limit) {
|
|
181
|
+
const chunk = items.slice(i, i + limit);
|
|
182
|
+
const chunkResults = await Promise.allSettled(chunk.map(fn));
|
|
183
|
+
results.push(...chunkResults);
|
|
184
|
+
}
|
|
185
|
+
return results;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Run a single global migration, returning { applied, failure, infos, warnings }.
|
|
189
|
+
*
|
|
190
|
+
* D33: Non-fatal semantics — if a global migration fails, we record the failure
|
|
191
|
+
* and continue. The failing migration is NOT marked as applied so it retries on
|
|
192
|
+
* the next `devflow init` run (transient errors such as filesystem contention
|
|
193
|
+
* are eventually resolved without blocking the install).
|
|
194
|
+
*/
|
|
195
|
+
async function runGlobalMigration(migration, ctx) {
|
|
196
|
+
try {
|
|
197
|
+
const runResult = await migration.run(ctx);
|
|
198
|
+
return { applied: true, failure: null, infos: runResult.infos, warnings: runResult.warnings };
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return {
|
|
202
|
+
applied: false,
|
|
203
|
+
failure: {
|
|
204
|
+
id: migration.id,
|
|
205
|
+
scope: migration.scope,
|
|
206
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
207
|
+
},
|
|
208
|
+
infos: [],
|
|
209
|
+
warnings: [],
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Run a single per-project migration across all discovered project roots with a
|
|
215
|
+
* concurrency cap, returning { applied, failures, infos, warnings }.
|
|
216
|
+
*
|
|
217
|
+
* D35: Per-project migrations run across all discovered projects with a
|
|
218
|
+
* concurrency cap of 16 to avoid EMFILE on machines with 50–200 projects.
|
|
219
|
+
* This matches the pattern used by `installClaudeignore` in init.ts for
|
|
220
|
+
* multi-project install — each project has its own `.memory/.decisions.lock`
|
|
221
|
+
* so there is no cross-project contention. Promise.allSettled collects all
|
|
222
|
+
* outcomes without short-circuiting on partial failures.
|
|
223
|
+
*
|
|
224
|
+
* Marking strategy: the migration is considered applied globally only when
|
|
225
|
+
* ALL projects succeed. Any per-project failure causes the ID to remain
|
|
226
|
+
* unapplied so the next `devflow init` (which may discover the same or
|
|
227
|
+
* additional projects) can retry the failed projects.
|
|
228
|
+
*
|
|
229
|
+
* D37: runPerProjectMigration is unreachable in production — MIGRATIONS holds
|
|
230
|
+
* only a global migration (`canonicalise-agent-keys-v1`). The vacuous-truth
|
|
231
|
+
* analysis is preserved for correctness: if a per-project migration is ever
|
|
232
|
+
* added, an empty discoveredProjects list marks it applied (empty-discovery-marks-applied
|
|
233
|
+
* intended); the applied-set write is skipped only when newlyApplied is empty,
|
|
234
|
+
* which is guaranteed when MIGRATIONS has no per-project entries.
|
|
235
|
+
*/
|
|
236
|
+
async function runPerProjectMigration(migration, ctx, discoveredProjects) {
|
|
237
|
+
const results = await pooled(discoveredProjects, 16, (projectRoot) => {
|
|
238
|
+
const memoryDir = getMemoryDir(projectRoot);
|
|
239
|
+
return migration.run({
|
|
240
|
+
scope: 'per-project',
|
|
241
|
+
devflowDir: ctx.devflowDir,
|
|
242
|
+
memoryDir,
|
|
243
|
+
projectRoot,
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
const failures = [];
|
|
247
|
+
const infos = [];
|
|
248
|
+
const warnings = [];
|
|
249
|
+
for (const [i, result] of results.entries()) {
|
|
250
|
+
if (result.status === 'rejected') {
|
|
251
|
+
failures.push({
|
|
252
|
+
id: migration.id,
|
|
253
|
+
scope: migration.scope,
|
|
254
|
+
project: discoveredProjects[i],
|
|
255
|
+
error: result.reason instanceof Error ? result.reason : new Error(String(result.reason)),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
infos.push(...result.value.infos);
|
|
260
|
+
warnings.push(...result.value.warnings);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const applied = results.every(r => r.status === 'fulfilled');
|
|
264
|
+
return { applied, failures, infos, warnings };
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Run all unapplied migrations from MIGRATIONS.
|
|
268
|
+
*
|
|
269
|
+
* D32: Always-run-unapplied semantics (no fresh-vs-upgrade branch).
|
|
270
|
+
* MIGRATIONS currently holds one global migration (`canonicalise-agent-keys-v1`);
|
|
271
|
+
* on a fresh machine the loop executes once and writes migrations.json. On
|
|
272
|
+
* subsequent runs the ID is already in the applied set and the loop is a no-op.
|
|
273
|
+
*
|
|
274
|
+
* @param ctx - devflowDir (memoryDir and projectRoot filled per-project)
|
|
275
|
+
* @param discoveredProjects - absolute paths to discovered Claude-enabled project roots
|
|
276
|
+
* @param registryOverride - override MIGRATIONS for testing (defaults to module-level MIGRATIONS)
|
|
277
|
+
*/
|
|
278
|
+
export async function runMigrations(ctx, discoveredProjects, registryOverride) {
|
|
279
|
+
const registry = registryOverride ?? MIGRATIONS;
|
|
280
|
+
// Always read from home-dir devflow location so state is machine-wide
|
|
281
|
+
const homeDevflowDir = path.join(os.homedir(), '.devflow');
|
|
282
|
+
const appliedArray = await readAppliedMigrations(homeDevflowDir);
|
|
283
|
+
// Convert to Set once for O(1) lookups throughout the loop (issue #9)
|
|
284
|
+
const applied = new Set(appliedArray);
|
|
285
|
+
const newlyApplied = [];
|
|
286
|
+
const failures = [];
|
|
287
|
+
const infos = [];
|
|
288
|
+
const warnings = [];
|
|
289
|
+
for (const migration of registry) {
|
|
290
|
+
if (applied.has(migration.id))
|
|
291
|
+
continue; // Already done — skip
|
|
292
|
+
if (migration.scope === 'global') {
|
|
293
|
+
const globalCtx = {
|
|
294
|
+
scope: 'global',
|
|
295
|
+
devflowDir: ctx.devflowDir,
|
|
296
|
+
};
|
|
297
|
+
const outcome = await runGlobalMigration(migration, globalCtx);
|
|
298
|
+
if (outcome.applied) {
|
|
299
|
+
newlyApplied.push(migration.id);
|
|
300
|
+
infos.push(...outcome.infos);
|
|
301
|
+
warnings.push(...outcome.warnings);
|
|
302
|
+
}
|
|
303
|
+
else if (outcome.failure) {
|
|
304
|
+
failures.push(outcome.failure);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else if (migration.scope === 'per-project') {
|
|
308
|
+
const outcome = await runPerProjectMigration(migration, ctx, discoveredProjects);
|
|
309
|
+
failures.push(...outcome.failures);
|
|
310
|
+
infos.push(...outcome.infos);
|
|
311
|
+
warnings.push(...outcome.warnings);
|
|
312
|
+
if (outcome.applied) {
|
|
313
|
+
newlyApplied.push(migration.id);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
// Exhaustiveness check — AnyMigration covers all MigrationScope values;
|
|
318
|
+
// migration is narrowed to `never` here so this branch is unreachable at runtime.
|
|
319
|
+
const _exhaustive = migration;
|
|
320
|
+
void _exhaustive;
|
|
321
|
+
throw new Error('Unknown migration scope');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// Write state once at end, accumulating all newly applied IDs (issue #5 — O(N²) → O(1))
|
|
325
|
+
if (newlyApplied.length > 0) {
|
|
326
|
+
await writeAppliedMigrations(homeDevflowDir, [...appliedArray, ...newlyApplied]);
|
|
327
|
+
}
|
|
328
|
+
return { newlyApplied, failures, infos, warnings };
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=migrations.js.map
|