@boshu2/vibe-check 1.6.2 → 1.8.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/bundles/actionable-coaching-plan-2025-12-02.md +209 -0
- package/.agents/bundles/automatic-learning-cadence-plan-2025-12-02.md +1297 -0
- package/.agents/bundles/automatic-learning-cadence-research-2025-12-02.md +481 -0
- package/.agents/bundles/dashboard-data-quality-plan.md +458 -0
- package/.agents/bundles/rating-scoring-alignment-plan.md +427 -0
- package/.agents/bundles/rpi-session-capture-plan-2025-12-02.md +693 -0
- package/.agents/bundles/rpi-session-capture-research-2025-12-02.md +433 -0
- package/.agents/bundles/session-integration-plan-2025-12-02.md +144 -0
- package/.agents/plans/git-forensics-enhancement-2025-12-05.md +493 -0
- package/.claude/skills/typescript-review.md +152 -0
- package/CHANGELOG.md +53 -0
- package/CLAUDE.md +79 -3
- package/Makefile +160 -0
- package/README.md +141 -155
- package/SECURITY.md +5 -1
- package/assets/logo-dark.svg +47 -0
- package/assets/logo.svg +47 -0
- package/claude-progress.json +54 -4
- package/claude-progress.txt +114 -0
- package/dashboard/app.js +699 -66
- package/dashboard/chart.min.js +20 -0
- package/dashboard/dashboard-data.js +764 -0
- package/dashboard/dashboard-data.json +182 -71
- package/dashboard/index.html +139 -14
- package/dashboard/styles.css +579 -4
- package/dist/analyzers/patterns.d.ts +62 -0
- package/dist/analyzers/patterns.d.ts.map +1 -0
- package/dist/analyzers/patterns.js +103 -0
- package/dist/analyzers/patterns.js.map +1 -0
- package/dist/analyzers/quality.d.ts +58 -0
- package/dist/analyzers/quality.d.ts.map +1 -0
- package/dist/analyzers/quality.js +114 -0
- package/dist/analyzers/quality.js.map +1 -0
- package/dist/analyzers/sessions.d.ts +45 -0
- package/dist/analyzers/sessions.d.ts.map +1 -0
- package/dist/analyzers/sessions.js +123 -0
- package/dist/analyzers/sessions.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +43 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/dashboard.js +4 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/forensics.d.ts +29 -0
- package/dist/commands/forensics.d.ts.map +1 -0
- package/dist/commands/forensics.js +213 -0
- package/dist/commands/forensics.js.map +1 -0
- package/dist/commands/index.d.ts +5 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +13 -3
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/insights.d.ts +3 -0
- package/dist/commands/insights.d.ts.map +1 -0
- package/dist/commands/insights.js +120 -0
- package/dist/commands/insights.js.map +1 -0
- package/dist/commands/learn.d.ts +3 -0
- package/dist/commands/learn.d.ts.map +1 -0
- package/dist/commands/learn.js +161 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/lesson.d.ts +8 -0
- package/dist/commands/lesson.d.ts.map +1 -0
- package/dist/commands/lesson.js +206 -0
- package/dist/commands/lesson.js.map +1 -0
- package/dist/commands/pipeline.d.ts +3 -0
- package/dist/commands/pipeline.d.ts.map +1 -0
- package/dist/commands/pipeline.js +485 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/profile.d.ts +0 -1
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +3 -206
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/session.d.ts +51 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +599 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/sessions.d.ts +20 -0
- package/dist/commands/sessions.d.ts.map +1 -0
- package/dist/commands/sessions.js +201 -0
- package/dist/commands/sessions.js.map +1 -0
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +48 -7
- package/dist/commands/watch.js.map +1 -1
- package/dist/gamification/index.d.ts +1 -3
- package/dist/gamification/index.d.ts.map +1 -1
- package/dist/gamification/index.js +2 -5
- package/dist/gamification/index.js.map +1 -1
- package/dist/gamification/pattern-memory.d.ts +1 -1
- package/dist/gamification/pattern-memory.d.ts.map +1 -1
- package/dist/gamification/pattern-memory.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 +2 -15
- package/dist/gamification/profile.js.map +1 -1
- package/dist/gamification/types.d.ts +8 -2
- package/dist/gamification/types.d.ts.map +1 -1
- package/dist/gamification/types.js.map +1 -1
- package/dist/insights/index.d.ts.map +1 -1
- package/dist/insights/index.js +16 -4
- package/dist/insights/index.js.map +1 -1
- package/dist/insights/types.d.ts +14 -0
- package/dist/insights/types.d.ts.map +1 -1
- package/dist/learning/cadence.d.ts +15 -0
- package/dist/learning/cadence.d.ts.map +1 -0
- package/dist/learning/cadence.js +130 -0
- package/dist/learning/cadence.js.map +1 -0
- package/dist/learning/index.d.ts +19 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +35 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/lessons-storage.d.ts +48 -0
- package/dist/learning/lessons-storage.d.ts.map +1 -0
- package/dist/learning/lessons-storage.js +266 -0
- package/dist/learning/lessons-storage.js.map +1 -0
- package/dist/learning/lessons-types.d.ts +83 -0
- package/dist/learning/lessons-types.d.ts.map +1 -0
- package/dist/learning/lessons-types.js +15 -0
- package/dist/learning/lessons-types.js.map +1 -0
- package/dist/learning/nudges.d.ts +20 -0
- package/dist/learning/nudges.d.ts.map +1 -0
- package/dist/learning/nudges.js +68 -0
- package/dist/learning/nudges.js.map +1 -0
- package/dist/learning/retrospective.d.ts +27 -0
- package/dist/learning/retrospective.d.ts.map +1 -0
- package/dist/learning/retrospective.js +184 -0
- package/dist/learning/retrospective.js.map +1 -0
- package/dist/learning/storage.d.ts +44 -0
- package/dist/learning/storage.d.ts.map +1 -0
- package/dist/learning/storage.js +194 -0
- package/dist/learning/storage.js.map +1 -0
- package/dist/learning/surfacing.d.ts +36 -0
- package/dist/learning/surfacing.d.ts.map +1 -0
- package/dist/learning/surfacing.js +255 -0
- package/dist/learning/surfacing.js.map +1 -0
- package/dist/learning/synthesis.d.ts +17 -0
- package/dist/learning/synthesis.d.ts.map +1 -0
- package/dist/learning/synthesis.js +293 -0
- package/dist/learning/synthesis.js.map +1 -0
- package/dist/learning/types.d.ts +60 -0
- package/dist/learning/types.d.ts.map +1 -0
- package/dist/learning/types.js +17 -0
- package/dist/learning/types.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +11 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/spiral-history.d.ts +62 -0
- package/dist/storage/spiral-history.d.ts.map +1 -0
- package/dist/storage/spiral-history.js +265 -0
- package/dist/storage/spiral-history.js.map +1 -0
- package/docs/ARCHITECTURE.md +2 -10
- package/docs/GAMIFICATION.md +19 -266
- package/docs/METRICS.md +528 -0
- package/docs/VIBE-ECOSYSTEM.md +12 -78
- package/feature-list.json +141 -68
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Learning System Types
|
|
4
|
+
*
|
|
5
|
+
* Types for the automatic learning cadence system including:
|
|
6
|
+
* - Learning state persistence
|
|
7
|
+
* - Nudge queue management
|
|
8
|
+
* - Retrospective summaries
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.PATTERN_WINDOW_DAYS = exports.PATTERN_REPEAT_THRESHOLD = exports.RETRO_CADENCE_DAYS = exports.MAX_PENDING_NUDGES = exports.NUDGE_TTL_DAYS = void 0;
|
|
12
|
+
exports.NUDGE_TTL_DAYS = 7;
|
|
13
|
+
exports.MAX_PENDING_NUDGES = 5;
|
|
14
|
+
exports.RETRO_CADENCE_DAYS = 7;
|
|
15
|
+
exports.PATTERN_REPEAT_THRESHOLD = 3;
|
|
16
|
+
exports.PATTERN_WINDOW_DAYS = 7;
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/learning/types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA6DU,QAAA,cAAc,GAAG,CAAC,CAAC;AACnB,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,kBAAkB,GAAG,CAAC,CAAC;AACvB,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAC7B,QAAA,mBAAmB,GAAG,CAAC,CAAC"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { TimelineStore, StoredSession, StoredInsight, PatternStats, TrendData, W
|
|
|
2
2
|
export { atomicWriteSync, appendLineSync, readNdjsonSync, readNdjsonWithErrors, safeReadJsonSync, ensureGitignore, NdjsonReadResult, } from './atomic';
|
|
3
3
|
export { StoredCommit, getCommitLogPath, appendCommits, readCommitLog, getLastLoggedCommitHash, getCommitLogCount, } from './commit-log';
|
|
4
4
|
export { SchemaVersion, CURRENT_SCHEMA_VERSION, VersionedStore, migrateStore, needsMigration, } from './schema';
|
|
5
|
+
export { SpiralRecord, SpiralResolution, SpiralAdvice, getSpiralHistoryPath, appendSpiral, resolveSpiral, readSpiralHistory, getAdvice, getPatternStats, getPatternDisplayName, getResolutionDisplayName, } from './spiral-history';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,eAAe,EACf,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
|
package/dist/storage/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.needsMigration = exports.migrateStore = exports.CURRENT_SCHEMA_VERSION = exports.getCommitLogCount = exports.getLastLoggedCommitHash = exports.readCommitLog = exports.appendCommits = exports.getCommitLogPath = exports.ensureGitignore = exports.safeReadJsonSync = exports.readNdjsonWithErrors = exports.readNdjsonSync = exports.appendLineSync = exports.atomicWriteSync = exports.getStoreDir = exports.getStorePath = exports.getLastCommitHash = exports.updateStore = exports.createInitialStore = exports.saveStore = exports.loadStore = void 0;
|
|
3
|
+
exports.getResolutionDisplayName = exports.getPatternDisplayName = exports.getPatternStats = exports.getAdvice = exports.readSpiralHistory = exports.resolveSpiral = exports.appendSpiral = exports.getSpiralHistoryPath = exports.needsMigration = exports.migrateStore = exports.CURRENT_SCHEMA_VERSION = exports.getCommitLogCount = exports.getLastLoggedCommitHash = exports.readCommitLog = exports.appendCommits = exports.getCommitLogPath = exports.ensureGitignore = exports.safeReadJsonSync = exports.readNdjsonWithErrors = exports.readNdjsonSync = exports.appendLineSync = exports.atomicWriteSync = exports.getStoreDir = exports.getStorePath = exports.getLastCommitHash = exports.updateStore = exports.createInitialStore = exports.saveStore = exports.loadStore = void 0;
|
|
4
4
|
// Timeline store (computed view)
|
|
5
5
|
var timeline_store_1 = require("./timeline-store");
|
|
6
6
|
Object.defineProperty(exports, "loadStore", { enumerable: true, get: function () { return timeline_store_1.loadStore; } });
|
|
@@ -30,4 +30,14 @@ var schema_1 = require("./schema");
|
|
|
30
30
|
Object.defineProperty(exports, "CURRENT_SCHEMA_VERSION", { enumerable: true, get: function () { return schema_1.CURRENT_SCHEMA_VERSION; } });
|
|
31
31
|
Object.defineProperty(exports, "migrateStore", { enumerable: true, get: function () { return schema_1.migrateStore; } });
|
|
32
32
|
Object.defineProperty(exports, "needsMigration", { enumerable: true, get: function () { return schema_1.needsMigration; } });
|
|
33
|
+
// Spiral history (coaching feature)
|
|
34
|
+
var spiral_history_1 = require("./spiral-history");
|
|
35
|
+
Object.defineProperty(exports, "getSpiralHistoryPath", { enumerable: true, get: function () { return spiral_history_1.getSpiralHistoryPath; } });
|
|
36
|
+
Object.defineProperty(exports, "appendSpiral", { enumerable: true, get: function () { return spiral_history_1.appendSpiral; } });
|
|
37
|
+
Object.defineProperty(exports, "resolveSpiral", { enumerable: true, get: function () { return spiral_history_1.resolveSpiral; } });
|
|
38
|
+
Object.defineProperty(exports, "readSpiralHistory", { enumerable: true, get: function () { return spiral_history_1.readSpiralHistory; } });
|
|
39
|
+
Object.defineProperty(exports, "getAdvice", { enumerable: true, get: function () { return spiral_history_1.getAdvice; } });
|
|
40
|
+
Object.defineProperty(exports, "getPatternStats", { enumerable: true, get: function () { return spiral_history_1.getPatternStats; } });
|
|
41
|
+
Object.defineProperty(exports, "getPatternDisplayName", { enumerable: true, get: function () { return spiral_history_1.getPatternDisplayName; } });
|
|
42
|
+
Object.defineProperty(exports, "getResolutionDisplayName", { enumerable: true, get: function () { return spiral_history_1.getResolutionDisplayName; } });
|
|
33
43
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,mDAe0B;AAPxB,2GAAA,SAAS,OAAA;AACT,2GAAA,SAAS,OAAA;AACT,oHAAA,kBAAkB,OAAA;AAClB,6GAAA,WAAW,OAAA;AACX,mHAAA,iBAAiB,OAAA;AACjB,8GAAA,YAAY,OAAA;AACZ,6GAAA,WAAW,OAAA;AAGb,yBAAyB;AACzB,mCAQkB;AAPhB,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,wGAAA,cAAc,OAAA;AACd,8GAAA,oBAAoB,OAAA;AACpB,0GAAA,gBAAgB,OAAA;AAChB,yGAAA,eAAe,OAAA;AAIjB,sCAAsC;AACtC,2CAOsB;AALpB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AACb,2GAAA,aAAa,OAAA;AACb,qHAAA,uBAAuB,OAAA;AACvB,+GAAA,iBAAiB,OAAA;AAGnB,oBAAoB;AACpB,mCAMkB;AAJhB,gHAAA,sBAAsB,OAAA;AAEtB,sGAAA,YAAY,OAAA;AACZ,wGAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AACjC,mDAe0B;AAPxB,2GAAA,SAAS,OAAA;AACT,2GAAA,SAAS,OAAA;AACT,oHAAA,kBAAkB,OAAA;AAClB,6GAAA,WAAW,OAAA;AACX,mHAAA,iBAAiB,OAAA;AACjB,8GAAA,YAAY,OAAA;AACZ,6GAAA,WAAW,OAAA;AAGb,yBAAyB;AACzB,mCAQkB;AAPhB,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,wGAAA,cAAc,OAAA;AACd,8GAAA,oBAAoB,OAAA;AACpB,0GAAA,gBAAgB,OAAA;AAChB,yGAAA,eAAe,OAAA;AAIjB,sCAAsC;AACtC,2CAOsB;AALpB,8GAAA,gBAAgB,OAAA;AAChB,2GAAA,aAAa,OAAA;AACb,2GAAA,aAAa,OAAA;AACb,qHAAA,uBAAuB,OAAA;AACvB,+GAAA,iBAAiB,OAAA;AAGnB,oBAAoB;AACpB,mCAMkB;AAJhB,gHAAA,sBAAsB,OAAA;AAEtB,sGAAA,YAAY,OAAA;AACZ,wGAAA,cAAc,OAAA;AAGhB,oCAAoC;AACpC,mDAY0B;AARxB,sHAAA,oBAAoB,OAAA;AACpB,8GAAA,YAAY,OAAA;AACZ,+GAAA,aAAa,OAAA;AACb,mHAAA,iBAAiB,OAAA;AACjB,2GAAA,SAAS,OAAA;AACT,iHAAA,eAAe,OAAA;AACf,uHAAA,qBAAqB,OAAA;AACrB,0HAAA,wBAAwB,OAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type SpiralResolution = 'TEST' | 'BREAK' | 'DOCS' | 'HELP' | 'ROLLBACK' | 'OTHER';
|
|
2
|
+
export interface SpiralRecord {
|
|
3
|
+
date: string;
|
|
4
|
+
pattern: string;
|
|
5
|
+
component: string;
|
|
6
|
+
duration: number;
|
|
7
|
+
commits: number;
|
|
8
|
+
resolution?: SpiralResolution;
|
|
9
|
+
resolvedAt?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SpiralAdvice {
|
|
12
|
+
yourHistory: {
|
|
13
|
+
times: number;
|
|
14
|
+
avgDuration: number;
|
|
15
|
+
totalMinutes: number;
|
|
16
|
+
};
|
|
17
|
+
whatWorked: Array<{
|
|
18
|
+
resolution: SpiralResolution;
|
|
19
|
+
times: number;
|
|
20
|
+
avgDuration: number;
|
|
21
|
+
}>;
|
|
22
|
+
suggestion: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get spiral history file path (in user's home directory)
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSpiralHistoryPath(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Append a spiral to history
|
|
30
|
+
*/
|
|
31
|
+
export declare function appendSpiral(pattern: string, component: string, duration: number, commits: number): void;
|
|
32
|
+
/**
|
|
33
|
+
* Resolve the most recent unresolved spiral
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveSpiral(resolution: SpiralResolution): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Read all spiral history
|
|
38
|
+
*/
|
|
39
|
+
export declare function readSpiralHistory(): SpiralRecord[];
|
|
40
|
+
/**
|
|
41
|
+
* Get personalized advice for a pattern
|
|
42
|
+
*/
|
|
43
|
+
export declare function getAdvice(pattern: string, component?: string): SpiralAdvice | null;
|
|
44
|
+
/**
|
|
45
|
+
* Get pattern statistics for insights command
|
|
46
|
+
*/
|
|
47
|
+
export declare function getPatternStats(days?: number): Array<{
|
|
48
|
+
pattern: string;
|
|
49
|
+
times: number;
|
|
50
|
+
avgDuration: number;
|
|
51
|
+
bestFix: SpiralResolution | null;
|
|
52
|
+
components: string[];
|
|
53
|
+
}>;
|
|
54
|
+
/**
|
|
55
|
+
* Friendly pattern names for display
|
|
56
|
+
*/
|
|
57
|
+
export declare function getPatternDisplayName(pattern: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Friendly resolution names for display
|
|
60
|
+
*/
|
|
61
|
+
export declare function getResolutionDisplayName(resolution: SpiralResolution): string;
|
|
62
|
+
//# sourceMappingURL=spiral-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spiral-history.d.ts","sourceRoot":"","sources":["../../src/storage/spiral-history.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAGzF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,EAAE,KAAK,CAAC;QAChB,UAAU,EAAE,gBAAgB,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAgBnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,EAAE,CAElD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAiDlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,SAAK,GACR,KAAK,CAAC;IACP,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC,CA+DD;AA+DD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAW7E"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getSpiralHistoryPath = getSpiralHistoryPath;
|
|
37
|
+
exports.appendSpiral = appendSpiral;
|
|
38
|
+
exports.resolveSpiral = resolveSpiral;
|
|
39
|
+
exports.readSpiralHistory = readSpiralHistory;
|
|
40
|
+
exports.getAdvice = getAdvice;
|
|
41
|
+
exports.getPatternStats = getPatternStats;
|
|
42
|
+
exports.getPatternDisplayName = getPatternDisplayName;
|
|
43
|
+
exports.getResolutionDisplayName = getResolutionDisplayName;
|
|
44
|
+
/**
|
|
45
|
+
* Spiral History Storage
|
|
46
|
+
*
|
|
47
|
+
* Append-only NDJSON log of spiral events with resolution tracking.
|
|
48
|
+
* Enables personalized coaching based on what worked before.
|
|
49
|
+
*/
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const os = __importStar(require("os"));
|
|
52
|
+
const atomic_1 = require("./atomic");
|
|
53
|
+
const HISTORY_DIR = '.vibe-check';
|
|
54
|
+
const HISTORY_FILE = 'spiral-history.ndjson';
|
|
55
|
+
const MAX_RECORDS = 100; // Keep last 100 spirals
|
|
56
|
+
/**
|
|
57
|
+
* Get spiral history file path (in user's home directory)
|
|
58
|
+
*/
|
|
59
|
+
function getSpiralHistoryPath() {
|
|
60
|
+
return path.join(os.homedir(), HISTORY_DIR, HISTORY_FILE);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Append a spiral to history
|
|
64
|
+
*/
|
|
65
|
+
function appendSpiral(pattern, component, duration, commits) {
|
|
66
|
+
const record = {
|
|
67
|
+
date: new Date().toISOString(),
|
|
68
|
+
pattern,
|
|
69
|
+
component,
|
|
70
|
+
duration,
|
|
71
|
+
commits,
|
|
72
|
+
};
|
|
73
|
+
(0, atomic_1.appendLineSync)(getSpiralHistoryPath(), JSON.stringify(record));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the most recent unresolved spiral
|
|
77
|
+
*/
|
|
78
|
+
function resolveSpiral(resolution) {
|
|
79
|
+
const records = readSpiralHistory();
|
|
80
|
+
// Find most recent unresolved spiral
|
|
81
|
+
for (let i = records.length - 1; i >= 0; i--) {
|
|
82
|
+
if (!records[i].resolution) {
|
|
83
|
+
records[i].resolution = resolution;
|
|
84
|
+
records[i].resolvedAt = new Date().toISOString();
|
|
85
|
+
// Rewrite entire file (since we're modifying existing record)
|
|
86
|
+
rewriteHistory(records);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return false; // No unresolved spiral found
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read all spiral history
|
|
94
|
+
*/
|
|
95
|
+
function readSpiralHistory() {
|
|
96
|
+
return (0, atomic_1.readNdjsonSync)(getSpiralHistoryPath());
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get personalized advice for a pattern
|
|
100
|
+
*/
|
|
101
|
+
function getAdvice(pattern, component) {
|
|
102
|
+
const records = readSpiralHistory();
|
|
103
|
+
// Filter to matching pattern (and optionally component)
|
|
104
|
+
const matching = records.filter((r) => r.pattern === pattern && (!component || r.component === component));
|
|
105
|
+
if (matching.length === 0) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Calculate history stats
|
|
109
|
+
const totalDuration = matching.reduce((sum, r) => sum + r.duration, 0);
|
|
110
|
+
const avgDuration = Math.round(totalDuration / matching.length);
|
|
111
|
+
// Group by resolution
|
|
112
|
+
const resolutionStats = new Map();
|
|
113
|
+
for (const record of matching) {
|
|
114
|
+
if (record.resolution) {
|
|
115
|
+
const stats = resolutionStats.get(record.resolution) || { times: 0, totalDuration: 0 };
|
|
116
|
+
stats.times++;
|
|
117
|
+
stats.totalDuration += record.duration;
|
|
118
|
+
resolutionStats.set(record.resolution, stats);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Sort by frequency
|
|
122
|
+
const whatWorked = Array.from(resolutionStats.entries())
|
|
123
|
+
.map(([resolution, stats]) => ({
|
|
124
|
+
resolution,
|
|
125
|
+
times: stats.times,
|
|
126
|
+
avgDuration: Math.round(stats.totalDuration / stats.times),
|
|
127
|
+
}))
|
|
128
|
+
.sort((a, b) => b.times - a.times);
|
|
129
|
+
// Generate suggestion
|
|
130
|
+
const suggestion = generateSuggestion(pattern, whatWorked, matching.length);
|
|
131
|
+
return {
|
|
132
|
+
yourHistory: {
|
|
133
|
+
times: matching.length,
|
|
134
|
+
avgDuration,
|
|
135
|
+
totalMinutes: totalDuration,
|
|
136
|
+
},
|
|
137
|
+
whatWorked,
|
|
138
|
+
suggestion,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get pattern statistics for insights command
|
|
143
|
+
*/
|
|
144
|
+
function getPatternStats(days = 30) {
|
|
145
|
+
const records = readSpiralHistory();
|
|
146
|
+
const cutoff = new Date();
|
|
147
|
+
cutoff.setDate(cutoff.getDate() - days);
|
|
148
|
+
// Filter to recent records
|
|
149
|
+
const recent = records.filter((r) => new Date(r.date) >= cutoff);
|
|
150
|
+
// Group by pattern
|
|
151
|
+
const patternStats = new Map();
|
|
152
|
+
for (const record of recent) {
|
|
153
|
+
const stats = patternStats.get(record.pattern) || {
|
|
154
|
+
times: 0,
|
|
155
|
+
totalDuration: 0,
|
|
156
|
+
resolutions: new Map(),
|
|
157
|
+
components: new Set(),
|
|
158
|
+
};
|
|
159
|
+
stats.times++;
|
|
160
|
+
stats.totalDuration += record.duration;
|
|
161
|
+
stats.components.add(record.component);
|
|
162
|
+
if (record.resolution) {
|
|
163
|
+
stats.resolutions.set(record.resolution, (stats.resolutions.get(record.resolution) || 0) + 1);
|
|
164
|
+
}
|
|
165
|
+
patternStats.set(record.pattern, stats);
|
|
166
|
+
}
|
|
167
|
+
// Convert to array and sort by frequency
|
|
168
|
+
return Array.from(patternStats.entries())
|
|
169
|
+
.map(([pattern, stats]) => {
|
|
170
|
+
// Find most common resolution
|
|
171
|
+
let bestFix = null;
|
|
172
|
+
let maxCount = 0;
|
|
173
|
+
for (const [resolution, count] of stats.resolutions) {
|
|
174
|
+
if (count > maxCount) {
|
|
175
|
+
maxCount = count;
|
|
176
|
+
bestFix = resolution;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
pattern,
|
|
181
|
+
times: stats.times,
|
|
182
|
+
avgDuration: Math.round(stats.totalDuration / stats.times),
|
|
183
|
+
bestFix,
|
|
184
|
+
components: Array.from(stats.components),
|
|
185
|
+
};
|
|
186
|
+
})
|
|
187
|
+
.sort((a, b) => b.times - a.times);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Rewrite entire history (used when modifying records)
|
|
191
|
+
*/
|
|
192
|
+
function rewriteHistory(records) {
|
|
193
|
+
const filePath = getSpiralHistoryPath();
|
|
194
|
+
// Trim to max records
|
|
195
|
+
const trimmed = records.slice(-MAX_RECORDS);
|
|
196
|
+
// Write each record as a line
|
|
197
|
+
const content = trimmed.map((r) => JSON.stringify(r)).join('\n') + '\n';
|
|
198
|
+
// Use atomic write for safety
|
|
199
|
+
(0, atomic_1.atomicWriteSync)(filePath, content);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Generate actionable suggestion based on history
|
|
203
|
+
*/
|
|
204
|
+
function generateSuggestion(pattern, whatWorked, totalTimes) {
|
|
205
|
+
// Pattern-specific base advice
|
|
206
|
+
const patternAdvice = {
|
|
207
|
+
SECRETS_AUTH: 'Write a test that validates your auth/token assumptions',
|
|
208
|
+
VOLUME_CONFIG: 'Check mount paths and permissions with a minimal test pod',
|
|
209
|
+
API_MISMATCH: 'Verify API version and schema against the docs',
|
|
210
|
+
SSL_TLS: 'Test certificate chain and FIPS compliance in isolation',
|
|
211
|
+
IMAGE_REGISTRY: 'Verify image exists and credentials are valid with docker pull',
|
|
212
|
+
GITOPS_DRIFT: 'Sync with ArgoCD and check for resource conflicts',
|
|
213
|
+
};
|
|
214
|
+
const baseAdvice = patternAdvice[pattern] || 'Take a step back and validate your assumptions';
|
|
215
|
+
// If we have history of what worked, personalize
|
|
216
|
+
if (whatWorked.length > 0) {
|
|
217
|
+
const best = whatWorked[0];
|
|
218
|
+
const resolutionText = {
|
|
219
|
+
TEST: 'writing a test',
|
|
220
|
+
BREAK: 'taking a break',
|
|
221
|
+
DOCS: 'reading the docs',
|
|
222
|
+
HELP: 'asking for help',
|
|
223
|
+
ROLLBACK: 'rolling back',
|
|
224
|
+
OTHER: 'trying something different',
|
|
225
|
+
};
|
|
226
|
+
if (best.times >= 2) {
|
|
227
|
+
return `Your go-to: ${resolutionText[best.resolution]} (worked ${best.times}x). ${baseAdvice}`;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// First time or no resolution data
|
|
231
|
+
if (totalTimes === 1) {
|
|
232
|
+
return baseAdvice;
|
|
233
|
+
}
|
|
234
|
+
return `You've hit this ${totalTimes}x. ${baseAdvice}`;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Friendly pattern names for display
|
|
238
|
+
*/
|
|
239
|
+
function getPatternDisplayName(pattern) {
|
|
240
|
+
const names = {
|
|
241
|
+
SECRETS_AUTH: 'OAuth/Token Issues',
|
|
242
|
+
VOLUME_CONFIG: 'Volume/Mount Issues',
|
|
243
|
+
API_MISMATCH: 'API Version/Schema Issues',
|
|
244
|
+
SSL_TLS: 'SSL/TLS/Certificate Issues',
|
|
245
|
+
IMAGE_REGISTRY: 'Image/Registry Issues',
|
|
246
|
+
GITOPS_DRIFT: 'GitOps Sync Issues',
|
|
247
|
+
OTHER: 'Other Issues',
|
|
248
|
+
};
|
|
249
|
+
return names[pattern] || pattern;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Friendly resolution names for display
|
|
253
|
+
*/
|
|
254
|
+
function getResolutionDisplayName(resolution) {
|
|
255
|
+
const names = {
|
|
256
|
+
TEST: 'Wrote a test',
|
|
257
|
+
BREAK: 'Took a break',
|
|
258
|
+
DOCS: 'Read the docs',
|
|
259
|
+
HELP: 'Asked for help',
|
|
260
|
+
ROLLBACK: 'Rolled back',
|
|
261
|
+
OTHER: 'Other',
|
|
262
|
+
};
|
|
263
|
+
return names[resolution];
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=spiral-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spiral-history.js","sourceRoot":"","sources":["../../src/storage/spiral-history.ts"],"names":[],"mappings":"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"}
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -77,15 +77,8 @@ src/
|
|
|
77
77
|
│ ├── xp.ts # XP calculation, levels
|
|
78
78
|
│ ├── streaks.ts # Streak tracking
|
|
79
79
|
│ ├── achievements.ts # Achievement definitions
|
|
80
|
-
│ ├── challenges.ts # Weekly challenges
|
|
81
|
-
│ ├── leaderboards.ts # Personal high scores
|
|
82
|
-
│ ├── hall-of-fame.ts # Personal records
|
|
83
80
|
│ ├── stats.ts # Weekly stats, sparklines
|
|
84
|
-
│
|
|
85
|
-
│ ├── share.ts # Shareable profiles
|
|
86
|
-
│ ├── profile.ts # Profile persistence
|
|
87
|
-
│ ├── pattern-memory.ts # Spiral trigger tracking
|
|
88
|
-
│ └── intervention-memory.ts # What breaks spirals
|
|
81
|
+
│ └── profile.ts # Profile persistence
|
|
89
82
|
│
|
|
90
83
|
└── output/ # Output formatters
|
|
91
84
|
├── index.ts # Format router
|
|
@@ -345,8 +338,7 @@ const XP_REWARDS = {
|
|
|
345
338
|
|
|
346
339
|
```
|
|
347
340
|
~/.vibe-check/ # Global (cross-repo)
|
|
348
|
-
|
|
349
|
-
└── leaderboards.json # Personal high scores
|
|
341
|
+
└── profile.json # User profile
|
|
350
342
|
|
|
351
343
|
.vibe-check/ # Per-repo (optional)
|
|
352
344
|
└── profile.json # Repo-specific profile
|