@vibe-validate/history 0.14.2 → 0.15.0-rc.1

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/README.md CHANGED
@@ -108,14 +108,14 @@ const config: HistoryConfig = {
108
108
  enabled: true,
109
109
 
110
110
  gitNotes: {
111
- ref: 'vibe-validate/runs', // Git notes ref namespace
112
- maxRunsPerTree: 10, // Keep last 10 runs per tree
113
- maxOutputBytes: 10000, // 10KB max per step output
111
+ ref: 'vibe-validate/validate', // Git notes ref namespace (v0.15.0: changed from 'runs')
112
+ maxRunsPerTree: 10, // Keep last 10 runs per tree
113
+ maxOutputBytes: 10000, // 10KB max per step output
114
114
  },
115
115
 
116
116
  retention: {
117
- warnAfterDays: 90, // Warn about notes >90 days old
118
- warnAfterCount: 100, // Warn when >100 tree hashes
117
+ warnAfterDays: 30, // Warn about notes >30 days old (v0.15.0: was 90)
118
+ warnAfterCount: 1000, // Warn when >1000 tree hashes (v0.15.0: was 100, adjusted for run caching)
119
119
  },
120
120
  };
121
121
  ```
@@ -21,12 +21,12 @@ export async function checkHistoryHealth(config = {}) {
21
21
  // Type assertion safe: DEFAULT_HISTORY_CONFIG is Required<HistoryConfig>
22
22
  const warnAfterDays = (mergedConfig.retention.warnAfterDays ?? DEFAULT_HISTORY_CONFIG.retention.warnAfterDays);
23
23
  const warnAfterCount = (mergedConfig.retention.warnAfterCount ?? DEFAULT_HISTORY_CONFIG.retention.warnAfterCount);
24
- const allNotes = await getAllHistoryNotes(mergedConfig.gitNotes?.ref || DEFAULT_HISTORY_CONFIG.gitNotes.ref);
24
+ const allNotes = await getAllHistoryNotes(mergedConfig.gitNotes.ref);
25
25
  const totalNotes = allNotes.length;
26
26
  const cutoffTime = Date.now() - warnAfterDays * 24 * 60 * 60 * 1000;
27
27
  let oldNotesCount = 0;
28
28
  for (const note of allNotes) {
29
- if (!note.runs || note.runs.length === 0) {
29
+ if (note.runs.length === 0) {
30
30
  continue;
31
31
  }
32
32
  // Check oldest run
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../src/health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAwB,EAAE;IAE1B,MAAM,YAAY,GAAG;QACnB,GAAG,sBAAsB;QACzB,GAAG,MAAM;QACT,SAAS,EAAE;YACT,GAAG,sBAAsB,CAAC,SAAS;YACnC,GAAG,MAAM,CAAC,SAAS;SACpB;KACF,CAAC;IAEF,yEAAyE;IACzE,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,IAAI,sBAAsB,CAAC,SAAS,CAAC,aAAa,CAAW,CAAC;IACzH,MAAM,cAAc,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,IAAI,sBAAsB,CAAC,SAAS,CAAC,cAAc,CAAW,CAAC;IAE5H,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACvC,YAAY,CAAC,QAAQ,EAAE,GAAG,IAAI,sBAAsB,CAAC,QAAQ,CAAC,GAAG,CAClE,CAAC;IAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEpE,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAEhE,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;YACjC,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;IACpD,MAAM,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,eAAe,IAAI,aAAa,CAAC;IAEpD,IAAI,cAAkC,CAAC;IAEvC,IAAI,eAAe,IAAI,aAAa,EAAE,CAAC;QACrC,cAAc;YACZ,2CAA2C,UAAU,iBAAiB;gBACtE,YAAY,aAAa,qBAAqB,aAAa,SAAS;gBACpE,kEAAkE,aAAa,QAAQ,CAAC;IAC5F,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,cAAc;YACZ,2CAA2C,UAAU,iBAAiB;gBACtE,kEAAkE,aAAa,QAAQ,CAAC;IAC5F,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,cAAc;YACZ,2CAA2C,aAAa,SAAS;gBACjE,MAAM,aAAa,8BAA8B;gBACjD,qDAAqD,aAAa,QAAQ,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,UAAU;QACV,aAAa;QACb,UAAU;QACV,cAAc;KACf,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"health-check.js","sourceRoot":"","sources":["../src/health-check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAwB,EAAE;IAE1B,MAAM,YAAY,GAAG;QACnB,GAAG,sBAAsB;QACzB,GAAG,MAAM;QACT,SAAS,EAAE;YACT,GAAG,sBAAsB,CAAC,SAAS;YACnC,GAAG,MAAM,CAAC,SAAS;SACpB;KACF,CAAC;IAEF,yEAAyE;IACzE,MAAM,aAAa,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,aAAa,IAAI,sBAAsB,CAAC,SAAS,CAAC,aAAa,CAAW,CAAC;IACzH,MAAM,cAAc,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,IAAI,sBAAsB,CAAC,SAAS,CAAC,cAAc,CAAW,CAAC;IAE5H,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACvC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC1B,CAAC;IAEF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAEpE,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,eAAe,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAEhE,IAAI,eAAe,GAAG,UAAU,EAAE,CAAC;YACjC,aAAa,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;IACpD,MAAM,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,eAAe,IAAI,aAAa,CAAC;IAEpD,IAAI,cAAkC,CAAC;IAEvC,IAAI,eAAe,IAAI,aAAa,EAAE,CAAC;QACrC,cAAc;YACZ,2CAA2C,UAAU,iBAAiB;gBACtE,YAAY,aAAa,qBAAqB,aAAa,SAAS;gBACpE,kEAAkE,aAAa,QAAQ,CAAC;IAC5F,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,cAAc;YACZ,2CAA2C,UAAU,iBAAiB;gBACtE,kEAAkE,aAAa,QAAQ,CAAC;IAC5F,CAAC;SAAM,IAAI,aAAa,EAAE,CAAC;QACzB,cAAc;YACZ,2CAA2C,aAAa,SAAS;gBACjE,MAAM,aAAa,8BAA8B;gBACjD,qDAAqD,aAAa,QAAQ,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,UAAU;QACV,aAAa;QACb,UAAU;QACV,cAAc;KACf,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,11 +3,12 @@
3
3
  *
4
4
  * @packageDocumentation
5
5
  */
6
- export type { ValidationRun, HistoryNote, RecordResult, StabilityCheck, HistoryConfig, HealthCheckResult, PruneResult, } from './types.js';
6
+ export type { ValidationRun, HistoryNote, RecordResult, StabilityCheck, HistoryConfig, HealthCheckResult, PruneResult, RunCacheNote, } from './types.js';
7
7
  export { DEFAULT_HISTORY_CONFIG } from './types.js';
8
8
  export { recordValidationHistory, checkWorktreeStability, } from './recorder.js';
9
9
  export { readHistoryNote, listHistoryTreeHashes, getAllHistoryNotes, hasHistoryForTree, } from './reader.js';
10
- export { pruneHistoryByAge, pruneAllHistory } from './pruner.js';
10
+ export { listRunCacheEntries, getRunCacheEntry, getAllRunCacheForTree, listRunCacheTreeHashes, getAllRunCacheEntries, type RunCacheEntryMeta, } from './run-cache-reader.js';
11
+ export { pruneHistoryByAge, pruneAllHistory, pruneLegacyNotes, pruneAllRunCache } from './pruner.js';
11
12
  export { checkHistoryHealth } from './health-check.js';
12
13
  export { truncateValidationOutput } from './truncate.js';
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,aAAa,EACb,WAAW,EACX,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGrG,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -8,8 +8,10 @@ export { DEFAULT_HISTORY_CONFIG } from './types.js';
8
8
  export { recordValidationHistory, checkWorktreeStability, } from './recorder.js';
9
9
  // Reader
10
10
  export { readHistoryNote, listHistoryTreeHashes, getAllHistoryNotes, hasHistoryForTree, } from './reader.js';
11
+ // Run cache reader
12
+ export { listRunCacheEntries, getRunCacheEntry, getAllRunCacheForTree, listRunCacheTreeHashes, getAllRunCacheEntries, } from './run-cache-reader.js';
11
13
  // Pruner
12
- export { pruneHistoryByAge, pruneAllHistory } from './pruner.js';
14
+ export { pruneHistoryByAge, pruneAllHistory, pruneLegacyNotes, pruneAllRunCache } from './pruner.js';
13
15
  // Health check
14
16
  export { checkHistoryHealth } from './health-check.js';
15
17
  // Truncate
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,WAAW;AACX,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,SAAS;AACT,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,SAAS;AACT,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,WAAW;AACX,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,WAAW;AACX,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,SAAS;AACT,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,mBAAmB;AACnB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GAEtB,MAAM,uBAAuB,CAAC;AAE/B,SAAS;AACT,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAErG,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,WAAW;AACX,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
package/dist/pruner.d.ts CHANGED
@@ -19,4 +19,21 @@ export declare function pruneHistoryByAge(olderThanDays: number, config?: Histor
19
19
  * @returns Prune result
20
20
  */
21
21
  export declare function pruneAllHistory(config?: HistoryConfig, dryRun?: boolean): Promise<PruneResult>;
22
+ /**
23
+ * Clean up legacy git notes from pre-0.15.0 versions
24
+ *
25
+ * Removes notes from the old `refs/notes/vibe-validate/runs` namespace.
26
+ * Safe to call - only removes if legacy notes exist.
27
+ *
28
+ * @param dryRun - If true, don't actually delete (default: false)
29
+ * @returns Prune result
30
+ */
31
+ export declare function pruneLegacyNotes(dryRun?: boolean): Promise<PruneResult>;
32
+ /**
33
+ * Prune all run cache entries
34
+ *
35
+ * @param dryRun - If true, don't actually delete (default: false)
36
+ * @returns Prune result
37
+ */
38
+ export declare function pruneAllRunCache(dryRun?: boolean): Promise<PruneResult>;
22
39
  //# sourceMappingURL=pruner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruner.d.ts","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAW7D;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CAsDtB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CAwCtB"}
1
+ {"version":3,"file":"pruner.d.ts","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAY7D;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CAsDtB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,GAAE,aAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,OAAO,CAAC,WAAW,CAAC,CAwCtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAoCpF;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,WAAW,CAAC,CAgCpF"}
package/dist/pruner.js CHANGED
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * History pruning utilities
3
3
  */
4
- import { execSync } from 'child_process';
4
+ import { execSync } from 'node:child_process';
5
5
  import { DEFAULT_HISTORY_CONFIG } from './types.js';
6
6
  import { getAllHistoryNotes } from './reader.js';
7
+ import { listRunCacheTreeHashes, getAllRunCacheForTree } from './run-cache-reader.js';
7
8
  const GIT_TIMEOUT = 30000;
8
9
  const GIT_OPTIONS = {
9
10
  encoding: 'utf8',
@@ -35,7 +36,7 @@ export async function pruneHistoryByAge(olderThanDays, config = {}, dryRun = fal
35
36
  const allNotes = await getAllHistoryNotes(notesRef);
36
37
  const notesRemaining = allNotes.length;
37
38
  for (const note of allNotes) {
38
- if (!note.runs || note.runs.length === 0) {
39
+ if (note.runs?.length === 0) {
39
40
  continue;
40
41
  }
41
42
  // Get oldest run timestamp
@@ -94,7 +95,7 @@ export async function pruneAllHistory(config = {}, dryRun = false) {
94
95
  }
95
96
  }
96
97
  notesPruned++;
97
- runsPruned += note.runs?.length || 0;
98
+ runsPruned += note.runs?.length ?? 0;
98
99
  prunedTreeHashes.push(note.treeHash);
99
100
  }
100
101
  return {
@@ -104,4 +105,77 @@ export async function pruneAllHistory(config = {}, dryRun = false) {
104
105
  prunedTreeHashes,
105
106
  };
106
107
  }
108
+ /**
109
+ * Clean up legacy git notes from pre-0.15.0 versions
110
+ *
111
+ * Removes notes from the old `refs/notes/vibe-validate/runs` namespace.
112
+ * Safe to call - only removes if legacy notes exist.
113
+ *
114
+ * @param dryRun - If true, don't actually delete (default: false)
115
+ * @returns Prune result
116
+ */
117
+ export async function pruneLegacyNotes(dryRun = false) {
118
+ const legacyRef = 'vibe-validate/runs';
119
+ let notesPruned = 0;
120
+ let runsPruned = 0;
121
+ const prunedTreeHashes = [];
122
+ try {
123
+ const allNotes = await getAllHistoryNotes(legacyRef);
124
+ for (const note of allNotes) {
125
+ if (!dryRun) {
126
+ try {
127
+ execSync(`git notes --ref=${legacyRef} remove ${note.treeHash}`, { ...GIT_OPTIONS, stdio: 'ignore' });
128
+ }
129
+ catch {
130
+ // Ignore errors
131
+ }
132
+ }
133
+ notesPruned++;
134
+ runsPruned += note.runs?.length ?? 0;
135
+ prunedTreeHashes.push(note.treeHash);
136
+ }
137
+ }
138
+ catch {
139
+ // No legacy notes found - that's fine
140
+ }
141
+ return {
142
+ notesPruned,
143
+ runsPruned,
144
+ notesRemaining: 0,
145
+ prunedTreeHashes,
146
+ };
147
+ }
148
+ /**
149
+ * Prune all run cache entries
150
+ *
151
+ * @param dryRun - If true, don't actually delete (default: false)
152
+ * @returns Prune result
153
+ */
154
+ export async function pruneAllRunCache(dryRun = false) {
155
+ const treeHashes = await listRunCacheTreeHashes();
156
+ let notesPruned = 0;
157
+ const prunedTreeHashes = [];
158
+ for (const treeHash of treeHashes) {
159
+ const entries = await getAllRunCacheForTree(treeHash);
160
+ if (entries.length > 0) {
161
+ if (!dryRun) {
162
+ try {
163
+ // Delete all run cache notes under this tree hash
164
+ execSync(`git for-each-ref --format="%(refname)" refs/notes/vibe-validate/run/${treeHash}/ | xargs -I {} git update-ref -d {}`, { ...GIT_OPTIONS, stdio: 'ignore' });
165
+ }
166
+ catch {
167
+ // Ignore errors
168
+ }
169
+ }
170
+ notesPruned += entries.length;
171
+ prunedTreeHashes.push(treeHash);
172
+ }
173
+ }
174
+ return {
175
+ notesPruned,
176
+ runsPruned: notesPruned, // For run cache, each note is one cached command
177
+ notesRemaining: 0,
178
+ prunedTreeHashes,
179
+ };
180
+ }
107
181
  //# sourceMappingURL=pruner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pruner.js","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pruner.js","sourceRoot":"","sources":["../src/pruner.ts"],"names":[],"mappings":"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"}
package/dist/reader.d.ts CHANGED
@@ -6,21 +6,21 @@ import type { HistoryNote } from './types.js';
6
6
  * Read validation history note for a tree hash
7
7
  *
8
8
  * @param treeHash - Git tree hash
9
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
9
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
10
10
  * @returns History note or null if not found
11
11
  */
12
12
  export declare function readHistoryNote(treeHash: string, notesRef?: string): Promise<HistoryNote | null>;
13
13
  /**
14
14
  * List all tree hashes with validation history
15
15
  *
16
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
16
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
17
17
  * @returns Array of tree hashes with notes
18
18
  */
19
19
  export declare function listHistoryTreeHashes(notesRef?: string): Promise<string[]>;
20
20
  /**
21
21
  * Get all validation history notes
22
22
  *
23
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
23
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
24
24
  * @returns Array of all history notes
25
25
  */
26
26
  export declare function getAllHistoryNotes(notesRef?: string): Promise<HistoryNote[]>;
@@ -28,7 +28,7 @@ export declare function getAllHistoryNotes(notesRef?: string): Promise<HistoryNo
28
28
  * Check if validation history exists for a tree hash
29
29
  *
30
30
  * @param treeHash - Git tree hash
31
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
31
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
32
32
  * @returns True if history exists
33
33
  */
34
34
  export declare function hasHistoryForTree(treeHash: string, notesRef?: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS9C;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAA6B,GACtC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAa7B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,GAAE,MAA6B,GACtC,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,GAAE,MAA6B,GACtC,OAAO,CAAC,WAAW,EAAE,CAAC,CAYxB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAA6B,GACtC,OAAO,CAAC,OAAO,CAAC,CAGlB"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAS9C;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA4C7B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,WAAW,EAAE,CAAC,CAYxB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,OAAO,CAAC,CAGlB"}
package/dist/reader.js CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Git notes reader
3
3
  */
4
- import { execSync } from 'child_process';
4
+ import { execSync } from 'node:child_process';
5
5
  import { parse as parseYaml } from 'yaml';
6
+ import { safeValidateResult } from '@vibe-validate/core';
6
7
  const GIT_TIMEOUT = 30000;
7
8
  const GIT_OPTIONS = {
8
9
  encoding: 'utf8',
@@ -13,27 +14,53 @@ const GIT_OPTIONS = {
13
14
  * Read validation history note for a tree hash
14
15
  *
15
16
  * @param treeHash - Git tree hash
16
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
17
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
17
18
  * @returns History note or null if not found
18
19
  */
19
- export async function readHistoryNote(treeHash, notesRef = 'vibe-validate/runs') {
20
+ export async function readHistoryNote(treeHash, notesRef = 'vibe-validate/validate') {
20
21
  try {
21
22
  const yaml = execSync(`git notes --ref=${notesRef} show ${treeHash}`, GIT_OPTIONS);
22
- const note = parseYaml(yaml);
23
- return note;
23
+ const parsed = parseYaml(yaml);
24
+ // Validate as HistoryNote structure
25
+ if (!parsed || typeof parsed !== 'object' || !('runs' in parsed) || !Array.isArray(parsed.runs)) {
26
+ console.warn(`Invalid history note structure for ${treeHash} - missing runs array`);
27
+ return null;
28
+ }
29
+ // Validate each ValidationResult in runs array using safe validation
30
+ const validatedRuns = [];
31
+ for (const run of parsed.runs) {
32
+ if (!run.result) {
33
+ console.warn(`Run ${run.id} missing result field - skipping`);
34
+ continue;
35
+ }
36
+ const validationResult = safeValidateResult(run.result);
37
+ if (!validationResult.success) {
38
+ console.warn(`Invalid ValidationResult in run ${run.id}:`, validationResult.errors);
39
+ console.warn('Skipping corrupted run entry');
40
+ continue;
41
+ }
42
+ validatedRuns.push({
43
+ ...run,
44
+ result: validationResult.data,
45
+ });
46
+ }
47
+ return {
48
+ treeHash: parsed.treeHash ?? treeHash,
49
+ runs: validatedRuns,
50
+ };
24
51
  }
25
- catch (_error) {
26
- // Note doesn't exist - this is fine
52
+ catch {
53
+ // Note doesn't exist - this is expected for first-time validation
27
54
  return null;
28
55
  }
29
56
  }
30
57
  /**
31
58
  * List all tree hashes with validation history
32
59
  *
33
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
60
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
34
61
  * @returns Array of tree hashes with notes
35
62
  */
36
- export async function listHistoryTreeHashes(notesRef = 'vibe-validate/runs') {
63
+ export async function listHistoryTreeHashes(notesRef = 'vibe-validate/validate') {
37
64
  try {
38
65
  const output = execSync(`git notes --ref=${notesRef} list`, GIT_OPTIONS);
39
66
  if (!output.trim()) {
@@ -50,18 +77,18 @@ export async function listHistoryTreeHashes(notesRef = 'vibe-validate/runs') {
50
77
  .filter(Boolean);
51
78
  return treeHashes;
52
79
  }
53
- catch (_error) {
54
- // No notes exist yet
80
+ catch {
81
+ // No notes exist yet - expected for new repos
55
82
  return [];
56
83
  }
57
84
  }
58
85
  /**
59
86
  * Get all validation history notes
60
87
  *
61
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
88
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
62
89
  * @returns Array of all history notes
63
90
  */
64
- export async function getAllHistoryNotes(notesRef = 'vibe-validate/runs') {
91
+ export async function getAllHistoryNotes(notesRef = 'vibe-validate/validate') {
65
92
  const treeHashes = await listHistoryTreeHashes(notesRef);
66
93
  const notes = [];
67
94
  for (const treeHash of treeHashes) {
@@ -76,10 +103,10 @@ export async function getAllHistoryNotes(notesRef = 'vibe-validate/runs') {
76
103
  * Check if validation history exists for a tree hash
77
104
  *
78
105
  * @param treeHash - Git tree hash
79
- * @param notesRef - Git notes ref (default: vibe-validate/runs)
106
+ * @param notesRef - Git notes ref (default: vibe-validate/validate)
80
107
  * @returns True if history exists
81
108
  */
82
- export async function hasHistoryForTree(treeHash, notesRef = 'vibe-validate/runs') {
109
+ export async function hasHistoryForTree(treeHash, notesRef = 'vibe-validate/validate') {
83
110
  const note = await readHistoryNote(treeHash, notesRef);
84
111
  return note !== null;
85
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG;IAClB,QAAQ,EAAE,MAAe;IACzB,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAA+B;CAChE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,WAAmB,oBAAoB;IAEvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CACnB,mBAAmB,QAAQ,SAAS,QAAQ,EAAE,EAC9C,WAAW,CACZ,CAAC;QAEF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAgB,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,oCAAoC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,oBAAoB;IAEvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,mBAAmB,QAAQ,OAAO,EAAE,WAAW,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,0CAA0C;QAC1C,MAAM,UAAU,GAAG,MAAM;aACtB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;QAC/B,CAAC,CAAC;aACD,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,qBAAqB;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,oBAAoB;IAEvC,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,WAAmB,oBAAoB;IAEvC,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}
package/dist/recorder.js CHANGED
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Git notes recorder
3
3
  */
4
- import { execSync } from 'child_process';
5
- import { writeFileSync, unlinkSync } from 'fs';
6
- import { tmpdir } from 'os';
7
- import { join } from 'path';
4
+ import { execSync } from 'node:child_process';
5
+ import { writeFileSync, unlinkSync } from 'node:fs';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
8
  import { stringify as stringifyYaml } from 'yaml';
9
9
  import { getGitTreeHash, hasWorkingTreeChanges } from '@vibe-validate/git';
10
10
  import { DEFAULT_HISTORY_CONFIG } from './types.js';
@@ -84,7 +84,7 @@ export async function recordValidationHistory(treeHash, result, config = {}) {
84
84
  };
85
85
  // Calculate duration from result phases if available (convert to milliseconds)
86
86
  if (result.phases && result.phases.length > 0) {
87
- newRun.duration = result.phases.reduce((total, phase) => total + (phase.durationSecs || 0) * 1000, 0);
87
+ newRun.duration = result.phases.reduce((total, phase) => total + phase.durationSecs * 1000, 0);
88
88
  }
89
89
  // 3. Append or create
90
90
  let note;
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Run cache reader - Read run cache entries from git notes
3
+ *
4
+ * Run cache is stored at: refs/notes/vibe-validate/run/{treeHash}/{cacheKey}
5
+ * where cacheKey = encodeURIComponent(workdir ? `${workdir}:${command}` : command)
6
+ */
7
+ import type { RunCacheNote } from './types.js';
8
+ /**
9
+ * Entry metadata from git notes list
10
+ */
11
+ export interface RunCacheEntryMeta {
12
+ treeHash: string;
13
+ cacheKey: string;
14
+ refPath: string;
15
+ }
16
+ /**
17
+ * List all run cache entries for a tree hash
18
+ *
19
+ * @param treeHash - Git tree hash
20
+ * @returns Array of run cache entry metadata
21
+ */
22
+ export declare function listRunCacheEntries(treeHash: string): Promise<RunCacheEntryMeta[]>;
23
+ /**
24
+ * Get a specific run cache entry
25
+ *
26
+ * @param treeHash - Git tree hash
27
+ * @param cacheKey - URL-encoded cache key
28
+ * @returns Run cache note or null if not found
29
+ */
30
+ export declare function getRunCacheEntry(treeHash: string, cacheKey: string): Promise<RunCacheNote | null>;
31
+ /**
32
+ * Get all run cache entries for a tree hash
33
+ *
34
+ * @param treeHash - Git tree hash
35
+ * @returns Array of all run cache notes for this tree hash
36
+ */
37
+ export declare function getAllRunCacheForTree(treeHash: string): Promise<RunCacheNote[]>;
38
+ /**
39
+ * List all tree hashes that have run cache entries
40
+ *
41
+ * @returns Array of tree hashes with run cache
42
+ */
43
+ export declare function listRunCacheTreeHashes(): Promise<string[]>;
44
+ /**
45
+ * Get all run cache entries across all tree hashes
46
+ *
47
+ * @returns Array of all run cache notes
48
+ */
49
+ export declare function getAllRunCacheEntries(): Promise<RunCacheNote[]>;
50
+ //# sourceMappingURL=run-cache-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cache-reader.d.ts","sourceRoot":"","sources":["../src/run-cache-reader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS/C;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAqCxF;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAW9B;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAYrF;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BhE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAarE"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Run cache reader - Read run cache entries from git notes
3
+ *
4
+ * Run cache is stored at: refs/notes/vibe-validate/run/{treeHash}/{cacheKey}
5
+ * where cacheKey = encodeURIComponent(workdir ? `${workdir}:${command}` : command)
6
+ */
7
+ import { execSync } from 'node:child_process';
8
+ import { parse as parseYaml } from 'yaml';
9
+ const GIT_TIMEOUT = 30000;
10
+ const GIT_OPTIONS = {
11
+ encoding: 'utf8',
12
+ timeout: GIT_TIMEOUT,
13
+ stdio: ['pipe', 'pipe', 'ignore'],
14
+ };
15
+ /**
16
+ * List all run cache entries for a tree hash
17
+ *
18
+ * @param treeHash - Git tree hash
19
+ * @returns Array of run cache entry metadata
20
+ */
21
+ export async function listRunCacheEntries(treeHash) {
22
+ try {
23
+ // List all notes under refs/notes/vibe-validate/run/{treeHash}/*
24
+ const output = execSync(`git for-each-ref --format="%(refname) %(objectname)" refs/notes/vibe-validate/run/${treeHash}/`, GIT_OPTIONS);
25
+ if (!output.trim()) {
26
+ return [];
27
+ }
28
+ // Parse output: "refs/notes/vibe-validate/run/{treeHash}/{cacheKey} {noteObjectName}"
29
+ const entries = output
30
+ .trim()
31
+ .split('\n')
32
+ .map((line) => {
33
+ const [refPath] = line.split(' ');
34
+ // Extract cache key from ref path
35
+ const regex = /refs\/notes\/vibe-validate\/run\/([^/]+)\/(.+)$/;
36
+ const match = regex.exec(refPath);
37
+ if (!match)
38
+ return null;
39
+ const [, treeHashFromRef, cacheKey] = match;
40
+ return {
41
+ treeHash: treeHashFromRef,
42
+ cacheKey,
43
+ refPath,
44
+ };
45
+ })
46
+ .filter(Boolean);
47
+ return entries;
48
+ }
49
+ catch {
50
+ // No run cache exists - expected for tree hashes without run cache
51
+ return [];
52
+ }
53
+ }
54
+ /**
55
+ * Get a specific run cache entry
56
+ *
57
+ * @param treeHash - Git tree hash
58
+ * @param cacheKey - URL-encoded cache key
59
+ * @returns Run cache note or null if not found
60
+ */
61
+ export async function getRunCacheEntry(treeHash, cacheKey) {
62
+ try {
63
+ const refPath = `vibe-validate/run/${treeHash}/${cacheKey}`;
64
+ const yaml = execSync(`git notes --ref=${refPath} show HEAD`, GIT_OPTIONS);
65
+ const note = parseYaml(yaml);
66
+ return note;
67
+ }
68
+ catch {
69
+ // Entry doesn't exist or parse failed
70
+ return null;
71
+ }
72
+ }
73
+ /**
74
+ * Get all run cache entries for a tree hash
75
+ *
76
+ * @param treeHash - Git tree hash
77
+ * @returns Array of all run cache notes for this tree hash
78
+ */
79
+ export async function getAllRunCacheForTree(treeHash) {
80
+ const entries = await listRunCacheEntries(treeHash);
81
+ const notes = [];
82
+ for (const entry of entries) {
83
+ const note = await getRunCacheEntry(entry.treeHash, entry.cacheKey);
84
+ if (note) {
85
+ notes.push(note);
86
+ }
87
+ }
88
+ return notes;
89
+ }
90
+ /**
91
+ * List all tree hashes that have run cache entries
92
+ *
93
+ * @returns Array of tree hashes with run cache
94
+ */
95
+ export async function listRunCacheTreeHashes() {
96
+ try {
97
+ // List all notes under refs/notes/vibe-validate/run/
98
+ const output = execSync('git for-each-ref --format="%(refname)" refs/notes/vibe-validate/run/', GIT_OPTIONS);
99
+ if (!output.trim()) {
100
+ return [];
101
+ }
102
+ // Parse output and extract unique tree hashes
103
+ const treeHashes = new Set();
104
+ const lines = output.trim().split('\n');
105
+ for (const line of lines) {
106
+ // Extract tree hash from ref path: refs/notes/vibe-validate/run/{treeHash}/...
107
+ const regex = /refs\/notes\/vibe-validate\/run\/([^/]+)/;
108
+ const match = regex.exec(line);
109
+ if (match) {
110
+ treeHashes.add(match[1]);
111
+ }
112
+ }
113
+ return Array.from(treeHashes);
114
+ }
115
+ catch {
116
+ // No run cache exists - expected for repos without run cache
117
+ return [];
118
+ }
119
+ }
120
+ /**
121
+ * Get all run cache entries across all tree hashes
122
+ *
123
+ * @returns Array of all run cache notes
124
+ */
125
+ export async function getAllRunCacheEntries() {
126
+ const treeHashes = await listRunCacheTreeHashes();
127
+ const allNotes = [];
128
+ for (const treeHash of treeHashes) {
129
+ const notes = await getAllRunCacheForTree(treeHash);
130
+ allNotes.push(...notes);
131
+ }
132
+ // Sort by timestamp (newest first)
133
+ allNotes.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
134
+ return allNotes;
135
+ }
136
+ //# sourceMappingURL=run-cache-reader.js.map