@cesarandreslopez/occ 0.7.0 → 0.8.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
@@ -340,6 +340,8 @@ Available subpath exports:
340
340
  | `@cesarandreslopez/occ/workspace/analyze` | `analyzeWorkspace` — workspace-level analysis |
341
341
  | `@cesarandreslopez/occ/workspace/documents` | `inspectWorkspaceDocumentSet` — document summaries and cross-references |
342
342
  | `@cesarandreslopez/occ/workspace/types` | Workspace analysis types |
343
+ | `@cesarandreslopez/occ/workspace/prepare` | `prepareWorkspaceContext` — combined code indexing + document inspection |
344
+ | `@cesarandreslopez/occ/workspace/prepare-types` | Workspace preparation types (`WorkspacePrepareOptions`, `WorkspacePreparedContext`, etc.) |
343
345
  | `@cesarandreslopez/occ/markdown/convert` | `documentToMarkdown` — document-to-markdown conversion |
344
346
  | `@cesarandreslopez/occ/structure/extract` | `extractFromMarkdown` — heading tree extraction |
345
347
  | `@cesarandreslopez/occ/structure/types` | Structure types and helpers |
@@ -472,6 +474,25 @@ occ workspace documents --max-files 20 --include-markdown --format json
472
474
 
473
475
  `occ workspace analyze` returns a `schemaVersion: 1` JSON envelope containing code metrics (via scc), document aggregates, heading structures, skipped files, and errors. `occ workspace documents` returns per-document summaries with cross-references (filename mentions, hyperlinks, citations) and unresolved mentions detected across the document set.
474
476
 
477
+ For combined code indexing and document inspection with progress tracking:
478
+
479
+ ```ts
480
+ import { prepareWorkspaceContext } from '@cesarandreslopez/occ/workspace/prepare';
481
+
482
+ const context = await prepareWorkspaceContext('./my-project', {
483
+ includeCode: true,
484
+ includeDocuments: true,
485
+ executionMode: 'auto', // 'auto' | 'inline' | 'subprocess'
486
+ }, (event) => {
487
+ console.log(`[${event.scope}] ${event.stage}: ${event.completed}/${event.total}`);
488
+ });
489
+
490
+ // context.code?.index — full CodebaseIndex
491
+ // context.documents — WorkspaceDocumentSet with cross-references
492
+ // context.elapsedMs — total wall time
493
+ // context.errors — collected errors from both phases
494
+ ```
495
+
475
496
  ## Documentation
476
497
 
