devflow-kit 1.8.3 → 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 +183 -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 +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,243 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# JSON parsing helper — tries jq, falls back to node json-helper.js
|
|
4
|
+
# Usage: source "$SCRIPT_DIR/json-parse"
|
|
5
|
+
#
|
|
6
|
+
# After sourcing, check $_JSON_AVAILABLE before using json_* functions.
|
|
7
|
+
# All functions read from stdin unless noted otherwise.
|
|
8
|
+
|
|
9
|
+
_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
_JSON_HELPER="$_SCRIPT_DIR/json-helper.cjs"
|
|
11
|
+
|
|
12
|
+
_HAS_JQ=false
|
|
13
|
+
_HAS_NODE=false
|
|
14
|
+
command -v jq &>/dev/null && _HAS_JQ=true
|
|
15
|
+
command -v node &>/dev/null && _HAS_NODE=true
|
|
16
|
+
|
|
17
|
+
if [ "$_HAS_JQ" = "false" ] && [ "$_HAS_NODE" = "false" ]; then
|
|
18
|
+
_JSON_AVAILABLE=false
|
|
19
|
+
return 0 2>/dev/null || exit 0
|
|
20
|
+
fi
|
|
21
|
+
_JSON_AVAILABLE=true
|
|
22
|
+
|
|
23
|
+
# --- Core field extraction ---
|
|
24
|
+
|
|
25
|
+
# Extract a field from stdin JSON. Usage: echo '{"k":"v"}' | json_field "k" "default"
|
|
26
|
+
json_field() {
|
|
27
|
+
local field="$1" default="${2:-}"
|
|
28
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
29
|
+
jq -r ".$field // \"$default\"" 2>/dev/null
|
|
30
|
+
else
|
|
31
|
+
node "$_JSON_HELPER" get-field "$field" "$default"
|
|
32
|
+
fi
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Extract a field from a JSON file. Usage: json_field_file "/path/to/file.json" "field" "default"
|
|
36
|
+
# Note: uses if/then/else to preserve boolean false (jq // operator would replace false with default)
|
|
37
|
+
json_field_file() {
|
|
38
|
+
local file="$1" field="$2" default="${3:-}"
|
|
39
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
40
|
+
jq -r "if (.$field | type) == \"null\" then \"$default\" else (.$field | tostring) end" "$file" 2>/dev/null
|
|
41
|
+
else
|
|
42
|
+
node "$_JSON_HELPER" get-field-file "$file" "$field" "$default"
|
|
43
|
+
fi
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# --- Validation ---
|
|
47
|
+
|
|
48
|
+
# Validate stdin as JSON (exit code 0/1). Usage: echo '{}' | json_valid
|
|
49
|
+
json_valid() {
|
|
50
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
51
|
+
jq -e . >/dev/null 2>&1
|
|
52
|
+
else
|
|
53
|
+
node "$_JSON_HELPER" validate
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# --- Compact ---
|
|
58
|
+
|
|
59
|
+
# Compact stdin JSON to single line. Usage: echo '{ "k": "v" }' | json_compact
|
|
60
|
+
json_compact() {
|
|
61
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
62
|
+
jq -c '.' 2>/dev/null
|
|
63
|
+
else
|
|
64
|
+
node "$_JSON_HELPER" compact
|
|
65
|
+
fi
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# --- Construction ---
|
|
69
|
+
|
|
70
|
+
# Build a JSON object from --arg/--argjson pairs.
|
|
71
|
+
# Usage: json_construct --arg key1 val1 --arg key2 val2
|
|
72
|
+
json_construct() {
|
|
73
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
74
|
+
# Build jq expression from args
|
|
75
|
+
local jq_args=()
|
|
76
|
+
local fields=""
|
|
77
|
+
local i=0
|
|
78
|
+
while [ $i -lt $# ]; do
|
|
79
|
+
local flag="${!((i+1))}"
|
|
80
|
+
if [ "$flag" = "--arg" ]; then
|
|
81
|
+
local name="${!((i+2))}"
|
|
82
|
+
local val="${!((i+3))}"
|
|
83
|
+
jq_args+=(--arg "$name" "$val")
|
|
84
|
+
if [ -n "$fields" ]; then fields="$fields, "; fi
|
|
85
|
+
fields="${fields}${name}: \$${name}"
|
|
86
|
+
i=$((i + 3))
|
|
87
|
+
elif [ "$flag" = "--argjson" ]; then
|
|
88
|
+
local name="${!((i+2))}"
|
|
89
|
+
local val="${!((i+3))}"
|
|
90
|
+
jq_args+=(--argjson "$name" "$val")
|
|
91
|
+
if [ -n "$fields" ]; then fields="$fields, "; fi
|
|
92
|
+
fields="${fields}${name}: \$${name}"
|
|
93
|
+
i=$((i + 3))
|
|
94
|
+
else
|
|
95
|
+
i=$((i + 1))
|
|
96
|
+
fi
|
|
97
|
+
done
|
|
98
|
+
jq -n -c "${jq_args[@]}" "{$fields}" 2>/dev/null
|
|
99
|
+
else
|
|
100
|
+
node "$_JSON_HELPER" construct "$@"
|
|
101
|
+
fi
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# --- Field updates ---
|
|
105
|
+
|
|
106
|
+
# Update a field on stdin JSON. Usage: echo '{"k":"v"}' | json_update_field "k" "new_v"
|
|
107
|
+
json_update_field() {
|
|
108
|
+
local field="$1" value="$2"
|
|
109
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
110
|
+
jq -c --arg v "$value" ".$field = \$v" 2>/dev/null
|
|
111
|
+
else
|
|
112
|
+
node "$_JSON_HELPER" update-field "$field" "$value"
|
|
113
|
+
fi
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
# Update a field with a JSON value. Usage: echo '{}' | json_update_field_json "k" '42'
|
|
117
|
+
json_update_field_json() {
|
|
118
|
+
local field="$1" value="$2"
|
|
119
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
120
|
+
jq -c --argjson v "$value" ".$field = \$v" 2>/dev/null
|
|
121
|
+
else
|
|
122
|
+
node "$_JSON_HELPER" update-field "$field" "$value" --json
|
|
123
|
+
fi
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# --- Slurp operations ---
|
|
127
|
+
|
|
128
|
+
# Slurp JSONL file, sort by field desc, output as JSONL (one line per entry).
|
|
129
|
+
# Usage: json_slurp_cap "file.jsonl" "confidence" 100
|
|
130
|
+
json_slurp_cap() {
|
|
131
|
+
local file="$1" field="$2" limit="${3:-100}"
|
|
132
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
133
|
+
jq -c '.' "$file" | jq -s "sort_by(.$field) | reverse | .[0:$limit][]" 2>/dev/null
|
|
134
|
+
else
|
|
135
|
+
node "$_JSON_HELPER" slurp-cap "$file" "$field" "$limit"
|
|
136
|
+
fi
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# --- Array operations ---
|
|
140
|
+
|
|
141
|
+
# Get length of array at path. Usage: echo '{"obs":[1,2]}' | json_array_length "observations"
|
|
142
|
+
json_array_length() {
|
|
143
|
+
local path="$1"
|
|
144
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
145
|
+
jq ".$path | length" 2>/dev/null
|
|
146
|
+
else
|
|
147
|
+
node "$_JSON_HELPER" array-length "$path"
|
|
148
|
+
fi
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
# Get item at index from array. Usage: echo '{"obs":[{},{}]}' | json_array_item "observations" 0
|
|
152
|
+
json_array_item() {
|
|
153
|
+
local path="$1" index="$2"
|
|
154
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
155
|
+
jq -c ".${path}[$index]" 2>/dev/null
|
|
156
|
+
else
|
|
157
|
+
node "$_JSON_HELPER" array-item "$path" "$index"
|
|
158
|
+
fi
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
# --- Multi-field batched extraction ---
|
|
162
|
+
|
|
163
|
+
# Extract cwd and an arbitrary top-level field from stdin JSON in a single
|
|
164
|
+
# subprocess. Uses ASCII SOH (U+0001) as delimiter -- safe for field values
|
|
165
|
+
# containing tabs or backslashes, and compatible with bash 3.2 parameter
|
|
166
|
+
# expansion (unlike NUL byte). Always written as the \u0001 jq escape (never
|
|
167
|
+
# a literal control byte) so the delimiter stays visible in source review.
|
|
168
|
+
# Caller pattern (zero extra subprocesses for the split):
|
|
169
|
+
# FIELDS=$(printf '%s' "$INPUT" | json_extract_cwd_field "last_assistant_message")
|
|
170
|
+
# CWD="${FIELDS%%$'\001'*}"
|
|
171
|
+
# VALUE="${FIELDS#*$'\001'}"
|
|
172
|
+
# This replaces the @tsv/@cut pattern, which corrupts tab chars in field values to "\t".
|
|
173
|
+
json_extract_cwd_field() {
|
|
174
|
+
local field="$1"
|
|
175
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
176
|
+
jq -r --arg f "$field" '(.cwd // "") + "\u0001" + (.[$f] // "")' 2>/dev/null
|
|
177
|
+
else
|
|
178
|
+
node "$_JSON_HELPER" extract-cwd-field "$field"
|
|
179
|
+
fi
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Thin wrapper over json_extract_cwd_field -- kept as a named function since
|
|
183
|
+
# it is the most common call site (capture-prompt, preamble).
|
|
184
|
+
json_extract_cwd_prompt() {
|
|
185
|
+
json_extract_cwd_field "prompt"
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# --- Transcript extraction ---
|
|
189
|
+
|
|
190
|
+
# Extract text messages from Claude message JSON. Usage: printf '%s\n' '{"message":...}' | json_extract_messages
|
|
191
|
+
json_extract_messages() {
|
|
192
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
193
|
+
jq -r 'if .message.content then
|
|
194
|
+
if (.message.content | type) == "string" then .message.content
|
|
195
|
+
else [.message.content[] | select(.type == "text") | .text] | join("\n")
|
|
196
|
+
end
|
|
197
|
+
else "" end' 2>/dev/null
|
|
198
|
+
else
|
|
199
|
+
node "$_JSON_HELPER" extract-text-messages
|
|
200
|
+
fi
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# --- Hook output envelopes ---
|
|
204
|
+
|
|
205
|
+
# Build SessionStart output. Usage: json_session_output "$CONTEXT"
|
|
206
|
+
json_session_output() {
|
|
207
|
+
local ctx="$1"
|
|
208
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
209
|
+
jq -n --arg ctx "$ctx" '{
|
|
210
|
+
"hookSpecificOutput": {
|
|
211
|
+
"hookEventName": "SessionStart",
|
|
212
|
+
"additionalContext": $ctx
|
|
213
|
+
}
|
|
214
|
+
}'
|
|
215
|
+
else
|
|
216
|
+
node "$_JSON_HELPER" session-output "$ctx"
|
|
217
|
+
fi
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
# Build UserPromptSubmit output. Usage: json_prompt_output "$CONTEXT"
|
|
221
|
+
json_prompt_output() {
|
|
222
|
+
local ctx="$1"
|
|
223
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
224
|
+
jq -n --arg ctx "$ctx" '{
|
|
225
|
+
"hookSpecificOutput": {
|
|
226
|
+
"hookEventName": "UserPromptSubmit",
|
|
227
|
+
"additionalContext": $ctx
|
|
228
|
+
}
|
|
229
|
+
}'
|
|
230
|
+
else
|
|
231
|
+
node "$_JSON_HELPER" prompt-output "$ctx"
|
|
232
|
+
fi
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
# Build pre-compact backup JSON. Usage: json_backup_construct --arg ts X --arg branch Y ...
|
|
236
|
+
json_backup_construct() {
|
|
237
|
+
if [ "$_HAS_JQ" = "true" ]; then
|
|
238
|
+
jq -n "$@" '{timestamp: $ts, trigger: "pre-compact", memory_snapshot: $memory, git: {branch: $branch, status: $status, log: $log, diff_stat: $diff}}'
|
|
239
|
+
else
|
|
240
|
+
node "$_JSON_HELPER" backup-construct "$@"
|
|
241
|
+
fi
|
|
242
|
+
}
|
|
243
|
+
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# mkdir-based locking, portable across BSD (macOS) and GNU (Linux) stat.
|
|
3
|
+
#
|
|
4
|
+
# Source-order requirement: source get-mtime (src/assets/scripts/hooks/get-mtime) BEFORE
|
|
5
|
+
# sourcing this file so get_mtime() is defined and stale-lock detection uses a
|
|
6
|
+
# real mtime. If get_mtime is not yet defined when a lock_dir already exists,
|
|
7
|
+
# this file falls back to treating the lock as maximally stale (immediate
|
|
8
|
+
# break) rather than crashing on a BSD-only stat flag — safe-by-construction,
|
|
9
|
+
# never a hard failure, but source get-mtime first for accurate staleness.
|
|
10
|
+
|
|
11
|
+
learning_lock_acquire() {
|
|
12
|
+
local lock_dir="$1"
|
|
13
|
+
local timeout="${2:-3}"
|
|
14
|
+
local stale_threshold=30
|
|
15
|
+
local waited=0
|
|
16
|
+
|
|
17
|
+
# Break stale locks
|
|
18
|
+
if [ -d "$lock_dir" ]; then
|
|
19
|
+
local lock_age lock_mtime
|
|
20
|
+
if declare -F get_mtime >/dev/null 2>&1; then
|
|
21
|
+
lock_mtime=$(get_mtime "$lock_dir")
|
|
22
|
+
else
|
|
23
|
+
lock_mtime=""
|
|
24
|
+
fi
|
|
25
|
+
lock_mtime="${lock_mtime:-0}"
|
|
26
|
+
lock_age=$(( $(date +%s) - lock_mtime ))
|
|
27
|
+
if [ "$lock_age" -gt "$stale_threshold" ]; then
|
|
28
|
+
rmdir "$lock_dir" 2>/dev/null || true
|
|
29
|
+
fi
|
|
30
|
+
fi
|
|
31
|
+
|
|
32
|
+
while [ "$waited" -lt "$timeout" ]; do
|
|
33
|
+
if mkdir "$lock_dir" 2>/dev/null; then
|
|
34
|
+
return 0
|
|
35
|
+
fi
|
|
36
|
+
sleep 1
|
|
37
|
+
waited=$(( waited + 1 ))
|
|
38
|
+
done
|
|
39
|
+
return 1
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
learning_lock_release() {
|
|
43
|
+
rmdir "$1" 2>/dev/null || true
|
|
44
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// src/assets/scripts/hooks/lib/decisions-format.cjs
|
|
2
|
+
//
|
|
3
|
+
// Shared pure formatting helpers for decisions.md and pitfalls.md output.
|
|
4
|
+
//
|
|
5
|
+
// DESIGN: Shared pure formatting helpers used by assign-anchor (via json-helper.cjs)
|
|
6
|
+
// and render-decisions.cjs so both share the EXACT same format functions. This is
|
|
7
|
+
// the single source of truth for the byte-compat output strings — any drift here
|
|
8
|
+
// will break the renderer/session-start-context TL;DR parser.
|
|
9
|
+
//
|
|
10
|
+
// BYTE-COMPAT CONTRACT (must not change without updating all consumers):
|
|
11
|
+
// Decision heading: \n## {anchorId}: {title}\n
|
|
12
|
+
// Decision fields: - **Date**: YYYY-MM-DD\n
|
|
13
|
+
// - **Status**: Accepted\n
|
|
14
|
+
// - **Context**: ...\n
|
|
15
|
+
// - **Decision**: ...\n
|
|
16
|
+
// - **Consequences**: ...\n
|
|
17
|
+
// - **Source**: self-learning:{obsId}\n
|
|
18
|
+
// Pitfall heading: \n## {anchorId}: {title}\n
|
|
19
|
+
// Pitfall fields: - **Area**: ...\n
|
|
20
|
+
// - **Issue**: ...\n
|
|
21
|
+
// - **Impact**: ...\n
|
|
22
|
+
// - **Resolution**: ...\n
|
|
23
|
+
// - **Status**: Active\n
|
|
24
|
+
// - **Source**: self-learning:{obsId}\n
|
|
25
|
+
// TL;DR line: <!-- TL;DR: N {decisions|pitfalls}. Key: id1, id2 -->
|
|
26
|
+
// File headers:
|
|
27
|
+
// decisions.md: "<!-- TL;DR: 0 decisions. Key: -->\n# Architectural Decisions\n\nAppend-only. Status changes allowed; deletions prohibited.\n"
|
|
28
|
+
// pitfalls.md: "<!-- TL;DR: 0 pitfalls. Key: -->\n# Known Pitfalls\n\nArea-specific gotchas, fragile areas, and past bugs.\n"
|
|
29
|
+
//
|
|
30
|
+
// Consumers of these strings:
|
|
31
|
+
// - session-start-context (line 57): reads TL;DR comment via sed
|
|
32
|
+
// - devflow:apply-decisions: reads ## ADR-NNN: / ## PF-NNN: headings
|
|
33
|
+
// - decisions-usage-scan: scans /(ADR|PF)-\d{3}/ anchors
|
|
34
|
+
// - buildIndexContent (below): parses ## heading, - **Status**:, - **Area**: lines from rendered blocks
|
|
35
|
+
|
|
36
|
+
'use strict';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Return the initial header content for a new decisions or pitfalls file.
|
|
40
|
+
* Byte-identical to the initDecisionsContent function in json-helper.cjs.
|
|
41
|
+
*
|
|
42
|
+
* @param {'decision'|'pitfall'} kind
|
|
43
|
+
* @returns {string}
|
|
44
|
+
*/
|
|
45
|
+
function initDecisionsContent(kind) {
|
|
46
|
+
return kind === 'decision'
|
|
47
|
+
? '<!-- TL;DR: 0 decisions. Key: -->\n# Architectural Decisions\n\nAppend-only. Status changes allowed; deletions prohibited.\n'
|
|
48
|
+
: '<!-- TL;DR: 0 pitfalls. Key: -->\n# Known Pitfalls\n\nArea-specific gotchas, fragile areas, and past bugs.\n';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Format a decision entry block from structured details.
|
|
53
|
+
* Used when `raw_body` is absent (new entries authored post-migration).
|
|
54
|
+
* Returns the block starting with a leading newline so appends just work.
|
|
55
|
+
*
|
|
56
|
+
* @param {object} row - Ledger row with at minimum: anchor_id, pattern, id, details, date
|
|
57
|
+
* @returns {string}
|
|
58
|
+
*/
|
|
59
|
+
function formatDecisionBody(row) {
|
|
60
|
+
const detailsStr = row.details || '';
|
|
61
|
+
const obsId = row.id || 'unknown';
|
|
62
|
+
const artDate = row.date || new Date().toISOString().slice(0, 10);
|
|
63
|
+
const anchorId = row.anchor_id || '';
|
|
64
|
+
const pattern = row.pattern || '';
|
|
65
|
+
|
|
66
|
+
const contextM = detailsStr.match(/context:\s*([^;]+)/i);
|
|
67
|
+
const decisionM = detailsStr.match(/decision:\s*([^;]+)/i);
|
|
68
|
+
const rationaleM = detailsStr.match(/rationale:\s*([^;]+)/i);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
`\n## ${anchorId}: ${pattern}\n\n` +
|
|
72
|
+
`- **Date**: ${artDate}\n` +
|
|
73
|
+
`- **Status**: Accepted\n` +
|
|
74
|
+
`- **Context**: ${(contextM || [])[1] || detailsStr}\n` +
|
|
75
|
+
`- **Decision**: ${(decisionM || [])[1] || pattern}\n` +
|
|
76
|
+
`- **Consequences**: ${(rationaleM || [])[1] || ''}\n` +
|
|
77
|
+
`- **Source**: self-learning:${obsId}\n`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Format a pitfall entry block from structured details.
|
|
83
|
+
* Used when `raw_body` is absent (new entries authored post-migration).
|
|
84
|
+
* Returns the block starting with a leading newline so appends just work.
|
|
85
|
+
*
|
|
86
|
+
* @param {object} row - Ledger row with at minimum: anchor_id, pattern, id, details
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
function formatPitfallBody(row) {
|
|
90
|
+
const detailsStr = row.details || '';
|
|
91
|
+
const obsId = row.id || 'unknown';
|
|
92
|
+
const anchorId = row.anchor_id || '';
|
|
93
|
+
const pattern = row.pattern || '';
|
|
94
|
+
|
|
95
|
+
const areaM = detailsStr.match(/area:\s*([^;]+)/i);
|
|
96
|
+
const issueM = detailsStr.match(/issue:\s*([^;]+)/i);
|
|
97
|
+
const impactM = detailsStr.match(/impact:\s*([^;]+)/i);
|
|
98
|
+
const resM = detailsStr.match(/resolution:\s*([^;]+)/i);
|
|
99
|
+
|
|
100
|
+
return (
|
|
101
|
+
`\n## ${anchorId}: ${pattern}\n\n` +
|
|
102
|
+
`- **Area**: ${(areaM || [])[1] || detailsStr}\n` +
|
|
103
|
+
`- **Issue**: ${(issueM || [])[1] || detailsStr}\n` +
|
|
104
|
+
`- **Impact**: ${(impactM || [])[1] || ''}\n` +
|
|
105
|
+
`- **Resolution**: ${(resM || [])[1] || ''}\n` +
|
|
106
|
+
`- **Status**: Active\n` +
|
|
107
|
+
`- **Source**: self-learning:${obsId}\n`
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Project a full observation row into the canonical committed-ledger shape.
|
|
113
|
+
* Whitelists ONLY the fields that belong in decisions-ledger.jsonl:
|
|
114
|
+
* { id, type, pattern, details, anchor_id, decisions_status, date?, raw_body?, amendments? }
|
|
115
|
+
*
|
|
116
|
+
* All observation-lifecycle fields (evidence, confidence, quality_ok, count,
|
|
117
|
+
* first_seen, last_seen, artifact_path, status, …) are intentionally excluded
|
|
118
|
+
* from the committed ledger — they are log-only state.
|
|
119
|
+
*
|
|
120
|
+
* D001: The projected shape is a DISTINCT COMMITTED shape, not a full obs copy.
|
|
121
|
+
* This function is the single source of truth for that projection so both the
|
|
122
|
+
* add-path (assign-anchor) and the migration's preserve-verbatim path produce
|
|
123
|
+
* byte-identical committed shapes. applies ADR-008.
|
|
124
|
+
*
|
|
125
|
+
* @param {object} obs - Full observation row from decisions-log.jsonl
|
|
126
|
+
* @param {{ anchorId: string, status: string, date?: string }} opts
|
|
127
|
+
* @returns {object} Canonical ledger row
|
|
128
|
+
*/
|
|
129
|
+
function toLedgerRow(obs, { anchorId, status, date }) {
|
|
130
|
+
/** @type {Record<string, unknown>} */
|
|
131
|
+
const row = {
|
|
132
|
+
id: obs.id,
|
|
133
|
+
type: obs.type,
|
|
134
|
+
pattern: obs.pattern,
|
|
135
|
+
details: obs.details,
|
|
136
|
+
anchor_id: anchorId,
|
|
137
|
+
decisions_status: status,
|
|
138
|
+
};
|
|
139
|
+
// Optional fields — include only when present in the observation or explicitly provided
|
|
140
|
+
if (date !== undefined) row.date = date;
|
|
141
|
+
if (obs.raw_body !== undefined) row.raw_body = obs.raw_body;
|
|
142
|
+
if (obs.amendments !== undefined) row.amendments = obs.amendments;
|
|
143
|
+
return row;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Build the TL;DR comment line for a rendered decisions or pitfalls file.
|
|
148
|
+
* Format: `<!-- TL;DR: N {decisions|pitfalls}. Key: id1, id2 -->`
|
|
149
|
+
*
|
|
150
|
+
* Key is the last 5 anchor IDs from the provided active rows (sorted by
|
|
151
|
+
* numeric anchor ascending — same order as the rendered file).
|
|
152
|
+
* When rows is empty, Key is empty string (no trailing space before -->).
|
|
153
|
+
*
|
|
154
|
+
* @param {'decisions'|'pitfalls'} kind - label used in the comment
|
|
155
|
+
* @param {object[]} rows - active anchored rows (already filtered + sorted)
|
|
156
|
+
* @returns {string} complete TL;DR comment line (no trailing newline)
|
|
157
|
+
*/
|
|
158
|
+
function buildTldrLine(kind, rows) {
|
|
159
|
+
const count = rows.length;
|
|
160
|
+
const last5 = rows.slice(-5).map(r => r.anchor_id);
|
|
161
|
+
const keyStr = last5.join(', ');
|
|
162
|
+
// Byte-compat: an empty key list must render `Key: -->` (single space) so the
|
|
163
|
+
// empty-corpus render is byte-identical to initDecisionsContent's header. A
|
|
164
|
+
// trailing space before `-->` would diverge from the documented contract and
|
|
165
|
+
// break the assertion that the render is the SOLE format authority.
|
|
166
|
+
if (!keyStr) return `<!-- TL;DR: ${count} ${kind}. Key: -->`;
|
|
167
|
+
return `<!-- TL;DR: ${count} ${kind}. Key: ${keyStr} -->`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Index content builder
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Statuses recognised by the index formatter — everything else renders as
|
|
176
|
+
* [unknown]. Only Active (pitfalls) and Accepted (decisions) appear in
|
|
177
|
+
* rendered .md files; the renderer excludes Deprecated/Superseded/Retired
|
|
178
|
+
* before writing.
|
|
179
|
+
*/
|
|
180
|
+
const INDEX_KNOWN_STATUSES = ['Active', 'Accepted'];
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Truncate a string to maxLen characters, appending '…' if truncated.
|
|
184
|
+
*
|
|
185
|
+
* @param {string} str
|
|
186
|
+
* @param {number} maxLen
|
|
187
|
+
* @returns {string}
|
|
188
|
+
*/
|
|
189
|
+
function truncate(str, maxLen) {
|
|
190
|
+
if (str.length <= maxLen) return str;
|
|
191
|
+
return str.slice(0, maxLen) + '…';
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Format a single index line for an ADR or PF entry.
|
|
196
|
+
* ADR entries have area: null, so the area suffix is naturally omitted.
|
|
197
|
+
*
|
|
198
|
+
* @param {{ id: string, title: string, status: string|null, area: string|null }} entry
|
|
199
|
+
* @returns {string}
|
|
200
|
+
*/
|
|
201
|
+
function formatIndexEntryLine(entry) {
|
|
202
|
+
const title = truncate(entry.title, 60);
|
|
203
|
+
const tag = entry.status && INDEX_KNOWN_STATUSES.includes(entry.status) ? `[${entry.status}]` : '[unknown]';
|
|
204
|
+
const areaSuffix = entry.area ? ` — ${truncate(entry.area, 80)}` : '';
|
|
205
|
+
return ` ${entry.id} ${title} ${tag}${areaSuffix}`;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Build the compact index content from in-memory active ledger rows.
|
|
210
|
+
* Empty corpus (both arrays empty) → '(none)'.
|
|
211
|
+
* No trailing newline (caller adds '\n' before writing).
|
|
212
|
+
*
|
|
213
|
+
* Strategy: for each row, obtain its rendered block (truthy raw_body || format*Body(row)),
|
|
214
|
+
* then extract heading/Status/Area with the same regexes.
|
|
215
|
+
* This preserves byte-compat for migrated rows that carry Area/Status only in raw_body.
|
|
216
|
+
* Note: raw_body === "" is treated as absent (falsy); both predicates align with the
|
|
217
|
+
* truthy check in renderDecisionsFile so index and body files never drift on this edge.
|
|
218
|
+
*
|
|
219
|
+
* @param {object[]} activeDecisionRows - Active decision rows (type='decision', sorted by anchor)
|
|
220
|
+
* @param {object[]} activePitfallRows - Active pitfall rows (type='pitfall', sorted by anchor)
|
|
221
|
+
* @param {{ decisionsFilePath: string, pitfallsFilePath: string }} opts - absolute file paths for footer
|
|
222
|
+
* @returns {string} compact index string, or '(none)'
|
|
223
|
+
*/
|
|
224
|
+
function buildIndexContent(activeDecisionRows, activePitfallRows, { decisionsFilePath, pitfallsFilePath }) {
|
|
225
|
+
/**
|
|
226
|
+
* Extract an index entry from a rendered block string.
|
|
227
|
+
* @param {string} block
|
|
228
|
+
* @returns {{ id: string, title: string, status: string|null, area: string|null }|null}
|
|
229
|
+
*/
|
|
230
|
+
function extractEntryFromBlock(block) {
|
|
231
|
+
const headingMatch = block.match(/^## ((?:ADR|PF)-\d+): (.+)/m);
|
|
232
|
+
if (!headingMatch) return null;
|
|
233
|
+
const id = headingMatch[1];
|
|
234
|
+
const rawTitle = headingMatch[2].trim();
|
|
235
|
+
const statusMatch = block.match(/- \*\*Status\*\*: (.+)/);
|
|
236
|
+
const status = statusMatch ? statusMatch[1].trim() : null;
|
|
237
|
+
const areaMatch = block.match(/- \*\*Area\*\*: (.+)/);
|
|
238
|
+
const area = areaMatch ? areaMatch[1].trim() : null;
|
|
239
|
+
return { id, title: rawTitle, status, area };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** @type {Array<{ id: string, title: string, status: string|null, area: string|null }>} */
|
|
243
|
+
const adrEntries = [];
|
|
244
|
+
for (const row of activeDecisionRows) {
|
|
245
|
+
const block = row.raw_body ? row.raw_body : formatDecisionBody(row);
|
|
246
|
+
const entry = extractEntryFromBlock(block);
|
|
247
|
+
if (entry) adrEntries.push(entry);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** @type {Array<{ id: string, title: string, status: string|null, area: string|null }>} */
|
|
251
|
+
const pfEntries = [];
|
|
252
|
+
for (const row of activePitfallRows) {
|
|
253
|
+
const block = row.raw_body ? row.raw_body : formatPitfallBody(row);
|
|
254
|
+
const entry = extractEntryFromBlock(block);
|
|
255
|
+
if (entry) pfEntries.push(entry);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (adrEntries.length === 0 && pfEntries.length === 0) return '(none)';
|
|
259
|
+
|
|
260
|
+
const blocks = [];
|
|
261
|
+
|
|
262
|
+
if (adrEntries.length > 0) {
|
|
263
|
+
const lines = [`Decisions (${adrEntries.length}):`];
|
|
264
|
+
for (const entry of adrEntries) {
|
|
265
|
+
lines.push(formatIndexEntryLine(entry));
|
|
266
|
+
}
|
|
267
|
+
blocks.push(lines.join('\n'));
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (pfEntries.length > 0) {
|
|
271
|
+
const lines = [`Pitfalls (${pfEntries.length}):`];
|
|
272
|
+
for (const entry of pfEntries) {
|
|
273
|
+
lines.push(formatIndexEntryLine(entry));
|
|
274
|
+
}
|
|
275
|
+
blocks.push(lines.join('\n'));
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Footer: explain how to read full bodies
|
|
279
|
+
const footerLines = [];
|
|
280
|
+
if (adrEntries.length > 0) {
|
|
281
|
+
footerLines.push(`ADR-NNN entries live in ${decisionsFilePath}`);
|
|
282
|
+
}
|
|
283
|
+
if (pfEntries.length > 0) {
|
|
284
|
+
footerLines.push(`PF-NNN entries live in ${pitfallsFilePath}`);
|
|
285
|
+
}
|
|
286
|
+
footerLines.push(
|
|
287
|
+
'Read the relevant file and locate the matching `## ADR-NNN:` or `## PF-NNN:` heading for the full body.'
|
|
288
|
+
);
|
|
289
|
+
blocks.push(footerLines.join('\n'));
|
|
290
|
+
|
|
291
|
+
return blocks.join('\n\n');
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
module.exports = {
|
|
295
|
+
initDecisionsContent,
|
|
296
|
+
formatDecisionBody,
|
|
297
|
+
formatPitfallBody,
|
|
298
|
+
buildTldrLine,
|
|
299
|
+
toLedgerRow,
|
|
300
|
+
buildIndexContent,
|
|
301
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// src/assets/scripts/hooks/lib/mkdir-lock.cjs
|
|
2
|
+
//
|
|
3
|
+
// Shared mkdir-based locking helpers used by json-helper.cjs, render-decisions.cjs,
|
|
4
|
+
// and any other CJS hook that needs exclusive access to a shared resource.
|
|
5
|
+
//
|
|
6
|
+
// DESIGN: mkdir is atomic on POSIX — the kernel guarantees that only one caller
|
|
7
|
+
// succeeds on a given path. On EEXIST we check staleness (mtime > staleMs) and
|
|
8
|
+
// break the lock if it is stale, then retry with a 50 ms idle sleep between attempts.
|
|
9
|
+
// Uses Atomics.wait when available (true CPU-idle blocking) or execSync('sleep 0.05')
|
|
10
|
+
// as the idle fallback in restricted worker environments where SharedArrayBuffer is
|
|
11
|
+
// unavailable. The fallback is allocated/looked-up once at module load to avoid
|
|
12
|
+
// per-iteration overhead.
|
|
13
|
+
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const { execSync } = require('child_process');
|
|
18
|
+
|
|
19
|
+
// D001: Hoist SharedArrayBuffer/Int32Array allocation to module scope so the
|
|
20
|
+
// Atomics.wait path never allocates per retry iteration. In environments where
|
|
21
|
+
// SharedArrayBuffer is unavailable (restricted worker contexts) we fall back to
|
|
22
|
+
// execSync('sleep 0.05') which is truly idle — no busy-wait.
|
|
23
|
+
/** @type {Int32Array | null} */
|
|
24
|
+
const _atomicsBuf = (() => {
|
|
25
|
+
try { return new Int32Array(new SharedArrayBuffer(4)); } catch { return null; }
|
|
26
|
+
})();
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Sleep for ~50 ms in a truly-idle, CPU-friendly way.
|
|
30
|
+
* Prefers Atomics.wait (zero-overhead blocking) when SharedArrayBuffer is available.
|
|
31
|
+
* Falls back to execSync('sleep 0.05') in restricted contexts (e.g. background hook workers).
|
|
32
|
+
* Never busy-waits.
|
|
33
|
+
*
|
|
34
|
+
* @returns {void}
|
|
35
|
+
*/
|
|
36
|
+
function _idleSleep50() {
|
|
37
|
+
if (_atomicsBuf !== null) {
|
|
38
|
+
Atomics.wait(_atomicsBuf, 0, 0, 50);
|
|
39
|
+
} else {
|
|
40
|
+
execSync('sleep 0.05');
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Acquire a mkdir-based lock. Returns true on success, false on timeout.
|
|
46
|
+
*
|
|
47
|
+
* Stale-break window (applies ADR-017): a lock directory older than `staleMs`
|
|
48
|
+
* (default 60 s) is forcibly removed and the caller retries. This protects against
|
|
49
|
+
* crashed holders but creates a narrow TOCTOU window: if a holder is actively
|
|
50
|
+
* working and takes longer than 60 s, its lock can be stolen — leading to concurrent
|
|
51
|
+
* ledger writes. Current callers (assign-anchor, retire-anchor, render CLI) perform
|
|
52
|
+
* only synchronous file I/O + JSON parse and complete well under 60 s in practice,
|
|
53
|
+
* so this window is not reachable under normal operation. For long-running callers
|
|
54
|
+
* call refreshLock(lockDir) periodically to reset the mtime and push the deadline
|
|
55
|
+
* out by another staleMs interval.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} lockDir - path to lock directory
|
|
58
|
+
* @param {number} [timeoutMs=30000] - max wait in milliseconds
|
|
59
|
+
* @param {number} [staleMs=60000] - age after which lock is considered stale
|
|
60
|
+
* @returns {boolean}
|
|
61
|
+
*/
|
|
62
|
+
function acquireMkdirLock(lockDir, timeoutMs = 30000, staleMs = 60000) {
|
|
63
|
+
const start = Date.now();
|
|
64
|
+
while (true) {
|
|
65
|
+
try {
|
|
66
|
+
fs.mkdirSync(lockDir, { recursive: false });
|
|
67
|
+
return true;
|
|
68
|
+
} catch (err) {
|
|
69
|
+
if (err.code !== 'EEXIST') throw err;
|
|
70
|
+
try {
|
|
71
|
+
const stat = fs.statSync(lockDir);
|
|
72
|
+
const age = Date.now() - stat.mtimeMs;
|
|
73
|
+
if (age > staleMs) {
|
|
74
|
+
try { fs.rmdirSync(lockDir); } catch { /* already gone */ }
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
} catch { /* lock gone between check and stat */ }
|
|
78
|
+
if (Date.now() - start >= timeoutMs) return false;
|
|
79
|
+
_idleSleep50();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Release a mkdir-based lock. No-op if already released.
|
|
86
|
+
*
|
|
87
|
+
* @param {string} lockDir
|
|
88
|
+
*/
|
|
89
|
+
function releaseLock(lockDir) {
|
|
90
|
+
try { fs.rmdirSync(lockDir); } catch { /* already released */ }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Refresh a held lock by touching its mtime, extending the stale-break deadline
|
|
95
|
+
* by another staleMs interval. Call periodically from long-running critical sections
|
|
96
|
+
* to prevent the lock from being stolen by a concurrent acquirer's stale-break check.
|
|
97
|
+
* No-op if the lock directory no longer exists (handles benign ENOENT races).
|
|
98
|
+
*
|
|
99
|
+
* @param {string} lockDir
|
|
100
|
+
*/
|
|
101
|
+
function refreshLock(lockDir) {
|
|
102
|
+
const now = new Date();
|
|
103
|
+
try { fs.utimesSync(lockDir, now, now); } catch { /* lock released or raced away — ignore */ }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
module.exports = { acquireMkdirLock, releaseLock, refreshLock };
|