@metaobjectsdev/sdk 0.5.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.
Files changed (118) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +32 -0
  3. package/dist/agent-docs/body.d.ts +2 -0
  4. package/dist/agent-docs/body.d.ts.map +1 -0
  5. package/dist/agent-docs/body.js +563 -0
  6. package/dist/agent-docs/body.js.map +1 -0
  7. package/dist/agent-docs/content-hash.d.ts +8 -0
  8. package/dist/agent-docs/content-hash.d.ts.map +1 -0
  9. package/dist/agent-docs/content-hash.js +23 -0
  10. package/dist/agent-docs/content-hash.js.map +1 -0
  11. package/dist/agent-docs/index.d.ts +3 -0
  12. package/dist/agent-docs/index.d.ts.map +1 -0
  13. package/dist/agent-docs/index.js +4 -0
  14. package/dist/agent-docs/index.js.map +1 -0
  15. package/dist/config.d.ts +113 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +53 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/forge-types.d.ts +47 -0
  20. package/dist/forge-types.d.ts.map +1 -0
  21. package/dist/forge-types.js +133 -0
  22. package/dist/forge-types.js.map +1 -0
  23. package/dist/index.d.ts +20 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +39 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/memory.d.ts +30 -0
  28. package/dist/memory.d.ts.map +1 -0
  29. package/dist/memory.js +105 -0
  30. package/dist/memory.js.map +1 -0
  31. package/dist/package.d.ts +65 -0
  32. package/dist/package.d.ts.map +1 -0
  33. package/dist/package.js +105 -0
  34. package/dist/package.js.map +1 -0
  35. package/dist/paths.d.ts +5 -0
  36. package/dist/paths.d.ts.map +1 -0
  37. package/dist/paths.js +26 -0
  38. package/dist/paths.js.map +1 -0
  39. package/dist/records/any.d.ts +467 -0
  40. package/dist/records/any.d.ts.map +1 -0
  41. package/dist/records/any.js +14 -0
  42. package/dist/records/any.js.map +1 -0
  43. package/dist/records/convention.d.ts +90 -0
  44. package/dist/records/convention.d.ts.map +1 -0
  45. package/dist/records/convention.js +9 -0
  46. package/dist/records/convention.js.map +1 -0
  47. package/dist/records/core.d.ts +84 -0
  48. package/dist/records/core.d.ts.map +1 -0
  49. package/dist/records/core.js +47 -0
  50. package/dist/records/core.js.map +1 -0
  51. package/dist/records/decision.d.ts +90 -0
  52. package/dist/records/decision.d.ts.map +1 -0
  53. package/dist/records/decision.js +9 -0
  54. package/dist/records/decision.js.map +1 -0
  55. package/dist/records/failure.d.ts +93 -0
  56. package/dist/records/failure.d.ts.map +1 -0
  57. package/dist/records/failure.js +10 -0
  58. package/dist/records/failure.js.map +1 -0
  59. package/dist/records/glossary.d.ts +111 -0
  60. package/dist/records/glossary.d.ts.map +1 -0
  61. package/dist/records/glossary.js +14 -0
  62. package/dist/records/glossary.js.map +1 -0
  63. package/dist/records/principle.d.ts +99 -0
  64. package/dist/records/principle.d.ts.map +1 -0
  65. package/dist/records/principle.js +12 -0
  66. package/dist/records/principle.js.map +1 -0
  67. package/dist/storage/errors.d.ts +14 -0
  68. package/dist/storage/errors.d.ts.map +1 -0
  69. package/dist/storage/errors.js +27 -0
  70. package/dist/storage/errors.js.map +1 -0
  71. package/dist/storage/index.d.ts +7 -0
  72. package/dist/storage/index.d.ts.map +1 -0
  73. package/dist/storage/index.js +6 -0
  74. package/dist/storage/index.js.map +1 -0
  75. package/dist/storage/lifecycle.d.ts +5 -0
  76. package/dist/storage/lifecycle.d.ts.map +1 -0
  77. package/dist/storage/lifecycle.js +27 -0
  78. package/dist/storage/lifecycle.js.map +1 -0
  79. package/dist/storage/list.d.ts +8 -0
  80. package/dist/storage/list.d.ts.map +1 -0
  81. package/dist/storage/list.js +42 -0
  82. package/dist/storage/list.js.map +1 -0
  83. package/dist/storage/read.d.ts +9 -0
  84. package/dist/storage/read.d.ts.map +1 -0
  85. package/dist/storage/read.js +43 -0
  86. package/dist/storage/read.js.map +1 -0
  87. package/dist/storage/write.d.ts +8 -0
  88. package/dist/storage/write.d.ts.map +1 -0
  89. package/dist/storage/write.js +20 -0
  90. package/dist/storage/write.js.map +1 -0
  91. package/dist/workspace.d.ts +49 -0
  92. package/dist/workspace.d.ts.map +1 -0
  93. package/dist/workspace.js +280 -0
  94. package/dist/workspace.js.map +1 -0
  95. package/package.json +48 -0
  96. package/src/agent-docs/body.ts +562 -0
  97. package/src/agent-docs/content-hash.ts +25 -0
  98. package/src/agent-docs/index.ts +8 -0
  99. package/src/config.ts +69 -0
  100. package/src/forge-types.ts +167 -0
  101. package/src/index.ts +98 -0
  102. package/src/memory.ts +116 -0
  103. package/src/package.ts +120 -0
  104. package/src/paths.ts +30 -0
  105. package/src/records/any.ts +15 -0
  106. package/src/records/convention.ts +10 -0
  107. package/src/records/core.ts +55 -0
  108. package/src/records/decision.ts +10 -0
  109. package/src/records/failure.ts +11 -0
  110. package/src/records/glossary.ts +15 -0
  111. package/src/records/principle.ts +13 -0
  112. package/src/storage/errors.ts +23 -0
  113. package/src/storage/index.ts +10 -0
  114. package/src/storage/lifecycle.ts +38 -0
  115. package/src/storage/list.ts +53 -0
  116. package/src/storage/read.ts +54 -0
  117. package/src/storage/write.ts +32 -0
  118. package/src/workspace.ts +342 -0
