@they-juanreina/compost-cli 0.1.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/LICENSE +21 -0
- package/README.md +5 -0
- package/bin/compost.js +7 -0
- package/dist/commands/_stub.d.ts +9 -0
- package/dist/commands/_stub.d.ts.map +1 -0
- package/dist/commands/_stub.js +27 -0
- package/dist/commands/_stub.js.map +1 -0
- package/dist/commands/blame.d.ts +3 -0
- package/dist/commands/blame.d.ts.map +1 -0
- package/dist/commands/blame.js +31 -0
- package/dist/commands/blame.js.map +1 -0
- package/dist/commands/chat.d.ts +8 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +99 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/code.d.ts +3 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +70 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +76 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/create.d.ts +20 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +148 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/endorse.d.ts +3 -0
- package/dist/commands/endorse.d.ts.map +1 -0
- package/dist/commands/endorse.js +31 -0
- package/dist/commands/endorse.js.map +1 -0
- package/dist/commands/evals.d.ts +3 -0
- package/dist/commands/evals.d.ts.map +1 -0
- package/dist/commands/evals.js +54 -0
- package/dist/commands/evals.js.map +1 -0
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +54 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/ingest.d.ts +3 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +26 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +51 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +28 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/models.d.ts +3 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +32 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/query.d.ts +3 -0
- package/dist/commands/query.d.ts.map +1 -0
- package/dist/commands/query.js +13 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/reindex.d.ts +3 -0
- package/dist/commands/reindex.d.ts.map +1 -0
- package/dist/commands/reindex.js +53 -0
- package/dist/commands/reindex.js.map +1 -0
- package/dist/commands/rescan.d.ts +3 -0
- package/dist/commands/rescan.d.ts.map +1 -0
- package/dist/commands/rescan.js +60 -0
- package/dist/commands/rescan.js.map +1 -0
- package/dist/commands/saturate.d.ts +3 -0
- package/dist/commands/saturate.d.ts.map +1 -0
- package/dist/commands/saturate.js +35 -0
- package/dist/commands/saturate.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +52 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/serve.d.ts +3 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +9 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +25 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +38 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/snap.d.ts +3 -0
- package/dist/commands/snap.d.ts.map +1 -0
- package/dist/commands/snap.js +27 -0
- package/dist/commands/snap.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +26 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/synthesize.d.ts +3 -0
- package/dist/commands/synthesize.d.ts.map +1 -0
- package/dist/commands/synthesize.js +13 -0
- package/dist/commands/synthesize.js.map +1 -0
- package/dist/commands/tag.d.ts +3 -0
- package/dist/commands/tag.d.ts.map +1 -0
- package/dist/commands/tag.js +46 -0
- package/dist/commands/tag.js.map +1 -0
- package/dist/commands/transcribe.d.ts +3 -0
- package/dist/commands/transcribe.d.ts.map +1 -0
- package/dist/commands/transcribe.js +110 -0
- package/dist/commands/transcribe.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +81 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +50 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -0
- package/dist/exporters/csv.d.ts +8 -0
- package/dist/exporters/csv.d.ts.map +1 -0
- package/dist/exporters/csv.js +44 -0
- package/dist/exporters/csv.js.map +1 -0
- package/dist/exporters/eaf.d.ts +3 -0
- package/dist/exporters/eaf.d.ts.map +1 -0
- package/dist/exporters/eaf.js +91 -0
- package/dist/exporters/eaf.js.map +1 -0
- package/dist/exporters/html.d.ts +8 -0
- package/dist/exporters/html.d.ts.map +1 -0
- package/dist/exporters/html.js +47 -0
- package/dist/exporters/html.js.map +1 -0
- package/dist/exporters/md.d.ts +3 -0
- package/dist/exporters/md.d.ts.map +1 -0
- package/dist/exporters/md.js +43 -0
- package/dist/exporters/md.js.map +1 -0
- package/dist/exporters/pdf.d.ts +9 -0
- package/dist/exporters/pdf.d.ts.map +1 -0
- package/dist/exporters/pdf.js +40 -0
- package/dist/exporters/pdf.js.map +1 -0
- package/dist/exporters/report.d.ts +43 -0
- package/dist/exporters/report.d.ts.map +1 -0
- package/dist/exporters/report.js +49 -0
- package/dist/exporters/report.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy_client.d.ts +38 -0
- package/dist/legacy_client.d.ts.map +1 -0
- package/dist/legacy_client.js +44 -0
- package/dist/legacy_client.js.map +1 -0
- package/dist/lib/answerSchema.d.ts +2 -0
- package/dist/lib/answerSchema.d.ts.map +1 -0
- package/dist/lib/answerSchema.js +27 -0
- package/dist/lib/answerSchema.js.map +1 -0
- package/dist/lib/artifacts.d.ts +64 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +254 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/blame.d.ts +30 -0
- package/dist/lib/blame.d.ts.map +1 -0
- package/dist/lib/blame.js +164 -0
- package/dist/lib/blame.js.map +1 -0
- package/dist/lib/canonicalSessions.d.ts +24 -0
- package/dist/lib/canonicalSessions.d.ts.map +1 -0
- package/dist/lib/canonicalSessions.js +48 -0
- package/dist/lib/canonicalSessions.js.map +1 -0
- package/dist/lib/chat.d.ts +24 -0
- package/dist/lib/chat.d.ts.map +1 -0
- package/dist/lib/chat.js +50 -0
- package/dist/lib/chat.js.map +1 -0
- package/dist/lib/config.d.ts +45 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +143 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dispatch.d.ts +10 -0
- package/dist/lib/dispatch.d.ts.map +1 -0
- package/dist/lib/dispatch.js +31 -0
- package/dist/lib/dispatch.js.map +1 -0
- package/dist/lib/doctor.d.ts +19 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +43 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/events.d.ts +42 -0
- package/dist/lib/events.d.ts.map +1 -0
- package/dist/lib/events.js +57 -0
- package/dist/lib/events.js.map +1 -0
- package/dist/lib/export.d.ts +14 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +36 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/ingest.d.ts +21 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +68 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/journal.d.ts +23 -0
- package/dist/lib/journal.d.ts.map +1 -0
- package/dist/lib/journal.js +95 -0
- package/dist/lib/journal.js.map +1 -0
- package/dist/lib/migrate.d.ts +29 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +117 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/nativeRuntime.d.ts +46 -0
- package/dist/lib/nativeRuntime.d.ts.map +1 -0
- package/dist/lib/nativeRuntime.js +61 -0
- package/dist/lib/nativeRuntime.js.map +1 -0
- package/dist/lib/provisionNative.d.ts +46 -0
- package/dist/lib/provisionNative.d.ts.map +1 -0
- package/dist/lib/provisionNative.js +105 -0
- package/dist/lib/provisionNative.js.map +1 -0
- package/dist/lib/queue.d.ts +36 -0
- package/dist/lib/queue.d.ts.map +1 -0
- package/dist/lib/queue.js +102 -0
- package/dist/lib/queue.js.map +1 -0
- package/dist/lib/retrieve.d.ts +51 -0
- package/dist/lib/retrieve.d.ts.map +1 -0
- package/dist/lib/retrieve.js +92 -0
- package/dist/lib/retrieve.js.map +1 -0
- package/dist/lib/saturate.d.ts +21 -0
- package/dist/lib/saturate.d.ts.map +1 -0
- package/dist/lib/saturate.js +132 -0
- package/dist/lib/saturate.js.map +1 -0
- package/dist/lib/schemas.generated.d.ts +15 -0
- package/dist/lib/schemas.generated.d.ts.map +1 -0
- package/dist/lib/schemas.generated.js +975 -0
- package/dist/lib/schemas.generated.js.map +1 -0
- package/dist/lib/seed.d.ts +16 -0
- package/dist/lib/seed.d.ts.map +1 -0
- package/dist/lib/seed.js +64 -0
- package/dist/lib/seed.js.map +1 -0
- package/dist/lib/seedResolve.d.ts +6 -0
- package/dist/lib/seedResolve.d.ts.map +1 -0
- package/dist/lib/seedResolve.js +27 -0
- package/dist/lib/seedResolve.js.map +1 -0
- package/dist/lib/session.d.ts +19 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +61 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/setup.d.ts +44 -0
- package/dist/lib/setup.d.ts.map +1 -0
- package/dist/lib/setup.js +249 -0
- package/dist/lib/setup.js.map +1 -0
- package/dist/lib/snap.d.ts +15 -0
- package/dist/lib/snap.d.ts.map +1 -0
- package/dist/lib/snap.js +115 -0
- package/dist/lib/snap.js.map +1 -0
- package/dist/lib/status.d.ts +39 -0
- package/dist/lib/status.d.ts.map +1 -0
- package/dist/lib/status.js +174 -0
- package/dist/lib/status.js.map +1 -0
- package/dist/lib/tagcode.d.ts +26 -0
- package/dist/lib/tagcode.d.ts.map +1 -0
- package/dist/lib/tagcode.js +231 -0
- package/dist/lib/tagcode.js.map +1 -0
- package/dist/lib/templates.d.ts +3 -0
- package/dist/lib/templates.d.ts.map +1 -0
- package/dist/lib/templates.js +21 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/transcribeNative.d.ts +44 -0
- package/dist/lib/transcribeNative.d.ts.map +1 -0
- package/dist/lib/transcribeNative.js +53 -0
- package/dist/lib/transcribeNative.js.map +1 -0
- package/dist/lib/transcript.d.ts +68 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +10 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/lib/validate.d.ts +16 -0
- package/dist/lib/validate.d.ts.map +1 -0
- package/dist/lib/validate.js +155 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/llm/adapter.d.ts +33 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +106 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/http.d.ts +9 -0
- package/dist/llm/http.d.ts.map +1 -0
- package/dist/llm/http.js +56 -0
- package/dist/llm/http.js.map +1 -0
- package/dist/llm/providers/anthropic.d.ts +14 -0
- package/dist/llm/providers/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/anthropic.js +66 -0
- package/dist/llm/providers/anthropic.js.map +1 -0
- package/dist/llm/providers/lmstudio.d.ts +7 -0
- package/dist/llm/providers/lmstudio.d.ts.map +1 -0
- package/dist/llm/providers/lmstudio.js +8 -0
- package/dist/llm/providers/lmstudio.js.map +1 -0
- package/dist/llm/providers/ollama.d.ts +12 -0
- package/dist/llm/providers/ollama.d.ts.map +1 -0
- package/dist/llm/providers/ollama.js +87 -0
- package/dist/llm/providers/ollama.js.map +1 -0
- package/dist/llm/providers/openai.d.ts +7 -0
- package/dist/llm/providers/openai.d.ts.map +1 -0
- package/dist/llm/providers/openai.js +8 -0
- package/dist/llm/providers/openai.js.map +1 -0
- package/dist/llm/providers/openai_compatible.d.ts +18 -0
- package/dist/llm/providers/openai_compatible.d.ts.map +1 -0
- package/dist/llm/providers/openai_compatible.js +70 -0
- package/dist/llm/providers/openai_compatible.js.map +1 -0
- package/dist/llm/types.d.ts +60 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +2 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logging.d.ts +22 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +58 -0
- package/dist/logging.js.map +1 -0
- package/dist/loops/embed_worker.d.ts +44 -0
- package/dist/loops/embed_worker.d.ts.map +1 -0
- package/dist/loops/embed_worker.js +144 -0
- package/dist/loops/embed_worker.js.map +1 -0
- package/dist/loops/eval_grader.d.ts +19 -0
- package/dist/loops/eval_grader.d.ts.map +1 -0
- package/dist/loops/eval_grader.js +22 -0
- package/dist/loops/eval_grader.js.map +1 -0
- package/dist/loops/ingest_watcher.d.ts +17 -0
- package/dist/loops/ingest_watcher.d.ts.map +1 -0
- package/dist/loops/ingest_watcher.js +66 -0
- package/dist/loops/ingest_watcher.js.map +1 -0
- package/dist/loops/legacy_worker.d.ts +26 -0
- package/dist/loops/legacy_worker.d.ts.map +1 -0
- package/dist/loops/legacy_worker.js +102 -0
- package/dist/loops/legacy_worker.js.map +1 -0
- package/dist/loops/supervisor.d.ts +71 -0
- package/dist/loops/supervisor.d.ts.map +1 -0
- package/dist/loops/supervisor.js +122 -0
- package/dist/loops/supervisor.js.map +1 -0
- package/dist/loops/synthesis.d.ts +31 -0
- package/dist/loops/synthesis.d.ts.map +1 -0
- package/dist/loops/synthesis.js +71 -0
- package/dist/loops/synthesis.js.map +1 -0
- package/dist/loops/transcribe_worker.d.ts +22 -0
- package/dist/loops/transcribe_worker.d.ts.map +1 -0
- package/dist/loops/transcribe_worker.js +77 -0
- package/dist/loops/transcribe_worker.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +26 -0
- package/dist/output.js.map +1 -0
- package/dist/render/transcript_md.d.ts +5 -0
- package/dist/render/transcript_md.d.ts.map +1 -0
- package/dist/render/transcript_md.js +14 -0
- package/dist/render/transcript_md.js.map +1 -0
- package/dist/router.d.ts +3 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +68 -0
- package/dist/router.js.map +1 -0
- package/dist/transcriber_client.d.ts +42 -0
- package/dist/transcriber_client.d.ts.map +1 -0
- package/dist/transcriber_client.js +72 -0
- package/dist/transcriber_client.js.map +1 -0
- package/package.json +45 -0
- package/templates/AGENTS.md +25 -0
- package/templates/config.toml +56 -0
- package/templates/sample-seed/codebook/desire-for-manual-override.md +8 -0
- package/templates/sample-seed/codebook/distrust-of-automation.md +8 -0
- package/templates/sample-seed/highlights/H-001.md +9 -0
- package/templates/sample-seed/highlights/H-002.md +9 -0
- package/templates/sample-seed/seed.md +17 -0
- package/templates/sample-seed/sessions/S001/transcript.json +74 -0
- package/templates/sample-seed/synthesis/themes/control-earns-trust.md +13 -0
- package/templates/seed.md +21 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { CompostError } from '../errors.js';
|
|
3
|
+
import { transcriptToCsv } from '../exporters/csv.js';
|
|
4
|
+
import { transcriptToEaf } from '../exporters/eaf.js';
|
|
5
|
+
import { transcriptToMarkdown } from '../exporters/md.js';
|
|
6
|
+
export function loadTranscript(path) {
|
|
7
|
+
if (!existsSync(path)) {
|
|
8
|
+
throw new CompostError('FILE_NOT_FOUND', `No transcript at ${path}`);
|
|
9
|
+
}
|
|
10
|
+
let parsed;
|
|
11
|
+
try {
|
|
12
|
+
parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
13
|
+
}
|
|
14
|
+
catch (cause) {
|
|
15
|
+
throw new CompostError('INVALID_INPUT', `Could not parse JSON at ${path}`, { cause });
|
|
16
|
+
}
|
|
17
|
+
const t = parsed;
|
|
18
|
+
if (typeof t.session_id !== 'string' || !Array.isArray(t.utterances)) {
|
|
19
|
+
throw new CompostError('SCHEMA_VIOLATION', `${path} is not a transcript (missing session_id or utterances)`);
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
23
|
+
export function exportTranscript(transcript, opts) {
|
|
24
|
+
let content;
|
|
25
|
+
if (opts.format === 'csv') {
|
|
26
|
+
content = transcriptToCsv(transcript, opts.createdDate !== undefined ? { createdDate: opts.createdDate } : {});
|
|
27
|
+
}
|
|
28
|
+
else if (opts.format === 'eaf') {
|
|
29
|
+
content = transcriptToEaf(transcript);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
content = transcriptToMarkdown(transcript);
|
|
33
|
+
}
|
|
34
|
+
return { format: opts.format, session_id: transcript.session_id, content };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/lib/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAgBzD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,2BAA2B,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACvF,CAAC;IACD,MAAM,CAAC,GAAG,MAA6B,CAAA;IACvC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,GAAG,IAAI,yDAAyD,CACjE,CAAA;IACH,CAAC;IACD,OAAO,MAAoB,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAsB,EAAE,IAAmB;IAC1E,IAAI,OAAe,CAAA;IACnB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,GAAG,eAAe,CACvB,UAAU,EACV,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CACxE,CAAA;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACjC,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface IngestItem {
|
|
2
|
+
path: string;
|
|
3
|
+
kind: string;
|
|
4
|
+
category: string;
|
|
5
|
+
job_id: number;
|
|
6
|
+
queued: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface IngestResult {
|
|
9
|
+
seed: string;
|
|
10
|
+
queued: number;
|
|
11
|
+
skipped: number;
|
|
12
|
+
unsupported: string[];
|
|
13
|
+
items: IngestItem[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Route a file or folder into the job queue. Folder ingest is resumable:
|
|
17
|
+
* jobs are unique on (kind, source_path), so a re-run only enqueues new files.
|
|
18
|
+
* Each newly-queued file emits an agent-authored `create` event.
|
|
19
|
+
*/
|
|
20
|
+
export declare function ingestPath(seedPath: string, target: string): IngestResult;
|
|
21
|
+
//# sourceMappingURL=ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,EAAE,UAAU,EAAE,CAAA;CACpB;AAcD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAsCzE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { CompostError } from '../errors.js';
|
|
4
|
+
import { classify } from './dispatch.js';
|
|
5
|
+
import { emitAgentCreate, openSeedEvents } from './events.js';
|
|
6
|
+
import { JobQueue, stateDbPath } from './queue.js';
|
|
7
|
+
const AGENT_NAME = 'ingest';
|
|
8
|
+
const AGENT_VERSION = '0.1.0';
|
|
9
|
+
function walk(path) {
|
|
10
|
+
if (statSync(path).isFile())
|
|
11
|
+
return [path];
|
|
12
|
+
const out = [];
|
|
13
|
+
for (const entry of readdirSync(path)) {
|
|
14
|
+
if (entry.startsWith('.'))
|
|
15
|
+
continue;
|
|
16
|
+
const abs = join(path, entry);
|
|
17
|
+
if (statSync(abs).isDirectory())
|
|
18
|
+
out.push(...walk(abs));
|
|
19
|
+
else
|
|
20
|
+
out.push(abs);
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Route a file or folder into the job queue. Folder ingest is resumable:
|
|
26
|
+
* jobs are unique on (kind, source_path), so a re-run only enqueues new files.
|
|
27
|
+
* Each newly-queued file emits an agent-authored `create` event.
|
|
28
|
+
*/
|
|
29
|
+
export function ingestPath(seedPath, target) {
|
|
30
|
+
if (!existsSync(target))
|
|
31
|
+
throw new CompostError('FILE_NOT_FOUND', `No such path: ${target}`);
|
|
32
|
+
const files = walk(target);
|
|
33
|
+
const queue = new JobQueue(stateDbPath(seedPath));
|
|
34
|
+
const events = openSeedEvents(seedPath);
|
|
35
|
+
try {
|
|
36
|
+
const items = [];
|
|
37
|
+
const unsupported = [];
|
|
38
|
+
let queued = 0;
|
|
39
|
+
let skipped = 0;
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const d = classify(file);
|
|
42
|
+
if (d === null) {
|
|
43
|
+
unsupported.push(file);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const { id, inserted } = queue.enqueue(d.kind, file, { category: d.category, ext: d.ext });
|
|
47
|
+
if (inserted) {
|
|
48
|
+
queued += 1;
|
|
49
|
+
emitAgentCreate(events, {
|
|
50
|
+
artifactKind: 'ingest_job',
|
|
51
|
+
initialState: { source_path: file, kind: d.kind, category: d.category },
|
|
52
|
+
agentName: AGENT_NAME,
|
|
53
|
+
agentVersion: AGENT_VERSION,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
skipped += 1;
|
|
58
|
+
}
|
|
59
|
+
items.push({ path: file, kind: d.kind, category: d.category, job_id: id, queued: inserted });
|
|
60
|
+
}
|
|
61
|
+
return { seed: seedPath, queued, skipped, unsupported, items };
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
queue.close();
|
|
65
|
+
events.close();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/lib/ingest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface JournalVersion {
|
|
2
|
+
ts: string;
|
|
3
|
+
body: string;
|
|
4
|
+
}
|
|
5
|
+
/** Split an AGENTS.md into versioned sections. The leading content (before any
|
|
6
|
+
* version marker) is the current working draft. */
|
|
7
|
+
export declare function parseVersions(content: string): {
|
|
8
|
+
draft: string;
|
|
9
|
+
versions: JournalVersion[];
|
|
10
|
+
};
|
|
11
|
+
/** Append the current draft as a timestamped version section (git-less
|
|
12
|
+
* fallback). Returns the new file content. Idempotent if the draft is empty. */
|
|
13
|
+
export declare function appendVersion(content: string, ts: string): string;
|
|
14
|
+
export interface DiffLine {
|
|
15
|
+
type: 'add' | 'del' | 'ctx';
|
|
16
|
+
text: string;
|
|
17
|
+
}
|
|
18
|
+
/** A minimal line-level diff (LCS) between two versions, for the diff view. */
|
|
19
|
+
export declare function diffLines(a: string, b: string): DiffLine[];
|
|
20
|
+
export declare function agentsPath(seedPath: string): string;
|
|
21
|
+
export declare function readJournal(seedPath: string): string;
|
|
22
|
+
export declare function saveJournalVersion(seedPath: string, ts: string): void;
|
|
23
|
+
//# sourceMappingURL=journal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../../src/lib/journal.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED;mDACmD;AACnD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE,CAoB5F;AAED;gFACgF;AAChF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CA+B1D;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAIrE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
// Prompt-journal version/diff logic (#62). The seed's .compost/AGENTS.md is
|
|
4
|
+
// the prompt journal loops read. When git is initialized the web UI commits on
|
|
5
|
+
// save; otherwise we append a timestamped version section so history is never
|
|
6
|
+
// lost. This module is the pure core consumed by the web page + a CLI command.
|
|
7
|
+
const VERSION_RE = /^<!-- compost:version (.+?) -->$/;
|
|
8
|
+
/** Split an AGENTS.md into versioned sections. The leading content (before any
|
|
9
|
+
* version marker) is the current working draft. */
|
|
10
|
+
export function parseVersions(content) {
|
|
11
|
+
const lines = content.split('\n');
|
|
12
|
+
const versions = [];
|
|
13
|
+
const draftLines = [];
|
|
14
|
+
let current = null;
|
|
15
|
+
for (const line of lines) {
|
|
16
|
+
const m = VERSION_RE.exec(line);
|
|
17
|
+
if (m !== null) {
|
|
18
|
+
if (current !== null)
|
|
19
|
+
versions.push(current);
|
|
20
|
+
current = { ts: m[1], body: '' };
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (current === null)
|
|
24
|
+
draftLines.push(line);
|
|
25
|
+
else
|
|
26
|
+
current.body += `${line}\n`;
|
|
27
|
+
}
|
|
28
|
+
if (current !== null)
|
|
29
|
+
versions.push(current);
|
|
30
|
+
return {
|
|
31
|
+
draft: draftLines.join('\n').trimEnd(),
|
|
32
|
+
versions: versions.map((v) => ({ ts: v.ts, body: v.body.trimEnd() })),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** Append the current draft as a timestamped version section (git-less
|
|
36
|
+
* fallback). Returns the new file content. Idempotent if the draft is empty. */
|
|
37
|
+
export function appendVersion(content, ts) {
|
|
38
|
+
const { draft } = parseVersions(content);
|
|
39
|
+
if (draft.trim().length === 0)
|
|
40
|
+
return content;
|
|
41
|
+
const marker = `<!-- compost:version ${ts} -->`;
|
|
42
|
+
// The new draft stays at top; the snapshot is recorded below it.
|
|
43
|
+
return `${draft}\n\n${marker}\n${draft}\n`;
|
|
44
|
+
}
|
|
45
|
+
/** A minimal line-level diff (LCS) between two versions, for the diff view. */
|
|
46
|
+
export function diffLines(a, b) {
|
|
47
|
+
const x = a.split('\n');
|
|
48
|
+
const y = b.split('\n');
|
|
49
|
+
const n = x.length;
|
|
50
|
+
const m = y.length;
|
|
51
|
+
const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
|
|
52
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
53
|
+
for (let j = m - 1; j >= 0; j--) {
|
|
54
|
+
lcs[i][j] =
|
|
55
|
+
x[i] === y[j] ? lcs[i + 1][j + 1] + 1 : Math.max(lcs[i + 1][j], lcs[i][j + 1]);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const out = [];
|
|
59
|
+
let i = 0;
|
|
60
|
+
let j = 0;
|
|
61
|
+
while (i < n && j < m) {
|
|
62
|
+
if (x[i] === y[j]) {
|
|
63
|
+
out.push({ type: 'ctx', text: x[i] });
|
|
64
|
+
i++;
|
|
65
|
+
j++;
|
|
66
|
+
}
|
|
67
|
+
else if (lcs[i + 1][j] >= lcs[i][j + 1]) {
|
|
68
|
+
out.push({ type: 'del', text: x[i] });
|
|
69
|
+
i++;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
out.push({ type: 'add', text: y[j] });
|
|
73
|
+
j++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
while (i < n)
|
|
77
|
+
out.push({ type: 'del', text: x[i++] });
|
|
78
|
+
while (j < m)
|
|
79
|
+
out.push({ type: 'add', text: y[j++] });
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
export function agentsPath(seedPath) {
|
|
83
|
+
return join(seedPath, '.compost', 'AGENTS.md');
|
|
84
|
+
}
|
|
85
|
+
export function readJournal(seedPath) {
|
|
86
|
+
const p = agentsPath(seedPath);
|
|
87
|
+
return existsSync(p) ? readFileSync(p, 'utf8') : '';
|
|
88
|
+
}
|
|
89
|
+
export function saveJournalVersion(seedPath, ts) {
|
|
90
|
+
const p = agentsPath(seedPath);
|
|
91
|
+
if (!existsSync(p))
|
|
92
|
+
return;
|
|
93
|
+
writeFileSync(p, appendVersion(readFileSync(p, 'utf8'), ts), 'utf8');
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=journal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../../src/lib/journal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface RenamePlan {
|
|
2
|
+
from: string;
|
|
3
|
+
to: string;
|
|
4
|
+
}
|
|
5
|
+
export interface MigratePlan {
|
|
6
|
+
seed_name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
already_migrated: boolean;
|
|
9
|
+
renames: RenamePlan[];
|
|
10
|
+
scaffold_dirs: string[];
|
|
11
|
+
scaffold_files: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface MigrateOptions {
|
|
14
|
+
apply?: boolean;
|
|
15
|
+
now?: () => Date;
|
|
16
|
+
}
|
|
17
|
+
export interface MigrateResult extends MigratePlan {
|
|
18
|
+
applied: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Map a legacy directory name to its compost equivalent.
|
|
22
|
+
* Strips a leading numeric prefix (`01_`, `02-`, …) and lowercases the first
|
|
23
|
+
* path segment. "01_Plan" → "plan", "02_Sessions" → "sessions",
|
|
24
|
+
* "04_Evaluation" → "evaluation". Names without a numeric prefix are left alone.
|
|
25
|
+
*/
|
|
26
|
+
export declare function mapLegacyName(name: string): string;
|
|
27
|
+
export declare function planMigration(seedPath: string): MigratePlan;
|
|
28
|
+
export declare function migrate(seedPath: string, opts?: MigrateOptions): MigrateResult;
|
|
29
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,EAAE,OAAO,CAAA;IACzB,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,cAAc,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CA4C3D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,aAAa,CAoDlF"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, join } from 'node:path';
|
|
3
|
+
import { CompostError } from '../errors.js';
|
|
4
|
+
import { loadTemplate, render } from './templates.js';
|
|
5
|
+
/** Folders that compost expects in a migrated seed, beyond the renamed legacy dirs. */
|
|
6
|
+
const SCAFFOLD_DIRS = [
|
|
7
|
+
'glossary',
|
|
8
|
+
'highlights',
|
|
9
|
+
'codebook',
|
|
10
|
+
'exports',
|
|
11
|
+
'legacy',
|
|
12
|
+
'sessions/_inbox',
|
|
13
|
+
'.compost',
|
|
14
|
+
'.compost/logs',
|
|
15
|
+
'.compost/work',
|
|
16
|
+
];
|
|
17
|
+
const NUMBERED_PREFIX_RE = /^(\d+)[_-](.+)$/;
|
|
18
|
+
/**
|
|
19
|
+
* Map a legacy directory name to its compost equivalent.
|
|
20
|
+
* Strips a leading numeric prefix (`01_`, `02-`, …) and lowercases the first
|
|
21
|
+
* path segment. "01_Plan" → "plan", "02_Sessions" → "sessions",
|
|
22
|
+
* "04_Evaluation" → "evaluation". Names without a numeric prefix are left alone.
|
|
23
|
+
*/
|
|
24
|
+
export function mapLegacyName(name) {
|
|
25
|
+
const m = NUMBERED_PREFIX_RE.exec(name);
|
|
26
|
+
if (m === null)
|
|
27
|
+
return name;
|
|
28
|
+
return m[2].toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
export function planMigration(seedPath) {
|
|
31
|
+
if (!existsSync(seedPath) || !statSync(seedPath).isDirectory()) {
|
|
32
|
+
throw new CompostError('FILE_NOT_FOUND', `Not a directory: ${seedPath}`);
|
|
33
|
+
}
|
|
34
|
+
const entries = readdirSync(seedPath).filter((e) => {
|
|
35
|
+
if (e.startsWith('.'))
|
|
36
|
+
return false;
|
|
37
|
+
return statSync(join(seedPath, e)).isDirectory();
|
|
38
|
+
});
|
|
39
|
+
const renames = [];
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
const mapped = mapLegacyName(entry);
|
|
42
|
+
if (mapped !== entry) {
|
|
43
|
+
renames.push({ from: entry, to: mapped });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const alreadyMigrated = renames.length === 0 && existsSync(join(seedPath, '.compost'));
|
|
47
|
+
const scaffoldDirs = [];
|
|
48
|
+
for (const dir of SCAFFOLD_DIRS) {
|
|
49
|
+
if (!existsSync(join(seedPath, dir)))
|
|
50
|
+
scaffoldDirs.push(dir);
|
|
51
|
+
}
|
|
52
|
+
const scaffoldFiles = [];
|
|
53
|
+
if (!existsSync(join(seedPath, '.compost', 'config.toml'))) {
|
|
54
|
+
scaffoldFiles.push('.compost/config.toml');
|
|
55
|
+
}
|
|
56
|
+
if (!existsSync(join(seedPath, '.compost', 'AGENTS.md'))) {
|
|
57
|
+
scaffoldFiles.push('.compost/AGENTS.md');
|
|
58
|
+
}
|
|
59
|
+
if (!existsSync(join(seedPath, 'seed.md'))) {
|
|
60
|
+
scaffoldFiles.push('seed.md');
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
seed_name: basename(seedPath),
|
|
64
|
+
path: seedPath,
|
|
65
|
+
already_migrated: alreadyMigrated,
|
|
66
|
+
renames,
|
|
67
|
+
scaffold_dirs: scaffoldDirs,
|
|
68
|
+
scaffold_files: scaffoldFiles,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export function migrate(seedPath, opts = {}) {
|
|
72
|
+
const plan = planMigration(seedPath);
|
|
73
|
+
const apply = opts.apply === true;
|
|
74
|
+
if (!apply) {
|
|
75
|
+
return { ...plan, applied: false };
|
|
76
|
+
}
|
|
77
|
+
// Guard: refuse to overwrite an existing target dir with a rename.
|
|
78
|
+
for (const r of plan.renames) {
|
|
79
|
+
if (existsSync(join(seedPath, r.to))) {
|
|
80
|
+
throw new CompostError('INVALID_INPUT', `Cannot rename "${r.from}" → "${r.to}": target already exists. Resolve manually.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Apply renames, tracking completed ones so we can roll back on failure.
|
|
84
|
+
const completed = [];
|
|
85
|
+
try {
|
|
86
|
+
for (const r of plan.renames) {
|
|
87
|
+
renameSync(join(seedPath, r.from), join(seedPath, r.to));
|
|
88
|
+
completed.push(r);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (cause) {
|
|
92
|
+
for (const done of completed.reverse()) {
|
|
93
|
+
try {
|
|
94
|
+
renameSync(join(seedPath, done.to), join(seedPath, done.from));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// best-effort rollback; report the original failure
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throw new CompostError('IO_ERROR', `Migration failed during rename; rolled back`, { cause });
|
|
101
|
+
}
|
|
102
|
+
// Scaffold missing dirs + files (idempotent).
|
|
103
|
+
for (const dir of plan.scaffold_dirs) {
|
|
104
|
+
mkdirSync(join(seedPath, dir), { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
const now = (opts.now ?? (() => new Date()))();
|
|
107
|
+
const vars = {
|
|
108
|
+
seed_name: plan.seed_name,
|
|
109
|
+
created_at: now.toISOString(),
|
|
110
|
+
};
|
|
111
|
+
for (const file of plan.scaffold_files) {
|
|
112
|
+
const templateName = file === 'seed.md' ? 'seed.md' : basename(file);
|
|
113
|
+
writeFileSync(join(seedPath, file), render(loadTemplate(templateName), vars), 'utf8');
|
|
114
|
+
}
|
|
115
|
+
return { ...plan, applied: true };
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native (host) transcription runtime resolution (#176, native-first).
|
|
3
|
+
*
|
|
4
|
+
* On Apple Silicon the native path (parakeet-mlx + pyannote on Metal) is ~20×
|
|
5
|
+
* faster than the Docker WhisperX container and runs on real host paths, so it's
|
|
6
|
+
* the default. The Docker container is a documented cross-platform fallback.
|
|
7
|
+
*
|
|
8
|
+
* `compost transcribe` defaults to native when both a Python interpreter and the
|
|
9
|
+
* transcriber package dir resolve; otherwise it falls back to Docker. Resolution
|
|
10
|
+
* precedence: explicit flag > env var > managed venv (provisioned by
|
|
11
|
+
* `compost setup`, #183) / repo-relative package.
|
|
12
|
+
*/
|
|
13
|
+
export interface NativeRuntimePaths {
|
|
14
|
+
python: string;
|
|
15
|
+
transcriberDir: string;
|
|
16
|
+
}
|
|
17
|
+
/** Native Metal/MLX ASR (parakeet-mlx) + pyannote-MPS require Apple Silicon. */
|
|
18
|
+
export declare function isAppleSilicon(): boolean;
|
|
19
|
+
/** Managed native venv directory, provisioned by `compost setup --provision-native`
|
|
20
|
+
* (#183). `$COMPOST_HOME` overrides the default `~/.compost`. */
|
|
21
|
+
export declare function managedVenvDir(env?: NodeJS.ProcessEnv): string;
|
|
22
|
+
/** Managed native venv python (`<venv>/bin/python`). */
|
|
23
|
+
export declare function managedVenvPython(env?: NodeJS.ProcessEnv): string;
|
|
24
|
+
/** Walk up from this module to find the repo's `transcriber/` package — works
|
|
25
|
+
* for repo/dev installs where cli/ and transcriber/ are siblings. Returns
|
|
26
|
+
* undefined for a bare global install (use the env var or managed venv there). */
|
|
27
|
+
export declare function findRepoTranscriberDir(startDir?: string, exists?: (p: string) => boolean): string | undefined;
|
|
28
|
+
export interface ResolveNativeOpts {
|
|
29
|
+
python?: string;
|
|
30
|
+
transcriberDir?: string;
|
|
31
|
+
env?: NodeJS.ProcessEnv;
|
|
32
|
+
exists?: (p: string) => boolean;
|
|
33
|
+
/** Override repo-dir discovery (tests). */
|
|
34
|
+
repoTranscriberDir?: () => string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the native python + transcriber dir, or null when native isn't
|
|
38
|
+
* available. Precedence: explicit > env > managed venv / repo-relative.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveNativeRuntime(opts?: ResolveNativeOpts): NativeRuntimePaths | null;
|
|
41
|
+
/**
|
|
42
|
+
* Pick the runtime: an explicit `--runtime` wins; otherwise native on Apple
|
|
43
|
+
* Silicon when resolvable, else Docker (the cross-platform fallback).
|
|
44
|
+
*/
|
|
45
|
+
export declare function pickRuntime(explicit: string | undefined, native: NativeRuntimePaths | null, appleSilicon?: boolean): 'native' | 'docker';
|
|
46
|
+
//# sourceMappingURL=nativeRuntime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeRuntime.d.ts","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,gFAAgF;AAChF,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;iEACiE;AACjE,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI3E;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE9E;AAED;;kFAEkF;AAClF,wBAAgB,sBAAsB,CACpC,QAAQ,GAAE,MAAgD,EAC1D,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAoB,GAC1C,MAAM,GAAG,SAAS,CAUpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/B,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CAC9C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,GAAG,IAAI,CAY5F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,YAAY,GAAE,OAA0B,GACvC,QAAQ,GAAG,QAAQ,CAGrB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
/** Native Metal/MLX ASR (parakeet-mlx) + pyannote-MPS require Apple Silicon. */
|
|
6
|
+
export function isAppleSilicon() {
|
|
7
|
+
return process.platform === 'darwin' && process.arch === 'arm64';
|
|
8
|
+
}
|
|
9
|
+
/** Managed native venv directory, provisioned by `compost setup --provision-native`
|
|
10
|
+
* (#183). `$COMPOST_HOME` overrides the default `~/.compost`. */
|
|
11
|
+
export function managedVenvDir(env = process.env) {
|
|
12
|
+
// `?.trim()` so an empty/whitespace COMPOST_HOME doesn't yield a relative path.
|
|
13
|
+
const home = env.COMPOST_HOME?.trim() ? env.COMPOST_HOME : join(homedir(), '.compost');
|
|
14
|
+
return join(home, 'transcriber-venv');
|
|
15
|
+
}
|
|
16
|
+
/** Managed native venv python (`<venv>/bin/python`). */
|
|
17
|
+
export function managedVenvPython(env = process.env) {
|
|
18
|
+
return join(managedVenvDir(env), 'bin', 'python');
|
|
19
|
+
}
|
|
20
|
+
/** Walk up from this module to find the repo's `transcriber/` package — works
|
|
21
|
+
* for repo/dev installs where cli/ and transcriber/ are siblings. Returns
|
|
22
|
+
* undefined for a bare global install (use the env var or managed venv there). */
|
|
23
|
+
export function findRepoTranscriberDir(startDir = dirname(fileURLToPath(import.meta.url)), exists = existsSync) {
|
|
24
|
+
let dir = startDir;
|
|
25
|
+
for (let i = 0; i < 10; i++) {
|
|
26
|
+
const candidate = join(dir, 'transcriber');
|
|
27
|
+
if (exists(join(candidate, 'app', 'transcribe_cli.py')))
|
|
28
|
+
return candidate;
|
|
29
|
+
const parent = dirname(dir);
|
|
30
|
+
if (parent === dir)
|
|
31
|
+
break;
|
|
32
|
+
dir = parent;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the native python + transcriber dir, or null when native isn't
|
|
38
|
+
* available. Precedence: explicit > env > managed venv / repo-relative.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveNativeRuntime(opts = {}) {
|
|
41
|
+
const env = opts.env ?? process.env;
|
|
42
|
+
const exists = opts.exists ?? existsSync;
|
|
43
|
+
const managed = managedVenvPython(env);
|
|
44
|
+
const python = opts.python ?? env.COMPOST_TRANSCRIBER_PYTHON ?? (exists(managed) ? managed : undefined);
|
|
45
|
+
const transcriberDir = opts.transcriberDir ??
|
|
46
|
+
env.COMPOST_TRANSCRIBER_DIR ??
|
|
47
|
+
(opts.repoTranscriberDir ?? (() => findRepoTranscriberDir(undefined, exists)))();
|
|
48
|
+
if (python === undefined || transcriberDir === undefined)
|
|
49
|
+
return null;
|
|
50
|
+
return { python, transcriberDir };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Pick the runtime: an explicit `--runtime` wins; otherwise native on Apple
|
|
54
|
+
* Silicon when resolvable, else Docker (the cross-platform fallback).
|
|
55
|
+
*/
|
|
56
|
+
export function pickRuntime(explicit, native, appleSilicon = isAppleSilicon()) {
|
|
57
|
+
if (explicit === 'native' || explicit === 'docker')
|
|
58
|
+
return explicit;
|
|
59
|
+
return appleSilicon && native !== null ? 'native' : 'docker';
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=nativeRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nativeRuntime.js","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provision the managed native transcription venv (#183) so `compost transcribe`
|
|
3
|
+
* runs native (Parakeet + pyannote on Metal) with zero flags on a fresh
|
|
4
|
+
* Apple-Silicon machine. Side-effectful, so it's an explicit opt-in
|
|
5
|
+
* (`compost setup --provision-native`), separate from the read-only doctor.
|
|
6
|
+
*
|
|
7
|
+
* The dep list mirrors the transcriber's `[native]` extra in pyproject.toml; a
|
|
8
|
+
* unit test asserts they stay in sync. We install the deps (not the package
|
|
9
|
+
* editable) to avoid depending on a build backend — the `app` package is found
|
|
10
|
+
* at run time via the entrypoint's cwd.
|
|
11
|
+
*/
|
|
12
|
+
/** Native ASR deps — keep in sync with transcriber/pyproject.toml `[native]`. */
|
|
13
|
+
export declare const NATIVE_DEPS: string[];
|
|
14
|
+
export interface ProvisionExecResult {
|
|
15
|
+
ok: boolean;
|
|
16
|
+
stdout: string;
|
|
17
|
+
stderr: string;
|
|
18
|
+
}
|
|
19
|
+
/** Injectable command runner. `stream` lets the slow pip step write to the
|
|
20
|
+
* terminal instead of being captured. */
|
|
21
|
+
export type ProvisionExec = (cmd: string, args: string[], opts?: {
|
|
22
|
+
stream?: boolean;
|
|
23
|
+
}) => ProvisionExecResult;
|
|
24
|
+
export interface ProvisionNativeOptions {
|
|
25
|
+
env?: NodeJS.ProcessEnv;
|
|
26
|
+
exists?: (p: string) => boolean;
|
|
27
|
+
exec?: ProvisionExec;
|
|
28
|
+
/** Explicit interpreter to build the venv from (else discovered). */
|
|
29
|
+
pythonBin?: string;
|
|
30
|
+
/** transcriber/ dir (else COMPOST_TRANSCRIBER_DIR env or repo-relative). */
|
|
31
|
+
transcriberDir?: string;
|
|
32
|
+
/** Reinstall even if the venv already imports the native deps. */
|
|
33
|
+
force?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ProvisionNativeResult {
|
|
36
|
+
status: 'already-ready' | 'provisioned';
|
|
37
|
+
venvDir: string;
|
|
38
|
+
venvPython: string;
|
|
39
|
+
pythonBin: string | null;
|
|
40
|
+
transcriberDir: string;
|
|
41
|
+
steps: string[];
|
|
42
|
+
}
|
|
43
|
+
/** Create + populate the managed native venv. Idempotent: a venv that already
|
|
44
|
+
* imports the deps is a no-op unless `force`. */
|
|
45
|
+
export declare function provisionNativeVenv(opts?: ProvisionNativeOptions): ProvisionNativeResult;
|
|
46
|
+
//# sourceMappingURL=provisionNative.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisionNative.d.ts","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AAEH,iFAAiF;AACjF,eAAO,MAAM,WAAW,UAMvB,CAAA;AAOD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AACD;yCACyC;AACzC,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,KACxB,mBAAmB,CAAA;AAExB,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,GAAG,aAAa,CAAA;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAgCD;iDACiD;AACjD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,sBAA2B,GAAG,qBAAqB,CA+D5F"}
|