477
498
  Full documentation is available at [cesarandreslopez.github.io/occ](https://cesarandreslopez.github.io/occ/), including:
@@ -9,12 +9,14 @@ import { inspectWorkbook } from './sheet/inspect.js';
9
9
  import { inspectPresentation } from './slide/inspect.js';
10
10
  import { analyzeWorkspace } from './workspace/analyze.js';
11
11
  import { inspectWorkspaceDocumentSet } from './workspace/documents.js';
12
+ import { prepareWorkspaceContext } from './workspace/prepare.js';
12
13
  export type { CodebaseIndex, CodeNode, CodeEdge, CodeNodeType, CodeEdgeType } from './code/types.js';
13
14
  export type { CodeQuerySession, CodeSessionChunkOptions } from './code/session.js';
14
15
  export type { CodeIndexStore, CodeIndexStoreOptions, StoreStrategy, StoreMetadata, StoreSessionOptions } from './code/store.js';
15
16
  export type { CodeChunk } from './code/chunk.js';
16
17
  export type { BuildCodebaseOptions } from './code/build.js';
17
18
  export type { OnProgress, ProgressEvent } from './progress-event.js';
19
+ export type { WorkspacePrepareOptions, WorkspacePreparedContext, WorkspacePreparationProgressEvent, OnPrepareProgress } from './workspace/prepare-types.js';
18
20
  export interface OccCodeNamespace {
19
21
  buildIndex: typeof buildCodebaseIndex;
20
22
  createSession: typeof createCodeQuerySession;
@@ -27,6 +29,7 @@ export interface OccCodeNamespace {
27
29
  export interface OccWorkspaceNamespace {
28
30
  analyze: typeof analyzeWorkspace;
29
31
  inspectDocuments: typeof inspectWorkspaceDocumentSet;
32
+ prepare: typeof prepareWorkspaceContext;
30
33
  }
31
34
  export interface OccDocNamespace {
32
35
  inspect: typeof inspectDocument;
package/dist/src/index.js CHANGED
@@ -9,6 +9,7 @@ import { inspectWorkbook } from './sheet/inspect.js';
9
9
  import { inspectPresentation } from './slide/inspect.js';
10
10
  import { analyzeWorkspace } from './workspace/analyze.js';
11
11
  import { inspectWorkspaceDocumentSet } from './workspace/documents.js';
12
+ import { prepareWorkspaceContext } from './workspace/prepare.js';
12
13
  export function createOcc() {
13
14
  return {
14
15
  code: {
@@ -23,6 +24,7 @@ export function createOcc() {
23
24
  workspace: {
24
25
  analyze: analyzeWorkspace,
25
26
  inspectDocuments: inspectWorkspaceDocumentSet,
27
+ prepare: prepareWorkspaceContext,
26
28
  },
27
29
  doc: {
28
30
  inspect: inspectDocument,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AA8CvE,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,sBAAsB;YACrC,sBAAsB,EAAE,+BAA+B;YACvD,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc;SAC/B;QACD,SAAS,EAAE;YACT,OAAO,EAAE,gBAAgB;YACzB,gBAAgB,EAAE,2BAA2B;SAC9C;QACD,GAAG,EAAE;YACH,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,iBAAiB;SAC5B;QACD,KAAK,EAAE;YACL,OAAO,EAAE,eAAe;SACzB;QACD,KAAK,EAAE;YACL,OAAO,EAAE,mBAAmB;SAC7B;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAgDjE,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,IAAI,EAAE;YACJ,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,sBAAsB;YACrC,sBAAsB,EAAE,+BAA+B;YACvD,SAAS,EAAE,kBAAkB;YAC7B,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,cAAc;SAC/B;QACD,SAAS,EAAE;YACT,OAAO,EAAE,gBAAgB;YACzB,gBAAgB,EAAE,2BAA2B;YAC7C,OAAO,EAAE,uBAAuB;SACjC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,iBAAiB;SAC5B;QACD,KAAK,EAAE;YACL,OAAO,EAAE,eAAe;SACzB;QACD,KAAK,EAAE;YACL,OAAO,EAAE,mBAAmB;SAC7B;KACF,CAAC;AACJ,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { OnProgress } from '../progress-event.js';
1
2
  import type { WorkspaceDocumentSet } from './types.js';
2
3
  export interface InspectWorkspaceDocumentSetOptions {
3
4
  excludeDir?: string[];
@@ -7,4 +8,4 @@ export interface InspectWorkspaceDocumentSetOptions {
7
8
  maxReferenceFiles?: number;
8
9
  includeMarkdown?: boolean;
9
10
  }
10
- export declare function inspectWorkspaceDocumentSet(rootDir: string, options?: InspectWorkspaceDocumentSetOptions): Promise<WorkspaceDocumentSet>;
11
+ export declare function inspectWorkspaceDocumentSet(rootDir: string, options?: InspectWorkspaceDocumentSetOptions, onProgress?: OnProgress): Promise<WorkspaceDocumentSet>;
@@ -5,7 +5,7 @@ import { documentToMarkdown } from '../markdown/convert.js';
5
5
  import { detectCrossReferences } from '../doc/references.js';
6
6
  import { inspectDocumentSummary } from '../doc/batch.js';
7
7
  const DOCUMENT_FORMATS = new Set(['docx', 'pdf', 'pptx', 'xlsx', 'odt', 'ods', 'odp']);
8
- export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
8
+ export async function inspectWorkspaceDocumentSet(rootDir, options = {}, onProgress) {
9
9
  const resolvedRoot = path.resolve(rootDir);
10
10
  const excludeDir = options.excludeDir ?? ['node_modules', '.git', 'dist', 'vendor', 'build', 'coverage', 'target'];
11
11
  const discovery = await findFiles([resolvedRoot], {
@@ -22,7 +22,20 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
22
22
  const discovered = discovery.files
23
23
  .filter((file) => DOCUMENT_FORMATS.has(getExtension(file.path)))
24
24
  .slice(0, maxFiles);
25
- for (const file of discovered) {
25
+ onProgress?.({ phase: 'discover', total: discovered.length, completed: discovered.length, detail: discovered.length > 0 ? `${discovered.length} documents found` : 'No documents found' });
26
+ if (discovered.length === 0) {
27
+ return {
28
+ schemaVersion: 1,
29
+ rootDir: resolvedRoot,
30
+ documents: [],
31
+ crossReferences: [],
32
+ unresolvedMentions: [],
33
+ skipped: discovery.skipped,
34
+ errors: [],
35
+ };
36
+ }
37
+ for (let i = 0; i < discovered.length; i++) {
38
+ const file = discovered[i];
26
39
  const relativePath = path.relative(resolvedRoot, file.path).split(path.sep).join('/');
27
40
  const format = getExtension(file.path);
28
41
  const result = await inspectDocumentSummary(file.path, relativePath, format, { includeMarkdown });
@@ -36,9 +49,12 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
36
49
  message: result.error,
37
50
  });
38
51
  }
52
+ onProgress?.({ phase: 'inspect', total: discovered.length, completed: i + 1, detail: relativePath });
39
53
  }
40
54
  const docsWithContent = [];
41
- for (const doc of documents.slice(0, maxReferenceFiles)) {
55
+ const refSlice = documents.slice(0, maxReferenceFiles);
56
+ for (let i = 0; i < refSlice.length; i++) {
57
+ const doc = refSlice[i];
42
58
  try {
43
59
  const content = doc.markdownContent ?? markdownByPath.get(doc.filePath) ?? await documentToMarkdown(doc.filePath);
44
60
  if (content)
@@ -51,10 +67,12 @@ export async function inspectWorkspaceDocumentSet(rootDir, options = {}) {
51
67
  message: error.message,
52
68
  });
53
69
  }
70
+ onProgress?.({ phase: 'references', total: refSlice.length, completed: i + 1, detail: path.relative(resolvedRoot, doc.filePath).split(path.sep).join('/') });
54
71
  }
55
72
  const references = docsWithContent.length >= 2
56
73
  ? detectCrossReferences(docsWithContent)
57
74
  : { references: [], unresolvedMentions: [] };
75
+ onProgress?.({ phase: 'cross-references', total: 1, completed: 1, detail: `${references.references.length} cross-references detected` });
58
76
  return {
59
77
  schemaVersion: 1,
60
78
  rootDir: resolvedRoot,
@@ -1 +1 @@
1
- {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/workspace/documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/workspace/documents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Internal subprocess entry point for workspace preparation.
3
+ * Spawned via fork() by prepare.ts — not a public API.
4
+ *
5
+ * IPC protocol:
6
+ * Parent → Child: { type: 'start', options: BuildCodebaseOptions }
7
+ * Child → Parent: { type: 'progress', event: ProgressEvent }
8
+ * Child → Parent: { type: 'complete', resultPath: string }
9
+ * Child → Parent: { type: 'error', message: string }
10
+ */
11
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Internal subprocess entry point for workspace preparation.
3
+ * Spawned via fork() by prepare.ts — not a public API.
4
+ *
5
+ * IPC protocol:
6
+ * Parent → Child: { type: 'start', options: BuildCodebaseOptions }
7
+ * Child → Parent: { type: 'progress', event: ProgressEvent }
8
+ * Child → Parent: { type: 'complete', resultPath: string }
9
+ * Child → Parent: { type: 'error', message: string }
10
+ */
11
+ import { openSync, writeSync, closeSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { tmpdir } from 'node:os';
14
+ import { buildCodebaseIndex } from '../code/build.js';
15
+ /**
16
+ * Write a CodebaseIndex to disk element-by-element via file descriptor,
17
+ * avoiding V8's ~512MB string length limit that JSON.stringify() hits
18
+ * on large codebases.
19
+ */
20
+ function streamIndexToFile(index, filePath) {
21
+ const fd = openSync(filePath, 'w');
22
+ try {
23
+ writeSync(fd, '{"repoRoot":');
24
+ writeSync(fd, JSON.stringify(index.repoRoot));
25
+ writeSync(fd, ',"capabilities":');
26
+ writeSync(fd, JSON.stringify(index.capabilities));
27
+ writeSync(fd, ',"files":[');
28
+ for (let i = 0; i < index.files.length; i++) {
29
+ if (i > 0)
30
+ writeSync(fd, ',');
31
+ writeSync(fd, JSON.stringify(index.files[i]));
32
+ }
33
+ writeSync(fd, '],"nodes":[');
34
+ for (let i = 0; i < index.nodes.length; i++) {
35
+ if (i > 0)
36
+ writeSync(fd, ',');
37
+ writeSync(fd, JSON.stringify(index.nodes[i]));
38
+ }
39
+ writeSync(fd, '],"edges":[');
40
+ for (let i = 0; i < index.edges.length; i++) {
41
+ if (i > 0)
42
+ writeSync(fd, ',');
43
+ writeSync(fd, JSON.stringify(index.edges[i]));
44
+ }
45
+ writeSync(fd, ']}');
46
+ }
47
+ finally {
48
+ closeSync(fd);
49
+ }
50
+ }
51
+ function send(msg) {
52
+ if (process.send) {
53
+ process.send(msg);
54
+ }
55
+ }
56
+ process.on('message', async (msg) => {
57
+ if (msg.type !== 'start')
58
+ return;
59
+ try {
60
+ const index = await buildCodebaseIndex(msg.options, (event) => {
61
+ send({ type: 'progress', event });
62
+ });
63
+ // Stream index to temp file element-by-element to avoid V8's ~512MB
64
+ // string length limit on JSON.stringify for large codebases.
65
+ const resultPath = join(tmpdir(), `occ-prepare-${process.pid}-${Date.now()}.json`);
66
+ streamIndexToFile(index, resultPath);
67
+ send({ type: 'complete', resultPath });
68
+ }
69
+ catch (err) {
70
+ const error = err instanceof Error ? err : new Error(String(err));
71
+ send({ type: 'error', message: error.message });
72
+ }
73
+ if (process.connected) {
74
+ process.disconnect?.();
75
+ }
76
+ });
77
+ //# sourceMappingURL=prepare-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-runner.js","sourceRoot":"","sources":["../../../src/workspace/prepare-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { CodebaseIndex } from '../code/types.js';
2
+ import type { WorkspaceDocumentSet } from './types.js';
3
+ export interface WorkspacePrepareOptions {
4
+ /** Include code indexing via buildCodebaseIndex. Default: true. */
5
+ includeCode?: boolean;
6
+ /** Include document inspection via inspectWorkspaceDocumentSet. Default: true. */
7
+ includeDocuments?: boolean;
8
+ /** Directories to exclude from both code and document discovery. */
9
+ excludeDir?: string[];
10
+ /** Disable .gitignore respect. */
11
+ noGitignore?: boolean;
12
+ /** Maximum document file size in MB. */
13
+ largeFileLimitMb?: number;
14
+ /** Maximum number of document files to inspect. */
15
+ maxFiles?: number;
16
+ /** Maximum number of documents to load for cross-reference detection. */
17
+ maxReferenceFiles?: number;
18
+ /** Include raw markdown content in document summaries. */
19
+ includeMarkdown?: boolean;
20
+ /**
21
+ * Execution mode for code indexing.
22
+ * - `'auto'` (default): subprocess when code indexing is enabled, inline for docs-only.
23
+ * - `'inline'`: run code indexing in the current process.
24
+ * - `'subprocess'`: always fork a child process for code indexing.
25
+ */
26
+ executionMode?: 'auto' | 'inline' | 'subprocess';
27
+ }
28
+ export interface WorkspacePreparedContext {
29
+ rootDir: string;
30
+ code: {
31
+ index: CodebaseIndex;
32
+ fileCount: number;
33
+ nodeCount: number;
34
+ edgeCount: number;
35
+ } | null;
36
+ documents: WorkspaceDocumentSet | null;
37
+ elapsedMs: number;
38
+ errors: string[];
39
+ }
40
+ export interface WorkspacePreparationProgressEvent {
41
+ /** Which subsystem is reporting: 'prepare' for overall, 'code' for indexing, 'documents' for inspection. */
42
+ scope: 'prepare' | 'code' | 'documents';
43
+ /** Current stage within the scope (e.g. 'discover', 'parse', 'index', 'inspect', 'references'). */
44
+ stage: string;
45
+ completed: number;
46
+ total: number;
47
+ detail?: string;
48
+ stats?: Record<string, number>;
49
+ }
50
+ export type OnPrepareProgress = (event: WorkspacePreparationProgressEvent) => void;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prepare-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-types.js","sourceRoot":"","sources":["../../../src/workspace/prepare-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { WorkspacePrepareOptions, WorkspacePreparedContext, OnPrepareProgress } from './prepare-types.js';
2
+ export declare function prepareWorkspaceContext(rootDir: string, options?: WorkspacePrepareOptions, onProgress?: OnPrepareProgress): Promise<WorkspacePreparedContext>;
@@ -0,0 +1,152 @@
1
+ import path from 'node:path';
2
+ import { fork } from 'node:child_process';
3
+ import { readFileSync, unlinkSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { buildCodebaseIndex } from '../code/build.js';
6
+ import { inspectWorkspaceDocumentSet } from './documents.js';
7
+ function resolveExecutionMode(options) {
8
+ const mode = options.executionMode ?? 'auto';
9
+ if (mode === 'inline')
10
+ return 'inline';
11
+ if (mode === 'subprocess')
12
+ return 'subprocess';
13
+ // auto: subprocess when code indexing is enabled
14
+ return (options.includeCode !== false) ? 'subprocess' : 'inline';
15
+ }
16
+ function mapCodeProgress(event, onProgress) {
17
+ onProgress({
18
+ scope: 'code',
19
+ stage: event.phase,
20
+ completed: event.completed,
21
+ total: event.total,
22
+ detail: event.detail,
23
+ });
24
+ }
25
+ async function buildCodeInline(rootDir, options, onProgress) {
26
+ return buildCodebaseIndex({
27
+ repoRoot: rootDir,
28
+ excludeDir: options.excludeDir,
29
+ noGitignore: options.noGitignore,
30
+ }, onProgress ? (event) => mapCodeProgress(event, onProgress) : undefined);
31
+ }
32
+ async function buildCodeSubprocess(rootDir, options, onProgress) {
33
+ const runnerPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'prepare-runner.js');
34
+ return new Promise((resolve, reject) => {
35
+ let settled = false;
36
+ const child = fork(runnerPath, [], { stdio: ['ignore', 'ignore', 'pipe', 'ipc'] });
37
+ let stderr = '';
38
+ child.stderr?.on('data', (d) => {
39
+ stderr += d.toString();
40
+ });
41
+ child.on('message', (msg) => {
42
+ if (msg.type === 'progress' && msg.event && onProgress) {
43
+ mapCodeProgress(msg.event, onProgress);
44
+ }
45
+ else if (msg.type === 'complete' && msg.resultPath) {
46
+ settled = true;
47
+ try {
48
+ const buf = readFileSync(msg.resultPath);
49
+ const index = JSON.parse(buf);
50
+ unlinkSync(msg.resultPath);
51
+ resolve(index);
52
+ }
53
+ catch (err) {
54
+ reject(err instanceof Error ? err : new Error(String(err)));
55
+ }
56
+ }
57
+ else if (msg.type === 'error') {
58
+ settled = true;
59
+ reject(new Error(msg.message ?? 'Subprocess failed'));
60
+ }
61
+ });
62
+ child.on('error', (err) => {
63
+ settled = true;
64
+ reject(err);
65
+ });
66
+ child.on('close', (code) => {
67
+ if (settled)
68
+ return;
69
+ if (code !== 0) {
70
+ reject(new Error(`Prepare runner exited with code ${code}: ${stderr.trim()}`));
71
+ }
72
+ else {
73
+ reject(new Error('Prepare runner exited without sending a result'));
74
+ }
75
+ });
76
+ child.send({
77
+ type: 'start',
78
+ options: {
79
+ repoRoot: rootDir,
80
+ excludeDir: options.excludeDir,
81
+ noGitignore: options.noGitignore,
82
+ },
83
+ });
84
+ });
85
+ }
86
+ export async function prepareWorkspaceContext(rootDir, options = {}, onProgress) {
87
+ const resolvedRoot = path.resolve(rootDir);
88
+ const startedAt = Date.now();
89
+ const errors = [];
90
+ const includeCode = options.includeCode !== false;
91
+ const includeDocuments = options.includeDocuments !== false;
92
+ onProgress?.({ scope: 'prepare', stage: 'start', completed: 0, total: 1, detail: 'Starting workspace preparation' });
93
+ // Phase 1: Code indexing
94
+ let codeResult = null;
95
+ if (includeCode) {
96
+ try {
97
+ const mode = resolveExecutionMode(options);
98
+ const buildFn = mode === 'subprocess' ? buildCodeSubprocess : buildCodeInline;
99
+ const index = await buildFn(resolvedRoot, options, onProgress);
100
+ codeResult = {
101
+ index,
102
+ fileCount: index.files.length,
103
+ nodeCount: index.nodes.length,
104
+ edgeCount: index.edges.length,
105
+ };
106
+ }
107
+ catch (err) {
108
+ const error = err instanceof Error ? err : new Error(String(err));
109
+ errors.push(`Code indexing failed: ${error.message}`);
110
+ }
111
+ }
112
+ // Phase 2: Document inspection
113
+ let documentsResult = null;
114
+ if (includeDocuments) {
115
+ try {
116
+ const docSet = await inspectWorkspaceDocumentSet(resolvedRoot, {
117
+ excludeDir: options.excludeDir,
118
+ noGitignore: options.noGitignore,
119
+ largeFileLimitMb: options.largeFileLimitMb,
120
+ maxFiles: options.maxFiles,
121
+ maxReferenceFiles: options.maxReferenceFiles,
122
+ includeMarkdown: options.includeMarkdown,
123
+ }, onProgress ? (event) => {
124
+ onProgress({
125
+ scope: 'documents',
126
+ stage: event.phase,
127
+ completed: event.completed,
128
+ total: event.total,
129
+ detail: event.detail,
130
+ });
131
+ } : undefined);
132
+ documentsResult = docSet;
133
+ for (const err of docSet.errors) {
134
+ errors.push(`Document error${err.path ? ` (${err.path})` : ''}: ${err.message}`);
135
+ }
136
+ }
137
+ catch (err) {
138
+ const error = err instanceof Error ? err : new Error(String(err));
139
+ errors.push(`Document inspection failed: ${error.message}`);
140
+ }
141
+ }
142
+ const elapsedMs = Date.now() - startedAt;
143
+ onProgress?.({ scope: 'prepare', stage: 'complete', completed: 1, total: 1, detail: `Completed in ${elapsedMs}ms` });
144
+ return {
145
+ rootDir: resolvedRoot,
146
+ code: codeResult,
147
+ documents: documentsResult,
148
+ elapsedMs,
149
+ errors,
150
+ };
151
+ }
152
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../src/workspace/prepare.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cesarandreslopez/occ",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Office Cloc and Count — scc-style summary tables for office documents",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",
@@ -100,6 +100,14 @@
100
100
  "types": "./dist/src/workspace/types.d.ts",
101
101
  "default": "./dist/src/workspace/types.js"
102
102
  },
103
+ "./workspace/prepare": {
104
+ "types": "./dist/src/workspace/prepare.d.ts",
105
+ "default": "./dist/src/workspace/prepare.js"
106
+ },
107
+ "./workspace/prepare-types": {
108
+ "types": "./dist/src/workspace/prepare-types.d.ts",
109
+ "default": "./dist/src/workspace/prepare-types.js"
110
+ },
103
111
  "./markdown/convert": {
104
112
  "types": "./dist/src/markdown/convert.d.ts",
105
113
  "default": "./dist/src/markdown/convert.js"
@@ -206,6 +214,12 @@
206
214
  "workspace/types": [
207
215
  "dist/src/workspace/types.d.ts"
208
216
  ],
217
+ "workspace/prepare": [
218
+ "dist/src/workspace/prepare.d.ts"
219
+ ],
220
+ "workspace/prepare-types": [
221
+ "dist/src/workspace/prepare-types.d.ts"
222
+ ],
209
223
  "markdown/convert": [
210
224
  "dist/src/markdown/convert.d.ts"
211
225
  ],