@@ -0,0 +1,8 @@
1
+ import type { AnyRecord } from "../records/any.js";
2
+ import type { RecordType } from "../records/core.js";
3
+ export interface ListOptions {
4
+ pending?: boolean;
5
+ onInvalid?: (path: string, err: unknown) => void;
6
+ }
7
+ export declare function listRecords(metaRoot: string, type: RecordType, opts?: ListOptions): Promise<AnyRecord[]>;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/storage/list.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,SAAS,EAAE,CAAC,CAqBtB"}
@@ -0,0 +1,42 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { join, basename } from "node:path";
3
+ import { recordPath } from "../paths.js";
4
+ import { readRecord } from "./read.js";
5
+ export async function listRecords(metaRoot, type, opts = {}) {
6
+ const dir = directoryFor(metaRoot, type, opts.pending);
7
+ let entries;
8
+ try {
9
+ entries = await readdir(dir);
10
+ }
11
+ catch (err) {
12
+ if (isNoEntError(err))
13
+ return [];
14
+ throw err;
15
+ }
16
+ const results = [];
17
+ for (const entry of entries) {
18
+ if (!entry.endsWith(".json"))
19
+ continue;
20
+ const id = basename(entry, ".json");
21
+ try {
22
+ const rec = await readRecord(metaRoot, type, id, opts.pending ? { pending: true } : {});
23
+ results.push(rec);
24
+ }
25
+ catch (err) {
26
+ opts.onInvalid?.(join(dir, entry), err);
27
+ }
28
+ }
29
+ return results;
30
+ }
31
+ function directoryFor(metaRoot, type, pending) {
32
+ // Re-derive from a sentinel id so we use a single source of truth for layout.
33
+ const sentinelPath = recordPath(metaRoot, type, "__sentinel__", pending ? { pending: true } : {});
34
+ return sentinelPath.slice(0, sentinelPath.length - "__sentinel__.json".length - 1);
35
+ }
36
+ function isNoEntError(err) {
37
+ return (typeof err === "object" &&
38
+ err !== null &&
39
+ "code" in err &&
40
+ err.code === "ENOENT");
41
+ }
42
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/storage/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAOvC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,IAAgB,EAChB,OAAoB,EAAE;IAEtB,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QACvC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,IAAgB,EAAE,OAAiB;IACzE,8EAA8E;IAC9E,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { AnyRecord } from "../records/any.js";
2
+ import type { RecordType } from "../records/core.js";
3
+ export declare function readRecord(metaRoot: string, type: RecordType, id: string, opts?: {
4
+ pending?: boolean;
5
+ }): Promise<AnyRecord>;
6
+ export declare function recordExists(metaRoot: string, type: RecordType, id: string, opts?: {
7
+ pending?: boolean;
8
+ }): Promise<boolean>;
9
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/storage/read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,SAAS,CAAC,CAkBpB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,OAAO,CAAC,CAOlB"}
@@ -0,0 +1,43 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { AnyRecord as AnyRecordSchema } from "../records/any.js";
3
+ import { recordPath } from "../paths.js";
4
+ import { MetaForgeRecordNotFoundError, MetaForgeRecordParseError } from "./errors.js";
5
+ export async function readRecord(metaRoot, type, id, opts = {}) {
6
+ const path = recordPath(metaRoot, type, id, opts);
7
+ let raw;
8
+ try {
9
+ raw = await readFile(path, "utf8");
10
+ }
11
+ catch (err) {
12
+ if (isNoEntError(err))
13
+ throw new MetaForgeRecordNotFoundError(path);
14
+ throw err;
15
+ }
16
+ let parsedJson;
17
+ try {
18
+ parsedJson = JSON.parse(raw);
19
+ }
20
+ catch (err) {
21
+ throw new MetaForgeRecordParseError(path, err);
22
+ }
23
+ const result = AnyRecordSchema.safeParse(parsedJson);
24
+ if (!result.success)
25
+ throw new MetaForgeRecordParseError(path, result.error);
26
+ return result.data;
27
+ }
28
+ export async function recordExists(metaRoot, type, id, opts = {}) {
29
+ try {
30
+ await stat(recordPath(metaRoot, type, id, opts));
31
+ return true;
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }
37
+ function isNoEntError(err) {
38
+ return (typeof err === "object" &&
39
+ err !== null &&
40
+ "code" in err &&
41
+ err.code === "ENOENT");
42
+ }
43
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/storage/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAgB,EAChB,IAAgB,EAChB,EAAU,EACV,OAA8B,EAAE;IAEhC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAClD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,YAAY,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,IAAgB,EAChB,EAAU,EACV,OAA8B,EAAE;IAEhC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,MAAM,IAAI,GAAG;QACZ,GAAyB,CAAC,IAAI,KAAK,QAAQ,CAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AnyRecord } from "../records/any.js";
2
+ export declare function writeRecord(metaRoot: string, record: AnyRecord, opts?: {
3
+ pending?: boolean;
4
+ }): Promise<void>;
5
+ export declare function removeRecord(metaRoot: string, type: AnyRecord["type"], id: string, opts?: {
6
+ pending?: boolean;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/storage/write.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMnD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,EACvB,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAKf"}
@@ -0,0 +1,20 @@
1
+ import { mkdir, writeFile, unlink } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { AnyRecord as AnyRecordSchema } from "../records/any.js";
4
+ import { recordPath } from "../paths.js";
5
+ import { MetaForgeRecordNotFoundError } from "./errors.js";
6
+ import { recordExists } from "./read.js";
7
+ export async function writeRecord(metaRoot, record, opts = {}) {
8
+ // Validate before any IO
9
+ AnyRecordSchema.parse(record);
10
+ const path = recordPath(metaRoot, record.type, record.id, opts);
11
+ await mkdir(dirname(path), { recursive: true });
12
+ await writeFile(path, JSON.stringify(record, null, 2) + "\n", "utf8");
13
+ }
14
+ export async function removeRecord(metaRoot, type, id, opts = {}) {
15
+ if (!(await recordExists(metaRoot, type, id, opts))) {
16
+ throw new MetaForgeRecordNotFoundError(recordPath(metaRoot, type, id, opts));
17
+ }
18
+ await unlink(recordPath(metaRoot, type, id, opts));
19
+ }
20
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/storage/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,MAAiB,EACjB,OAA8B,EAAE;IAEhC,yBAAyB;IACzB,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE9B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,IAAuB,EACvB,EAAU,EACV,OAA8B,EAAE;IAEhC,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,4BAA4B,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type PackageManifest } from "./package.js";
2
+ export interface WorkspacePackage {
3
+ /** Absolute path to the .meta/ directory. */
4
+ metaDir: string;
5
+ /** The parsed package.meta.json. */
6
+ manifest: PackageManifest;
7
+ /** The canonical metaobjects ref (resolved via resolveMetaobjectsPackage). */
8
+ metaobjectsPackage: string;
9
+ }
10
+ export interface Workspace {
11
+ /** Absolute path to the workspace root (where pnpm-workspace.yaml or package.json lives). */
12
+ root: string;
13
+ /** All metadata packages found under workspace globs. */
14
+ packages: WorkspacePackage[];
15
+ /** Look up by package.meta.json `name` (e.g., "@acme/shared"). */
16
+ findByName(name: string): WorkspacePackage | undefined;
17
+ /** Look up by canonical metaobjects ref (e.g., "acme::shared"). */
18
+ findByMetaobjectsPackage(ref: string): WorkspacePackage | undefined;
19
+ }
20
+ /**
21
+ * Extract the `packages:` glob list from pnpm-workspace.yaml. Tiny parser —
22
+ * sufficient for the simple-list format pnpm actually emits. Not a general
23
+ * YAML parser; doesn't support quoted strings with special chars, flow
24
+ * mappings, anchors, etc.
25
+ */
26
+ export declare function extractPnpmPackages(yaml: string): string[];
27
+ /**
28
+ * Discover the metaobjects workspace containing `cwd`. Returns undefined if
29
+ * no workspace config (pnpm-workspace.yaml or package.json workspaces) is
30
+ * found walking up the directory tree, OR if no `.meta/package.meta.json`
31
+ * files are present in the workspace packages.
32
+ *
33
+ * The returned Workspace has every package's manifest pre-loaded; callers
34
+ * can look up peers by name or canonical metaobjects ref.
35
+ */
36
+ export declare function discoverWorkspace(cwd: string): Promise<Workspace | undefined>;
37
+ /**
38
+ * For a given package (specified by its .meta/ directory), walk its `extends:`
39
+ * deps transitively via the workspace and return the full ordered list of
40
+ * packages to load — dependencies first, the target package last.
41
+ *
42
+ * Throws on:
43
+ * - Missing package referenced by extends:
44
+ * - Cycles in the extends graph
45
+ */
46
+ export declare function resolveExtendsOrder(workspace: Workspace, startMetaDir: string): WorkspacePackage[];
47
+ /** Human-readable label for a workspace package — useful for error messages. */
48
+ export declare function packageLabel(pkg: WorkspacePackage): string;
49
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAkBA,OAAO,EACL,KAAK,eAAe,EAIrB,MAAM,cAAc,CAAC;AAStB,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,eAAe,CAAC;IAC1B,8EAA8E;IAC9E,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,6FAA6F;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kEAAkE;IAClE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IACvD,mEAAmE;IACnE,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CACrE;AAqBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB1D;AA0GD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA8DnF;AAMD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,GACnB,gBAAgB,EAAE,CAoCpB;AAMD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,280 @@
1
+ // Workspace discovery — finds peer metadata packages in a monorepo via the
2
+ // workspace conventions used by pnpm/npm/bun. The result is a registry of
3
+ // `package.meta.json` files keyed by their `name` and `metaobjectsPackage`,
4
+ // used by loadMemory (when extends: is present) and by future cross-package
5
+ // codegen/migrate flows.
6
+ //
7
+ // Discovery sources (first match wins, walking up from cwd):
8
+ // - pnpm-workspace.yaml (packages: array)
9
+ // - package.json workspaces (array of globs OR { packages: [...] })
10
+ //
11
+ // This is the prototype implementation. Full v0.3 SP2 will harden:
12
+ // - Bun workspaces (currently mirrors package.json field)
13
+ // - Cargo / Maven workspaces (future polyglot support)
14
+ // - Lockfile-style resolution + version range matching
15
+ // - Better error messages on circular extends, missing packages
16
+ import { readFile, readdir, stat } from "node:fs/promises";
17
+ import { dirname, join, resolve, basename } from "node:path";
18
+ import { PackageManifestSchema, PACKAGE_MANIFEST_FILE, resolveMetaobjectsPackage, } from "./package.js";
19
+ const PNPM_WORKSPACE_FILE = "pnpm-workspace.yaml";
20
+ const PACKAGE_JSON = "package.json";
21
+ async function readPnpmWorkspaceFile(path) {
22
+ try {
23
+ const content = await readFile(path, "utf8");
24
+ return extractPnpmPackages(content);
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ /**
31
+ * Extract the `packages:` glob list from pnpm-workspace.yaml. Tiny parser —
32
+ * sufficient for the simple-list format pnpm actually emits. Not a general
33
+ * YAML parser; doesn't support quoted strings with special chars, flow
34
+ * mappings, anchors, etc.
35
+ */
36
+ export function extractPnpmPackages(yaml) {
37
+ const lines = yaml.split(/\r?\n/);
38
+ const result = [];
39
+ let inPackages = false;
40
+ for (const rawLine of lines) {
41
+ const line = rawLine.replace(/#.*$/, "").trimEnd();
42
+ if (line.length === 0)
43
+ continue;
44
+ if (/^packages\s*:/.test(line)) {
45
+ inPackages = true;
46
+ continue;
47
+ }
48
+ if (inPackages) {
49
+ const match = /^\s+-\s+['"]?([^'"]+)['"]?\s*$/.exec(line);
50
+ if (match !== null) {
51
+ result.push(match[1]);
52
+ continue;
53
+ }
54
+ // Non-list line at the same or lower indent ends the packages: block
55
+ if (/^[A-Za-z_]/.test(line)) {
56
+ inPackages = false;
57
+ }
58
+ }
59
+ }
60
+ return result;
61
+ }
62
+ async function readPackageJsonWorkspaces(path) {
63
+ try {
64
+ const content = await readFile(path, "utf8");
65
+ const parsed = JSON.parse(content);
66
+ if (Array.isArray(parsed.workspaces))
67
+ return parsed.workspaces;
68
+ if (parsed.workspaces && Array.isArray(parsed.workspaces.packages)) {
69
+ return parsed.workspaces.packages;
70
+ }
71
+ return undefined;
72
+ }
73
+ catch {
74
+ return undefined;
75
+ }
76
+ }
77
+ /** Walk up from `start` looking for the first directory with a workspace config. */
78
+ async function findWorkspaceConfig(start) {
79
+ let dir = resolve(start);
80
+ // Cap walk-up at filesystem root; in practice we'll find or stop in a few steps.
81
+ while (true) {
82
+ const pnpmPath = join(dir, PNPM_WORKSPACE_FILE);
83
+ const pnpmGlobs = await readPnpmWorkspaceFile(pnpmPath);
84
+ if (pnpmGlobs !== undefined && pnpmGlobs.length > 0) {
85
+ return { root: dir, globs: pnpmGlobs };
86
+ }
87
+ const pkgPath = join(dir, PACKAGE_JSON);
88
+ const pkgGlobs = await readPackageJsonWorkspaces(pkgPath);
89
+ if (pkgGlobs !== undefined && pkgGlobs.length > 0) {
90
+ return { root: dir, globs: pkgGlobs };
91
+ }
92
+ const parent = dirname(dir);
93
+ if (parent === dir)
94
+ return undefined; // hit filesystem root
95
+ dir = parent;
96
+ }
97
+ }
98
+ // ---------------------------------------------------------------------------
99
+ // Glob expansion (simple, matches workspace-style patterns)
100
+ // ---------------------------------------------------------------------------
101
+ /** Expand a workspace glob like "packages/*" relative to root. Returns directory paths. */
102
+ async function expandGlob(root, glob) {
103
+ // Strip trailing `/` for normalization
104
+ const pattern = glob.replace(/\/$/, "");
105
+ // No wildcard: literal directory
106
+ if (!pattern.includes("*")) {
107
+ const literal = join(root, pattern);
108
+ try {
109
+ const s = await stat(literal);
110
+ return s.isDirectory() ? [literal] : [];
111
+ }
112
+ catch {
113
+ return [];
114
+ }
115
+ }
116
+ // Split into prefix segments (literal) + last segment with wildcard.
117
+ // Supports the common cases: "packages/*", "apps/*", "packages/foo-*".
118
+ // Doesn't support deep `**` globs in this prototype.
119
+ const segments = pattern.split("/");
120
+ const lastSegment = segments.pop();
121
+ const prefixDir = join(root, ...segments);
122
+ let entries;
123
+ try {
124
+ entries = await readdir(prefixDir);
125
+ }
126
+ catch {
127
+ return [];
128
+ }
129
+ const matcher = matchGlobSegment(lastSegment);
130
+ const result = [];
131
+ for (const entry of entries) {
132
+ if (!matcher(entry))
133
+ continue;
134
+ const full = join(prefixDir, entry);
135
+ try {
136
+ const s = await stat(full);
137
+ if (s.isDirectory())
138
+ result.push(full);
139
+ }
140
+ catch {
141
+ // skip unreadable
142
+ }
143
+ }
144
+ return result;
145
+ }
146
+ function matchGlobSegment(pattern) {
147
+ if (pattern === "*")
148
+ return () => true;
149
+ const regex = new RegExp("^" +
150
+ pattern
151
+ .replace(/[.+^${}()|[\]\\]/g, "\\$&")
152
+ .replace(/\*/g, "[^/]*") +
153
+ "$");
154
+ return (value) => regex.test(value);
155
+ }
156
+ // ---------------------------------------------------------------------------
157
+ // Public: discoverWorkspace
158
+ // ---------------------------------------------------------------------------
159
+ /**
160
+ * Discover the metaobjects workspace containing `cwd`. Returns undefined if
161
+ * no workspace config (pnpm-workspace.yaml or package.json workspaces) is
162
+ * found walking up the directory tree, OR if no `.meta/package.meta.json`
163
+ * files are present in the workspace packages.
164
+ *
165
+ * The returned Workspace has every package's manifest pre-loaded; callers
166
+ * can look up peers by name or canonical metaobjects ref.
167
+ */
168
+ export async function discoverWorkspace(cwd) {
169
+ const config = await findWorkspaceConfig(cwd);
170
+ if (config === undefined)
171
+ return undefined;
172
+ // Expand all workspace globs
173
+ const packageDirs = [];
174
+ for (const glob of config.globs) {
175
+ packageDirs.push(...(await expandGlob(config.root, glob)));
176
+ }
177
+ // Also include the workspace root itself if it has a .meta/ —
178
+ // common pattern for root-level "the app" metadata.
179
+ const rootMetaDir = join(config.root, ".meta");
180
+ try {
181
+ const s = await stat(rootMetaDir);
182
+ if (s.isDirectory())
183
+ packageDirs.push(config.root);
184
+ }
185
+ catch {
186
+ // no root-level .meta — fine
187
+ }
188
+ // For each package dir, look for .meta/package.meta.json
189
+ const packages = [];
190
+ const seenDirs = new Set();
191
+ for (const pkgDir of packageDirs) {
192
+ if (seenDirs.has(pkgDir))
193
+ continue;
194
+ seenDirs.add(pkgDir);
195
+ const metaDir = join(pkgDir, ".meta");
196
+ try {
197
+ const s = await stat(metaDir);
198
+ if (!s.isDirectory())
199
+ continue;
200
+ }
201
+ catch {
202
+ continue;
203
+ }
204
+ const manifestPath = join(metaDir, PACKAGE_MANIFEST_FILE);
205
+ let raw;
206
+ try {
207
+ raw = await readFile(manifestPath, "utf8");
208
+ }
209
+ catch {
210
+ continue; // no manifest = not a metadata package
211
+ }
212
+ const manifest = PackageManifestSchema.parse(JSON.parse(raw));
213
+ const canonical = resolveMetaobjectsPackage(manifest);
214
+ if (canonical === undefined) {
215
+ throw new Error(`package.meta.json in ${metaDir} has a name "${manifest.name}" that cannot be auto-derived to a canonical ref; declare metaobjectsPackage explicitly`);
216
+ }
217
+ packages.push({ metaDir, manifest, metaobjectsPackage: canonical });
218
+ }
219
+ if (packages.length === 0)
220
+ return undefined;
221
+ return {
222
+ root: config.root,
223
+ packages,
224
+ findByName(name) {
225
+ return packages.find((p) => p.manifest.name === name);
226
+ },
227
+ findByMetaobjectsPackage(ref) {
228
+ return packages.find((p) => p.metaobjectsPackage === ref);
229
+ },
230
+ };
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Resolve extends graph
234
+ // ---------------------------------------------------------------------------
235
+ /**
236
+ * For a given package (specified by its .meta/ directory), walk its `extends:`
237
+ * deps transitively via the workspace and return the full ordered list of
238
+ * packages to load — dependencies first, the target package last.
239
+ *
240
+ * Throws on:
241
+ * - Missing package referenced by extends:
242
+ * - Cycles in the extends graph
243
+ */
244
+ export function resolveExtendsOrder(workspace, startMetaDir) {
245
+ const startPkg = workspace.packages.find((p) => p.metaDir === startMetaDir);
246
+ if (startPkg === undefined) {
247
+ throw new Error(`metadata package at ${startMetaDir} is not part of the discovered workspace (root: ${workspace.root})`);
248
+ }
249
+ const ordered = [];
250
+ const visited = new Set();
251
+ const visiting = new Set();
252
+ function visit(pkg) {
253
+ if (visited.has(pkg.metaobjectsPackage))
254
+ return;
255
+ if (visiting.has(pkg.metaobjectsPackage)) {
256
+ throw new Error(`cycle in extends graph: ${[...visiting, pkg.metaobjectsPackage].join(" → ")}`);
257
+ }
258
+ visiting.add(pkg.metaobjectsPackage);
259
+ for (const dep of pkg.manifest.extends) {
260
+ const depPkg = workspace.findByName(dep) ?? workspace.findByMetaobjectsPackage(dep);
261
+ if (depPkg === undefined) {
262
+ throw new Error(`package "${pkg.manifest.name}" extends "${dep}" but that package was not found in the workspace`);
263
+ }
264
+ visit(depPkg);
265
+ }
266
+ visiting.delete(pkg.metaobjectsPackage);
267
+ visited.add(pkg.metaobjectsPackage);
268
+ ordered.push(pkg);
269
+ }
270
+ visit(startPkg);
271
+ return ordered;
272
+ }
273
+ // ---------------------------------------------------------------------------
274
+ // Diagnostic helpers
275
+ // ---------------------------------------------------------------------------
276
+ /** Human-readable label for a workspace package — useful for error messages. */
277
+ export function packageLabel(pkg) {
278
+ return `${pkg.manifest.name} (${pkg.metaobjectsPackage}) at ${basename(dirname(pkg.metaDir))}`;
279
+ }
280
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@metaobjectsdev/sdk",
3
+ "version": "0.5.0-rc.1",
4
+ "description": "Workspace helpers and agent-docs utilities for MetaObjects projects.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "bun": "./src/index.ts",
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./agent-docs": {
15
+ "bun": "./src/agent-docs/index.ts",
16
+ "types": "./dist/agent-docs/index.d.ts",
17
+ "default": "./dist/agent-docs/index.js"
18
+ }
19
+ },
20
+ "files": ["dist", "src", "README.md", "LICENSE"],
21
+ "scripts": {
22
+ "build": "tsc -p .",
23
+ "typecheck": "tsc -p tsconfig.typecheck.json"
24
+ },
25
+ "license": "Apache-2.0",
26
+ "author": "Doug Mealing <doug@dougmealing.com>",
27
+ "homepage": "https://metaobjects.dev",
28
+ "bugs": {
29
+ "url": "https://github.com/metaobjectsdev/metaobjects/issues"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/metaobjectsdev/metaobjects.git",
34
+ "directory": "server/typescript/packages/sdk"
35
+ },
36
+ "keywords": ["metaobjects", "sdk", "agent-docs", "workspace"],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "dependencies": {
41
+ "@metaobjectsdev/metadata": "0.5.0",
42
+ "zod": "^3.23.0"
43
+ },
44
+ "devDependencies": {
45
+ "bun-types": "latest",
46
+ "typescript": "^5.6.0"
47
+ }
48
+ }