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,230 @@
|
|
|
1
|
+
// src/assets/scripts/hooks/lib/project-paths.cjs
|
|
2
|
+
//
|
|
3
|
+
// Centralized path construction for all project-relative directories and files.
|
|
4
|
+
//
|
|
5
|
+
// DESIGN: Every function takes `projectRoot` (absolute path) and returns an
|
|
6
|
+
// absolute path string. All construction uses path.join() — no string concatenation.
|
|
7
|
+
//
|
|
8
|
+
// ARCHITECTURE: This module is the single source of truth for path layout in
|
|
9
|
+
// the CJS hook layer. Must match src/core/project-paths.ts exactly.
|
|
10
|
+
//
|
|
11
|
+
// TS COUNTERPART: src/core/project-paths.ts must mirror this file exactly.
|
|
12
|
+
// Keep them in sync when adding or changing functions.
|
|
13
|
+
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const path = require('path');
|
|
17
|
+
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Core directories
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
|
|
22
|
+
/** .devflow/memory/ — working memory root */
|
|
23
|
+
function getMemoryDir(projectRoot) {
|
|
24
|
+
return path.join(projectRoot, '.devflow', 'memory');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** .devflow/learning/ — learning state root */
|
|
28
|
+
function getLearningDir(projectRoot) {
|
|
29
|
+
return path.join(projectRoot, '.devflow', 'learning');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** .devflow/features/ — per-feature knowledge bases */
|
|
33
|
+
function getFeaturesDir(projectRoot) {
|
|
34
|
+
return path.join(projectRoot, '.devflow', 'features');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** .devflow/docs/ — generated documentation artifacts */
|
|
38
|
+
function getDocsDir(projectRoot) {
|
|
39
|
+
return path.join(projectRoot, '.devflow', 'docs');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Feature config (neutral .devflow root — not inside learning/)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
/** .devflow/config.json — feature toggles {memory, learning, knowledge} */
|
|
47
|
+
function getFeatureConfigPath(projectRoot) {
|
|
48
|
+
return path.join(projectRoot, '.devflow', 'config.json');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Learning queue files
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
|
|
55
|
+
/** .devflow/learning/.pending-turns.jsonl — decisions detection queue */
|
|
56
|
+
function getLearningPendingTurnsPath(projectRoot) {
|
|
57
|
+
return path.join(projectRoot, '.devflow', 'learning', '.pending-turns.jsonl');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** .devflow/learning/.pending-turns.processing — atomic claim held by the Learning agent while processing */
|
|
61
|
+
function getLearningPendingTurnsProcessingPath(projectRoot) {
|
|
62
|
+
return path.join(projectRoot, '.devflow', 'learning', '.pending-turns.processing');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Learning content files
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
/** .devflow/learning/decisions.md */
|
|
70
|
+
function getDecisionsFilePath(projectRoot) {
|
|
71
|
+
return path.join(projectRoot, '.devflow', 'learning', 'decisions.md');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** .devflow/learning/pitfalls.md */
|
|
75
|
+
function getPitfallsFilePath(projectRoot) {
|
|
76
|
+
return path.join(projectRoot, '.devflow', 'learning', 'pitfalls.md');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** .devflow/learning/learning.json — project-level learning agent tuning config */
|
|
80
|
+
function getLearningTuningConfigPath(projectRoot) {
|
|
81
|
+
return path.join(projectRoot, '.devflow', 'learning', 'learning.json');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** .devflow/learning/decisions-ledger.jsonl — anchored ledger rows (single source of truth for rendering) */
|
|
85
|
+
function getDecisionsLedgerPath(projectRoot) {
|
|
86
|
+
return path.join(projectRoot, '.devflow', 'learning', 'decisions-ledger.jsonl');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** .devflow/learning/decisions-log.jsonl */
|
|
90
|
+
function getDecisionsLogPath(projectRoot) {
|
|
91
|
+
return path.join(projectRoot, '.devflow', 'learning', 'decisions-log.jsonl');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** .devflow/learning/decisions-log.archive.jsonl — rotated-out stale observing rows (gitignored) */
|
|
95
|
+
function getDecisionsArchivePath(projectRoot) {
|
|
96
|
+
return path.join(projectRoot, '.devflow', 'learning', 'decisions-log.archive.jsonl');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** .devflow/learning/.decisions.lock — mkdir-based lock directory */
|
|
100
|
+
function getDecisionsLockDir(projectRoot) {
|
|
101
|
+
return path.join(projectRoot, '.devflow', 'learning', '.decisions.lock');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** .devflow/learning/.decisions-usage.json */
|
|
105
|
+
function getDecisionsUsagePath(projectRoot) {
|
|
106
|
+
return path.join(projectRoot, '.devflow', 'learning', '.decisions-usage.json');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** .devflow/learning/.decisions-usage.lock/ — mkdir-based lock directory for usage file */
|
|
110
|
+
function getDecisionsUsageLockDir(projectRoot) {
|
|
111
|
+
return path.join(projectRoot, '.devflow', 'learning', '.decisions-usage.lock');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** .devflow/learning/index.md — pre-rendered compact index written by render-decisions.cjs */
|
|
115
|
+
function getDecisionsIndexPath(projectRoot) {
|
|
116
|
+
return path.join(projectRoot, '.devflow', 'learning', 'index.md');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** .devflow/learning/.observations.lock — mkdir-based lock directory for observation log writes */
|
|
120
|
+
function getObservationsLockDir(projectRoot) {
|
|
121
|
+
return path.join(projectRoot, '.devflow', 'learning', '.observations.lock');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Memory / working-memory files
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
/** .devflow/memory/WORKING-MEMORY.md */
|
|
129
|
+
function getWorkingMemoryPath(projectRoot) {
|
|
130
|
+
return path.join(projectRoot, '.devflow', 'memory', 'WORKING-MEMORY.md');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** .devflow/memory/backup.json — pre-compact git state snapshot */
|
|
134
|
+
function getBackupPath(projectRoot) {
|
|
135
|
+
return path.join(projectRoot, '.devflow', 'memory', 'backup.json');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** .devflow/memory/.pending-turns.jsonl — queue of captured turns */
|
|
139
|
+
function getPendingTurnsPath(projectRoot) {
|
|
140
|
+
return path.join(projectRoot, '.devflow', 'memory', '.pending-turns.jsonl');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** .devflow/memory/.pending-turns.processing — atomic handoff during processing */
|
|
144
|
+
function getPendingTurnsProcessingPath(projectRoot) {
|
|
145
|
+
return path.join(projectRoot, '.devflow', 'memory', '.pending-turns.processing');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** .devflow/memory/.pending-turns.lock — mutex for queue operations */
|
|
149
|
+
function getPendingTurnsLockDir(projectRoot) {
|
|
150
|
+
return path.join(projectRoot, '.devflow', 'memory', '.pending-turns.lock');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Docs files
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
/** .devflow/docs/reviews/ */
|
|
158
|
+
function getReviewsDir(projectRoot) {
|
|
159
|
+
return path.join(projectRoot, '.devflow', 'docs', 'reviews');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** .devflow/docs/design/ */
|
|
163
|
+
function getDesignDir(projectRoot) {
|
|
164
|
+
return path.join(projectRoot, '.devflow', 'docs', 'design');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** .devflow/docs/research/ */
|
|
168
|
+
function getResearchDir(projectRoot) {
|
|
169
|
+
return path.join(projectRoot, '.devflow', 'docs', 'research');
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** .devflow/docs/handoff-{branchSlug}.md — Code agent phase handoff artifact */
|
|
173
|
+
function getHandoffPath(projectRoot, branchSlug) {
|
|
174
|
+
return path.join(projectRoot, '.devflow', 'docs', `handoff-${branchSlug}.md`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Gitignore entries
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* The canonical list of generic gitignore entries Devflow adds to a project's
|
|
183
|
+
* root .gitignore for LOCAL-scope installs. Currently just `.claude/`.
|
|
184
|
+
*
|
|
185
|
+
* `.devflow/` is intentionally NOT here: it is managed by ensureDevflowGitignore
|
|
186
|
+
* (TS) / ensure-root-gitignore (hook), which write the feature-knowledge carve-out
|
|
187
|
+
* for ALL scopes. Adding a bare `.devflow/` here would append a wholesale-ignore
|
|
188
|
+
* line after the carve-out and re-bury it (last match wins in .gitignore).
|
|
189
|
+
*/
|
|
190
|
+
function getGitignoreEntries() {
|
|
191
|
+
return ['.claude/'];
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
module.exports = {
|
|
195
|
+
// Core directories
|
|
196
|
+
getMemoryDir,
|
|
197
|
+
getLearningDir,
|
|
198
|
+
getFeaturesDir,
|
|
199
|
+
getDocsDir,
|
|
200
|
+
// Feature config
|
|
201
|
+
getFeatureConfigPath,
|
|
202
|
+
// Learning queue files
|
|
203
|
+
getLearningPendingTurnsPath,
|
|
204
|
+
getLearningPendingTurnsProcessingPath,
|
|
205
|
+
// Learning content files
|
|
206
|
+
getDecisionsFilePath,
|
|
207
|
+
getPitfallsFilePath,
|
|
208
|
+
getLearningTuningConfigPath,
|
|
209
|
+
getDecisionsLedgerPath,
|
|
210
|
+
getDecisionsLogPath,
|
|
211
|
+
getDecisionsArchivePath,
|
|
212
|
+
getDecisionsLockDir,
|
|
213
|
+
getObservationsLockDir,
|
|
214
|
+
getDecisionsUsagePath,
|
|
215
|
+
getDecisionsUsageLockDir,
|
|
216
|
+
getDecisionsIndexPath,
|
|
217
|
+
// Memory files
|
|
218
|
+
getWorkingMemoryPath,
|
|
219
|
+
getBackupPath,
|
|
220
|
+
getPendingTurnsPath,
|
|
221
|
+
getPendingTurnsProcessingPath,
|
|
222
|
+
getPendingTurnsLockDir,
|
|
223
|
+
// Docs files
|
|
224
|
+
getReviewsDir,
|
|
225
|
+
getDesignDir,
|
|
226
|
+
getResearchDir,
|
|
227
|
+
getHandoffPath,
|
|
228
|
+
// Gitignore entries
|
|
229
|
+
getGitignoreEntries,
|
|
230
|
+
};
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// src/assets/scripts/hooks/lib/render-decisions.cjs
|
|
3
|
+
//
|
|
4
|
+
// Pure renderer for decisions.md and pitfalls.md from a decisions-ledger.jsonl.
|
|
5
|
+
//
|
|
6
|
+
// DESIGN: Idempotent, clock-free render from anchored ledger rows. No timestamps
|
|
7
|
+
// in output — render is a pure function of the ledger rows. Two consumers:
|
|
8
|
+
// 1. renderDecisionsFile(rows, kind) — exported pure function for testing
|
|
9
|
+
// 2. CLI: `render <worktree>` and `--check <worktree>` subcommands
|
|
10
|
+
//
|
|
11
|
+
// Filtering rules (must match AC-F3):
|
|
12
|
+
// - anchor_id must be set (unanchored observing rows are excluded)
|
|
13
|
+
// - type must match kind: 'decision' rows → decisions.md; 'pitfall' rows → pitfalls.md
|
|
14
|
+
// - decisions_status: undefined|'Accepted'|'Active' → included
|
|
15
|
+
// 'Deprecated'|'Superseded'|'Retired' → excluded
|
|
16
|
+
//
|
|
17
|
+
// Row shape: see LearningObservation in src/core/observations.ts.
|
|
18
|
+
// Ledger file: .devflow/learning/decisions-ledger.jsonl (anchored rows only).
|
|
19
|
+
// If absent, treat as empty corpus.
|
|
20
|
+
//
|
|
21
|
+
// Byte-compat: formatDecisionBody / formatPitfallBody / buildTldrLine /
|
|
22
|
+
// initDecisionsContent — all from decisions-format.cjs (single source of truth).
|
|
23
|
+
|
|
24
|
+
'use strict';
|
|
25
|
+
|
|
26
|
+
const fs = require('fs');
|
|
27
|
+
const path = require('path');
|
|
28
|
+
|
|
29
|
+
const {
|
|
30
|
+
initDecisionsContent,
|
|
31
|
+
formatDecisionBody,
|
|
32
|
+
formatPitfallBody,
|
|
33
|
+
buildTldrLine,
|
|
34
|
+
buildIndexContent,
|
|
35
|
+
} = require('./decisions-format.cjs');
|
|
36
|
+
|
|
37
|
+
const {
|
|
38
|
+
getDecisionsFilePath,
|
|
39
|
+
getPitfallsFilePath,
|
|
40
|
+
getDecisionsIndexPath,
|
|
41
|
+
getDecisionsLockDir,
|
|
42
|
+
} = require('./project-paths.cjs');
|
|
43
|
+
const { acquireMkdirLock, releaseLock } = require('./mkdir-lock.cjs');
|
|
44
|
+
const { safePath } = require('./safe-path.cjs');
|
|
45
|
+
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Constants
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
|
|
50
|
+
/** Statuses that indicate an anchored entry should be HIDDEN from the render. */
|
|
51
|
+
const INACTIVE_STATUSES = new Set(['Deprecated', 'Superseded', 'Retired']);
|
|
52
|
+
|
|
53
|
+
/** Ledger filename relative to .devflow/learning/ */
|
|
54
|
+
const LEDGER_FILENAME = 'decisions-ledger.jsonl';
|
|
55
|
+
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Ledger parsing
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Parse a JSONL ledger file into an array of row objects.
|
|
62
|
+
* Skips empty or malformed lines. Returns [] if file is absent.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} ledgerPath
|
|
65
|
+
* @returns {object[]}
|
|
66
|
+
*/
|
|
67
|
+
function parseLedger(ledgerPath) {
|
|
68
|
+
let raw;
|
|
69
|
+
try {
|
|
70
|
+
raw = fs.readFileSync(ledgerPath, 'utf8');
|
|
71
|
+
} catch (err) {
|
|
72
|
+
if (err.code === 'ENOENT') return [];
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
const rows = [];
|
|
76
|
+
for (const line of raw.split('\n')) {
|
|
77
|
+
const trimmed = line.trim();
|
|
78
|
+
if (!trimmed) continue;
|
|
79
|
+
try {
|
|
80
|
+
rows.push(JSON.parse(trimmed));
|
|
81
|
+
} catch {
|
|
82
|
+
// Skip malformed lines
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return rows;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Core renderer
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Determine whether a row is "active" for render purposes.
|
|
94
|
+
* Active = decisions_status is undefined OR is one of 'Accepted'/'Active'.
|
|
95
|
+
*
|
|
96
|
+
* @param {object} row
|
|
97
|
+
* @returns {boolean}
|
|
98
|
+
*/
|
|
99
|
+
function isActive(row) {
|
|
100
|
+
if (!row.decisions_status) return true;
|
|
101
|
+
return !INACTIVE_STATUSES.has(row.decisions_status);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Extract the numeric suffix from an anchor_id like "ADR-016" or "PF-007".
|
|
106
|
+
* Returns Infinity for unparseable values so they sort to the end.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} anchorId
|
|
109
|
+
* @returns {number}
|
|
110
|
+
*/
|
|
111
|
+
function anchorNumeric(anchorId) {
|
|
112
|
+
if (!anchorId) return Infinity;
|
|
113
|
+
const m = anchorId.match(/\d+$/);
|
|
114
|
+
return m ? parseInt(m[0], 10) : Infinity;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Select active rows of a given kind from the ledger, sorted by numeric anchor.
|
|
119
|
+
* Exported so callers (renderAndWriteAll, migrations) can build the index without
|
|
120
|
+
* going through renderDecisionsFile.
|
|
121
|
+
*
|
|
122
|
+
* @param {object[]} rows - all rows from the ledger (unfiltered)
|
|
123
|
+
* @param {'decisions'|'pitfalls'} kind
|
|
124
|
+
* @returns {object[]} filtered + sorted active rows
|
|
125
|
+
*/
|
|
126
|
+
function selectActiveRows(rows, kind) {
|
|
127
|
+
const type = kind === 'decisions' ? 'decision' : 'pitfall';
|
|
128
|
+
return rows
|
|
129
|
+
.filter(r => r.type === type && r.anchor_id && isActive(r))
|
|
130
|
+
.sort((a, b) => anchorNumeric(a.anchor_id) - anchorNumeric(b.anchor_id));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Build the full file content from already-filtered + sorted active rows.
|
|
135
|
+
* Internal helper — callers that have already run selectActiveRows can pass
|
|
136
|
+
* the result here directly to avoid re-filtering the ledger.
|
|
137
|
+
*
|
|
138
|
+
* Per-row content:
|
|
139
|
+
* - If row.raw_body is truthy → emit verbatim (migrated entries)
|
|
140
|
+
* - Otherwise → formatDecisionBody / formatPitfallBody from details
|
|
141
|
+
*
|
|
142
|
+
* @param {object[]} activeRows - already-filtered + sorted active rows
|
|
143
|
+
* @param {'decisions'|'pitfalls'} kind
|
|
144
|
+
* @returns {string} complete file content
|
|
145
|
+
*/
|
|
146
|
+
function renderBodyFromActive(activeRows, kind) {
|
|
147
|
+
// Build per-row blocks
|
|
148
|
+
const blocks = activeRows.map(row => {
|
|
149
|
+
if (row.raw_body) {
|
|
150
|
+
// Migrated entry: emit verbatim. raw_body must start with \n## so
|
|
151
|
+
// it fits seamlessly after the header preamble.
|
|
152
|
+
return row.raw_body;
|
|
153
|
+
}
|
|
154
|
+
return kind === 'decisions'
|
|
155
|
+
? formatDecisionBody(row)
|
|
156
|
+
: formatPitfallBody(row);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Build TL;DR line (uses active + sorted rows so last-5 are stable)
|
|
160
|
+
const tldr = buildTldrLine(kind, activeRows);
|
|
161
|
+
|
|
162
|
+
// Build header: replace placeholder TL;DR in the init content with the real one.
|
|
163
|
+
// initDecisionsContent returns "<!-- TL;DR: 0 {kind}. Key: -->\n..." so we
|
|
164
|
+
// replace the TL;DR line at position 0.
|
|
165
|
+
const initKind = kind === 'decisions' ? 'decision' : 'pitfall';
|
|
166
|
+
const headerWithPlaceholder = initDecisionsContent(initKind);
|
|
167
|
+
// Replace only the first line (the TL;DR comment)
|
|
168
|
+
const header = headerWithPlaceholder.replace(/^<!-- TL;DR:[^\n]*-->/, tldr);
|
|
169
|
+
|
|
170
|
+
return header + blocks.join('');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Pure render function. Produces the full content of a decisions.md or
|
|
175
|
+
* pitfalls.md file from the given ledger rows.
|
|
176
|
+
*
|
|
177
|
+
* Filtering:
|
|
178
|
+
* - row.type must match kind ('decision' → decisions.md, 'pitfall' → pitfalls.md)
|
|
179
|
+
* - row.anchor_id must be set
|
|
180
|
+
* - row must be active (decisions_status not in INACTIVE_STATUSES)
|
|
181
|
+
*
|
|
182
|
+
* Output structure:
|
|
183
|
+
* TL;DR line (line 1)
|
|
184
|
+
* File header body (title + preamble)
|
|
185
|
+
* Per-row blocks (sorted by numeric anchor ASC)
|
|
186
|
+
* (no trailing newline beyond what the blocks naturally include)
|
|
187
|
+
*
|
|
188
|
+
* Idempotent and clock-free: no timestamps in output.
|
|
189
|
+
*
|
|
190
|
+
* @param {object[]} rows - all rows from the ledger (unfiltered)
|
|
191
|
+
* @param {'decisions'|'pitfalls'} kind
|
|
192
|
+
* @returns {string} complete file content
|
|
193
|
+
*/
|
|
194
|
+
function renderDecisionsFile(rows, kind) {
|
|
195
|
+
return renderBodyFromActive(selectActiveRows(rows, kind), kind);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
// Atomic write helper
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Write content atomically via a .tmp sibling + rename.
|
|
204
|
+
* Uses O_EXCL to prevent TOCTOU symlink attacks, retries once on EEXIST.
|
|
205
|
+
*
|
|
206
|
+
* @param {string} filePath
|
|
207
|
+
* @param {string} content
|
|
208
|
+
*/
|
|
209
|
+
function writeAtomic(filePath, content) {
|
|
210
|
+
const tmp = filePath + '.tmp';
|
|
211
|
+
try {
|
|
212
|
+
fs.writeFileSync(tmp, content, { flag: 'wx' });
|
|
213
|
+
} catch (err) {
|
|
214
|
+
if (err.code !== 'EEXIST') throw err;
|
|
215
|
+
try { fs.unlinkSync(tmp); } catch { /* race */ }
|
|
216
|
+
fs.writeFileSync(tmp, content, { flag: 'wx' });
|
|
217
|
+
}
|
|
218
|
+
fs.renameSync(tmp, filePath);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Lock-free render+write helper (for callers that already hold .decisions.lock)
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Render both decisions.md and pitfalls.md from the given ledger rows and write
|
|
227
|
+
* them atomically. Does NOT acquire any lock — callers (assign-anchor, retire-anchor)
|
|
228
|
+
* must already hold .decisions.lock. The standalone `render` CLI takes the lock
|
|
229
|
+
* before calling this function.
|
|
230
|
+
*
|
|
231
|
+
* Creates the decisionsDir if it does not exist.
|
|
232
|
+
*
|
|
233
|
+
* @param {string} worktreePath - Absolute path to the worktree root.
|
|
234
|
+
* @param {object[]} rows - All rows from the ledger (unfiltered).
|
|
235
|
+
*/
|
|
236
|
+
function renderAndWriteAll(worktreePath, rows) {
|
|
237
|
+
const decisionsDir = path.join(worktreePath, '.devflow', 'learning');
|
|
238
|
+
fs.mkdirSync(decisionsDir, { recursive: true });
|
|
239
|
+
|
|
240
|
+
const decisionsFilePath = getDecisionsFilePath(worktreePath);
|
|
241
|
+
const pitfallsFilePath = getPitfallsFilePath(worktreePath);
|
|
242
|
+
const indexFilePath = getDecisionsIndexPath(worktreePath);
|
|
243
|
+
|
|
244
|
+
// Hoist active-row selection: computed once per kind, reused for both the
|
|
245
|
+
// body render and the index build — avoids two redundant selectActiveRows passes.
|
|
246
|
+
const activeDecisionRows = selectActiveRows(rows, 'decisions');
|
|
247
|
+
const activePitfallRows = selectActiveRows(rows, 'pitfalls');
|
|
248
|
+
|
|
249
|
+
const decisionsContent = renderBodyFromActive(activeDecisionRows, 'decisions');
|
|
250
|
+
const pitfallsContent = renderBodyFromActive(activePitfallRows, 'pitfalls');
|
|
251
|
+
|
|
252
|
+
// Write body files first; index last. On a crash between body writes and the
|
|
253
|
+
// index write: on the FIRST render the index is absent (reader falls back to
|
|
254
|
+
// (none)); on a RE-render the index is stale — one generation behind the new
|
|
255
|
+
// body files — never corrupt. Both cases are benign and self-heal on the next
|
|
256
|
+
// successful render.
|
|
257
|
+
writeAtomic(decisionsFilePath, decisionsContent);
|
|
258
|
+
writeAtomic(pitfallsFilePath, pitfallsContent);
|
|
259
|
+
|
|
260
|
+
// Build and write compact index (write-time artifact; consumed via plain Read)
|
|
261
|
+
// Reuses the pre-computed active rows — no additional selectActiveRows pass.
|
|
262
|
+
const indexContent = buildIndexContent(activeDecisionRows, activePitfallRows, {
|
|
263
|
+
decisionsFilePath,
|
|
264
|
+
pitfallsFilePath,
|
|
265
|
+
});
|
|
266
|
+
writeAtomic(indexFilePath, indexContent + '\n');
|
|
267
|
+
|
|
268
|
+
process.stderr.write(
|
|
269
|
+
`[render-decisions] wrote decisions.md (${decisionsContent.length}B) + pitfalls.md (${pitfallsContent.length}B) + index.md (${indexContent.length}B)\n`
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// ---------------------------------------------------------------------------
|
|
274
|
+
// CLI entry point
|
|
275
|
+
// ---------------------------------------------------------------------------
|
|
276
|
+
|
|
277
|
+
if (require.main === module) {
|
|
278
|
+
const argv = process.argv.slice(2);
|
|
279
|
+
|
|
280
|
+
if (argv.length === 0) {
|
|
281
|
+
process.stderr.write(
|
|
282
|
+
'Usage:\n' +
|
|
283
|
+
' render-decisions.cjs render <worktree> Write both .md files\n' +
|
|
284
|
+
' render-decisions.cjs --check <worktree> Diff without writing; exit 1 on drift\n'
|
|
285
|
+
);
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Parse: `render <worktree>` or `--check <worktree>`
|
|
290
|
+
let mode; // 'render' | 'check'
|
|
291
|
+
let worktreePath;
|
|
292
|
+
|
|
293
|
+
if (argv[0] === 'render' && argv[1]) {
|
|
294
|
+
mode = 'render';
|
|
295
|
+
worktreePath = path.resolve(argv[1]);
|
|
296
|
+
} else if (argv[0] === '--check' && argv[1]) {
|
|
297
|
+
mode = 'check';
|
|
298
|
+
worktreePath = path.resolve(argv[1]);
|
|
299
|
+
} else {
|
|
300
|
+
process.stderr.write(
|
|
301
|
+
'Usage:\n' +
|
|
302
|
+
' render-decisions.cjs render <worktree> Write both .md files\n' +
|
|
303
|
+
' render-decisions.cjs --check <worktree> Diff without writing; exit 1 on drift\n'
|
|
304
|
+
);
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Validate path at trust boundary before any file operations.
|
|
309
|
+
// safePath rejects null bytes, which path.resolve preserves silently.
|
|
310
|
+
try {
|
|
311
|
+
worktreePath = safePath(worktreePath);
|
|
312
|
+
} catch (err) {
|
|
313
|
+
process.stderr.write(`render-decisions: invalid worktree path: ${err.message}\n`);
|
|
314
|
+
process.exit(1);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const decisionsDir = path.join(worktreePath, '.devflow', 'learning');
|
|
318
|
+
const ledgerPath = path.join(decisionsDir, LEDGER_FILENAME);
|
|
319
|
+
const decisionsFilePath = getDecisionsFilePath(worktreePath);
|
|
320
|
+
const pitfallsFilePath = getPitfallsFilePath(worktreePath);
|
|
321
|
+
const indexFilePath = getDecisionsIndexPath(worktreePath);
|
|
322
|
+
const lockDir = getDecisionsLockDir(worktreePath);
|
|
323
|
+
|
|
324
|
+
// Ensure decisionsDir exists (needed before lock acquisition and file reads)
|
|
325
|
+
fs.mkdirSync(decisionsDir, { recursive: true });
|
|
326
|
+
|
|
327
|
+
// Read ledger (empty corpus if absent)
|
|
328
|
+
const rows = parseLedger(ledgerPath);
|
|
329
|
+
|
|
330
|
+
if (mode === 'check') {
|
|
331
|
+
// Render all three files in memory and compare against on-disk content.
|
|
332
|
+
// Exit non-zero on drift.
|
|
333
|
+
// Hoist active-row selection (mirrors renderAndWriteAll): computed once per kind,
|
|
334
|
+
// reused for both body render and index build.
|
|
335
|
+
const activeDecisionRows = selectActiveRows(rows, 'decisions');
|
|
336
|
+
const activePitfallRows = selectActiveRows(rows, 'pitfalls');
|
|
337
|
+
const decisionsContent = renderBodyFromActive(activeDecisionRows, 'decisions');
|
|
338
|
+
const pitfallsContent = renderBodyFromActive(activePitfallRows, 'pitfalls');
|
|
339
|
+
const indexContent = buildIndexContent(activeDecisionRows, activePitfallRows, {
|
|
340
|
+
decisionsFilePath,
|
|
341
|
+
pitfallsFilePath,
|
|
342
|
+
}) + '\n';
|
|
343
|
+
|
|
344
|
+
let drift = false;
|
|
345
|
+
let existingDecisions = '';
|
|
346
|
+
let existingPitfalls = '';
|
|
347
|
+
let existingIndex = '';
|
|
348
|
+
try { existingDecisions = fs.readFileSync(decisionsFilePath, 'utf8'); } catch { drift = true; }
|
|
349
|
+
try { existingPitfalls = fs.readFileSync(pitfallsFilePath, 'utf8'); } catch { drift = true; }
|
|
350
|
+
// index.md missing is a drift condition (it should always be present after a render)
|
|
351
|
+
try { existingIndex = fs.readFileSync(indexFilePath, 'utf8'); } catch { drift = true; }
|
|
352
|
+
|
|
353
|
+
if (!drift) {
|
|
354
|
+
if (existingDecisions !== decisionsContent) {
|
|
355
|
+
process.stderr.write(`[render-decisions] DRIFT: ${decisionsFilePath}\n`);
|
|
356
|
+
drift = true;
|
|
357
|
+
}
|
|
358
|
+
if (existingPitfalls !== pitfallsContent) {
|
|
359
|
+
process.stderr.write(`[render-decisions] DRIFT: ${pitfallsFilePath}\n`);
|
|
360
|
+
drift = true;
|
|
361
|
+
}
|
|
362
|
+
if (existingIndex !== indexContent) {
|
|
363
|
+
process.stderr.write(`[render-decisions] DRIFT: ${indexFilePath}\n`);
|
|
364
|
+
drift = true;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
process.exit(drift ? 1 : 0);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// mode === 'render': write atomically under lock
|
|
372
|
+
if (!acquireMkdirLock(lockDir, 30000, 60000)) {
|
|
373
|
+
process.stderr.write(`render-decisions: timeout acquiring lock at ${lockDir}\n`);
|
|
374
|
+
process.exit(1);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
try {
|
|
378
|
+
// Use the lock-free helper — we already hold the lock.
|
|
379
|
+
renderAndWriteAll(worktreePath, rows);
|
|
380
|
+
} finally {
|
|
381
|
+
releaseLock(lockDir);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
process.exit(0);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// ---------------------------------------------------------------------------
|
|
388
|
+
// Module exports (for testing)
|
|
389
|
+
// ---------------------------------------------------------------------------
|
|
390
|
+
|
|
391
|
+
module.exports = {
|
|
392
|
+
renderDecisionsFile,
|
|
393
|
+
renderAndWriteAll,
|
|
394
|
+
selectActiveRows,
|
|
395
|
+
parseLedger,
|
|
396
|
+
isActive,
|
|
397
|
+
anchorNumeric,
|
|
398
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a file path to an absolute path, optionally validating it
|
|
7
|
+
* falls within an allowed root directory.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} filePath
|
|
10
|
+
* @param {string} [allowedRoot] — when provided, throws if resolved path escapes this root
|
|
11
|
+
* @returns {string}
|
|
12
|
+
*/
|
|
13
|
+
function safePath(filePath, allowedRoot) {
|
|
14
|
+
// D-SEC-001: Validate at boundary — reject null bytes before path.resolve, which
|
|
15
|
+
// preserves them silently. A null byte in a path is always hostile input.
|
|
16
|
+
if (filePath.includes('\0')) {
|
|
17
|
+
throw new Error(`Invalid path: contains null byte`);
|
|
18
|
+
}
|
|
19
|
+
const resolved = path.resolve(filePath);
|
|
20
|
+
if (typeof allowedRoot === 'string') {
|
|
21
|
+
const root = path.resolve(allowedRoot);
|
|
22
|
+
if (resolved !== root && !resolved.startsWith(root + path.sep)) {
|
|
23
|
+
throw new Error(`Refused path outside ${root}: ${filePath}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return resolved;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { safePath };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Shared log path computation for Devflow hooks.
|
|
3
|
+
# Source this file to get devflow_log_dir function.
|
|
4
|
+
|
|
5
|
+
# Cache the computed log dir path to avoid spawning 4 subprocesses (sed+tr+mkdir+chmod)
|
|
6
|
+
# on every call within the same hook process.
|
|
7
|
+
_LOG_DIR_CACHED=""
|
|
8
|
+
_LOG_DIR_CACHED_CWD=""
|
|
9
|
+
|
|
10
|
+
devflow_log_dir() {
|
|
11
|
+
local cwd="$1"
|
|
12
|
+
if [ "$cwd" = "$_LOG_DIR_CACHED_CWD" ] && [ -n "$_LOG_DIR_CACHED" ]; then
|
|
13
|
+
echo "$_LOG_DIR_CACHED"
|
|
14
|
+
return 0
|
|
15
|
+
fi
|
|
16
|
+
local slug
|
|
17
|
+
slug=$(echo "$cwd" | sed 's|^/||' | tr '/' '-')
|
|
18
|
+
local dir="$HOME/.devflow/logs/$slug"
|
|
19
|
+
mkdir -p "$dir"
|
|
20
|
+
chmod 700 "$dir"
|
|
21
|
+
_LOG_DIR_CACHED="$dir"
|
|
22
|
+
_LOG_DIR_CACHED_CWD="$cwd"
|
|
23
|
+
echo "$dir"
|
|
24
|
+
}
|