@boshu2/vibe-check 1.8.1 → 2.2.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/.agents/plans/2025-12-27-vibe-check-evolution-plan.md +383 -0
- package/.agents/research/2025-12-27-vibe-check-evolution.md +352 -0
- package/.claude/settings.local.json +9 -3
- package/CHANGELOG.md +43 -0
- package/CLAUDE.md +201 -26
- package/Makefile +4 -4
- package/README.md +95 -0
- package/bin/vibe-check.js +1 -1
- package/claude-progress.json +18 -0
- package/dist/analysis/cross-session-analysis.d.ts +1 -1
- package/dist/analysis/cross-session-analysis.d.ts.map +1 -1
- package/dist/analysis/cross-session-analysis.js +9 -18
- package/dist/analysis/cross-session-analysis.js.map +1 -1
- package/dist/analysis/index.d.ts +1 -1
- package/dist/analysis/index.d.ts.map +1 -1
- package/dist/analysis/index.js +1 -11
- package/dist/analysis/index.js.map +1 -1
- package/dist/analyzers/audit.d.ts +28 -0
- package/dist/analyzers/audit.d.ts.map +1 -0
- package/dist/analyzers/audit.js +86 -0
- package/dist/analyzers/audit.js.map +1 -0
- package/dist/analyzers/eldritch.d.ts +40 -0
- package/dist/analyzers/eldritch.d.ts.map +1 -0
- package/dist/analyzers/eldritch.js +202 -0
- package/dist/analyzers/eldritch.js.map +1 -0
- package/dist/analyzers/modularity.d.ts +67 -0
- package/dist/analyzers/modularity.d.ts.map +1 -0
- package/dist/analyzers/modularity.js +254 -0
- package/dist/analyzers/modularity.js.map +1 -0
- package/dist/analyzers/patterns.d.ts +1 -1
- package/dist/analyzers/patterns.d.ts.map +1 -1
- package/dist/analyzers/patterns.js +4 -10
- package/dist/analyzers/patterns.js.map +1 -1
- package/dist/analyzers/quality.d.ts +1 -1
- package/dist/analyzers/quality.d.ts.map +1 -1
- package/dist/analyzers/quality.js +5 -12
- package/dist/analyzers/quality.js.map +1 -1
- package/dist/analyzers/sessions.d.ts +1 -1
- package/dist/analyzers/sessions.d.ts.map +1 -1
- package/dist/analyzers/sessions.js +1 -4
- package/dist/analyzers/sessions.js.map +1 -1
- package/dist/cli.js +21 -20
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +124 -149
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +102 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/cache.js +31 -70
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +22 -58
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/forensics.d.ts +10 -2
- package/dist/commands/forensics.d.ts.map +1 -1
- package/dist/commands/forensics.js +91 -51
- package/dist/commands/forensics.js.map +1 -1
- package/dist/commands/index.d.ts +15 -13
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +15 -33
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init-hook.js +26 -32
- package/dist/commands/init-hook.js.map +1 -1
- package/dist/commands/insights.js +39 -45
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/modularity.d.ts +27 -0
- package/dist/commands/modularity.d.ts.map +1 -0
- package/dist/commands/modularity.js +182 -0
- package/dist/commands/modularity.js.map +1 -0
- package/dist/commands/pipeline.js +39 -78
- package/dist/commands/pipeline.js.map +1 -1
- package/dist/commands/profile.js +68 -74
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/session.js +88 -129
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/sessions.d.ts +1 -1
- package/dist/commands/sessions.d.ts.map +1 -1
- package/dist/commands/sessions.js +42 -49
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/start.js +22 -67
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/timeline.js +74 -81
- package/dist/commands/timeline.js.map +1 -1
- package/dist/commands/watch.js +54 -60
- package/dist/commands/watch.js.map +1 -1
- package/dist/gamification/achievements.d.ts +1 -1
- package/dist/gamification/achievements.d.ts.map +1 -1
- package/dist/gamification/achievements.js +7 -13
- package/dist/gamification/achievements.js.map +1 -1
- package/dist/gamification/index.d.ts +8 -8
- package/dist/gamification/index.d.ts.map +1 -1
- package/dist/gamification/index.js +8 -28
- package/dist/gamification/index.js.map +1 -1
- package/dist/gamification/profile.d.ts +2 -2
- package/dist/gamification/profile.d.ts.map +1 -1
- package/dist/gamification/profile.js +21 -64
- package/dist/gamification/profile.js.map +1 -1
- package/dist/gamification/stats.d.ts +1 -1
- package/dist/gamification/stats.d.ts.map +1 -1
- package/dist/gamification/stats.js +4 -10
- package/dist/gamification/stats.js.map +1 -1
- package/dist/gamification/streaks.d.ts +1 -1
- package/dist/gamification/streaks.d.ts.map +1 -1
- package/dist/gamification/streaks.js +8 -18
- package/dist/gamification/streaks.js.map +1 -1
- package/dist/gamification/types.js +3 -6
- package/dist/gamification/types.js.map +1 -1
- package/dist/gamification/xp.d.ts +1 -1
- package/dist/gamification/xp.d.ts.map +1 -1
- package/dist/gamification/xp.js +29 -38
- package/dist/gamification/xp.js.map +1 -1
- package/dist/git.d.ts +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +23 -29
- package/dist/git.js.map +1 -1
- package/dist/inner-loop/context-amnesia.d.ts +2 -2
- package/dist/inner-loop/context-amnesia.d.ts.map +1 -1
- package/dist/inner-loop/context-amnesia.js +7 -10
- package/dist/inner-loop/context-amnesia.js.map +1 -1
- package/dist/inner-loop/index.d.ts +7 -7
- package/dist/inner-loop/index.d.ts.map +1 -1
- package/dist/inner-loop/index.js +18 -45
- package/dist/inner-loop/index.js.map +1 -1
- package/dist/inner-loop/instruction-drift.d.ts +2 -2
- package/dist/inner-loop/instruction-drift.d.ts.map +1 -1
- package/dist/inner-loop/instruction-drift.js +5 -10
- package/dist/inner-loop/instruction-drift.js.map +1 -1
- package/dist/inner-loop/logging-only.d.ts +2 -2
- package/dist/inner-loop/logging-only.d.ts.map +1 -1
- package/dist/inner-loop/logging-only.js +9 -17
- package/dist/inner-loop/logging-only.js.map +1 -1
- package/dist/inner-loop/tests-passing-lie.d.ts +2 -2
- package/dist/inner-loop/tests-passing-lie.d.ts.map +1 -1
- package/dist/inner-loop/tests-passing-lie.js +12 -17
- package/dist/inner-loop/tests-passing-lie.js.map +1 -1
- package/dist/inner-loop/types.js +1 -4
- package/dist/inner-loop/types.js.map +1 -1
- package/dist/insights/generators.d.ts +4 -4
- package/dist/insights/generators.d.ts.map +1 -1
- package/dist/insights/generators.js +9 -20
- package/dist/insights/generators.js.map +1 -1
- package/dist/insights/index.d.ts +4 -4
- package/dist/insights/index.d.ts.map +1 -1
- package/dist/insights/index.js +23 -27
- package/dist/insights/index.js.map +1 -1
- package/dist/insights/types.js +1 -2
- package/dist/insights/types.js.map +1 -1
- package/dist/metrics/code-stability.d.ts +1 -1
- package/dist/metrics/code-stability.d.ts.map +1 -1
- package/dist/metrics/code-stability.js +1 -4
- package/dist/metrics/code-stability.js.map +1 -1
- package/dist/metrics/cohesion.d.ts +27 -0
- package/dist/metrics/cohesion.d.ts.map +1 -0
- package/dist/metrics/cohesion.js +134 -0
- package/dist/metrics/cohesion.js.map +1 -0
- package/dist/metrics/file-churn.d.ts +1 -1
- package/dist/metrics/file-churn.d.ts.map +1 -1
- package/dist/metrics/file-churn.js +1 -4
- package/dist/metrics/file-churn.js.map +1 -1
- package/dist/metrics/flow.d.ts +1 -1
- package/dist/metrics/flow.d.ts.map +1 -1
- package/dist/metrics/flow.js +1 -4
- package/dist/metrics/flow.js.map +1 -1
- package/dist/metrics/index.d.ts +10 -2
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +51 -20
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/investigation.d.ts +25 -0
- package/dist/metrics/investigation.d.ts.map +1 -0
- package/dist/metrics/investigation.js +115 -0
- package/dist/metrics/investigation.js.map +1 -0
- package/dist/metrics/rework.d.ts +1 -1
- package/dist/metrics/rework.d.ts.map +1 -1
- package/dist/metrics/rework.js +1 -4
- package/dist/metrics/rework.js.map +1 -1
- package/dist/metrics/spirals.d.ts +1 -1
- package/dist/metrics/spirals.d.ts.map +1 -1
- package/dist/metrics/spirals.js +5 -10
- package/dist/metrics/spirals.js.map +1 -1
- package/dist/metrics/time-spiral.d.ts +1 -1
- package/dist/metrics/time-spiral.d.ts.map +1 -1
- package/dist/metrics/time-spiral.js +1 -4
- package/dist/metrics/time-spiral.js.map +1 -1
- package/dist/metrics/tracers.d.ts +28 -0
- package/dist/metrics/tracers.d.ts.map +1 -0
- package/dist/metrics/tracers.js +117 -0
- package/dist/metrics/tracers.js.map +1 -0
- package/dist/metrics/trust.d.ts +1 -1
- package/dist/metrics/trust.d.ts.map +1 -1
- package/dist/metrics/trust.js +3 -6
- package/dist/metrics/trust.js.map +1 -1
- package/dist/metrics/velocity-anomaly.d.ts +1 -1
- package/dist/metrics/velocity-anomaly.d.ts.map +1 -1
- package/dist/metrics/velocity-anomaly.js +3 -6
- package/dist/metrics/velocity-anomaly.js.map +1 -1
- package/dist/metrics/velocity.d.ts +1 -1
- package/dist/metrics/velocity.d.ts.map +1 -1
- package/dist/metrics/velocity.js +6 -10
- package/dist/metrics/velocity.js.map +1 -1
- package/dist/output/index.d.ts +4 -4
- package/dist/output/index.d.ts.map +1 -1
- package/dist/output/index.js +10 -18
- package/dist/output/index.js.map +1 -1
- package/dist/output/json.d.ts +1 -1
- package/dist/output/json.d.ts.map +1 -1
- package/dist/output/json.js +1 -4
- package/dist/output/json.js.map +1 -1
- package/dist/output/markdown.d.ts +1 -1
- package/dist/output/markdown.d.ts.map +1 -1
- package/dist/output/markdown.js +5 -8
- package/dist/output/markdown.js.map +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/output/terminal.d.ts.map +1 -1
- package/dist/output/terminal.js +88 -62
- package/dist/output/terminal.js.map +1 -1
- package/dist/output/timeline-html.d.ts +1 -1
- package/dist/output/timeline-html.d.ts.map +1 -1
- package/dist/output/timeline-html.js +5 -8
- package/dist/output/timeline-html.js.map +1 -1
- package/dist/output/timeline-markdown.d.ts +1 -1
- package/dist/output/timeline-markdown.d.ts.map +1 -1
- package/dist/output/timeline-markdown.js +5 -8
- package/dist/output/timeline-markdown.js.map +1 -1
- package/dist/output/timeline.d.ts +1 -1
- package/dist/output/timeline.d.ts.map +1 -1
- package/dist/output/timeline.js +46 -52
- package/dist/output/timeline.js.map +1 -1
- package/dist/patterns/detour.d.ts +1 -1
- package/dist/patterns/detour.d.ts.map +1 -1
- package/dist/patterns/detour.js +1 -4
- package/dist/patterns/detour.js.map +1 -1
- package/dist/patterns/flow-state.d.ts +1 -1
- package/dist/patterns/flow-state.d.ts.map +1 -1
- package/dist/patterns/flow-state.js +1 -4
- package/dist/patterns/flow-state.js.map +1 -1
- package/dist/patterns/index.d.ts +7 -7
- package/dist/patterns/index.d.ts.map +1 -1
- package/dist/patterns/index.js +7 -21
- package/dist/patterns/index.js.map +1 -1
- package/dist/patterns/intervention-effectiveness.d.ts +1 -1
- package/dist/patterns/intervention-effectiveness.d.ts.map +1 -1
- package/dist/patterns/intervention-effectiveness.js +3 -8
- package/dist/patterns/intervention-effectiveness.js.map +1 -1
- package/dist/patterns/late-night.d.ts +1 -1
- package/dist/patterns/late-night.d.ts.map +1 -1
- package/dist/patterns/late-night.js +1 -4
- package/dist/patterns/late-night.js.map +1 -1
- package/dist/patterns/post-delete-sprint.d.ts +1 -1
- package/dist/patterns/post-delete-sprint.d.ts.map +1 -1
- package/dist/patterns/post-delete-sprint.js +1 -4
- package/dist/patterns/post-delete-sprint.js.map +1 -1
- package/dist/patterns/spiral-regression.d.ts +1 -1
- package/dist/patterns/spiral-regression.d.ts.map +1 -1
- package/dist/patterns/spiral-regression.js +3 -8
- package/dist/patterns/spiral-regression.js.map +1 -1
- package/dist/patterns/thrashing.d.ts +1 -1
- package/dist/patterns/thrashing.d.ts.map +1 -1
- package/dist/patterns/thrashing.js +3 -6
- package/dist/patterns/thrashing.js.map +1 -1
- package/dist/score/index.d.ts +3 -3
- package/dist/score/index.d.ts.map +1 -1
- package/dist/score/index.js +4 -10
- package/dist/score/index.js.map +1 -1
- package/dist/score/weights.js +2 -6
- package/dist/score/weights.js.map +1 -1
- package/dist/sessions/index.js +9 -51
- package/dist/sessions/index.js.map +1 -1
- package/dist/storage/atomic.js +10 -51
- package/dist/storage/atomic.js.map +1 -1
- package/dist/storage/commit-log.d.ts +1 -1
- package/dist/storage/commit-log.d.ts.map +1 -1
- package/dist/storage/commit-log.js +11 -51
- package/dist/storage/commit-log.js.map +1 -1
- package/dist/storage/index.d.ts +5 -5
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +5 -37
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/schema.js +4 -9
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/spiral-history.js +14 -57
- package/dist/storage/spiral-history.js.map +1 -1
- package/dist/storage/timeline-store.d.ts +2 -2
- package/dist/storage/timeline-store.d.ts.map +1 -1
- package/dist/storage/timeline-store.js +17 -61
- package/dist/storage/timeline-store.js.map +1 -1
- package/dist/types.d.ts +36 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/docs/ENHANCEMENT-PLAN.md +379 -0
- package/feature-list.json +6 -0
- package/package.json +8 -7
- package/.claude/skills/typescript-review.md +0 -152
- package/dist/calibration/ece.d.ts +0 -26
- package/dist/calibration/ece.d.ts.map +0 -1
- package/dist/calibration/ece.js +0 -93
- package/dist/calibration/ece.js.map +0 -1
- package/dist/calibration/index.d.ts +0 -3
- package/dist/calibration/index.d.ts.map +0 -1
- package/dist/calibration/index.js +0 -15
- package/dist/calibration/index.js.map +0 -1
- package/dist/calibration/storage.d.ts +0 -34
- package/dist/calibration/storage.d.ts.map +0 -1
- package/dist/calibration/storage.js +0 -188
- package/dist/calibration/storage.js.map +0 -1
- package/dist/commands/intervene.d.ts +0 -15
- package/dist/commands/intervene.d.ts.map +0 -1
- package/dist/commands/intervene.js +0 -183
- package/dist/commands/intervene.js.map +0 -1
- package/dist/commands/learn.d.ts +0 -3
- package/dist/commands/learn.d.ts.map +0 -1
- package/dist/commands/learn.js +0 -161
- package/dist/commands/learn.js.map +0 -1
- package/dist/commands/lesson.d.ts +0 -8
- package/dist/commands/lesson.d.ts.map +0 -1
- package/dist/commands/lesson.js +0 -206
- package/dist/commands/lesson.js.map +0 -1
- package/dist/commands/level.d.ts +0 -3
- package/dist/commands/level.d.ts.map +0 -1
- package/dist/commands/level.js +0 -277
- package/dist/commands/level.js.map +0 -1
- package/dist/gamification/badges.d.ts +0 -29
- package/dist/gamification/badges.d.ts.map +0 -1
- package/dist/gamification/badges.js +0 -114
- package/dist/gamification/badges.js.map +0 -1
- package/dist/gamification/challenges.d.ts +0 -42
- package/dist/gamification/challenges.d.ts.map +0 -1
- package/dist/gamification/challenges.js +0 -184
- package/dist/gamification/challenges.js.map +0 -1
- package/dist/gamification/hall-of-fame.d.ts +0 -17
- package/dist/gamification/hall-of-fame.d.ts.map +0 -1
- package/dist/gamification/hall-of-fame.js +0 -64
- package/dist/gamification/hall-of-fame.js.map +0 -1
- package/dist/gamification/intervention-memory.d.ts +0 -61
- package/dist/gamification/intervention-memory.d.ts.map +0 -1
- package/dist/gamification/intervention-memory.js +0 -229
- package/dist/gamification/intervention-memory.js.map +0 -1
- package/dist/gamification/leaderboards.d.ts +0 -49
- package/dist/gamification/leaderboards.d.ts.map +0 -1
- package/dist/gamification/leaderboards.js +0 -179
- package/dist/gamification/leaderboards.js.map +0 -1
- package/dist/gamification/pattern-memory.d.ts +0 -45
- package/dist/gamification/pattern-memory.d.ts.map +0 -1
- package/dist/gamification/pattern-memory.js +0 -188
- package/dist/gamification/pattern-memory.js.map +0 -1
- package/dist/gamification/share.d.ts +0 -29
- package/dist/gamification/share.d.ts.map +0 -1
- package/dist/gamification/share.js +0 -57
- package/dist/gamification/share.js.map +0 -1
- package/dist/learning/cadence.d.ts +0 -15
- package/dist/learning/cadence.d.ts.map +0 -1
- package/dist/learning/cadence.js +0 -130
- package/dist/learning/cadence.js.map +0 -1
- package/dist/learning/index.d.ts +0 -19
- package/dist/learning/index.d.ts.map +0 -1
- package/dist/learning/index.js +0 -35
- package/dist/learning/index.js.map +0 -1
- package/dist/learning/lessons-storage.d.ts +0 -48
- package/dist/learning/lessons-storage.d.ts.map +0 -1
- package/dist/learning/lessons-storage.js +0 -266
- package/dist/learning/lessons-storage.js.map +0 -1
- package/dist/learning/lessons-types.d.ts +0 -83
- package/dist/learning/lessons-types.d.ts.map +0 -1
- package/dist/learning/lessons-types.js +0 -15
- package/dist/learning/lessons-types.js.map +0 -1
- package/dist/learning/nudges.d.ts +0 -20
- package/dist/learning/nudges.d.ts.map +0 -1
- package/dist/learning/nudges.js +0 -68
- package/dist/learning/nudges.js.map +0 -1
- package/dist/learning/retrospective.d.ts +0 -27
- package/dist/learning/retrospective.d.ts.map +0 -1
- package/dist/learning/retrospective.js +0 -184
- package/dist/learning/retrospective.js.map +0 -1
- package/dist/learning/storage.d.ts +0 -44
- package/dist/learning/storage.d.ts.map +0 -1
- package/dist/learning/storage.js +0 -194
- package/dist/learning/storage.js.map +0 -1
- package/dist/learning/surfacing.d.ts +0 -36
- package/dist/learning/surfacing.d.ts.map +0 -1
- package/dist/learning/surfacing.js +0 -255
- package/dist/learning/surfacing.js.map +0 -1
- package/dist/learning/synthesis.d.ts +0 -17
- package/dist/learning/synthesis.d.ts.map +0 -1
- package/dist/learning/synthesis.js +0 -293
- package/dist/learning/synthesis.js.map +0 -1
- package/dist/learning/types.d.ts +0 -60
- package/dist/learning/types.d.ts.map +0 -1
- package/dist/learning/types.js +0 -17
- package/dist/learning/types.js.map +0 -1
- package/dist/recommend/index.d.ts +0 -3
- package/dist/recommend/index.d.ts.map +0 -1
- package/dist/recommend/index.js +0 -14
- package/dist/recommend/index.js.map +0 -1
- package/dist/recommend/ordered-logistic.d.ts +0 -49
- package/dist/recommend/ordered-logistic.d.ts.map +0 -1
- package/dist/recommend/ordered-logistic.js +0 -153
- package/dist/recommend/ordered-logistic.js.map +0 -1
- package/dist/recommend/questions.d.ts +0 -19
- package/dist/recommend/questions.d.ts.map +0 -1
- package/dist/recommend/questions.js +0 -73
- package/dist/recommend/questions.js.map +0 -1
package/Makefile
CHANGED
|
@@ -100,7 +100,7 @@ release-patch: build test
|
|
|
100
100
|
git push --follow-tags
|
|
101
101
|
$(MAKE) github-release
|
|
102
102
|
npm publish --access=public
|
|
103
|
-
@echo "✅ Released v$$(
|
|
103
|
+
@echo "✅ Released v$$(npm pkg get version | tr -d '"')"
|
|
104
104
|
|
|
105
105
|
release-minor: build test
|
|
106
106
|
@echo "📦 Releasing minor version..."
|
|
@@ -108,7 +108,7 @@ release-minor: build test
|
|
|
108
108
|
git push --follow-tags
|
|
109
109
|
$(MAKE) github-release
|
|
110
110
|
npm publish --access=public
|
|
111
|
-
@echo "✅ Released v$$(
|
|
111
|
+
@echo "✅ Released v$$(npm pkg get version | tr -d '"')"
|
|
112
112
|
|
|
113
113
|
release-major: build test
|
|
114
114
|
@echo "📦 Releasing major version..."
|
|
@@ -116,11 +116,11 @@ release-major: build test
|
|
|
116
116
|
git push --follow-tags
|
|
117
117
|
$(MAKE) github-release
|
|
118
118
|
npm publish --access=public
|
|
119
|
-
@echo "✅ Released v$$(
|
|
119
|
+
@echo "✅ Released v$$(npm pkg get version | tr -d '"')"
|
|
120
120
|
|
|
121
121
|
# Create GitHub release from latest tag
|
|
122
122
|
github-release:
|
|
123
|
-
@VERSION=$$(
|
|
123
|
+
@VERSION=$$(npm pkg get version | tr -d '"'); \
|
|
124
124
|
gh release create "v$$VERSION" \
|
|
125
125
|
--title "v$$VERSION" \
|
|
126
126
|
--generate-notes
|
package/README.md
CHANGED
|
@@ -187,6 +187,15 @@ vibe-check profile # XP and achievements
|
|
|
187
187
|
vibe-check insights # Your spiral patterns
|
|
188
188
|
```
|
|
189
189
|
|
|
190
|
+
### Code Quality
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
vibe-check audit # Scan for monoliths, test gaps, TODOs
|
|
194
|
+
vibe-check modularity # Pattern-aware modularity analysis
|
|
195
|
+
vibe-check modularity --verbose # Detailed breakdown with metrics
|
|
196
|
+
vibe-check modularity -f json # JSON output for CI integration
|
|
197
|
+
```
|
|
198
|
+
|
|
190
199
|
### Tools
|
|
191
200
|
|
|
192
201
|
```bash
|
|
@@ -241,6 +250,92 @@ When inner loop issues are detected:
|
|
|
241
250
|
|
|
242
251
|
---
|
|
243
252
|
|
|
253
|
+
## Modularity Analysis
|
|
254
|
+
|
|
255
|
+
Goes beyond simple LOC counting to assess whether large files are well-organized or problematic.
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
vibe-check modularity
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
📐 Modularity Analysis
|
|
263
|
+
────────────────────────────────────────────────────────────
|
|
264
|
+
|
|
265
|
+
Analyzed 584 files (195,345 lines)
|
|
266
|
+
Average modularity score: 9.5/10
|
|
267
|
+
|
|
268
|
+
Score Distribution:
|
|
269
|
+
Elite (9-10): ████████████████░░░░ 82%
|
|
270
|
+
Good (7-8): ███░░░░░░░░░░░░░░░░░ 15%
|
|
271
|
+
Acceptable (5-6): ░░░░░░░░░░░░░░░░░░░░ 2%
|
|
272
|
+
Needs Work (3-4): ░░░░░░░░░░░░░░░░░░░░ 1%
|
|
273
|
+
Poor (0-2): ░░░░░░░░░░░░░░░░░░░░ 0%
|
|
274
|
+
|
|
275
|
+
⚠️ Files Needing Attention (8):
|
|
276
|
+
|
|
277
|
+
6/10 stores/network.js 1023 lines [state-machine]
|
|
278
|
+
⚠ no sections/organization
|
|
279
|
+
5/10 server/WebSocketGateway.ts 702 lines
|
|
280
|
+
⚠ no sections/organization
|
|
281
|
+
4/10 client/App.tsx 568 lines [component]
|
|
282
|
+
⚠ no sections/organization, ⚠ high coupling
|
|
283
|
+
|
|
284
|
+
👍 Good modularity. Minor improvements possible.
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Pattern-Aware Scoring
|
|
288
|
+
|
|
289
|
+
A 2,500-line file can score **10/10** if well-organized. A 300-line file can score **4/10** if it's a mess.
|
|
290
|
+
|
|
291
|
+
| Factor | Impact | What It Checks |
|
|
292
|
+
|--------|--------|----------------|
|
|
293
|
+
| **Pattern Match** | +1 | Is it a controller/store/routes/state-machine? |
|
|
294
|
+
| **Internal Sections** | +1/-2 | Does it use `// ====` dividers or nested classes? |
|
|
295
|
+
| **Single Responsibility** | +2/-2 | Can purpose be described in one sentence? |
|
|
296
|
+
| **Coupling** | -1/-2 | >15 imports = high coupling warning |
|
|
297
|
+
| **Export Surface** | -1 | >20 exports = bloated API |
|
|
298
|
+
|
|
299
|
+
### Pattern-Specific Thresholds
|
|
300
|
+
|
|
301
|
+
Different file types have different acceptable sizes:
|
|
302
|
+
|
|
303
|
+
| Pattern | Yellow | Red | Why |
|
|
304
|
+
|---------|--------|-----|-----|
|
|
305
|
+
| `store` | 1,500 | 2,500 | Data layer naturally groups many methods |
|
|
306
|
+
| `controller` | 800 | 1,200 | K8s-style with reconciliation loops |
|
|
307
|
+
| `routes` | 1,000 | 1,500 | Vertical slice entry points |
|
|
308
|
+
| `component` | 250 | 400 | React components should stay focused |
|
|
309
|
+
| `utility` | 150 | 250 | Utilities should be smallest |
|
|
310
|
+
|
|
311
|
+
### Automatic Exemptions
|
|
312
|
+
|
|
313
|
+
These patterns skip modularity checks:
|
|
314
|
+
- `*.test.ts` — Tests can be comprehensive
|
|
315
|
+
- `*.generated.ts` — Generated files
|
|
316
|
+
- Type definition files — Central types are OK to be large
|
|
317
|
+
|
|
318
|
+
### Forensics Integration
|
|
319
|
+
|
|
320
|
+
Modularity is also included in `vibe-check forensics` for complete code health analysis:
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
vibe-check forensics
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
Modularity Health:
|
|
328
|
+
Average Score: 9.5/10 (303 files analyzed)
|
|
329
|
+
⚠️ 8 files need attention:
|
|
330
|
+
6/10 stores/network.js 1023 lines (no-internal-structure)
|
|
331
|
+
5/10 server/WebSocketGateway.ts 702 lines
|
|
332
|
+
...
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
Poor modularity (score <5) triggers the **SWEEP** recommendation alongside commit pattern issues.
|
|
336
|
+
|
|
337
|
+
---
|
|
338
|
+
|
|
244
339
|
## For Autonomous Agents
|
|
245
340
|
|
|
246
341
|
vibe-check measures **human-AI collaboration sessions**—the inner loop where you're working with an AI assistant.
|
package/bin/vibe-check.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
2
|
+
import '../dist/cli.js';
|
package/claude-progress.json
CHANGED
|
@@ -218,6 +218,24 @@
|
|
|
218
218
|
"Plan before implement - actionable coaching plan guides next work"
|
|
219
219
|
]
|
|
220
220
|
}
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"session_id": "2025-12-15-001",
|
|
224
|
+
"started": "2025-12-15T12:00:00Z",
|
|
225
|
+
"ended": "2025-12-15T12:05:00Z",
|
|
226
|
+
"vibe_level": 5,
|
|
227
|
+
"summary": "Updated dependencies to latest (Dec 2025). Bumped typescript to 5.9.3, types/node to 25.0.2. Fixed integration tests to account for stale git history.",
|
|
228
|
+
"commits": [],
|
|
229
|
+
"features_completed": []
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"session_id": "2025-12-15-002",
|
|
233
|
+
"started": "2025-12-15T13:00:00Z",
|
|
234
|
+
"ended": "2025-12-15T13:30:00Z",
|
|
235
|
+
"vibe_level": 4,
|
|
236
|
+
"summary": "Implemented `vibe-check audit` command for static analysis. Detects monoliths (>600 lines), test gaps (missing test files), and TODO density.",
|
|
237
|
+
"commits": [],
|
|
238
|
+
"features_completed": ["VIBE-048"]
|
|
221
239
|
}
|
|
222
240
|
],
|
|
223
241
|
"sessions_continued": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-session-analysis.d.ts","sourceRoot":"","sources":["../../src/analysis/cross-session-analysis.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cross-session-analysis.d.ts","sourceRoot":"","sources":["../../src/analysis/cross-session-analysis.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3C,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,EAAE,CAEzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAU7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAqC9D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAqD7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAY,GAAG,UAAU,EAAE,CAK9F;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAKlF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACzC,CA8BA"}
|
|
@@ -1,27 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.loadAllCommits = loadAllCommits;
|
|
4
|
-
exports.queryCommits = queryCommits;
|
|
5
|
-
exports.analyzeByScope = analyzeByScope;
|
|
6
|
-
exports.getCrossSessionSummary = getCrossSessionSummary;
|
|
7
|
-
exports.findProblematicScopes = findProblematicScopes;
|
|
8
|
-
exports.findPeakHours = findPeakHours;
|
|
9
|
-
exports.analyzeScopeDetail = analyzeScopeDetail;
|
|
10
1
|
/**
|
|
11
2
|
* Cross-session analysis for querying historical commit data.
|
|
12
3
|
* Enables queries like "show all auth spirals" or "commits by scope".
|
|
13
4
|
*/
|
|
14
|
-
|
|
5
|
+
import { readCommitLog } from '../storage/commit-log.js';
|
|
15
6
|
/**
|
|
16
7
|
* Load all commits from the NDJSON log
|
|
17
8
|
*/
|
|
18
|
-
function loadAllCommits(repoPath = process.cwd()) {
|
|
19
|
-
return
|
|
9
|
+
export function loadAllCommits(repoPath = process.cwd()) {
|
|
10
|
+
return readCommitLog(repoPath);
|
|
20
11
|
}
|
|
21
12
|
/**
|
|
22
13
|
* Query commits with filters
|
|
23
14
|
*/
|
|
24
|
-
function queryCommits(commits, filter) {
|
|
15
|
+
export function queryCommits(commits, filter) {
|
|
25
16
|
return commits.filter(commit => {
|
|
26
17
|
if (filter.scope && commit.scope !== filter.scope)
|
|
27
18
|
return false;
|
|
@@ -41,7 +32,7 @@ function queryCommits(commits, filter) {
|
|
|
41
32
|
/**
|
|
42
33
|
* Get statistics by scope
|
|
43
34
|
*/
|
|
44
|
-
function analyzeByScope(commits) {
|
|
35
|
+
export function analyzeByScope(commits) {
|
|
45
36
|
const scopeMap = new Map();
|
|
46
37
|
for (const commit of commits) {
|
|
47
38
|
const scope = commit.scope || '(no scope)';
|
|
@@ -74,7 +65,7 @@ function analyzeByScope(commits) {
|
|
|
74
65
|
/**
|
|
75
66
|
* Get comprehensive cross-session summary
|
|
76
67
|
*/
|
|
77
|
-
function getCrossSessionSummary(commits) {
|
|
68
|
+
export function getCrossSessionSummary(commits) {
|
|
78
69
|
if (commits.length === 0) {
|
|
79
70
|
return {
|
|
80
71
|
totalCommits: 0,
|
|
@@ -125,7 +116,7 @@ function getCrossSessionSummary(commits) {
|
|
|
125
116
|
/**
|
|
126
117
|
* Find scopes with high spiral ratios (potential trouble spots)
|
|
127
118
|
*/
|
|
128
|
-
function findProblematicScopes(commits, threshold = 0.5) {
|
|
119
|
+
export function findProblematicScopes(commits, threshold = 0.5) {
|
|
129
120
|
const byScope = analyzeByScope(commits);
|
|
130
121
|
return byScope
|
|
131
122
|
.filter(s => s.commitCount >= 3 && s.spiralRatio >= threshold)
|
|
@@ -134,7 +125,7 @@ function findProblematicScopes(commits, threshold = 0.5) {
|
|
|
134
125
|
/**
|
|
135
126
|
* Find peak productivity hours
|
|
136
127
|
*/
|
|
137
|
-
function findPeakHours(commits) {
|
|
128
|
+
export function findPeakHours(commits) {
|
|
138
129
|
const summary = getCrossSessionSummary(commits);
|
|
139
130
|
return Object.entries(summary.byHour)
|
|
140
131
|
.map(([hour, count]) => ({ hour: parseInt(hour), count }))
|
|
@@ -143,7 +134,7 @@ function findPeakHours(commits) {
|
|
|
143
134
|
/**
|
|
144
135
|
* Get commits for a specific scope with detailed analysis
|
|
145
136
|
*/
|
|
146
|
-
function analyzeScopeDetail(commits, scope) {
|
|
137
|
+
export function analyzeScopeDetail(commits, scope) {
|
|
147
138
|
const scopeCommits = commits.filter(c => c.scope === scope);
|
|
148
139
|
if (scopeCommits.length === 0) {
|
|
149
140
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-session-analysis.js","sourceRoot":"","sources":["../../src/analysis/cross-session-analysis.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cross-session-analysis.js","sourceRoot":"","sources":["../../src/analysis/cross-session-analysis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AAiCvE;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC7D,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,MAAmB;IACjE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QAC7B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAChE,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACnE,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAGpB,CAAC;IAEL,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,YAAY,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAErE,KAAK,CAAC,IAAI,CAAC;YACT,KAAK;YACL,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAChC,QAAQ;YACR,SAAS;YACT,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACzE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;YACxC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAiB;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,YAAY,EAAE,CAAC;YACf,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,EAAE;YACX,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhF,UAAU;IACV,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,YAAY;IACZ,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,iBAAiB;IACjB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,8BAA8B;IAC9B,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,SAAS,EAAE;YACT,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;YACpB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;SACnC;QACD,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC;QAChC,MAAM;QACN,QAAQ;QACR,MAAM;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAiB,EAAE,YAAoB,GAAG;IAC9E,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC;SAC7D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAiB;IAC7C,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;SACzD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAiB,EAAE,KAAa;IAMjE,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAE5D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,IAAI;YACX,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACrF,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3C,iDAAiD;IACjD,IAAI,YAAY,GAA8B,KAAK,CAAC;IACpD,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;QAC7B,YAAY,GAAG,MAAM,CAAC;IACxB,CAAC;SAAM,IAAI,KAAK,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC;QACpC,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,KAAK;QACL,cAAc;QACd,YAAY;KACb,CAAC;AACJ,CAAC"}
|
package/dist/analysis/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { QueryFilter, ScopeStats, CrossSessionSummary, loadAllCommits, queryCommits, analyzeByScope, getCrossSessionSummary, findProblematicScopes, findPeakHours, analyzeScopeDetail, } from './cross-session-analysis';
|
|
1
|
+
export { QueryFilter, ScopeStats, CrossSessionSummary, loadAllCommits, queryCommits, analyzeByScope, getCrossSessionSummary, findProblematicScopes, findPeakHours, analyzeScopeDetail, } from './cross-session-analysis.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAC"}
|
package/dist/analysis/index.js
CHANGED
|
@@ -1,12 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.analyzeScopeDetail = exports.findPeakHours = exports.findProblematicScopes = exports.getCrossSessionSummary = exports.analyzeByScope = exports.queryCommits = exports.loadAllCommits = void 0;
|
|
4
|
-
var cross_session_analysis_1 = require("./cross-session-analysis");
|
|
5
|
-
Object.defineProperty(exports, "loadAllCommits", { enumerable: true, get: function () { return cross_session_analysis_1.loadAllCommits; } });
|
|
6
|
-
Object.defineProperty(exports, "queryCommits", { enumerable: true, get: function () { return cross_session_analysis_1.queryCommits; } });
|
|
7
|
-
Object.defineProperty(exports, "analyzeByScope", { enumerable: true, get: function () { return cross_session_analysis_1.analyzeByScope; } });
|
|
8
|
-
Object.defineProperty(exports, "getCrossSessionSummary", { enumerable: true, get: function () { return cross_session_analysis_1.getCrossSessionSummary; } });
|
|
9
|
-
Object.defineProperty(exports, "findProblematicScopes", { enumerable: true, get: function () { return cross_session_analysis_1.findProblematicScopes; } });
|
|
10
|
-
Object.defineProperty(exports, "findPeakHours", { enumerable: true, get: function () { return cross_session_analysis_1.findPeakHours; } });
|
|
11
|
-
Object.defineProperty(exports, "analyzeScopeDetail", { enumerable: true, get: function () { return cross_session_analysis_1.analyzeScopeDetail; } });
|
|
1
|
+
export { loadAllCommits, queryCommits, analyzeByScope, getCrossSessionSummary, findProblematicScopes, findPeakHours, analyzeScopeDetail, } from './cross-session-analysis.js';
|
|
12
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface AuditResult {
|
|
2
|
+
monoliths: Monolith[];
|
|
3
|
+
testGaps: TestGap[];
|
|
4
|
+
todoDensity: TodoHotspot[];
|
|
5
|
+
stats: {
|
|
6
|
+
totalFiles: number;
|
|
7
|
+
totalLines: number;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export interface Monolith {
|
|
11
|
+
file: string;
|
|
12
|
+
lines: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TestGap {
|
|
15
|
+
file: string;
|
|
16
|
+
testFile: string | null;
|
|
17
|
+
lastModified: Date;
|
|
18
|
+
}
|
|
19
|
+
export interface TodoHotspot {
|
|
20
|
+
file: string;
|
|
21
|
+
count: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function scanDirectory(dir: string, rootDir?: string): string[];
|
|
24
|
+
export declare function analyzeMonoliths(files: string[], limit?: number): Monolith[];
|
|
25
|
+
export declare function analyzeTodoDensity(files: string[], limit?: number): TodoHotspot[];
|
|
26
|
+
export declare function analyzeTestGaps(files: string[], rootDir: string): TestGap[];
|
|
27
|
+
export declare function runAudit(rootDir: string): AuditResult;
|
|
28
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/analyzers/audit.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAY,GAAG,MAAM,EAAE,CAoB1E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAY,GAAG,QAAQ,EAAE,CAYjF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU,GAAG,WAAW,EAAE,CAYpF;AAGD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CA4B3E;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAerD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const IGNORE_DIRS = ['node_modules', 'dist', 'coverage', '.git', '.vibe-check'];
|
|
4
|
+
const TEST_EXTENSIONS = ['.test.ts', '.spec.ts', '.test.js', '.spec.js'];
|
|
5
|
+
export function scanDirectory(dir, rootDir = dir) {
|
|
6
|
+
let results = [];
|
|
7
|
+
const list = fs.readdirSync(dir);
|
|
8
|
+
for (const file of list) {
|
|
9
|
+
const filePath = path.join(dir, file);
|
|
10
|
+
const stat = fs.statSync(filePath);
|
|
11
|
+
if (stat && stat.isDirectory()) {
|
|
12
|
+
if (!IGNORE_DIRS.includes(file)) {
|
|
13
|
+
results = results.concat(scanDirectory(filePath, rootDir));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// Only include source files
|
|
18
|
+
if (file.match(/\.(ts|js|jsx|tsx)$/)) {
|
|
19
|
+
results.push(filePath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return results;
|
|
24
|
+
}
|
|
25
|
+
export function analyzeMonoliths(files, limit = 600) {
|
|
26
|
+
const monoliths = [];
|
|
27
|
+
for (const file of files) {
|
|
28
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
29
|
+
const lines = content.split('\n').length;
|
|
30
|
+
if (lines > limit) {
|
|
31
|
+
monoliths.push({ file, lines });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return monoliths.sort((a, b) => b.lines - a.lines);
|
|
35
|
+
}
|
|
36
|
+
export function analyzeTodoDensity(files, limit = 5) {
|
|
37
|
+
const hotspots = [];
|
|
38
|
+
for (const file of files) {
|
|
39
|
+
const content = fs.readFileSync(file, 'utf-8');
|
|
40
|
+
const matches = content.match(/\/\/\s*(TODO|FIXME)/gi);
|
|
41
|
+
if (matches && matches.length >= limit) {
|
|
42
|
+
hotspots.push({ file, count: matches.length });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return hotspots.sort((a, b) => b.count - a.count);
|
|
46
|
+
}
|
|
47
|
+
// Simple heuristic: if src/foo.ts exists, look for src/foo.test.ts or tests/foo.test.ts
|
|
48
|
+
export function analyzeTestGaps(files, rootDir) {
|
|
49
|
+
const gaps = [];
|
|
50
|
+
const sourceFiles = files.filter(f => !f.match(/\.(test|spec)\./) && !f.includes('/tests/'));
|
|
51
|
+
for (const file of sourceFiles) {
|
|
52
|
+
const fileName = path.basename(file, path.extname(file));
|
|
53
|
+
const relativePath = path.relative(rootDir, file);
|
|
54
|
+
// Potential test locations
|
|
55
|
+
const candidates = [
|
|
56
|
+
file.replace(/\.(ts|js|tsx|jsx)$/, '.test.$1'),
|
|
57
|
+
file.replace(/\.(ts|js|tsx|jsx)$/, '.spec.$1'),
|
|
58
|
+
path.join(rootDir, 'tests', `${fileName}.test.ts`),
|
|
59
|
+
path.join(rootDir, 'tests', relativePath.replace(/\.(ts|js|tsx|jsx)$/, '.test.$1'))
|
|
60
|
+
];
|
|
61
|
+
const hasTest = candidates.some(c => fs.existsSync(c));
|
|
62
|
+
if (!hasTest) {
|
|
63
|
+
gaps.push({
|
|
64
|
+
file: relativePath,
|
|
65
|
+
testFile: null,
|
|
66
|
+
lastModified: fs.statSync(file).mtime
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return gaps;
|
|
71
|
+
}
|
|
72
|
+
export function runAudit(rootDir) {
|
|
73
|
+
const files = scanDirectory(rootDir);
|
|
74
|
+
const totalFiles = files.length;
|
|
75
|
+
let totalLines = 0;
|
|
76
|
+
files.forEach(f => {
|
|
77
|
+
totalLines += fs.readFileSync(f, 'utf-8').split('\n').length;
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
monoliths: analyzeMonoliths(files),
|
|
81
|
+
testGaps: analyzeTestGaps(files, rootDir),
|
|
82
|
+
todoDensity: analyzeTodoDensity(files),
|
|
83
|
+
stats: { totalFiles, totalLines }
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/analyzers/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Eldritch Horror Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects oversized functions that are symptomatic of the "Eldritch Horror"
|
|
5
|
+
* middle loop failure pattern from vibe coding. This pattern occurs when
|
|
6
|
+
* AI generates monolithic functions that are impossible to understand.
|
|
7
|
+
*
|
|
8
|
+
* Thresholds:
|
|
9
|
+
* - Warning: Functions > 200 lines
|
|
10
|
+
* - Critical: Functions > 500 lines
|
|
11
|
+
*
|
|
12
|
+
* Detection is heuristic-based (not full AST parsing) to keep it fast
|
|
13
|
+
* and work across multiple languages.
|
|
14
|
+
*/
|
|
15
|
+
export interface EldritchHorror {
|
|
16
|
+
file: string;
|
|
17
|
+
functionName: string;
|
|
18
|
+
lineStart: number;
|
|
19
|
+
lineCount: number;
|
|
20
|
+
severity: 'warning' | 'critical';
|
|
21
|
+
}
|
|
22
|
+
export interface EldritchHorrorResult {
|
|
23
|
+
detected: boolean;
|
|
24
|
+
horrors: EldritchHorror[];
|
|
25
|
+
totalCount: number;
|
|
26
|
+
criticalCount: number;
|
|
27
|
+
warningCount: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Detect oversized functions in source files.
|
|
31
|
+
*
|
|
32
|
+
* @param files - List of file paths to analyze
|
|
33
|
+
* @returns Detection result with list of horrors
|
|
34
|
+
*/
|
|
35
|
+
export declare function detectEldritchHorrors(files: string[]): EldritchHorrorResult;
|
|
36
|
+
/**
|
|
37
|
+
* Run eldritch horror detection on a directory.
|
|
38
|
+
*/
|
|
39
|
+
export declare function scanForHorrors(dir: string): EldritchHorrorResult;
|
|
40
|
+
//# sourceMappingURL=eldritch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eldritch.d.ts","sourceRoot":"","sources":["../../src/analyzers/eldritch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAqBD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,CAuB3E;AA8HD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAGhE"}
|