@pella-labs/pinakes 0.4.3 → 0.5.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/dist/cli/audit-wiki.d.ts +1 -0
- package/dist/cli/audit-wiki.d.ts.map +1 -1
- package/dist/cli/audit-wiki.js +49 -25
- package/dist/cli/audit-wiki.js.map +1 -1
- package/dist/cli/claims.d.ts +46 -2
- package/dist/cli/claims.d.ts.map +1 -1
- package/dist/cli/claims.js +202 -14
- package/dist/cli/claims.js.map +1 -1
- package/dist/cli/contradiction.js +1 -1
- package/dist/cli/contradiction.js.map +1 -1
- package/dist/cli/crystallize-scheduler.d.ts +24 -0
- package/dist/cli/crystallize-scheduler.d.ts.map +1 -0
- package/dist/cli/crystallize-scheduler.js +164 -0
- package/dist/cli/crystallize-scheduler.js.map +1 -0
- package/dist/cli/crystallize.d.ts +57 -0
- package/dist/cli/crystallize.d.ts.map +1 -0
- package/dist/cli/crystallize.js +329 -0
- package/dist/cli/crystallize.js.map +1 -0
- package/dist/cli/index.js +29 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +10 -2
- package/dist/cli/serve.js.map +1 -1
- package/dist/db/client.js +1 -1
- package/dist/db/migrations/0005_claim_supersession.sql +6 -0
- package/dist/db/migrations/meta/_journal.json +7 -0
- package/dist/db/schema.d.ts +51 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +7 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/ingest/ingester.js +3 -3
- package/dist/ingest/ingester.js.map +1 -1
- package/dist/ingest/parse/markdown.d.ts +2 -2
- package/dist/ingest/parse/markdown.d.ts.map +1 -1
- package/dist/ingest/parse/markdown.js +2 -0
- package/dist/ingest/parse/markdown.js.map +1 -1
- package/dist/ingest/repo-mirror.d.ts.map +1 -1
- package/dist/ingest/repo-mirror.js +11 -7
- package/dist/ingest/repo-mirror.js.map +1 -1
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +38 -1
- package/dist/paths.js.map +1 -1
- package/package.json +1 -1
|
@@ -45,7 +45,7 @@ export async function contradictionScan(opts) {
|
|
|
45
45
|
}
|
|
46
46
|
// Get all claims grouped by topic
|
|
47
47
|
const allClaims = bundle.writer
|
|
48
|
-
.prepare(`SELECT topic, claim, source_uri FROM pinakes_claims WHERE scope = ? ORDER BY topic`)
|
|
48
|
+
.prepare(`SELECT topic, claim, source_uri FROM pinakes_claims WHERE scope = ? AND superseded_at IS NULL ORDER BY topic`)
|
|
49
49
|
.all(scope);
|
|
50
50
|
if (allClaims.length === 0) {
|
|
51
51
|
return { scanned_pairs: 0, topics_scanned: 0, claims_extracted: 0, contradictions: [], rate_limited: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contradiction.js","sourceRoot":"","sources":["../../src/cli/contradiction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAiCpD,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;AAC/C,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,MAAM,cAAc,GAAG;;;;;;;;;qDAS8B,CAAC;AAEtD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAA2B;IAE3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,wBAAwB,CAAC;IAEnE,mBAAmB;IACnB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM;SAC3B,OAAO,CACN,8CAA8C,CAC/C;SACA,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAElC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,aAAa,EAAE,CAAC;YACxC,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAC9G,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;SAC5B,OAAO,CACN,
|
|
1
|
+
{"version":3,"file":"contradiction.js","sourceRoot":"","sources":["../../src/cli/contradiction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Database as BetterSqliteDatabase } from 'better-sqlite3';
|
|
2
|
+
export declare class CrystallizationScheduler {
|
|
3
|
+
private readonly projectRoot;
|
|
4
|
+
private readonly writer;
|
|
5
|
+
private commitPollTimer;
|
|
6
|
+
private timeFallbackTimer;
|
|
7
|
+
private lastKnownHead;
|
|
8
|
+
private running;
|
|
9
|
+
constructor(projectRoot: string, writer: BetterSqliteDatabase);
|
|
10
|
+
/**
|
|
11
|
+
* Start all three trigger layers. Call once after server is ready.
|
|
12
|
+
*/
|
|
13
|
+
start(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Stop all timers. Called during graceful shutdown.
|
|
16
|
+
*/
|
|
17
|
+
stop(): void;
|
|
18
|
+
private pollCommit;
|
|
19
|
+
private tryRun;
|
|
20
|
+
private isRateLimitClear;
|
|
21
|
+
private getMetaValue;
|
|
22
|
+
private setMetaValue;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=crystallize-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crystallize-scheduler.d.ts","sourceRoot":"","sources":["../../src/cli/crystallize-scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAoCvE,qBAAa,wBAAwB;IAOjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,iBAAiB,CAA+C;IACxE,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,OAAO,CAAS;gBAGL,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,oBAAoB;IAG/C;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,UAAU;YAgBJ,MAAM;IA2CpB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,YAAY;CASrB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { crystallizeCommand, getGitHead } from './crystallize.js';
|
|
2
|
+
import { createLlmProvider } from '../llm/provider.js';
|
|
3
|
+
import { logger } from '../observability/logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* CrystallizationScheduler — autonomous wiki evolution via three trigger layers.
|
|
6
|
+
*
|
|
7
|
+
* Runs inside the `pinakes serve` process and automatically distills coding
|
|
8
|
+
* sessions into wiki pages without human intervention. The existing confidence
|
|
9
|
+
* scoring, decay, contradiction detection, and supersession systems serve as
|
|
10
|
+
* quality controls.
|
|
11
|
+
*
|
|
12
|
+
* **Trigger layers**:
|
|
13
|
+
* 1. **Startup catch-up** — on construction, compare stored HEAD against
|
|
14
|
+
* current HEAD. If different, crystallize un-captured commits.
|
|
15
|
+
* 2. **Commit poll** — check `git rev-parse HEAD` every 60s. If HEAD
|
|
16
|
+
* changed since last poll, trigger crystallization.
|
|
17
|
+
* 3. **Time fallback** — every 4 hours, trigger crystallization regardless
|
|
18
|
+
* of HEAD changes. Catches solo devs who don't commit often.
|
|
19
|
+
*
|
|
20
|
+
* **Rate limit**: at most once per hour. Stored in `pinakes_meta` as
|
|
21
|
+
* `last_crystallize_ts` and `last_crystallize_head`.
|
|
22
|
+
*
|
|
23
|
+
* **Graceful degradation**: skips silently if no LLM provider is available
|
|
24
|
+
* or if the project is not a git repo.
|
|
25
|
+
*/
|
|
26
|
+
const RATE_LIMIT_MS = 60 * 60 * 1000; // 1 hour
|
|
27
|
+
const COMMIT_POLL_MS = 60 * 1000; // 60 seconds
|
|
28
|
+
const TIME_FALLBACK_MS = 4 * 60 * 60 * 1000; // 4 hours
|
|
29
|
+
const META_KEY_TS = 'last_crystallize_ts';
|
|
30
|
+
const META_KEY_HEAD = 'last_crystallize_head';
|
|
31
|
+
export class CrystallizationScheduler {
|
|
32
|
+
projectRoot;
|
|
33
|
+
writer;
|
|
34
|
+
commitPollTimer = null;
|
|
35
|
+
timeFallbackTimer = null;
|
|
36
|
+
lastKnownHead = null;
|
|
37
|
+
running = false;
|
|
38
|
+
constructor(projectRoot, writer) {
|
|
39
|
+
this.projectRoot = projectRoot;
|
|
40
|
+
this.writer = writer;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start all three trigger layers. Call once after server is ready.
|
|
44
|
+
*/
|
|
45
|
+
start() {
|
|
46
|
+
// 1. Startup catch-up
|
|
47
|
+
this.lastKnownHead = getGitHead(this.projectRoot);
|
|
48
|
+
if (this.lastKnownHead) {
|
|
49
|
+
const storedHead = this.getMetaValue(META_KEY_HEAD);
|
|
50
|
+
if (storedHead !== this.lastKnownHead) {
|
|
51
|
+
logger.info({ storedHead, currentHead: this.lastKnownHead }, 'crystallize: startup catch-up — HEAD changed since last run');
|
|
52
|
+
void this.tryRun('startup');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// 2. Commit poll (every 60s)
|
|
56
|
+
this.commitPollTimer = setInterval(() => {
|
|
57
|
+
this.pollCommit();
|
|
58
|
+
}, COMMIT_POLL_MS);
|
|
59
|
+
this.commitPollTimer.unref();
|
|
60
|
+
// 3. Time fallback (every 4h)
|
|
61
|
+
this.timeFallbackTimer = setInterval(() => {
|
|
62
|
+
void this.tryRun('time-fallback');
|
|
63
|
+
}, TIME_FALLBACK_MS);
|
|
64
|
+
this.timeFallbackTimer.unref();
|
|
65
|
+
logger.info('crystallize scheduler started (commit poll + time fallback)');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Stop all timers. Called during graceful shutdown.
|
|
69
|
+
*/
|
|
70
|
+
stop() {
|
|
71
|
+
if (this.commitPollTimer) {
|
|
72
|
+
clearInterval(this.commitPollTimer);
|
|
73
|
+
this.commitPollTimer = null;
|
|
74
|
+
}
|
|
75
|
+
if (this.timeFallbackTimer) {
|
|
76
|
+
clearInterval(this.timeFallbackTimer);
|
|
77
|
+
this.timeFallbackTimer = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// -------------------------------------------------------------------------
|
|
81
|
+
// Internals
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
pollCommit() {
|
|
84
|
+
const head = getGitHead(this.projectRoot);
|
|
85
|
+
if (!head)
|
|
86
|
+
return; // not a git repo
|
|
87
|
+
if (this.lastKnownHead === null) {
|
|
88
|
+
this.lastKnownHead = head;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (head !== this.lastKnownHead) {
|
|
92
|
+
this.lastKnownHead = head;
|
|
93
|
+
logger.info({ head }, 'crystallize: new commit detected');
|
|
94
|
+
void this.tryRun('commit');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async tryRun(trigger) {
|
|
98
|
+
if (this.running)
|
|
99
|
+
return;
|
|
100
|
+
if (!this.isRateLimitClear()) {
|
|
101
|
+
logger.debug({ trigger }, 'crystallize: rate-limited, skipping');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.running = true;
|
|
105
|
+
try {
|
|
106
|
+
const llm = createLlmProvider();
|
|
107
|
+
if (!llm.available()) {
|
|
108
|
+
logger.debug('crystallize: no LLM provider available, skipping');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
logger.info({ trigger }, 'crystallize: running auto-crystallization');
|
|
112
|
+
const result = await crystallizeCommand({
|
|
113
|
+
projectRoot: this.projectRoot,
|
|
114
|
+
llmProvider: llm,
|
|
115
|
+
});
|
|
116
|
+
if (result.skipped_reason) {
|
|
117
|
+
logger.info({ trigger, reason: result.skipped_reason }, 'crystallize: skipped');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
logger.info({ trigger, drafts: result.drafts_created }, 'crystallize: completed');
|
|
121
|
+
}
|
|
122
|
+
// Update meta regardless of outcome (rate limit resets)
|
|
123
|
+
this.setMetaValue(META_KEY_TS, String(Date.now()));
|
|
124
|
+
const head = getGitHead(this.projectRoot);
|
|
125
|
+
if (head) {
|
|
126
|
+
this.setMetaValue(META_KEY_HEAD, head);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
logger.warn({ err, trigger }, 'crystallize: auto-crystallization failed');
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
this.running = false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
isRateLimitClear() {
|
|
137
|
+
const lastTs = this.getMetaValue(META_KEY_TS);
|
|
138
|
+
if (!lastTs)
|
|
139
|
+
return true;
|
|
140
|
+
return Date.now() - parseInt(lastTs, 10) >= RATE_LIMIT_MS;
|
|
141
|
+
}
|
|
142
|
+
getMetaValue(key) {
|
|
143
|
+
try {
|
|
144
|
+
const row = this.writer
|
|
145
|
+
.prepare(`SELECT value FROM pinakes_meta WHERE key = ?`)
|
|
146
|
+
.get(key);
|
|
147
|
+
return row?.value;
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setMetaValue(key, value) {
|
|
154
|
+
try {
|
|
155
|
+
this.writer
|
|
156
|
+
.prepare(`INSERT OR REPLACE INTO pinakes_meta (key, value) VALUES (?, ?)`)
|
|
157
|
+
.run(key, value);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
logger.warn({ err, key }, 'crystallize: failed to write meta value');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=crystallize-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crystallize-scheduler.js","sourceRoot":"","sources":["../../src/cli/crystallize-scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface DiffEntry {
|
|
2
|
+
filePath: string;
|
|
3
|
+
lines: string[];
|
|
4
|
+
significantLines: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CrystallizeOptions {
|
|
7
|
+
projectRoot?: string;
|
|
8
|
+
dbPath?: string;
|
|
9
|
+
since?: string;
|
|
10
|
+
commits?: number;
|
|
11
|
+
include?: string[];
|
|
12
|
+
exclude?: string[];
|
|
13
|
+
minLines?: number;
|
|
14
|
+
/** Injected LLM provider (tests). Default: createLlmProvider(). */
|
|
15
|
+
llmProvider?: {
|
|
16
|
+
name: string;
|
|
17
|
+
available(): boolean;
|
|
18
|
+
complete(o: {
|
|
19
|
+
system: string;
|
|
20
|
+
prompt: string;
|
|
21
|
+
maxTokens: number;
|
|
22
|
+
}): Promise<string>;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export interface CrystallizeResult {
|
|
26
|
+
drafts_created: number;
|
|
27
|
+
output_dir: string;
|
|
28
|
+
skipped_reason?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Split a unified diff into per-file entries. Each entry carries the file
|
|
32
|
+
* path, the raw lines, and a count of "significant" changed lines (non-blank
|
|
33
|
+
* additions/deletions, excluding the `+++`/`---` header lines).
|
|
34
|
+
*/
|
|
35
|
+
export declare function parseDiff(diffOutput: string): DiffEntry[];
|
|
36
|
+
export declare function filterDiff(entries: DiffEntry[], opts?: {
|
|
37
|
+
include?: string[];
|
|
38
|
+
exclude?: string[];
|
|
39
|
+
}): DiffEntry[];
|
|
40
|
+
export declare function truncateDiff(diffText: string, maxTokens: number): string;
|
|
41
|
+
export declare function getGitDiff(projectRoot: string, opts: {
|
|
42
|
+
since?: string;
|
|
43
|
+
commits?: number;
|
|
44
|
+
}): {
|
|
45
|
+
diff: string;
|
|
46
|
+
commits: string[];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Get current git HEAD SHA. Returns null if not a git repo or git fails.
|
|
50
|
+
*/
|
|
51
|
+
export declare function getGitHead(projectRoot: string): string | null;
|
|
52
|
+
export declare function parseLlmDrafts(response: string): Array<{
|
|
53
|
+
title: string;
|
|
54
|
+
content: string;
|
|
55
|
+
}>;
|
|
56
|
+
export declare function crystallizeCommand(opts: CrystallizeOptions): Promise<CrystallizeResult>;
|
|
57
|
+
//# sourceMappingURL=crystallize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crystallize.d.ts","sourceRoot":"","sources":["../../src/cli/crystallize.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,IAAI,OAAO,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;CAC3I;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAiBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CA8BzD;AAgBD,wBAAgB,UAAU,CACxB,OAAO,EAAE,SAAS,EAAE,EACpB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACpD,SAAS,EAAE,CAab;AAMD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMxE;AAMD,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA6BrC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D;AAkCD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa3C;AAqED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA2H5B"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, writeFileSync, } from 'node:fs';
|
|
3
|
+
import { join, relative } from 'node:path';
|
|
4
|
+
import { closeDb, openDb } from '../db/client.js';
|
|
5
|
+
import { countTokens } from '../gate/budget.js';
|
|
6
|
+
import { createLlmProvider } from '../llm/provider.js';
|
|
7
|
+
import { resolveAbs, projectWikiPath as defaultProjectWikiPath, projectDbPath as defaultProjectDbPath, } from '../paths.js';
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Constants
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const DEFAULT_EXCLUDES = [
|
|
12
|
+
'*.test.ts', '*.spec.ts', '*.lock', '*-lock.json',
|
|
13
|
+
'node_modules/', 'dist/', '*.map',
|
|
14
|
+
];
|
|
15
|
+
const DEFAULT_MIN_LINES = 10;
|
|
16
|
+
const MAX_DIFF_TOKENS = 50_000;
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Diff parsing
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/**
|
|
21
|
+
* Split a unified diff into per-file entries. Each entry carries the file
|
|
22
|
+
* path, the raw lines, and a count of "significant" changed lines (non-blank
|
|
23
|
+
* additions/deletions, excluding the `+++`/`---` header lines).
|
|
24
|
+
*/
|
|
25
|
+
export function parseDiff(diffOutput) {
|
|
26
|
+
const entries = [];
|
|
27
|
+
const sections = diffOutput.split(/^(?=diff --git )/m);
|
|
28
|
+
for (const section of sections) {
|
|
29
|
+
if (!section.trim())
|
|
30
|
+
continue;
|
|
31
|
+
const plusMatch = section.match(/^\+\+\+ b\/(.+)$/m);
|
|
32
|
+
if (!plusMatch)
|
|
33
|
+
continue;
|
|
34
|
+
const filePath = plusMatch[1];
|
|
35
|
+
const lines = section.split('\n');
|
|
36
|
+
let significantLines = 0;
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
if ((line.startsWith('+') || line.startsWith('-')) &&
|
|
39
|
+
!line.startsWith('+++') &&
|
|
40
|
+
!line.startsWith('---')) {
|
|
41
|
+
if (line.slice(1).trim().length > 0) {
|
|
42
|
+
significantLines++;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
entries.push({ filePath, lines, significantLines });
|
|
47
|
+
}
|
|
48
|
+
return entries;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Diff filtering
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
function matchesPattern(filePath, pattern) {
|
|
54
|
+
if (pattern.endsWith('/')) {
|
|
55
|
+
return filePath.includes(pattern) || filePath.startsWith(pattern);
|
|
56
|
+
}
|
|
57
|
+
if (pattern.startsWith('*')) {
|
|
58
|
+
return filePath.endsWith(pattern.slice(1));
|
|
59
|
+
}
|
|
60
|
+
return filePath === pattern;
|
|
61
|
+
}
|
|
62
|
+
export function filterDiff(entries, opts = {}) {
|
|
63
|
+
const excludes = opts.exclude ?? DEFAULT_EXCLUDES;
|
|
64
|
+
const includes = opts.include;
|
|
65
|
+
return entries.filter((entry) => {
|
|
66
|
+
for (const pattern of excludes) {
|
|
67
|
+
if (matchesPattern(entry.filePath, pattern))
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (includes && includes.length > 0) {
|
|
71
|
+
return includes.some((p) => matchesPattern(entry.filePath, p));
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// Diff truncation
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
export function truncateDiff(diffText, maxTokens) {
|
|
80
|
+
const tc = countTokens(diffText);
|
|
81
|
+
if (tc <= maxTokens)
|
|
82
|
+
return diffText;
|
|
83
|
+
const ratio = maxTokens / tc;
|
|
84
|
+
const cutAt = Math.floor(diffText.length * ratio);
|
|
85
|
+
return diffText.slice(0, cutAt) + '\n\n[... diff truncated due to size ...]';
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Git helpers
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
export function getGitDiff(projectRoot, opts) {
|
|
91
|
+
const cwd = projectRoot;
|
|
92
|
+
let diffArgs;
|
|
93
|
+
if (opts.since) {
|
|
94
|
+
diffArgs = ['diff', `HEAD@{${opts.since}}`, 'HEAD'];
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const n = opts.commits ?? 1;
|
|
98
|
+
diffArgs = ['diff', `HEAD~${n}..HEAD`];
|
|
99
|
+
}
|
|
100
|
+
const diff = execFileSync('git', diffArgs, {
|
|
101
|
+
cwd,
|
|
102
|
+
encoding: 'utf-8',
|
|
103
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
104
|
+
});
|
|
105
|
+
let logArgs;
|
|
106
|
+
if (opts.since) {
|
|
107
|
+
logArgs = ['log', `--since=${opts.since}`, '--format=%H'];
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const n = opts.commits ?? 1;
|
|
111
|
+
logArgs = ['log', `-${n}`, '--format=%H'];
|
|
112
|
+
}
|
|
113
|
+
const logOutput = execFileSync('git', logArgs, { cwd, encoding: 'utf-8' });
|
|
114
|
+
const commits = logOutput.trim().split('\n').filter(Boolean);
|
|
115
|
+
return { diff, commits };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get current git HEAD SHA. Returns null if not a git repo or git fails.
|
|
119
|
+
*/
|
|
120
|
+
export function getGitHead(projectRoot) {
|
|
121
|
+
try {
|
|
122
|
+
return execFileSync('git', ['rev-parse', 'HEAD'], {
|
|
123
|
+
cwd: projectRoot,
|
|
124
|
+
encoding: 'utf-8',
|
|
125
|
+
}).trim();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// LLM prompt + parsing
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
const CRYSTALLIZE_SYSTEM = `You are a technical documentation writer distilling a coding session into wiki knowledge pages.
|
|
135
|
+
|
|
136
|
+
Given a git diff and optional existing wiki context, identify the most important decisions, learnings, and architectural changes. For each, produce a wiki page.
|
|
137
|
+
|
|
138
|
+
Rules:
|
|
139
|
+
- Focus on WHY decisions were made, not just WHAT changed
|
|
140
|
+
- Each page should be self-contained and useful to a future developer
|
|
141
|
+
- Use markdown format with a clear H1 title
|
|
142
|
+
- Include rationale/context sections
|
|
143
|
+
- Reference relevant source files
|
|
144
|
+
- Don't document trivial changes (formatting, typos, simple renames)
|
|
145
|
+
- Output pages separated by a line containing only "---PAGE_BREAK---"
|
|
146
|
+
- Each page should start with an H1 heading on the first line
|
|
147
|
+
- Keep each page under 500 words`;
|
|
148
|
+
function buildPrompt(diffText, wikiContext, commits) {
|
|
149
|
+
let prompt = `## Git Diff (commits: ${commits.join(', ')})\n\n\`\`\`diff\n${diffText}\n\`\`\`\n`;
|
|
150
|
+
if (wikiContext) {
|
|
151
|
+
prompt += `\n## Existing Wiki Context (avoid duplicating this)\n\n${wikiContext}\n`;
|
|
152
|
+
}
|
|
153
|
+
prompt += '\nDistill the significant decisions and learnings from this diff into wiki pages.';
|
|
154
|
+
return prompt;
|
|
155
|
+
}
|
|
156
|
+
export function parseLlmDrafts(response) {
|
|
157
|
+
const pages = response.split(/^---PAGE_BREAK---$/m);
|
|
158
|
+
const drafts = [];
|
|
159
|
+
for (const page of pages) {
|
|
160
|
+
const trimmed = page.trim();
|
|
161
|
+
if (!trimmed)
|
|
162
|
+
continue;
|
|
163
|
+
const titleMatch = trimmed.match(/^#\s+(.+)$/m);
|
|
164
|
+
const title = titleMatch ? titleMatch[1].trim() : 'untitled';
|
|
165
|
+
drafts.push({ title, content: trimmed });
|
|
166
|
+
}
|
|
167
|
+
return drafts;
|
|
168
|
+
}
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// Draft writing (directly to wiki root)
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
function slugify(title) {
|
|
173
|
+
return title
|
|
174
|
+
.toLowerCase()
|
|
175
|
+
.replace(/^#+\s*/, '')
|
|
176
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
177
|
+
.replace(/(^-|-$)/g, '')
|
|
178
|
+
.slice(0, 80);
|
|
179
|
+
}
|
|
180
|
+
function writeWikiPage(wikiRoot, title, content, commits) {
|
|
181
|
+
const slug = slugify(title);
|
|
182
|
+
if (!slug)
|
|
183
|
+
return '';
|
|
184
|
+
const frontmatter = [
|
|
185
|
+
'---',
|
|
186
|
+
'confidence: crystallized',
|
|
187
|
+
`source: crystallize`,
|
|
188
|
+
`crystallized_at: ${new Date().toISOString()}`,
|
|
189
|
+
`source_commits: [${commits.join(', ')}]`,
|
|
190
|
+
'---',
|
|
191
|
+
'',
|
|
192
|
+
].join('\n');
|
|
193
|
+
const filePath = join(wikiRoot, `${slug}.md`);
|
|
194
|
+
writeFileSync(filePath, frontmatter + content, 'utf-8');
|
|
195
|
+
return filePath;
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// Wiki context
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
function getWikiContext(bundle) {
|
|
201
|
+
try {
|
|
202
|
+
const reader = bundle.readers[0] ?? bundle.writer;
|
|
203
|
+
const rows = reader
|
|
204
|
+
.prepare(`SELECT title, source_uri, substr(content, 1, 300) as content
|
|
205
|
+
FROM pinakes_nodes
|
|
206
|
+
WHERE scope = 'project'
|
|
207
|
+
ORDER BY updated_at DESC
|
|
208
|
+
LIMIT 10`)
|
|
209
|
+
.all();
|
|
210
|
+
if (rows.length === 0)
|
|
211
|
+
return '';
|
|
212
|
+
return rows
|
|
213
|
+
.map((r) => `### ${r.title ?? r.source_uri}\n${r.content}`)
|
|
214
|
+
.join('\n\n');
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return '';
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
// Main: crystallize (direct wiki write)
|
|
222
|
+
// ---------------------------------------------------------------------------
|
|
223
|
+
export async function crystallizeCommand(opts) {
|
|
224
|
+
const projectRoot = resolveAbs(opts.projectRoot ?? process.cwd());
|
|
225
|
+
const wikiRoot = defaultProjectWikiPath(projectRoot);
|
|
226
|
+
// 1. Git diff
|
|
227
|
+
let gitResult;
|
|
228
|
+
try {
|
|
229
|
+
gitResult = getGitDiff(projectRoot, {
|
|
230
|
+
since: opts.since,
|
|
231
|
+
commits: opts.commits,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
return {
|
|
236
|
+
drafts_created: 0,
|
|
237
|
+
output_dir: wikiRoot,
|
|
238
|
+
skipped_reason: `git diff failed: ${err instanceof Error ? err.message : err}`,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
if (!gitResult.diff.trim()) {
|
|
242
|
+
return {
|
|
243
|
+
drafts_created: 0,
|
|
244
|
+
output_dir: wikiRoot,
|
|
245
|
+
skipped_reason: 'no changes found in git diff',
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// 2. Parse + filter
|
|
249
|
+
const allEntries = parseDiff(gitResult.diff);
|
|
250
|
+
const filtered = filterDiff(allEntries, {
|
|
251
|
+
include: opts.include,
|
|
252
|
+
exclude: opts.exclude,
|
|
253
|
+
});
|
|
254
|
+
// 3. Min lines check
|
|
255
|
+
const minLines = opts.minLines ?? DEFAULT_MIN_LINES;
|
|
256
|
+
const totalSignificant = filtered.reduce((sum, e) => sum + e.significantLines, 0);
|
|
257
|
+
if (totalSignificant < minLines) {
|
|
258
|
+
return {
|
|
259
|
+
drafts_created: 0,
|
|
260
|
+
output_dir: wikiRoot,
|
|
261
|
+
skipped_reason: `only ${totalSignificant} significant lines (minimum: ${minLines})`,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// 4. Reconstruct filtered diff, truncate if needed
|
|
265
|
+
let diffText = filtered
|
|
266
|
+
.map((e) => e.lines.join('\n'))
|
|
267
|
+
.join('\n');
|
|
268
|
+
diffText = truncateDiff(diffText, MAX_DIFF_TOKENS);
|
|
269
|
+
// 5. Wiki context
|
|
270
|
+
const dbPath = opts.dbPath
|
|
271
|
+
? resolveAbs(opts.dbPath)
|
|
272
|
+
: defaultProjectDbPath(projectRoot);
|
|
273
|
+
let wikiContext = '';
|
|
274
|
+
if (existsSync(dbPath)) {
|
|
275
|
+
const bundle = openDb(dbPath);
|
|
276
|
+
try {
|
|
277
|
+
wikiContext = getWikiContext(bundle);
|
|
278
|
+
}
|
|
279
|
+
finally {
|
|
280
|
+
closeDb(bundle);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// 6. LLM call
|
|
284
|
+
const llm = opts.llmProvider ?? createLlmProvider();
|
|
285
|
+
if (!llm.available()) {
|
|
286
|
+
return {
|
|
287
|
+
drafts_created: 0,
|
|
288
|
+
output_dir: wikiRoot,
|
|
289
|
+
skipped_reason: 'no LLM provider available',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const prompt = buildPrompt(diffText, wikiContext, gitResult.commits);
|
|
293
|
+
let response;
|
|
294
|
+
try {
|
|
295
|
+
response = await llm.complete({
|
|
296
|
+
system: CRYSTALLIZE_SYSTEM,
|
|
297
|
+
prompt,
|
|
298
|
+
maxTokens: 4000,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
catch (err) {
|
|
302
|
+
return {
|
|
303
|
+
drafts_created: 0,
|
|
304
|
+
output_dir: wikiRoot,
|
|
305
|
+
skipped_reason: `LLM call failed: ${err instanceof Error ? err.message : err}`,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// 7. Parse + write directly to wiki
|
|
309
|
+
const drafts = parseLlmDrafts(response);
|
|
310
|
+
if (drafts.length === 0) {
|
|
311
|
+
return {
|
|
312
|
+
drafts_created: 0,
|
|
313
|
+
output_dir: wikiRoot,
|
|
314
|
+
skipped_reason: 'LLM produced no draft pages',
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
mkdirSync(wikiRoot, { recursive: true });
|
|
318
|
+
let created = 0;
|
|
319
|
+
for (const draft of drafts) {
|
|
320
|
+
const path = writeWikiPage(wikiRoot, draft.title, draft.content, gitResult.commits);
|
|
321
|
+
if (path) {
|
|
322
|
+
created++;
|
|
323
|
+
// eslint-disable-next-line no-console
|
|
324
|
+
console.error(` wiki: ${relative(wikiRoot, path)}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return { drafts_created: created, output_dir: wikiRoot };
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=crystallize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crystallize.js","sourceRoot":"","sources":["../../src/cli/crystallize.ts"],"names":[],"mappings":"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"}
|