devflow-kit 1.8.3 → 2.0.1
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 +182 -7
- 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 +14 -4
- 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,655 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file model-discovery.ts
|
|
3
|
+
*
|
|
4
|
+
* Discovers routable external models from the routing runtime.
|
|
5
|
+
* The only impure piece of the external-model-routing design.
|
|
6
|
+
*
|
|
7
|
+
* applies ADR-013: pure core-layer module — no adapter imports.
|
|
8
|
+
* applies PF-013: cwd = os.tmpdir() so discovery never assumes the devflow
|
|
9
|
+
* directory exists (the --set read path never mkdirs, so the dir may not
|
|
10
|
+
* exist; os.tmpdir() also prevents a stale subswitch.config.json in any
|
|
11
|
+
* particular working directory from causing exit 1 in the routing runtime).
|
|
12
|
+
* avoids PF-009: discoverExternalModels never throws or rejects — every
|
|
13
|
+
* failure path returns { known: false }.
|
|
14
|
+
* avoids PF-016: real-binary tests (T1–T4) live in tests/, never in
|
|
15
|
+
* tests/integration/ which is excluded from npm test by vitest.config.ts.
|
|
16
|
+
*
|
|
17
|
+
* Branding constraint: the routing runtime package name ("subswitch") must
|
|
18
|
+
* NEVER appear in user-visible strings, CLI output, or error messages. It is
|
|
19
|
+
* permitted in logs (proxy.log), code comments, and env var names.
|
|
20
|
+
*/
|
|
21
|
+
import * as fs from 'node:fs';
|
|
22
|
+
import { promises as fsAsync } from 'node:fs';
|
|
23
|
+
import * as path from 'node:path';
|
|
24
|
+
import * as os from 'node:os';
|
|
25
|
+
import { spawn as cpSpawn } from 'node:child_process';
|
|
26
|
+
import { MODEL_NAME_RE } from './agent-frontmatter.js';
|
|
27
|
+
import { CLAUDE_MODEL_ALIASES } from './external-models.js';
|
|
28
|
+
import { readCache, writeCache, parseRawEnvelope, MAX_TTL_MS } from './cache.js';
|
|
29
|
+
import { resolveProxyBin } from './proxy-state.js';
|
|
30
|
+
import { openProxyLog, scrubChildEnv } from './proxy-log.js';
|
|
31
|
+
function Ok(value) {
|
|
32
|
+
return { ok: true, value };
|
|
33
|
+
}
|
|
34
|
+
function Err(error) {
|
|
35
|
+
return { ok: false, error };
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Constants
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/** Prefix for all discovery cache keys. */
|
|
41
|
+
const CACHE_KEY_PREFIX = 'external-models-v1-';
|
|
42
|
+
/** TTL for live discovery results. 24 h is the effective invalidator; version
|
|
43
|
+
* changes are the REAL invalidator since the model registry ships in the
|
|
44
|
+
* routing runtime package, so it cannot change without the version changing. */
|
|
45
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1_000;
|
|
46
|
+
/**
|
|
47
|
+
* Maximum number of discovery cache entries to retain.
|
|
48
|
+
* Oldest entries beyond this limit are pruned after each successful live write
|
|
49
|
+
* so the cache directory has a fixed upper bound.
|
|
50
|
+
*/
|
|
51
|
+
const CACHE_PRUNE_KEEP = 3;
|
|
52
|
+
/**
|
|
53
|
+
* Maximum bytes buffered from the discovery command's stdout.
|
|
54
|
+
* The live payload is ~1 KB; 256× headroom caps a malformed or hostile
|
|
55
|
+
* response without allowing unbounded allocation. Exceeding this cap causes
|
|
56
|
+
* the result to be treated as a spawn failure.
|
|
57
|
+
*/
|
|
58
|
+
const STDOUT_CAP = 262_144;
|
|
59
|
+
/**
|
|
60
|
+
* Discovery spawn timeout (ms). A child that does not close its stdout pipe
|
|
61
|
+
* within this window receives SIGTERM followed by a SIGKILL escalation after
|
|
62
|
+
* SIGKILL_GRACE_MS. Zero retries — the stale cache is the retry.
|
|
63
|
+
*
|
|
64
|
+
* Exported so tests can derive timing bounds without mirroring the literal.
|
|
65
|
+
*/
|
|
66
|
+
export const SPAWN_TIMEOUT_MS = 2_000;
|
|
67
|
+
/**
|
|
68
|
+
* Grace period (ms) between SIGTERM and SIGKILL escalation. Unreffed so the
|
|
69
|
+
* timer never prevents the Node.js event loop from exiting on its own.
|
|
70
|
+
*
|
|
71
|
+
* Exported so tests can derive timing bounds without mirroring the literal.
|
|
72
|
+
*/
|
|
73
|
+
export const SIGKILL_GRACE_MS = 2_000;
|
|
74
|
+
/**
|
|
75
|
+
* Maximum bytes written per log failure message. Prevents a single log write
|
|
76
|
+
* from growing proxy.log unexpectedly. Discovery runs while the relay is up
|
|
77
|
+
* so rotateProxyLogIfLarge MUST NOT be called here (PRE-SPAWN ONLY invariant).
|
|
78
|
+
*/
|
|
79
|
+
const LOG_WRITE_CAP = 2_048;
|
|
80
|
+
/**
|
|
81
|
+
* Maximum bytes for a single cache-entry read in the discovery scanner.
|
|
82
|
+
* The live payload is ~1 KB; 64 KB is 64× headroom. Entries exceeding this
|
|
83
|
+
* cap are treated as corrupt and skipped. Enforced via parseDiscoveryFileContent,
|
|
84
|
+
* the shared helper used by all three enumeration sites.
|
|
85
|
+
*/
|
|
86
|
+
const MAX_ENTRY_BYTES = 65_536;
|
|
87
|
+
/** The exact argv passed to the routing runtime for model discovery.
|
|
88
|
+
* Must be ['models', '--json'], always, unconditionally.
|
|
89
|
+
*
|
|
90
|
+
* SAFETY: the routing runtime's CLI dispatch is `positionals[0] ?? "serve"`,
|
|
91
|
+
* so an empty positional list would default to starting a relay. The argv
|
|
92
|
+
* constant pins this and T6 asserts it via injectable deps. */
|
|
93
|
+
const DISCOVERY_ARGV = ['models', '--json'];
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// parseModelsJson — pure, tolerant, never throws
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* Parse and validate a raw `models --json` payload.
|
|
99
|
+
*
|
|
100
|
+
* Hard-gates (return Err immediately):
|
|
101
|
+
* - Non-JSON or non-object root
|
|
102
|
+
* - schemaVersion !== 1 (integer 1; the string "1" also fails)
|
|
103
|
+
* - kind !== 'models'
|
|
104
|
+
* - models is not an array
|
|
105
|
+
* - Zero rows survive row-level filtering
|
|
106
|
+
*
|
|
107
|
+
* Tolerant (drop the offending row, not the payload):
|
|
108
|
+
* - Missing or wrong-typed required fields on a row
|
|
109
|
+
* - provider !== 'codex'
|
|
110
|
+
* - routable !== true or retired !== false
|
|
111
|
+
* - id or alias.name fails MODEL_NAME_RE
|
|
112
|
+
* - alias.name equals a canonical id in the payload
|
|
113
|
+
* - alias.name is in CLAUDE_MODEL_ALIASES (prevents picker collisions)
|
|
114
|
+
* - model's provider has routing === 'passthrough' in the providers array
|
|
115
|
+
*
|
|
116
|
+
* Pure function: no I/O, no state, never throws.
|
|
117
|
+
*/
|
|
118
|
+
export function parseModelsJson(raw) {
|
|
119
|
+
// --- Parse JSON ---
|
|
120
|
+
let parsed;
|
|
121
|
+
try {
|
|
122
|
+
parsed = JSON.parse(raw);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return Err('invalid JSON');
|
|
126
|
+
}
|
|
127
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
128
|
+
return Err('root is not an object');
|
|
129
|
+
}
|
|
130
|
+
const root = parsed;
|
|
131
|
+
// --- Hard gates ---
|
|
132
|
+
if (root['schemaVersion'] !== 1) {
|
|
133
|
+
return Err(`unexpected schemaVersion: ${String(root['schemaVersion'])}`);
|
|
134
|
+
}
|
|
135
|
+
if (root['kind'] !== 'models') {
|
|
136
|
+
return Err(`unexpected kind: ${String(root['kind'])}`);
|
|
137
|
+
}
|
|
138
|
+
if (!Array.isArray(root['models'])) {
|
|
139
|
+
return Err('models is not an array');
|
|
140
|
+
}
|
|
141
|
+
// --- Check whether the codex provider is marked passthrough ---
|
|
142
|
+
// Row selection hard-gates on provider === 'codex', so only codex entries ever
|
|
143
|
+
// reach the passthrough filter. Compute once before the per-row loop instead of
|
|
144
|
+
// re-evaluating passthroughProviders.has('codex') identically on every row.
|
|
145
|
+
const passthroughProviders = new Set();
|
|
146
|
+
if (Array.isArray(root['providers'])) {
|
|
147
|
+
for (const p of root['providers']) {
|
|
148
|
+
if (typeof p !== 'object' || p === null)
|
|
149
|
+
continue;
|
|
150
|
+
const pObj = p;
|
|
151
|
+
if (typeof pObj['id'] === 'string' && pObj['routing'] === 'passthrough') {
|
|
152
|
+
passthroughProviders.add(pObj['id']);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const codexIsPassthrough = passthroughProviders.has('codex');
|
|
157
|
+
// --- First pass: collect canonical ids of qualifying rows ---
|
|
158
|
+
// Pre-collecting canonical ids allows the alias-dedup check ("drop alias
|
|
159
|
+
// that equals a canonical id") to cover ALL models in the payload, not just
|
|
160
|
+
// models processed before the current one.
|
|
161
|
+
const canonicalIds = new Set();
|
|
162
|
+
const qualifyingRows = [];
|
|
163
|
+
for (const row of root['models']) {
|
|
164
|
+
if (typeof row !== 'object' || row === null)
|
|
165
|
+
continue;
|
|
166
|
+
const m = row;
|
|
167
|
+
if (typeof m['id'] !== 'string')
|
|
168
|
+
continue;
|
|
169
|
+
if (!MODEL_NAME_RE.test(m['id']))
|
|
170
|
+
continue;
|
|
171
|
+
if (m['provider'] !== 'codex')
|
|
172
|
+
continue;
|
|
173
|
+
if (codexIsPassthrough)
|
|
174
|
+
continue;
|
|
175
|
+
if (m['routable'] !== true)
|
|
176
|
+
continue;
|
|
177
|
+
if (m['retired'] !== false)
|
|
178
|
+
continue;
|
|
179
|
+
canonicalIds.add(m['id']);
|
|
180
|
+
qualifyingRows.push(m);
|
|
181
|
+
}
|
|
182
|
+
// --- Second pass: build ExternalModel with validated aliases ---
|
|
183
|
+
const CLAUDE_ALIAS_SET = new Set(CLAUDE_MODEL_ALIASES);
|
|
184
|
+
const models = [];
|
|
185
|
+
for (const m of qualifyingRows) {
|
|
186
|
+
const id = m['id'];
|
|
187
|
+
const rawAliases = Array.isArray(m['aliases']) ? m['aliases'] : [];
|
|
188
|
+
const aliases = [];
|
|
189
|
+
for (const a of rawAliases) {
|
|
190
|
+
if (typeof a !== 'object' || a === null)
|
|
191
|
+
continue;
|
|
192
|
+
const aObj = a;
|
|
193
|
+
if (typeof aObj['name'] !== 'string')
|
|
194
|
+
continue;
|
|
195
|
+
const aliasName = aObj['name'];
|
|
196
|
+
if (!MODEL_NAME_RE.test(aliasName))
|
|
197
|
+
continue;
|
|
198
|
+
// Drop alias equal to any canonical id in the payload
|
|
199
|
+
if (canonicalIds.has(aliasName))
|
|
200
|
+
continue;
|
|
201
|
+
// Drop alias in the Claude passthrough set (prevents picker collisions)
|
|
202
|
+
if (CLAUDE_ALIAS_SET.has(aliasName))
|
|
203
|
+
continue;
|
|
204
|
+
aliases.push(aliasName);
|
|
205
|
+
}
|
|
206
|
+
models.push({ id, aliases });
|
|
207
|
+
}
|
|
208
|
+
if (models.length === 0) {
|
|
209
|
+
return Err('zero rows survived filtering');
|
|
210
|
+
}
|
|
211
|
+
// --- Build selectableNames and aliasToId ---
|
|
212
|
+
// Order: aliases (registry order, across all models), then canonical ids.
|
|
213
|
+
// The `seen` set guarantees uniqueness — duplicates break cycleNext/cyclePrev.
|
|
214
|
+
const seen = new Set();
|
|
215
|
+
const selectableNames = [];
|
|
216
|
+
const aliasToId = new Map();
|
|
217
|
+
// Aliases first (registry order)
|
|
218
|
+
for (const model of models) {
|
|
219
|
+
for (const alias of model.aliases) {
|
|
220
|
+
if (!seen.has(alias)) {
|
|
221
|
+
seen.add(alias);
|
|
222
|
+
selectableNames.push(alias);
|
|
223
|
+
aliasToId.set(alias, model.id);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Canonical ids (registry order)
|
|
228
|
+
for (const model of models) {
|
|
229
|
+
if (!seen.has(model.id) && !CLAUDE_ALIAS_SET.has(model.id)) {
|
|
230
|
+
seen.add(model.id);
|
|
231
|
+
selectableNames.push(model.id);
|
|
232
|
+
aliasToId.set(model.id, model.id);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return Ok({
|
|
236
|
+
models,
|
|
237
|
+
aliasToId: aliasToId,
|
|
238
|
+
selectableNames,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
// Cache helpers
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
/** Validate that a cache-envelope `data` field is a string (raw JSON stdout). */
|
|
245
|
+
function validateCachedString(data) {
|
|
246
|
+
return typeof data === 'string' ? data : null;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Parse raw bytes from a discovery cache file.
|
|
250
|
+
*
|
|
251
|
+
* Single shared helper for all three enumeration sites. Enforces MAX_ENTRY_BYTES
|
|
252
|
+
* to bound memory allocation on corrupt or oversized entries. Pure: no I/O.
|
|
253
|
+
* Callers own the read (sync or async).
|
|
254
|
+
*
|
|
255
|
+
* Returns null when the entry exceeds the size cap, fails JSON/envelope
|
|
256
|
+
* parsing, or contains a non-string data field.
|
|
257
|
+
*/
|
|
258
|
+
function parseDiscoveryFileContent(buf) {
|
|
259
|
+
if (buf.length > MAX_ENTRY_BYTES)
|
|
260
|
+
return null;
|
|
261
|
+
const envelope = parseRawEnvelope(buf.toString('utf-8'));
|
|
262
|
+
if (envelope === null || typeof envelope.data !== 'string')
|
|
263
|
+
return null;
|
|
264
|
+
return { data: envelope.data, timestamp: envelope.timestamp, ttl: envelope.ttl };
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Scan cacheDir for the newest external-models-v1-* entry (by embedded
|
|
268
|
+
* envelope timestamp, not file mtime) that is not skipKey and whose data is
|
|
269
|
+
* a parseable string. Returns the raw stdout string or null.
|
|
270
|
+
*
|
|
271
|
+
* Uses embedded timestamp rather than file mtime because mtime is trivially
|
|
272
|
+
* settable — relying on it would let a hostile cache file masquerade as newer.
|
|
273
|
+
*/
|
|
274
|
+
async function findStaleFallback(cacheDir, skipKey) {
|
|
275
|
+
let entries;
|
|
276
|
+
try {
|
|
277
|
+
entries = await fsAsync.readdir(cacheDir);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
let bestTimestamp = -Infinity;
|
|
283
|
+
let bestRaw = null;
|
|
284
|
+
for (const entry of entries) {
|
|
285
|
+
if (!entry.startsWith(CACHE_KEY_PREFIX) || !entry.endsWith('.json'))
|
|
286
|
+
continue;
|
|
287
|
+
const key = entry.slice(0, -'.json'.length);
|
|
288
|
+
if (skipKey !== null && key === skipKey)
|
|
289
|
+
continue;
|
|
290
|
+
try {
|
|
291
|
+
const buf = await fsAsync.readFile(path.join(cacheDir, entry));
|
|
292
|
+
const parsed = parseDiscoveryFileContent(buf);
|
|
293
|
+
if (parsed === null)
|
|
294
|
+
continue;
|
|
295
|
+
if (parsed.timestamp > bestTimestamp) {
|
|
296
|
+
bestTimestamp = parsed.timestamp;
|
|
297
|
+
bestRaw = parsed.data;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Skip unreadable entries — they do not prevent other entries from being used
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return bestRaw;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Prune external-models-v1-* cache entries to at most CACHE_PRUNE_KEEP
|
|
308
|
+
* (3) entries, keeping the newest by embedded envelope timestamp.
|
|
309
|
+
* Called after each successful live write. Best-effort, non-fatal.
|
|
310
|
+
*/
|
|
311
|
+
async function pruneOldEntries(cacheDir) {
|
|
312
|
+
try {
|
|
313
|
+
const entries = await fsAsync.readdir(cacheDir);
|
|
314
|
+
const candidates = [];
|
|
315
|
+
for (const entry of entries) {
|
|
316
|
+
if (!entry.startsWith(CACHE_KEY_PREFIX))
|
|
317
|
+
continue;
|
|
318
|
+
// Reap orphaned atomic-write temp files (<key>.json.tmp.<pid>).
|
|
319
|
+
// These accumulate when the writer is interrupted between the tmp write
|
|
320
|
+
// and the rename (e.g., Ctrl-C during enable).
|
|
321
|
+
if (entry.includes('.json.tmp.')) {
|
|
322
|
+
try {
|
|
323
|
+
await fsAsync.unlink(path.join(cacheDir, entry));
|
|
324
|
+
}
|
|
325
|
+
catch { /* non-fatal */ }
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (!entry.endsWith('.json'))
|
|
329
|
+
continue;
|
|
330
|
+
try {
|
|
331
|
+
const buf = await fsAsync.readFile(path.join(cacheDir, entry));
|
|
332
|
+
const parsed = parseDiscoveryFileContent(buf);
|
|
333
|
+
if (parsed !== null) {
|
|
334
|
+
candidates.push({ filename: entry, timestamp: parsed.timestamp });
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// Skip unreadable entries
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (candidates.length <= CACHE_PRUNE_KEEP)
|
|
342
|
+
return;
|
|
343
|
+
// Sort newest-first; keep first CACHE_PRUNE_KEEP, delete the rest
|
|
344
|
+
candidates.sort((a, b) => b.timestamp - a.timestamp);
|
|
345
|
+
for (let i = CACHE_PRUNE_KEEP; i < candidates.length; i++) {
|
|
346
|
+
try {
|
|
347
|
+
await fsAsync.unlink(path.join(cacheDir, candidates[i].filename));
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
// Non-fatal — an entry that cannot be deleted is benign
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// Pruning failure is non-fatal
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
// ---------------------------------------------------------------------------
|
|
359
|
+
// Log helper
|
|
360
|
+
// ---------------------------------------------------------------------------
|
|
361
|
+
/**
|
|
362
|
+
* Append a failure reason to proxy.log.
|
|
363
|
+
*
|
|
364
|
+
* Uses openProxyLog (not bare appendFile) to preserve the 0600 mode
|
|
365
|
+
* hardening from commit 2120891. Caps writes to LOG_WRITE_CAP bytes.
|
|
366
|
+
* MUST NOT call rotateProxyLogIfLarge — that carries a PRE-SPAWN ONLY
|
|
367
|
+
* invariant; discovery runs while the relay is up.
|
|
368
|
+
* Non-fatal: a log-write failure must never surface to the caller.
|
|
369
|
+
*/
|
|
370
|
+
async function appendToLog(logPath, msg) {
|
|
371
|
+
try {
|
|
372
|
+
const handle = await openProxyLog(logPath);
|
|
373
|
+
try {
|
|
374
|
+
const line = `${msg}\n`;
|
|
375
|
+
// Encode first, then slice bytes — slicing the JS string first would
|
|
376
|
+
// slice UTF-16 code units before encoding, allowing up to ~4× the intended
|
|
377
|
+
// byte cap for non-ASCII content.
|
|
378
|
+
await handle.write(Buffer.from(line).subarray(0, LOG_WRITE_CAP));
|
|
379
|
+
}
|
|
380
|
+
finally {
|
|
381
|
+
await handle.close();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// Non-fatal
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// ---------------------------------------------------------------------------
|
|
389
|
+
// Real spawn implementation
|
|
390
|
+
// ---------------------------------------------------------------------------
|
|
391
|
+
/**
|
|
392
|
+
* Build the production spawnAndCollect function for a given log path.
|
|
393
|
+
*
|
|
394
|
+
* Spawns `process.execPath [binPath, ...argv]` with the scrubbed env and
|
|
395
|
+
* os.tmpdir() as cwd. Caps stdout at STDOUT_CAP bytes; enforces
|
|
396
|
+
* SPAWN_TIMEOUT_MS with SIGKILL escalation after SIGKILL_GRACE_MS.
|
|
397
|
+
*
|
|
398
|
+
* The child's stderr goes to proxy.log via logFd so failure reasons are
|
|
399
|
+
* visible without bloating the log with normal-operation output.
|
|
400
|
+
*
|
|
401
|
+
* Never throws — all OS-level failures resolve to exitCode: -1.
|
|
402
|
+
*/
|
|
403
|
+
function buildRealSpawnAndCollect(logPath) {
|
|
404
|
+
return async (opts) => {
|
|
405
|
+
let logHandle = null;
|
|
406
|
+
try {
|
|
407
|
+
logHandle = await openProxyLog(logPath);
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
// If proxy.log cannot be opened, spawn without a log fd (stderr → pipe)
|
|
411
|
+
}
|
|
412
|
+
try {
|
|
413
|
+
return await new Promise((resolve) => {
|
|
414
|
+
const proc = cpSpawn(opts.execPath, [opts.binPath, ...opts.argv], {
|
|
415
|
+
env: opts.env,
|
|
416
|
+
// stderr goes to proxy.log fd; stdout is piped for collection
|
|
417
|
+
stdio: ['ignore', 'pipe', logHandle ? logHandle.fd : 'pipe'],
|
|
418
|
+
cwd: opts.cwd,
|
|
419
|
+
});
|
|
420
|
+
let resolved = false;
|
|
421
|
+
let stdout = '';
|
|
422
|
+
let overflowed = false;
|
|
423
|
+
proc.stdout?.on('data', (chunk) => {
|
|
424
|
+
if (overflowed || resolved)
|
|
425
|
+
return;
|
|
426
|
+
stdout += chunk.toString('utf-8');
|
|
427
|
+
if (stdout.length > STDOUT_CAP) {
|
|
428
|
+
overflowed = true;
|
|
429
|
+
stdout = '';
|
|
430
|
+
// Trigger SIGTERM; the timeout handler fires after SPAWN_TIMEOUT_MS
|
|
431
|
+
// and will schedule SIGKILL. This avoids duplicating the escalation
|
|
432
|
+
// logic here.
|
|
433
|
+
try {
|
|
434
|
+
proc.kill();
|
|
435
|
+
}
|
|
436
|
+
catch { /* already dead */ }
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
const timer = setTimeout(() => {
|
|
440
|
+
if (!resolved) {
|
|
441
|
+
resolved = true;
|
|
442
|
+
try {
|
|
443
|
+
proc.kill();
|
|
444
|
+
}
|
|
445
|
+
catch { /* already dead */ }
|
|
446
|
+
// SIGKILL escalation after grace — unreffed so it does not hold
|
|
447
|
+
// the event loop open if everything else has settled.
|
|
448
|
+
const sigkill = setTimeout(() => {
|
|
449
|
+
try {
|
|
450
|
+
proc.kill('SIGKILL');
|
|
451
|
+
}
|
|
452
|
+
catch { /* already dead */ }
|
|
453
|
+
}, SIGKILL_GRACE_MS);
|
|
454
|
+
sigkill.unref();
|
|
455
|
+
resolve({ exitCode: 1, stdout: '', timedOut: true });
|
|
456
|
+
}
|
|
457
|
+
}, SPAWN_TIMEOUT_MS);
|
|
458
|
+
proc.on('close', (code) => {
|
|
459
|
+
if (!resolved) {
|
|
460
|
+
resolved = true;
|
|
461
|
+
clearTimeout(timer);
|
|
462
|
+
if (overflowed) {
|
|
463
|
+
resolve({ exitCode: 1, stdout: '', timedOut: false });
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
resolve({ exitCode: code ?? 1, stdout, timedOut: false });
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
});
|
|
470
|
+
// OS-level spawn failure (EMFILE, ENOMEM, EAGAIN): must be caught or
|
|
471
|
+
// it becomes an uncaught exception. Resolve cleanly with exitCode: -1.
|
|
472
|
+
proc.on('error', () => {
|
|
473
|
+
if (!resolved) {
|
|
474
|
+
resolved = true;
|
|
475
|
+
clearTimeout(timer);
|
|
476
|
+
resolve({ exitCode: -1, stdout: '', timedOut: false });
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
finally {
|
|
482
|
+
if (logHandle) {
|
|
483
|
+
await logHandle.close();
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
// ---------------------------------------------------------------------------
|
|
489
|
+
// discoverExternalModels — the impure entry point
|
|
490
|
+
// ---------------------------------------------------------------------------
|
|
491
|
+
/**
|
|
492
|
+
* Discover routable external models from the routing runtime.
|
|
493
|
+
*
|
|
494
|
+
* Algorithm:
|
|
495
|
+
* 1. resolveProxyBin() — if Err, return { known: false } (no binary).
|
|
496
|
+
* 2. Check fresh cache for the current version key.
|
|
497
|
+
* 3. Collect stale-cache fallback (newest entry by embedded timestamp).
|
|
498
|
+
* 4. Live spawn: `process.execPath [binPath, 'models', '--json']`.
|
|
499
|
+
* 5. On success: write to cache, prune to CACHE_PRUNE_KEEP entries.
|
|
500
|
+
* 6. On failure: return stale-cache if available, else { known: false }.
|
|
501
|
+
*
|
|
502
|
+
* Cache key: `external-models-v1-<validatedRuntimeVersion>`.
|
|
503
|
+
* TTL: 24 h. Version is the real invalidator (registry ships in the package).
|
|
504
|
+
* Raw validated stdout is cached; parseModelsJson runs on every read (no bypass).
|
|
505
|
+
*
|
|
506
|
+
* Failure behaviour:
|
|
507
|
+
* - spawn failure, timeout, overflow → log reason to proxy.log.
|
|
508
|
+
* - parse failure on live payload → log reason to proxy.log.
|
|
509
|
+
* - All failures degrade to stale-cache then { known: false } — never throw.
|
|
510
|
+
*
|
|
511
|
+
* applies PF-013: cwd = os.tmpdir() (not devflow dir, which may not exist on
|
|
512
|
+
* the cold --set path; also prevents legacy subswitch.config.json in cwd
|
|
513
|
+
* from causing exit 1 in the routing runtime).
|
|
514
|
+
*
|
|
515
|
+
* AC-C7: resolveProxyBin() is called live every invocation, never proxy.json.binPath.
|
|
516
|
+
* AC-C8: never throws or rejects.
|
|
517
|
+
*
|
|
518
|
+
* @param cacheDir Absolute path to the discovery cache directory (caller-supplied).
|
|
519
|
+
* @param logPath Absolute path to proxy.log for failure logging (caller-supplied).
|
|
520
|
+
* @param deps Optional injectable seam for testing.
|
|
521
|
+
*/
|
|
522
|
+
export async function discoverExternalModels(cacheDir, logPath, deps) {
|
|
523
|
+
try {
|
|
524
|
+
return await _discoverInternal(cacheDir, logPath, deps);
|
|
525
|
+
}
|
|
526
|
+
catch {
|
|
527
|
+
// Catch-all: discoverExternalModels MUST NOT throw (avoids PF-009).
|
|
528
|
+
return { known: false };
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
async function _discoverInternal(cacheDir, logPath, deps) {
|
|
532
|
+
// AC-C7: call resolveProxyBin() live (never proxy.json.binPath)
|
|
533
|
+
const resolveFn = deps?.resolveProxyBin ?? resolveProxyBin;
|
|
534
|
+
const binResult = await resolveFn();
|
|
535
|
+
if (!binResult.ok)
|
|
536
|
+
return { known: false };
|
|
537
|
+
const { binPath, version } = binResult.value;
|
|
538
|
+
const currentKey = version != null ? `${CACHE_KEY_PREFIX}${version}` : null;
|
|
539
|
+
// --- Fresh cache check ---
|
|
540
|
+
if (currentKey !== null) {
|
|
541
|
+
const fresh = readCache(cacheDir, currentKey, validateCachedString);
|
|
542
|
+
if (fresh !== null) {
|
|
543
|
+
const parsed = parseModelsJson(fresh);
|
|
544
|
+
if (parsed.ok) {
|
|
545
|
+
return { known: true, ...parsed.value, source: 'cache' };
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
// --- Stale-cache fallback — started concurrently with spawn, awaited only on failure ---
|
|
550
|
+
// Happy path returns before the await below; running the lookup concurrently
|
|
551
|
+
// with the spawn means the failure path incurs no extra latency (findStaleFallback
|
|
552
|
+
// completes during the spawn's SPAWN_TIMEOUT_MS window).
|
|
553
|
+
const staleRawP = findStaleFallback(cacheDir, currentKey);
|
|
554
|
+
// --- Live spawn ---
|
|
555
|
+
const env = { ...scrubChildEnv(), NO_COLOR: '1' };
|
|
556
|
+
const spawnFn = deps?.spawnAndCollect ?? buildRealSpawnAndCollect(logPath);
|
|
557
|
+
let spawnResult;
|
|
558
|
+
try {
|
|
559
|
+
spawnResult = await spawnFn({
|
|
560
|
+
execPath: process.execPath,
|
|
561
|
+
binPath,
|
|
562
|
+
argv: DISCOVERY_ARGV,
|
|
563
|
+
env,
|
|
564
|
+
cwd: os.tmpdir(),
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
spawnResult = { exitCode: -1, stdout: '', timedOut: false };
|
|
569
|
+
}
|
|
570
|
+
// --- Handle live result ---
|
|
571
|
+
if (spawnResult.exitCode === 0 && spawnResult.stdout.length > 0) {
|
|
572
|
+
const parsed = parseModelsJson(spawnResult.stdout);
|
|
573
|
+
if (parsed.ok) {
|
|
574
|
+
// Success — write to cache and prune
|
|
575
|
+
if (currentKey !== null) {
|
|
576
|
+
await writeCache(cacheDir, currentKey, spawnResult.stdout, CACHE_TTL_MS);
|
|
577
|
+
await pruneOldEntries(cacheDir);
|
|
578
|
+
}
|
|
579
|
+
return { known: true, ...parsed.value, source: 'live' };
|
|
580
|
+
}
|
|
581
|
+
// Parse failed even though spawn succeeded.
|
|
582
|
+
// Strip control characters from untrusted runtime output before embedding
|
|
583
|
+
// in the log line to prevent log-line injection (LOG_WRITE_CAP bounds total
|
|
584
|
+
// length but not embedded newlines).
|
|
585
|
+
// eslint-disable-next-line no-control-regex
|
|
586
|
+
const safeError = parsed.error.replace(/[\x00-\x1f\x7f]/g, ' ');
|
|
587
|
+
await appendToLog(logPath, `[model-discovery] parse failed: ${safeError}`);
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
const reason = spawnResult.timedOut
|
|
591
|
+
? 'spawn timed out'
|
|
592
|
+
: `spawn exited ${spawnResult.exitCode}`;
|
|
593
|
+
await appendToLog(logPath, `[model-discovery] ${reason}`);
|
|
594
|
+
}
|
|
595
|
+
// --- Stale-cache fallback (only reached on failure path) ---
|
|
596
|
+
const staleRaw = await staleRawP;
|
|
597
|
+
if (staleRaw !== null) {
|
|
598
|
+
const parsed = parseModelsJson(staleRaw);
|
|
599
|
+
if (parsed.ok) {
|
|
600
|
+
return { known: true, ...parsed.value, source: 'stale-cache' };
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
return { known: false };
|
|
604
|
+
}
|
|
605
|
+
// ---------------------------------------------------------------------------
|
|
606
|
+
// getExternalModelsCached — cache-only query, no spawn
|
|
607
|
+
// ---------------------------------------------------------------------------
|
|
608
|
+
/**
|
|
609
|
+
* Return the most recently cached model catalog without spawning the runtime.
|
|
610
|
+
*
|
|
611
|
+
* Used by the --set path in agents.ts which runs regardless of proxy state and
|
|
612
|
+
* must not trigger a live fetch. Returns the newest valid entry across all
|
|
613
|
+
* external-models-v1-* keys regardless of TTL (stale is acceptable here —
|
|
614
|
+
* the TUI will surface staleness via the dormancy indicator).
|
|
615
|
+
*
|
|
616
|
+
* Synchronous — suitable for startup paths that must not go async.
|
|
617
|
+
* Returns { known: false } when no valid cache entry exists.
|
|
618
|
+
*/
|
|
619
|
+
export function getExternalModelsCached(cacheDir) {
|
|
620
|
+
let entries;
|
|
621
|
+
try {
|
|
622
|
+
entries = fs.readdirSync(cacheDir);
|
|
623
|
+
}
|
|
624
|
+
catch {
|
|
625
|
+
return { known: false };
|
|
626
|
+
}
|
|
627
|
+
let best = null;
|
|
628
|
+
for (const entry of entries) {
|
|
629
|
+
if (!entry.startsWith(CACHE_KEY_PREFIX) || !entry.endsWith('.json'))
|
|
630
|
+
continue;
|
|
631
|
+
try {
|
|
632
|
+
// Sync read is intentional; size guard and parsing via the shared helper.
|
|
633
|
+
const buf = fs.readFileSync(path.join(cacheDir, entry));
|
|
634
|
+
const result = parseDiscoveryFileContent(buf);
|
|
635
|
+
if (result === null)
|
|
636
|
+
continue;
|
|
637
|
+
if (best === null || result.timestamp > best.timestamp) {
|
|
638
|
+
best = { raw: result.data, timestamp: result.timestamp, ttl: result.ttl };
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
catch {
|
|
642
|
+
// Skip unreadable entries
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
if (best === null)
|
|
646
|
+
return { known: false };
|
|
647
|
+
const parsed = parseModelsJson(best.raw);
|
|
648
|
+
if (!parsed.ok)
|
|
649
|
+
return { known: false };
|
|
650
|
+
const age = Date.now() - best.timestamp;
|
|
651
|
+
const ttlClamped = Math.min(Math.abs(best.ttl), MAX_TTL_MS);
|
|
652
|
+
const source = age < ttlClamped ? 'cache' : 'stale-cache';
|
|
653
|
+
return { known: true, ...parsed.value, source };
|
|
654
|
+
}
|
|
655
|
+
//# sourceMappingURL=model-discovery.js.map
|