@su-record/vibe 2.16.3 → 3.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/.env.example +15 -0
- package/CLAUDE.md +8 -8
- package/README.en.md +46 -29
- package/README.md +41 -24
- package/agents/acceptance-tester.md +56 -0
- package/agents/architect.md +25 -67
- package/agents/build-error-resolver.md +28 -97
- package/agents/code-reviewer.md +89 -0
- package/agents/diagrammer.md +34 -165
- package/agents/documenter.md +43 -0
- package/agents/e2e-tester.md +46 -277
- package/agents/event/event-ops.md +54 -77
- package/agents/event/event-planner.md +63 -0
- package/agents/figma/figma-engineer.md +76 -0
- package/agents/implementer.md +26 -41
- package/agents/security-reviewer.md +56 -0
- package/agents/tester.md +37 -33
- package/agents/ui/design-reviewer.md +62 -0
- package/agents/ui/design-system-gen.md +63 -0
- package/dist/__tests__/agent-model-sync.test.d.ts +2 -0
- package/dist/__tests__/agent-model-sync.test.d.ts.map +1 -0
- package/dist/__tests__/agent-model-sync.test.js +71 -0
- package/dist/__tests__/agent-model-sync.test.js.map +1 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +8 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +2 -0
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/llm.d.ts +11 -0
- package/dist/cli/commands/llm.d.ts.map +1 -0
- package/dist/cli/commands/llm.js +62 -0
- package/dist/cli/commands/llm.js.map +1 -0
- package/dist/cli/commands/remove.d.ts.map +1 -1
- package/dist/cli/commands/remove.js +8 -10
- package/dist/cli/commands/remove.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +35 -1
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.d.ts +0 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +59 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/llm/config.d.ts.map +1 -1
- package/dist/cli/llm/config.js +7 -0
- package/dist/cli/llm/config.js.map +1 -1
- package/dist/cli/llm/index.d.ts +1 -0
- package/dist/cli/llm/index.d.ts.map +1 -1
- package/dist/cli/llm/index.js +1 -0
- package/dist/cli/llm/index.js.map +1 -1
- package/dist/cli/llm/model-refresh.d.ts +29 -0
- package/dist/cli/llm/model-refresh.d.ts.map +1 -0
- package/dist/cli/llm/model-refresh.js +139 -0
- package/dist/cli/llm/model-refresh.js.map +1 -0
- package/dist/cli/llm/zai-commands.d.ts +15 -0
- package/dist/cli/llm/zai-commands.d.ts.map +1 -0
- package/dist/cli/llm/zai-commands.js +64 -0
- package/dist/cli/llm/zai-commands.js.map +1 -0
- package/dist/cli/postinstall/claude-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/claude-agents.js +16 -77
- package/dist/cli/postinstall/claude-agents.js.map +1 -1
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +81 -296
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/postinstall/cursor-agents.d.ts +5 -0
- package/dist/cli/postinstall/cursor-agents.d.ts.map +1 -1
- package/dist/cli/postinstall/cursor-agents.js +26 -68
- package/dist/cli/postinstall/cursor-agents.js.map +1 -1
- package/dist/cli/postinstall/cursor-skills.d.ts.map +1 -1
- package/dist/cli/postinstall/cursor-skills.js +26 -30
- package/dist/cli/postinstall/cursor-skills.js.map +1 -1
- package/dist/cli/postinstall/main.d.ts.map +1 -1
- package/dist/cli/postinstall/main.js +0 -2
- package/dist/cli/postinstall/main.js.map +1 -1
- package/dist/cli/setup/Provisioner.d.ts.map +1 -1
- package/dist/cli/setup/Provisioner.js +19 -21
- package/dist/cli/setup/Provisioner.js.map +1 -1
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/cli/utils.d.ts +4 -1
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +4 -1
- package/dist/cli/utils.js.map +1 -1
- package/dist/infra/lib/FrameworkDetector.js +4 -4
- package/dist/infra/lib/FrameworkDetector.js.map +1 -1
- package/dist/infra/lib/OrchestrateWorkflow.js +2 -2
- package/dist/infra/lib/OrchestrateWorkflow.js.map +1 -1
- package/dist/infra/lib/browser/launch.js +1 -1
- package/dist/infra/lib/browser/launch.js.map +1 -1
- package/dist/infra/lib/browser/types.d.ts +1 -1
- package/dist/infra/lib/browser/types.js +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.d.ts +2 -0
- package/dist/infra/lib/config/GlobalConfigManager.d.ts.map +1 -1
- package/dist/infra/lib/config/GlobalConfigManager.js +6 -0
- package/dist/infra/lib/config/GlobalConfigManager.js.map +1 -1
- package/dist/infra/lib/constants.d.ts +1 -1
- package/dist/infra/lib/constants.d.ts.map +1 -1
- package/dist/infra/lib/constants.js +4 -5
- package/dist/infra/lib/constants.js.map +1 -1
- package/dist/infra/lib/evolution/__tests__/integration.test.js +7 -7
- package/dist/infra/lib/evolution/__tests__/integration.test.js.map +1 -1
- package/dist/infra/lib/llm-availability.d.ts +4 -0
- package/dist/infra/lib/llm-availability.d.ts.map +1 -1
- package/dist/infra/lib/llm-availability.js +9 -1
- package/dist/infra/lib/llm-availability.js.map +1 -1
- package/dist/infra/lib/memory/index.d.ts +0 -2
- package/dist/infra/lib/memory/index.d.ts.map +1 -1
- package/dist/infra/lib/memory/index.js +0 -2
- package/dist/infra/lib/memory/index.js.map +1 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js +1 -1
- package/dist/infra/lib/telemetry/SkillTelemetry.test.js.map +1 -1
- package/dist/infra/lib/zai/client.d.ts +30 -0
- package/dist/infra/lib/zai/client.d.ts.map +1 -0
- package/dist/infra/lib/zai/client.js +124 -0
- package/dist/infra/lib/zai/client.js.map +1 -0
- package/dist/infra/lib/zai/index.d.ts +11 -0
- package/dist/infra/lib/zai/index.d.ts.map +1 -0
- package/dist/infra/lib/zai/index.js +10 -0
- package/dist/infra/lib/zai/index.js.map +1 -0
- package/dist/infra/lib/zai/orchestration.d.ts +15 -0
- package/dist/infra/lib/zai/orchestration.d.ts.map +1 -0
- package/dist/infra/lib/zai/orchestration.js +54 -0
- package/dist/infra/lib/zai/orchestration.js.map +1 -0
- package/dist/infra/lib/zai/types.d.ts +40 -0
- package/dist/infra/lib/zai/types.d.ts.map +1 -0
- package/dist/infra/lib/zai/types.js +5 -0
- package/dist/infra/lib/zai/types.js.map +1 -0
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.js +16 -34
- package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
- package/dist/infra/orchestrator/index.d.ts +1 -0
- package/dist/infra/orchestrator/index.d.ts.map +1 -1
- package/dist/infra/orchestrator/index.js +11 -9
- package/dist/infra/orchestrator/index.js.map +1 -1
- package/dist/infra/orchestrator/types.d.ts +32 -9
- package/dist/infra/orchestrator/types.d.ts.map +1 -1
- package/dist/infra/orchestrator/types.js +68 -37
- package/dist/infra/orchestrator/types.js.map +1 -1
- package/dist/infra/orchestrator/types.test.d.ts +2 -0
- package/dist/infra/orchestrator/types.test.d.ts.map +1 -0
- package/dist/infra/orchestrator/types.test.js +57 -0
- package/dist/infra/orchestrator/types.test.js.map +1 -0
- package/dist/tools/index.d.ts +0 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +0 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory/autoSaveContext.d.ts +0 -1
- package/dist/tools/memory/autoSaveContext.d.ts.map +1 -1
- package/dist/tools/memory/autoSaveContext.js +13 -27
- package/dist/tools/memory/autoSaveContext.js.map +1 -1
- package/hooks/scripts/__tests__/code-check-detectors.test.js +2 -2
- package/hooks/scripts/__tests__/run-ledger.test.js +1 -1
- package/hooks/scripts/__tests__/scope-from-spec.test.js +12 -12
- package/hooks/scripts/__tests__/step-counter.test.js +1 -1
- package/hooks/scripts/code-check.js +16 -203
- package/hooks/scripts/context-save.js +0 -11
- package/hooks/scripts/lib/scope-from-spec.js +9 -6
- package/hooks/scripts/llm-orchestrate.js +49 -0
- package/hooks/scripts/post-edit-dispatcher.js +1 -1
- package/hooks/scripts/prompt-dispatcher.js +7 -18
- package/hooks/scripts/session-start.js +25 -35
- package/package.json +4 -4
- package/skills/agents-md/SKILL.md +62 -15
- package/skills/arch-guard/SKILL.md +1 -1
- package/skills/brand-assets/SKILL.md +2 -2
- package/skills/capability-loop/SKILL.md +1 -1
- package/skills/chub-usage/SKILL.md +1 -1
- package/skills/commerce-patterns/SKILL.md +2 -2
- package/skills/commit-push-pr/SKILL.md +0 -1
- package/skills/context7-usage/SKILL.md +1 -1
- package/skills/create-prd/agents/edge-case-finder.md +4 -4
- package/skills/create-prd/agents/prioritizer.md +4 -4
- package/skills/create-prd/agents/requirements-writer.md +3 -3
- package/skills/create-prd/agents/researcher.md +3 -3
- package/skills/create-prd/agents/reviewer.md +3 -3
- package/skills/create-prd/orchestrator.md +2 -0
- package/skills/design-refine/SKILL.md +140 -0
- package/skills/{design-polish → design-refine}/templates/polish-report.md +1 -1
- package/skills/{design-normalize → design-refine}/templates/token-audit.md +3 -3
- package/skills/design-review/SKILL.md +143 -0
- package/skills/{design-audit → design-review}/agents/a11y-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/performance-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/responsive-auditor.md +1 -1
- package/skills/{design-audit → design-review}/agents/slop-detector.md +1 -1
- package/skills/{design-audit → design-review}/frameworks/core-web-vitals.md +1 -1
- package/skills/{design-audit → design-review}/frameworks/wcag-checklist.md +1 -1
- package/skills/{design-audit → design-review}/orchestrator.md +5 -3
- package/skills/{design-critique → design-review}/templates/critique-report.md +3 -3
- package/skills/{design-audit → design-review}/templates/report.md +3 -3
- package/skills/design-teach/SKILL.md +11 -11
- package/skills/docs/SKILL.md +14 -16
- package/skills/e2e-commerce/SKILL.md +1 -1
- package/skills/event-comms/SKILL.md +1 -1
- package/skills/event-ops/SKILL.md +2 -2
- package/skills/event-planning/SKILL.md +1 -1
- package/skills/exec-plan/SKILL.md +2 -2
- package/skills/exec-plan/orchestrator.md +2 -0
- package/skills/figma/SKILL.md +240 -148
- package/skills/figma/rubrics/css-mapping.md +125 -0
- package/skills/git-worktree/SKILL.md +1 -1
- package/skills/handoff/SKILL.md +1 -1
- package/skills/parallel-research/SKILL.md +14 -28
- package/skills/parallel-research/orchestrator.md +2 -0
- package/skills/priority-todos/SKILL.md +1 -1
- package/skills/regress/SKILL.md +11 -0
- package/skills/restraint/SKILL.md +72 -0
- package/skills/seo-checklist/SKILL.md +2 -2
- package/skills/spec/SKILL.md +65 -836
- package/skills/test/SKILL.md +3 -3
- package/skills/tool-fallback/SKILL.md +2 -2
- package/skills/vercel-react-best-practices/SKILL.md +1 -1
- package/skills/vibe/SKILL.md +20 -35
- package/skills/vibe.analyze/SKILL.md +7 -9
- package/skills/vibe.docs/SKILL.md +1 -1
- package/skills/vibe.event/SKILL.md +27 -27
- package/skills/vibe.figma/SKILL.md +14 -18
- package/skills/vibe.harness/SKILL.md +5 -5
- package/skills/vibe.llm/SKILL.md +50 -0
- package/skills/vibe.reason/SKILL.md +0 -2
- package/skills/vibe.review/SKILL.md +45 -49
- package/skills/vibe.run/SKILL.md +2 -5
- package/skills/vibe.run/references/parallel-agents.md +33 -98
- package/skills/vibe.spec/SKILL.md +38 -535
- package/skills/vibe.utils/SKILL.md +3 -3
- package/skills/vibe.verify/SKILL.md +70 -542
- package/skills/video-production/SKILL.md +1 -1
- package/vibe/rules/orchestrator-contract.md +57 -0
- package/vibe/rules/quality/performance.md +1 -1
- package/vibe/templates/claudemd-template.md +1 -1
- package/vibe/templates/spec-template.md +35 -185
- package/agents/architect-low.md +0 -41
- package/agents/architect-medium.md +0 -59
- package/agents/compounder.md +0 -261
- package/agents/docs/api-documenter.md +0 -99
- package/agents/docs/changelog-writer.md +0 -93
- package/agents/event/event-comms.md +0 -78
- package/agents/event/event-content.md +0 -68
- package/agents/event/event-image.md +0 -95
- package/agents/event/event-scheduler.md +0 -69
- package/agents/event/event-speaker.md +0 -86
- package/agents/explorer-low.md +0 -42
- package/agents/explorer-medium.md +0 -59
- package/agents/explorer.md +0 -48
- package/agents/figma/figma-analyst.md +0 -52
- package/agents/figma/figma-architect.md +0 -112
- package/agents/figma/figma-auditor.md +0 -82
- package/agents/figma/figma-builder.md +0 -100
- package/agents/implementer-low.md +0 -43
- package/agents/implementer-medium.md +0 -52
- package/agents/junior-mentor.md +0 -141
- package/agents/planning/requirements-analyst.md +0 -84
- package/agents/planning/ux-advisor.md +0 -83
- package/agents/qa/acceptance-tester.md +0 -86
- package/agents/qa/edge-case-finder.md +0 -93
- package/agents/qa/qa-coordinator.md +0 -131
- package/agents/refactor-cleaner.md +0 -143
- package/agents/research/best-practices.md +0 -199
- package/agents/research/codebase-patterns.md +0 -157
- package/agents/research/framework-docs.md +0 -188
- package/agents/research/security-advisory.md +0 -213
- package/agents/review/architecture-reviewer.md +0 -107
- package/agents/review/complexity-reviewer.md +0 -116
- package/agents/review/data-integrity-reviewer.md +0 -88
- package/agents/review/git-history-reviewer.md +0 -103
- package/agents/review/performance-reviewer.md +0 -86
- package/agents/review/python-reviewer.md +0 -150
- package/agents/review/rails-reviewer.md +0 -139
- package/agents/review/react-reviewer.md +0 -144
- package/agents/review/security-reviewer.md +0 -80
- package/agents/review/simplicity-reviewer.md +0 -140
- package/agents/review/test-coverage-reviewer.md +0 -116
- package/agents/review/typescript-reviewer.md +0 -127
- package/agents/searcher.md +0 -54
- package/agents/simplifier.md +0 -120
- package/agents/teams/debug-team.md +0 -70
- package/agents/teams/dev-team.md +0 -88
- package/agents/teams/docs-team.md +0 -80
- package/agents/teams/figma-team.md +0 -85
- package/agents/teams/fullstack-team.md +0 -83
- package/agents/teams/lite-team.md +0 -69
- package/agents/teams/migration-team.md +0 -78
- package/agents/teams/refactor-team.md +0 -94
- package/agents/teams/research-team.md +0 -86
- package/agents/teams/review-debate-team.md +0 -125
- package/agents/teams/security-team.md +0 -81
- package/agents/ui/ui-a11y-auditor.md +0 -93
- package/agents/ui/ui-antipattern-detector.md +0 -102
- package/agents/ui/ui-dataviz-advisor.md +0 -69
- package/agents/ui/ui-design-system-gen.md +0 -57
- package/agents/ui/ui-industry-analyzer.md +0 -49
- package/agents/ui/ui-layout-architect.md +0 -65
- package/agents/ui/ui-stack-implementer.md +0 -68
- package/agents/ui/ux-compliance-reviewer.md +0 -81
- package/agents/ui-previewer.md +0 -258
- package/hooks/scripts/__tests__/keyword-detector.test.js +0 -242
- package/hooks/scripts/keyword-detector.js +0 -226
- package/skills/characterization-test/SKILL.md +0 -209
- package/skills/characterization-test/agents/behavior-capturer.md +0 -50
- package/skills/characterization-test/agents/coverage-checker.md +0 -54
- package/skills/characterization-test/agents/reporter.md +0 -50
- package/skills/characterization-test/agents/test-writer.md +0 -49
- package/skills/characterization-test/rubrics/coverage-criteria.md +0 -53
- package/skills/characterization-test/templates/test-template.ts +0 -101
- package/skills/claude-md-guide/SKILL.md +0 -353
- package/skills/claude-md-guide/rubrics/anti-patterns.md +0 -88
- package/skills/design-audit/SKILL.md +0 -154
- package/skills/design-critique/SKILL.md +0 -140
- package/skills/design-distill/SKILL.md +0 -131
- package/skills/design-normalize/SKILL.md +0 -135
- package/skills/design-polish/SKILL.md +0 -132
- package/skills/figma-convert/SKILL.md +0 -236
- package/skills/figma-extract/SKILL.md +0 -242
- package/skills/interview/SKILL.md +0 -358
- package/skills/interview/checklists/api.md +0 -101
- package/skills/interview/checklists/feature.md +0 -88
- package/skills/interview/checklists/library.md +0 -95
- package/skills/interview/checklists/mobile.md +0 -89
- package/skills/interview/checklists/webapp.md +0 -97
- package/skills/interview/checklists/website.md +0 -99
- package/skills/plan/SKILL.md +0 -254
- package/skills/rob-pike/SKILL.md +0 -66
- package/skills/spec/references/askuser-examples.md +0 -57
- package/skills/spec/references/example-session.md +0 -87
- package/skills/spec/references/templates.md +0 -194
- package/skills/spec-review/SKILL.md +0 -725
- package/skills/systematic-debugging/SKILL.md +0 -142
- package/skills/techdebt/SKILL.md +0 -126
- package/skills/techdebt/agents/analyzer.md +0 -50
- package/skills/techdebt/agents/fixer.md +0 -41
- package/skills/techdebt/agents/reviewer.md +0 -47
- package/skills/techdebt/agents/scanner.md +0 -44
- package/skills/techdebt/orchestrator.md +0 -70
- package/skills/techdebt/rubrics/severity.md +0 -51
- package/skills/techdebt/scripts/scan.js +0 -90
- package/skills/techdebt/templates/report.md +0 -86
- package/skills/typescript-advanced-types/SKILL.md +0 -68
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +0 -109
- package/skills/yagni-ladder/SKILL.md +0 -90
- /package/skills/{claude-md-guide → agents-md}/templates/claude-md.md +0 -0
- /package/skills/{design-polish → design-refine}/rubrics/polish-checklist.md +0 -0
- /package/skills/{design-normalize → design-refine}/rubrics/token-naming.md +0 -0
- /package/skills/{design-distill → design-refine}/templates/design-system.md +0 -0
- /package/skills/{design-audit → design-review}/agents/scorer.md +0 -0
- /package/skills/{design-audit → design-review}/rubrics/ai-slop-patterns.md +0 -0
- /package/skills/{design-audit → design-review}/rubrics/scoring.md +0 -0
- /package/skills/{design-critique → design-review}/rubrics/ux-heuristics.md +0 -0
- /package/skills/{figma-convert → figma}/rubrics/conversion-rules.md +0 -0
- /package/skills/{figma-extract → figma}/rubrics/image-rules.md +0 -0
- /package/skills/{figma-convert → figma}/templates/component.md +0 -0
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: systematic-debugging
|
|
3
|
-
user-invocable: false
|
|
4
|
-
invocation: [auto]
|
|
5
|
-
tier: core
|
|
6
|
-
description: "Enforce reproduce-first, root-cause-first, failing-test-first debugging. Auto-activates on bug, error, fail, broken, crash, flaky keywords."
|
|
7
|
-
triggers: [bug, error, fail, broken, crash, flaky, not working, regression, unexpected, stack trace, exception, debug]
|
|
8
|
-
priority: 90
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Systematic Debugging
|
|
12
|
-
|
|
13
|
-
## Hard Gates
|
|
14
|
-
|
|
15
|
-
These rules have NO exceptions:
|
|
16
|
-
|
|
17
|
-
1. **Never fix before reproducing or observing the failure.**
|
|
18
|
-
2. **State a root-cause hypothesis before changing code.**
|
|
19
|
-
3. **Write a failing test (or equivalent) before fixing.**
|
|
20
|
-
4. **Test one hypothesis at a time.**
|
|
21
|
-
5. **No "while I'm here" refactoring during a fix.**
|
|
22
|
-
6. **3 failed fixes → suspect structural issue, stop patching.**
|
|
23
|
-
|
|
24
|
-
These excuses are NOT allowed:
|
|
25
|
-
- "It looks simple, I'll just fix it"
|
|
26
|
-
- "No time, let me patch and move on"
|
|
27
|
-
- "This seems like the issue, let me just change it"
|
|
28
|
-
|
|
29
|
-
## Workflow
|
|
30
|
-
|
|
31
|
-
Follow this order strictly.
|
|
32
|
-
|
|
33
|
-
### Phase 1. Define The Problem
|
|
34
|
-
|
|
35
|
-
```text
|
|
36
|
-
Problem: <expected> but got <actual> under <condition>
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Good: "Product detail API returns 500 when brand is null."
|
|
40
|
-
Bad: "Serializer is broken because brand mapping seems wrong."
|
|
41
|
-
|
|
42
|
-
### Phase 2. Reproduce Or Instrument
|
|
43
|
-
|
|
44
|
-
Priority:
|
|
45
|
-
1. Reproduce with existing test
|
|
46
|
-
2. Minimal integration test
|
|
47
|
-
3. Unit test
|
|
48
|
-
4. Reproduction script/command
|
|
49
|
-
5. Add logging/instrumentation to observe
|
|
50
|
-
|
|
51
|
-
Rules:
|
|
52
|
-
- Make reproduction path as small as possible.
|
|
53
|
-
- If UI-only bug, prefer reproducing at a lower layer.
|
|
54
|
-
- If flaky, add logging for inputs, timing, concurrency conditions.
|
|
55
|
-
- If can't reproduce, do NOT proceed to fix — increase observability first.
|
|
56
|
-
|
|
57
|
-
### Phase 3. Gather Evidence
|
|
58
|
-
|
|
59
|
-
Collect observable facts only:
|
|
60
|
-
- Full error message and stack trace
|
|
61
|
-
- Failing input values
|
|
62
|
-
- Recent changed files/commits
|
|
63
|
-
- Environment/config differences
|
|
64
|
-
- Call path and data flow
|
|
65
|
-
|
|
66
|
-
At each boundary (controller → service → repository), check:
|
|
67
|
-
- What came in?
|
|
68
|
-
- What went out?
|
|
69
|
-
- What was transformed?
|
|
70
|
-
- Under what condition does it break?
|
|
71
|
-
|
|
72
|
-
Do NOT fix before locating the problem.
|
|
73
|
-
|
|
74
|
-
### Phase 4. Isolate Root Cause
|
|
75
|
-
|
|
76
|
-
State exactly one candidate:
|
|
77
|
-
|
|
78
|
-
```text
|
|
79
|
-
Hypothesis: <root cause> because <evidence>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Good hypothesis conditions:
|
|
83
|
-
- Points to a single cause
|
|
84
|
-
- Connected to observed evidence
|
|
85
|
-
- Falsifiable with a small experiment
|
|
86
|
-
|
|
87
|
-
Bad: "Something async seems wrong" / "The whole serializer area is unstable"
|
|
88
|
-
|
|
89
|
-
### Phase 5. Lock The Failure
|
|
90
|
-
|
|
91
|
-
Before fixing, lock the failure:
|
|
92
|
-
1. Automated failing test (preferred)
|
|
93
|
-
2. Add regression case to existing test
|
|
94
|
-
3. Minimal reproduction script
|
|
95
|
-
4. Temporary log/assertion guard
|
|
96
|
-
|
|
97
|
-
The test MUST fail before fix, pass after fix.
|
|
98
|
-
|
|
99
|
-
### Phase 6. Single Fix
|
|
100
|
-
|
|
101
|
-
Allowed:
|
|
102
|
-
- Minimal code change addressing the root cause
|
|
103
|
-
- Minimal supporting changes for verification
|
|
104
|
-
|
|
105
|
-
Forbidden:
|
|
106
|
-
- Bundling multiple "related" fixes
|
|
107
|
-
- Refactoring alongside the fix
|
|
108
|
-
- Formatting/renaming/cleanup
|
|
109
|
-
- Adding null-guards without evidence
|
|
110
|
-
- Swallowing exceptions
|
|
111
|
-
|
|
112
|
-
If fix fails → go back to Phase 3. Previous hypothesis was wrong.
|
|
113
|
-
|
|
114
|
-
### Phase 7. Verify And Close
|
|
115
|
-
|
|
116
|
-
ALL must be true:
|
|
117
|
-
1. Original reproduction path no longer fails
|
|
118
|
-
2. New failing guard now passes
|
|
119
|
-
3. Related tests don't break
|
|
120
|
-
4. Fix addresses cause, not symptom
|
|
121
|
-
|
|
122
|
-
For flaky bugs: single pass is not enough. Repeat or vary conditions.
|
|
123
|
-
|
|
124
|
-
## Red Flags — Stop Immediately
|
|
125
|
-
|
|
126
|
-
If you think any of these, STOP and go back:
|
|
127
|
-
|
|
128
|
-
- "Let me just change this one line"
|
|
129
|
-
- "I'll check logs later, let me fix first"
|
|
130
|
-
- "I'll add the test later"
|
|
131
|
-
- "Let me fix this and that together"
|
|
132
|
-
- "The error is gone so it doesn't matter what caused it"
|
|
133
|
-
|
|
134
|
-
## Completion Checklist
|
|
135
|
-
|
|
136
|
-
- [ ] Problem defined in one sentence
|
|
137
|
-
- [ ] Failure reproduced or made observable
|
|
138
|
-
- [ ] Evidence collected
|
|
139
|
-
- [ ] Single root-cause hypothesis stated
|
|
140
|
-
- [ ] Failing guard created before fix
|
|
141
|
-
- [ ] Single fix applied
|
|
142
|
-
- [ ] Verified via same reproduction path
|
package/skills/techdebt/SKILL.md
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt
|
|
3
|
-
user-invocable: false
|
|
4
|
-
invocation: [auto, chain]
|
|
5
|
-
tier: core
|
|
6
|
-
description: "Technical debt cleanup — detect and fix duplicate code, console.log, unused imports, any types, etc. Recommended before session end. Activates on techdebt, cleanup, debt keywords."
|
|
7
|
-
triggers: [techdebt, cleanup, debt, unused imports, console.log, dead code]
|
|
8
|
-
priority: 60
|
|
9
|
-
chain-next: [commit-push-pr]
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# Techdebt — Technical Debt Cleanup
|
|
13
|
-
|
|
14
|
-
Detect and clean up technical debt in the codebase before session end or periodically.
|
|
15
|
-
|
|
16
|
-
## Inspection Items
|
|
17
|
-
|
|
18
|
-
### 1. Duplicate Code
|
|
19
|
-
|
|
20
|
-
- Check for similar functions/logic across multiple files
|
|
21
|
-
- Identify code extractable into common utilities
|
|
22
|
-
- Method: Detect similar code with `core_analyze_complexity`
|
|
23
|
-
|
|
24
|
-
### 2. Unused Code
|
|
25
|
-
|
|
26
|
-
- Unused import statements
|
|
27
|
-
- Unused variables/functions
|
|
28
|
-
- Commented-out code blocks
|
|
29
|
-
|
|
30
|
-
Detection tools:
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
# Detect unused imports (using Grep tool)
|
|
34
|
-
Grep: pattern="^import .+ from" → cross-reference usage
|
|
35
|
-
|
|
36
|
-
# Detect commented-out code blocks
|
|
37
|
-
Grep: pattern="^\\s*//.*\\b(function|const|let|var|class|import)\\b"
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 3. Debug Code
|
|
41
|
-
|
|
42
|
-
- `console.log` / `console.error` / `console.warn`
|
|
43
|
-
- `debugger` statements
|
|
44
|
-
- Temporary comments: `// TODO`, `// FIXME`, `// HACK`, `// XXX`
|
|
45
|
-
|
|
46
|
-
Detection tools:
|
|
47
|
-
|
|
48
|
-
```
|
|
49
|
-
# Detect console statements (using Grep tool)
|
|
50
|
-
Grep: pattern="console\\.(log|error|warn|debug)" glob="*.{ts,tsx}"
|
|
51
|
-
|
|
52
|
-
# Detect TODO/FIXME
|
|
53
|
-
Grep: pattern="(TODO|FIXME|HACK|XXX)" glob="*.{ts,tsx}"
|
|
54
|
-
|
|
55
|
-
# Detect debugger statements
|
|
56
|
-
Grep: pattern="\\bdebugger\\b" glob="*.{ts,tsx}"
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### 4. Code Quality
|
|
60
|
-
|
|
61
|
-
- `any` type usage (TypeScript)
|
|
62
|
-
- Hardcoded values (magic numbers/strings)
|
|
63
|
-
- Functions exceeding 50 lines
|
|
64
|
-
- Nesting deeper than 4 levels
|
|
65
|
-
|
|
66
|
-
Detection tools:
|
|
67
|
-
|
|
68
|
-
```
|
|
69
|
-
# Detect any types (using Grep tool)
|
|
70
|
-
Grep: pattern=": any\\b|as any\\b" glob="*.{ts,tsx}"
|
|
71
|
-
|
|
72
|
-
# Analyze complexity with built-in VIBE tools
|
|
73
|
-
core_analyze_complexity: filePath="src/**/*.ts"
|
|
74
|
-
core_validate_code_quality: filePath="src/**/*.ts"
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Output Format
|
|
78
|
-
|
|
79
|
-
```markdown
|
|
80
|
-
## Technical Debt Report
|
|
81
|
-
|
|
82
|
-
### Duplicate Code (N items)
|
|
83
|
-
- src/utils.ts:formatDate ↔ src/helpers.ts:formatDateTime
|
|
84
|
-
|
|
85
|
-
### Unused Imports (N items)
|
|
86
|
-
- src/components/Button.tsx:3 — React (unused)
|
|
87
|
-
|
|
88
|
-
### Debug Code (N items)
|
|
89
|
-
- src/api/auth.ts:23 — console.log
|
|
90
|
-
|
|
91
|
-
### Code Quality Issues (N items)
|
|
92
|
-
- src/services/user.ts:45 — any type usage
|
|
93
|
-
- src/utils/calc.ts:10 — magic number (hardcoded 365)
|
|
94
|
-
|
|
95
|
-
Total: N technical debt items found.
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Auto-fix Scope
|
|
99
|
-
|
|
100
|
-
### Auto-fixable (Safe)
|
|
101
|
-
|
|
102
|
-
| Item | Fix Method |
|
|
103
|
-
|------|-----------|
|
|
104
|
-
| Unused imports | Delete the import statement |
|
|
105
|
-
| `console.log` / `debugger` | Delete the line |
|
|
106
|
-
| Trailing whitespace / blank lines | Apply formatter |
|
|
107
|
-
|
|
108
|
-
### Requires Manual Review (Safety Guard)
|
|
109
|
-
|
|
110
|
-
| Item | Reason |
|
|
111
|
-
|------|--------|
|
|
112
|
-
| Duplicate code extraction | Need to verify logic equivalence |
|
|
113
|
-
| `any` type fixes | Need proper type design |
|
|
114
|
-
| Magic number extraction | Need to decide constant names and locations |
|
|
115
|
-
| Long function splitting | Need to decide logic separation criteria |
|
|
116
|
-
|
|
117
|
-
> Always show the scope of changes to the user and get confirmation before auto-fixing.
|
|
118
|
-
|
|
119
|
-
## VIBE Tool Integration
|
|
120
|
-
|
|
121
|
-
| Tool | Purpose |
|
|
122
|
-
|------|---------|
|
|
123
|
-
| `core_analyze_complexity` | Measure function complexity (nesting, line count) |
|
|
124
|
-
| `core_validate_code_quality` | Detect code quality rule violations |
|
|
125
|
-
| `core_suggest_improvements` | Generate improvement suggestions |
|
|
126
|
-
| `core_check_coupling_cohesion` | Analyze module coupling/cohesion |
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt-analyzer
|
|
3
|
-
role: Analyzes severity and blast radius of each scanned finding
|
|
4
|
-
tools: [Read, Grep]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Techdebt Analyzer
|
|
8
|
-
|
|
9
|
-
## Role
|
|
10
|
-
Receives raw scan findings and evaluates each item's severity, effort to fix, and risk of breakage. Classifies findings into auto-fixable vs. manual-review categories and assigns a priority score to guide the fixer.
|
|
11
|
-
|
|
12
|
-
## Responsibilities
|
|
13
|
-
- Classify each finding by severity: Critical / High / Medium / Low
|
|
14
|
-
- Assess auto-fix safety: safe (delete line), risky (needs refactor), manual-only
|
|
15
|
-
- Estimate fix effort: trivial (1 line), minor (< 10 lines), major (multi-file)
|
|
16
|
-
- Detect clusters — multiple related findings that should be fixed together
|
|
17
|
-
- Flag findings in test files separately (lower priority, different rules apply)
|
|
18
|
-
|
|
19
|
-
## Input
|
|
20
|
-
Raw findings JSON array from `techdebt-scanner` with file, line, category, and snippet fields.
|
|
21
|
-
|
|
22
|
-
## Output
|
|
23
|
-
Enriched findings list with severity and fix metadata:
|
|
24
|
-
```json
|
|
25
|
-
[
|
|
26
|
-
{
|
|
27
|
-
"category": "console-log",
|
|
28
|
-
"file": "src/api/auth.ts",
|
|
29
|
-
"line": 12,
|
|
30
|
-
"snippet": "console.log(token)",
|
|
31
|
-
"severity": "High",
|
|
32
|
-
"autoFixable": true,
|
|
33
|
-
"effort": "trivial",
|
|
34
|
-
"fixMethod": "delete-line"
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
```
|
|
38
|
-
Plus a summary: total counts by severity, estimated total fix time.
|
|
39
|
-
|
|
40
|
-
## Communication
|
|
41
|
-
- Reports enriched findings to: `techdebt-fixer` (auto-fixable items) and orchestrator (manual items)
|
|
42
|
-
- Receives instructions from: techdebt orchestrator (SKILL.md)
|
|
43
|
-
|
|
44
|
-
## Domain Knowledge
|
|
45
|
-
Severity heuristics:
|
|
46
|
-
- **Critical**: `any` in public API surface, `console.log` logging credentials/tokens
|
|
47
|
-
- **High**: `any` in business logic, `console.log` in production paths
|
|
48
|
-
- **Medium**: magic numbers, unused imports, commented-out blocks
|
|
49
|
-
- **Low**: unused imports in test files, minor style issues
|
|
50
|
-
Auto-fix safety rules: never auto-fix type changes, logic extractions, or multi-file changes.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt-fixer
|
|
3
|
-
role: Generates safe auto-fix patches for trivially fixable techdebt items
|
|
4
|
-
tools: [Read, Edit]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Techdebt Fixer
|
|
8
|
-
|
|
9
|
-
## Role
|
|
10
|
-
Applies safe, deterministic fixes to auto-fixable findings identified by the analyzer. Operates strictly within the boundaries set by the analyzer — never attempts fixes marked `manual-only` or `risky`. Each fix is atomic and targets a single file at a time.
|
|
11
|
-
|
|
12
|
-
## Responsibilities
|
|
13
|
-
- Delete `console.log`, `console.error`, `console.warn`, and `debugger` lines
|
|
14
|
-
- Remove unused import statements (single-identifier and named imports)
|
|
15
|
-
- Delete commented-out code blocks that contain dead code constructs
|
|
16
|
-
- Preserve surrounding blank lines and indentation conventions
|
|
17
|
-
- Record every change made for the reviewer's diff check
|
|
18
|
-
|
|
19
|
-
## Input
|
|
20
|
-
Filtered findings list from `techdebt-analyzer` where `autoFixable: true` and `effort: "trivial"`, plus the full file content via Read.
|
|
21
|
-
|
|
22
|
-
## Output
|
|
23
|
-
A change log of all edits applied:
|
|
24
|
-
```json
|
|
25
|
-
[
|
|
26
|
-
{ "file": "src/api/auth.ts", "line": 12, "action": "deleted", "was": "console.log(token)" },
|
|
27
|
-
{ "file": "src/components/Button.tsx", "line": 3, "action": "deleted", "was": "import React from 'react'" }
|
|
28
|
-
]
|
|
29
|
-
```
|
|
30
|
-
Edited files are modified in place using the Edit tool.
|
|
31
|
-
|
|
32
|
-
## Communication
|
|
33
|
-
- Reports change log to: `techdebt-reviewer`
|
|
34
|
-
- Receives instructions from: techdebt orchestrator (SKILL.md)
|
|
35
|
-
|
|
36
|
-
## Domain Knowledge
|
|
37
|
-
Fix safety rules:
|
|
38
|
-
- Only delete lines — never rewrite or rearrange code
|
|
39
|
-
- When removing a named import `{ A, B }`, if only `A` is unused, rewrite to `{ B }`, not delete the line
|
|
40
|
-
- Never remove imports flagged as side-effect imports (e.g., `import './styles.css'`)
|
|
41
|
-
- Stop and escalate if a file has been modified by another agent in the same session
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt-reviewer
|
|
3
|
-
role: Reviews auto-fix patches for correctness and safety before presenting to user
|
|
4
|
-
tools: [Read, Grep]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Techdebt Reviewer
|
|
8
|
-
|
|
9
|
-
## Role
|
|
10
|
-
Acts as the final quality gate before fixes are presented to the user for confirmation. Re-reads every modified file, verifies that only the intended lines were changed, and checks that no new issues were introduced. Produces a human-readable summary with before/after context.
|
|
11
|
-
|
|
12
|
-
## Responsibilities
|
|
13
|
-
- Re-read each modified file and diff against the change log from `techdebt-fixer`
|
|
14
|
-
- Verify no unintended lines were altered (scope creep check)
|
|
15
|
-
- Confirm removed imports were genuinely unused by re-scanning usage in file body
|
|
16
|
-
- Check that removing a `console.log` did not break a surrounding `if` block structure
|
|
17
|
-
- Produce a formatted summary grouped by category for user confirmation
|
|
18
|
-
|
|
19
|
-
## Input
|
|
20
|
-
Change log JSON from `techdebt-fixer` plus current file content from Read tool.
|
|
21
|
-
|
|
22
|
-
## Output
|
|
23
|
-
Human-readable review report:
|
|
24
|
-
```markdown
|
|
25
|
-
## Techdebt Fix Review
|
|
26
|
-
|
|
27
|
-
### Ready to Apply (N changes)
|
|
28
|
-
- src/api/auth.ts:12 — removed console.log(token) [verified safe]
|
|
29
|
-
- src/components/Button.tsx:3 — removed unused React import [verified safe]
|
|
30
|
-
|
|
31
|
-
### Flagged for Manual Review (N items)
|
|
32
|
-
- src/services/user.ts:45 — any type, needs proper interface definition
|
|
33
|
-
|
|
34
|
-
All changes are reversible with git checkout.
|
|
35
|
-
```
|
|
36
|
-
Final confirmation prompt to user before any edits are committed.
|
|
37
|
-
|
|
38
|
-
## Communication
|
|
39
|
-
- Reports review summary to: orchestrator / user
|
|
40
|
-
- Receives instructions from: techdebt orchestrator (SKILL.md)
|
|
41
|
-
|
|
42
|
-
## Domain Knowledge
|
|
43
|
-
Verification checklist:
|
|
44
|
-
- Import removal: identifier must appear zero times outside the import line
|
|
45
|
-
- Console removal: surrounding block must remain syntactically valid
|
|
46
|
-
- Commented code removal: must not be a doc comment (`/** */`) or license header
|
|
47
|
-
- Scope rule: reviewer changes nothing — read-only gate only
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt-scanner
|
|
3
|
-
role: Scans codebase for code smells — any types, console.log, unused imports, magic numbers
|
|
4
|
-
tools: [Grep, Glob, Read]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Techdebt Scanner
|
|
8
|
-
|
|
9
|
-
## Role
|
|
10
|
-
Performs broad pattern-based scanning across the codebase to locate instances of known code smells. Produces a raw findings list with file paths and line numbers. Does not assess severity — that is the analyzer's job.
|
|
11
|
-
|
|
12
|
-
## Responsibilities
|
|
13
|
-
- Scan for `any` and `as any` TypeScript type violations
|
|
14
|
-
- Detect `console.log`, `console.error`, `console.warn`, `debugger` statements
|
|
15
|
-
- Find unused import statements by cross-referencing declaration vs. usage
|
|
16
|
-
- Locate magic numbers and hardcoded string literals outside constant files
|
|
17
|
-
- Detect commented-out code blocks containing code constructs
|
|
18
|
-
|
|
19
|
-
## Input
|
|
20
|
-
- Root directory path to scan
|
|
21
|
-
- Optional glob filter (e.g., `src/**/*.{ts,tsx}`)
|
|
22
|
-
- Optional category filter (e.g., scan only `any-types`)
|
|
23
|
-
|
|
24
|
-
## Output
|
|
25
|
-
Structured findings list in JSON format:
|
|
26
|
-
```json
|
|
27
|
-
[
|
|
28
|
-
{ "category": "any-type", "file": "src/services/user.ts", "line": 34, "snippet": ": any" },
|
|
29
|
-
{ "category": "console-log", "file": "src/api/auth.ts", "line": 12, "snippet": "console.log(token)" },
|
|
30
|
-
{ "category": "magic-number", "file": "src/utils/calc.ts", "line": 10, "snippet": "* 365" }
|
|
31
|
-
]
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Communication
|
|
35
|
-
- Reports findings to: `techdebt-analyzer`
|
|
36
|
-
- Receives instructions from: techdebt orchestrator (SKILL.md)
|
|
37
|
-
|
|
38
|
-
## Domain Knowledge
|
|
39
|
-
Scan patterns:
|
|
40
|
-
- `any` types: `: any\b`, `as any\b`, `<any>`
|
|
41
|
-
- Debug code: `console\.(log|error|warn|debug|info)`, `\bdebugger\b`
|
|
42
|
-
- Magic numbers: numeric literals outside `const` declarations, ignoring 0, 1, -1, 100
|
|
43
|
-
- Commented code: `^\s*//.*\b(function|const|let|var|class|import)\b`
|
|
44
|
-
- Unused imports: declared in `import { X }` but `X` never referenced in file body
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: techdebt-orchestrator
|
|
3
|
-
type: orchestrator
|
|
4
|
-
agents: [scanner, analyzer, fixer, reviewer]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Techdebt Orchestrator
|
|
8
|
-
|
|
9
|
-
## Workflow
|
|
10
|
-
|
|
11
|
-
### Phase 1: Scan
|
|
12
|
-
- **Agent**: scanner
|
|
13
|
-
- **Input**: Changed file paths (or root dir + glob filter)
|
|
14
|
-
- **Output**: Raw findings list `[{category, file, line, snippet}]`
|
|
15
|
-
- **Parallel**: yes — each file scanned independently
|
|
16
|
-
|
|
17
|
-
### Phase 2: Analyze
|
|
18
|
-
- **Agent**: analyzer
|
|
19
|
-
- **Input**: Raw findings list from Phase 1
|
|
20
|
-
- **Output**: Scored findings with severity (P0–P3) and auto-fix eligibility flag
|
|
21
|
-
- **Parallel**: no — requires full findings set for deduplication
|
|
22
|
-
|
|
23
|
-
### Phase 3: Fix
|
|
24
|
-
- **Agent**: fixer
|
|
25
|
-
- **Input**: Findings flagged `auto-fixable: true` from Phase 2
|
|
26
|
-
- **Output**: Patch set (file edits) for each auto-fixable item
|
|
27
|
-
- **Parallel**: yes — patches per file are independent
|
|
28
|
-
|
|
29
|
-
### Phase 4: Review
|
|
30
|
-
- **Agent**: reviewer
|
|
31
|
-
- **Input**: Patch set from Phase 3
|
|
32
|
-
- **Output**: Approved patches + rejected patches with rejection reason
|
|
33
|
-
- **Parallel**: no — needs holistic view to catch patch conflicts
|
|
34
|
-
|
|
35
|
-
### Phase 5: Apply
|
|
36
|
-
- **Agent**: orchestrator (self)
|
|
37
|
-
- **Input**: Approved patches from Phase 4 + manual-review items from Phase 2
|
|
38
|
-
- **Output**: Applied fixes + final report with manual-review list
|
|
39
|
-
- **Parallel**: no — sequential file writes to avoid conflicts
|
|
40
|
-
|
|
41
|
-
## DAG (Dependency Graph)
|
|
42
|
-
|
|
43
|
-
```mermaid
|
|
44
|
-
graph TD
|
|
45
|
-
A[Phase 1: Scanner\nparallel per file] --> B[Phase 2: Analyzer]
|
|
46
|
-
B --> C[Phase 3: Fixer\nparallel per file]
|
|
47
|
-
B --> E[Manual Review Items]
|
|
48
|
-
C --> D[Phase 4: Reviewer]
|
|
49
|
-
D --> F[Phase 5: Apply]
|
|
50
|
-
E --> F
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Error Handling
|
|
54
|
-
|
|
55
|
-
| Phase | Failure Mode | Strategy |
|
|
56
|
-
|-------|-------------|----------|
|
|
57
|
-
| Phase 1 | File unreadable / binary file | Skip file, log warning, continue |
|
|
58
|
-
| Phase 1 | Glob returns 0 files | Escalate — prompt user to verify path |
|
|
59
|
-
| Phase 2 | Analyzer returns 0 findings | Skip phases 3–4, output clean report |
|
|
60
|
-
| Phase 3 | Patch generation fails for a file | Skip that file, flag for manual review |
|
|
61
|
-
| Phase 4 | Reviewer rejects all patches | Fallback to manual-review-only report |
|
|
62
|
-
| Phase 5 | Write conflict detected | Abort apply, show diff for manual resolution |
|
|
63
|
-
|
|
64
|
-
## Scalability Modes
|
|
65
|
-
|
|
66
|
-
| Mode | When | Agents Used |
|
|
67
|
-
|------|------|-------------|
|
|
68
|
-
| Full | Normal operation | scanner + analyzer + fixer + reviewer |
|
|
69
|
-
| Reduced | Time pressure / large repo | scanner + analyzer only (no auto-fix) |
|
|
70
|
-
| Single | Quick scan / pre-commit check | scanner only — raw findings, no scoring |
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Techdebt Severity Rubric
|
|
2
|
-
|
|
3
|
-
## P1 — Blocks Merge
|
|
4
|
-
|
|
5
|
-
Issues that introduce bugs, security holes, or break type safety. Must fix before merging.
|
|
6
|
-
|
|
7
|
-
| Pattern | Why P1 |
|
|
8
|
-
|---------|--------|
|
|
9
|
-
| `: any` / `as any` | Breaks TypeScript safety guarantee |
|
|
10
|
-
| `@ts-ignore` | Hides real type errors |
|
|
11
|
-
| `debugger` statement | Halts execution in production |
|
|
12
|
-
| Hardcoded secrets / credentials | Security risk |
|
|
13
|
-
| Circular imports causing runtime errors | Breaks module loading |
|
|
14
|
-
|
|
15
|
-
**Rule**: P1 count must be 0 before merge.
|
|
16
|
-
|
|
17
|
-
## P2 — Fix Before PR
|
|
18
|
-
|
|
19
|
-
Issues that reduce maintainability, performance, or correctness. Should be resolved before PR review.
|
|
20
|
-
|
|
21
|
-
| Pattern | Why P2 |
|
|
22
|
-
|---------|--------|
|
|
23
|
-
| `console.log` / `console.warn` | Debug noise in production logs |
|
|
24
|
-
| Functions > 50 lines | Violates complexity limit; hard to test |
|
|
25
|
-
| Nesting depth > 4 | Cognitive overload; obscures logic |
|
|
26
|
-
| Unused imports | Bundle bloat; misleading code |
|
|
27
|
-
| TODO/FIXME without ticket | Ambiguous ownership |
|
|
28
|
-
| Duplicate logic (2+ files) | Maintenance hazard |
|
|
29
|
-
|
|
30
|
-
**Rule**: P2 items are warnings. Resolve or create a tracked P3 ticket before merge.
|
|
31
|
-
|
|
32
|
-
## P3 — Backlog
|
|
33
|
-
|
|
34
|
-
Issues that are cosmetic or nice-to-have. Address during scheduled cleanup sessions.
|
|
35
|
-
|
|
36
|
-
| Pattern | Why P3 |
|
|
37
|
-
|---------|--------|
|
|
38
|
-
| Magic numbers (non-critical) | Readability |
|
|
39
|
-
| Commented-out code | Noise |
|
|
40
|
-
| Inconsistent naming | Style drift |
|
|
41
|
-
| Missing JSDoc on internal helpers | Documentation gap |
|
|
42
|
-
| Slightly long files (200–499 lines) | Future extraction candidate |
|
|
43
|
-
|
|
44
|
-
**Rule**: P3 items never block. Review weekly; archive when resolved.
|
|
45
|
-
|
|
46
|
-
## Convergence Rule
|
|
47
|
-
|
|
48
|
-
- Round 1: address all P1 + P2
|
|
49
|
-
- Round 2: address remaining P1 + P2 only
|
|
50
|
-
- Round 3+: P1 only
|
|
51
|
-
- Same findings as previous round → stop immediately
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* techdebt/scripts/scan.js
|
|
4
|
-
* Scan a directory for technical debt patterns.
|
|
5
|
-
* Usage: node scan.js <directory>
|
|
6
|
-
* Output: JSON array of findings to stdout.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import fs from 'fs';
|
|
10
|
-
import path from 'path';
|
|
11
|
-
|
|
12
|
-
const TARGET_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);
|
|
13
|
-
|
|
14
|
-
/** @returns {string[]} */
|
|
15
|
-
function collectFiles(dir) {
|
|
16
|
-
const results = [];
|
|
17
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
18
|
-
if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') continue;
|
|
19
|
-
const full = path.join(dir, entry.name);
|
|
20
|
-
if (entry.isDirectory()) results.push(...collectFiles(full));
|
|
21
|
-
else if (TARGET_EXTENSIONS.has(path.extname(entry.name))) results.push(full);
|
|
22
|
-
}
|
|
23
|
-
return results;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** @param {string} file @returns {import('./scan.js').Finding[]} */
|
|
27
|
-
function scanFile(file) {
|
|
28
|
-
const lines = fs.readFileSync(file, 'utf-8').split('\n');
|
|
29
|
-
const findings = [];
|
|
30
|
-
let functionLineStart = -1;
|
|
31
|
-
let braceDepth = 0;
|
|
32
|
-
let functionLineCount = 0;
|
|
33
|
-
let maxNesting = 0;
|
|
34
|
-
let currentNesting = 0;
|
|
35
|
-
|
|
36
|
-
const push = (line, type, severity, message) =>
|
|
37
|
-
findings.push({ file, line: line + 1, type, severity, message });
|
|
38
|
-
|
|
39
|
-
for (let i = 0; i < lines.length; i++) {
|
|
40
|
-
const raw = lines[i];
|
|
41
|
-
const trimmed = raw.trim();
|
|
42
|
-
|
|
43
|
-
if (/:\s*any\b|as\s+any\b/.test(trimmed)) push(i, 'any-type', 'P1', `'any' type usage detected`);
|
|
44
|
-
if (/console\.(log|warn|error|debug)\s*\(/.test(trimmed)) push(i, 'console-log', 'P2', `console statement found`);
|
|
45
|
-
if (/^import\s+/.test(trimmed)) {
|
|
46
|
-
const match = trimmed.match(/^import\s+\{([^}]+)\}/);
|
|
47
|
-
if (match) {
|
|
48
|
-
const names = match[1].split(',').map(n => n.trim().split(/\s+as\s+/).pop());
|
|
49
|
-
for (const name of names) {
|
|
50
|
-
const usedElsewhere = lines.slice(i + 1).some(l => new RegExp(`\\b${name}\\b`).test(l));
|
|
51
|
-
if (!usedElsewhere) push(i, 'unused-import', 'P2', `Possibly unused import: ${name}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const magicNumber = trimmed.match(/(?<![A-Za-z_$'"`])\b([2-9]\d{2,}|\d{4,})\b(?![A-Za-z_$'"`])/);
|
|
56
|
-
if (magicNumber && !/^\s*(\/\/|\/\*)/.test(raw)) push(i, 'magic-number', 'P3', `Magic number: ${magicNumber[1]}`);
|
|
57
|
-
|
|
58
|
-
const opens = (raw.match(/\{/g) || []).length;
|
|
59
|
-
const closes = (raw.match(/\}/g) || []).length;
|
|
60
|
-
if (/\bfunction\b|\=\>/.test(raw) && opens > closes) {
|
|
61
|
-
functionLineStart = i;
|
|
62
|
-
functionLineCount = 0;
|
|
63
|
-
braceDepth = opens - closes;
|
|
64
|
-
} else if (functionLineStart >= 0) {
|
|
65
|
-
braceDepth += opens - closes;
|
|
66
|
-
functionLineCount++;
|
|
67
|
-
if (braceDepth <= 0) {
|
|
68
|
-
if (functionLineCount > 50) push(functionLineStart, 'long-function', 'P2', `Function is ${functionLineCount} lines (limit: 50)`);
|
|
69
|
-
functionLineStart = -1;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const indent = raw.match(/^(\s*)/)[1].length;
|
|
74
|
-
currentNesting = Math.floor(indent / 2);
|
|
75
|
-
if (currentNesting > maxNesting) maxNesting = currentNesting;
|
|
76
|
-
if (currentNesting > 4) push(i, 'deep-nesting', 'P2', `Nesting depth ${currentNesting} exceeds limit of 4`);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return findings;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const dir = process.argv[2] || process.cwd();
|
|
83
|
-
if (!fs.existsSync(dir)) {
|
|
84
|
-
process.stderr.write(`Directory not found: ${dir}\n`);
|
|
85
|
-
process.exit(1);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const files = collectFiles(path.resolve(dir));
|
|
89
|
-
const findings = files.flatMap(scanFile);
|
|
90
|
-
process.stdout.write(JSON.stringify(findings, null, 2) + '\n');
|