@moxn/kb-migrate 0.4.35 → 0.4.37

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.
@@ -29,6 +29,22 @@ export interface LocalSourceConfig extends SourceConfig {
29
29
  /** Date filter for source files */
30
30
  dateFilter?: DateFilter;
31
31
  }
32
+ /**
33
+ * A local file to be imported as GRAMMAR markdown (Phase 9a-3).
34
+ *
35
+ * The grammar path reads the file VERBATIM (it is already moxn-grammar
36
+ * markdown — front-matter + body + `:::…` embeds, e.g. produced by the
37
+ * export) and hands it to `import_markdown`; it does NOT parse to MCP blocks
38
+ * like the legacy {@link LocalSource.extract} path.
39
+ */
40
+ export interface GrammarFile {
41
+ /** Absolute path to the source file on disk (for reading + media base dir). */
42
+ fullPath: string;
43
+ /** Original relative path from the scan root (for logging). */
44
+ sourcePath: string;
45
+ /** Sanitized KB path the doc maps to (e.g. "subdir/My-Doc"). */
46
+ kbPath: string;
47
+ }
32
48
  /**
33
49
  * Local filesystem migration source
34
50
  */
@@ -40,6 +56,14 @@ export declare class LocalSource extends MigrationSource<LocalSourceConfig> {
40
56
  validate(): Promise<void>;
41
57
  getDocumentCount(): Promise<number | undefined>;
42
58
  extract(): AsyncGenerator<ExtractedDocument, void, unknown>;
59
+ /**
60
+ * Yield local files as GRAMMAR markdown for the `import_markdown` path
61
+ * (Phase 9a-3). Reuses the SAME discovery + collision-skip + date-filter
62
+ * logic as {@link extract}, but emits the file's KB path + disk location
63
+ * instead of parsing to MCP blocks. The runner reads the file verbatim,
64
+ * uploads + rewrites its media refs, then calls `import_markdown`.
65
+ */
66
+ extractGrammarFiles(): AsyncGenerator<GrammarFile, void, unknown>;
43
67
  private discoverFiles;
44
68
  private extractDocument;
45
69
  private parseMarkdownSections;
@@ -75,6 +75,28 @@ export class LocalSource extends MigrationSource {
75
75
  }
76
76
  }
77
77
  }
78
+ /**
79
+ * Yield local files as GRAMMAR markdown for the `import_markdown` path
80
+ * (Phase 9a-3). Reuses the SAME discovery + collision-skip + date-filter
81
+ * logic as {@link extract}, but emits the file's KB path + disk location
82
+ * instead of parsing to MCP blocks. The runner reads the file verbatim,
83
+ * uploads + rewrites its media refs, then calls `import_markdown`.
84
+ */
85
+ async *extractGrammarFiles() {
86
+ if (!this.files) {
87
+ await this.discoverFiles();
88
+ }
89
+ for (const file of this.files) {
90
+ if (this.skippedCollisions.has(file)) {
91
+ continue;
92
+ }
93
+ yield {
94
+ fullPath: path.join(this.config.directory, file),
95
+ sourcePath: file,
96
+ kbPath: filePathToKbPath(file),
97
+ };
98
+ }
99
+ }
78
100
  async discoverFiles() {
79
101
  const patterns = this.config.extensions.map((ext) => `**/*${ext.startsWith('.') ? ext : '.' + ext}`);
80
102
  const allFiles = [];
@@ -20,7 +20,7 @@ describe('sanitizePathSegment', () => {
20
20
  expect(sanitizePathSegment('foo@bar!')).toBe('foo-bar');
21
21
  });
22
22
  it('handles parentheses, ampersands, apostrophes', () => {
23
- expect(sanitizePathSegment("Q3 Plan (final)")).toBe('Q3-Plan-final');
23
+ expect(sanitizePathSegment('Q3 Plan (final)')).toBe('Q3-Plan-final');
24
24
  expect(sanitizePathSegment("Tom's & Jerry's")).toBe('Tom-s-Jerry-s');
25
25
  });
26
26
  it('strips accents via NFKD normalization', () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moxn/kb-migrate",
3
- "version": "0.4.35",
3
+ "version": "0.4.37",
4
4
  "description": "Migration tool for importing documents into Moxn Knowledge Base from local files, Notion, Google Docs, and more",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -70,6 +70,14 @@
70
70
  "types": "./dist/client.d.ts",
71
71
  "default": "./dist/client.js"
72
72
  },
73
+ "./grammar-media": {
74
+ "types": "./dist/grammar-media.d.ts",
75
+ "default": "./dist/grammar-media.js"
76
+ },
77
+ "./import-local": {
78
+ "types": "./dist/import-local.d.ts",
79
+ "default": "./dist/import-local.js"
80
+ },
73
81
  "./date-filter": {
74
82
  "types": "./dist/date-filter.d.ts",
75
83
  "default": "./dist/date-filter.js"