@bradygaster/squad-sdk 0.9.0 → 0.9.2-insider.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 (222) hide show
  1. package/README.md +44 -0
  2. package/dist/agents/history-shadow.d.ts +7 -5
  3. package/dist/agents/history-shadow.d.ts.map +1 -1
  4. package/dist/agents/history-shadow.js +39 -48
  5. package/dist/agents/history-shadow.js.map +1 -1
  6. package/dist/agents/index.d.ts +12 -1
  7. package/dist/agents/index.d.ts.map +1 -1
  8. package/dist/agents/index.js +62 -9
  9. package/dist/agents/index.js.map +1 -1
  10. package/dist/agents/lifecycle.d.ts +4 -0
  11. package/dist/agents/lifecycle.d.ts.map +1 -1
  12. package/dist/agents/lifecycle.js +6 -7
  13. package/dist/agents/lifecycle.js.map +1 -1
  14. package/dist/agents/onboarding.d.ts +4 -2
  15. package/dist/agents/onboarding.d.ts.map +1 -1
  16. package/dist/agents/onboarding.js +26 -16
  17. package/dist/agents/onboarding.js.map +1 -1
  18. package/dist/agents/personal.d.ts +2 -1
  19. package/dist/agents/personal.d.ts.map +1 -1
  20. package/dist/agents/personal.js +11 -12
  21. package/dist/agents/personal.js.map +1 -1
  22. package/dist/build/bundle.d.ts.map +1 -1
  23. package/dist/build/bundle.js +6 -6
  24. package/dist/build/bundle.js.map +1 -1
  25. package/dist/build/release.d.ts.map +1 -1
  26. package/dist/build/release.js +7 -5
  27. package/dist/build/release.js.map +1 -1
  28. package/dist/casting/index.d.ts.map +1 -1
  29. package/dist/casting/index.js +4 -3
  30. package/dist/casting/index.js.map +1 -1
  31. package/dist/config/agent-source.d.ts +5 -1
  32. package/dist/config/agent-source.d.ts.map +1 -1
  33. package/dist/config/agent-source.js +85 -41
  34. package/dist/config/agent-source.js.map +1 -1
  35. package/dist/config/init.d.ts +4 -3
  36. package/dist/config/init.d.ts.map +1 -1
  37. package/dist/config/init.js +84 -63
  38. package/dist/config/init.js.map +1 -1
  39. package/dist/config/legacy-fallback.d.ts +3 -2
  40. package/dist/config/legacy-fallback.d.ts.map +1 -1
  41. package/dist/config/legacy-fallback.js +16 -14
  42. package/dist/config/legacy-fallback.js.map +1 -1
  43. package/dist/config/models.d.ts +9 -6
  44. package/dist/config/models.d.ts.map +1 -1
  45. package/dist/config/models.js +35 -25
  46. package/dist/config/models.js.map +1 -1
  47. package/dist/index.d.ts +5 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +14 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/marketplace/packaging.d.ts.map +1 -1
  52. package/dist/marketplace/packaging.js +18 -16
  53. package/dist/marketplace/packaging.js.map +1 -1
  54. package/dist/multi-squad.d.ts.map +1 -1
  55. package/dist/multi-squad.js +10 -9
  56. package/dist/multi-squad.js.map +1 -1
  57. package/dist/platform/comms-file-log.d.ts.map +1 -1
  58. package/dist/platform/comms-file-log.js +7 -6
  59. package/dist/platform/comms-file-log.js.map +1 -1
  60. package/dist/platform/comms.d.ts.map +1 -1
  61. package/dist/platform/comms.js +6 -5
  62. package/dist/platform/comms.js.map +1 -1
  63. package/dist/platform/index.d.ts.map +1 -1
  64. package/dist/platform/index.js +4 -3
  65. package/dist/platform/index.js.map +1 -1
  66. package/dist/ralph/capabilities.d.ts +30 -1
  67. package/dist/ralph/capabilities.d.ts.map +1 -1
  68. package/dist/ralph/capabilities.js +51 -6
  69. package/dist/ralph/capabilities.js.map +1 -1
  70. package/dist/ralph/index.d.ts +1 -1
  71. package/dist/ralph/index.d.ts.map +1 -1
  72. package/dist/ralph/index.js +4 -3
  73. package/dist/ralph/index.js.map +1 -1
  74. package/dist/ralph/rate-limiting.d.ts.map +1 -1
  75. package/dist/ralph/rate-limiting.js +4 -4
  76. package/dist/ralph/rate-limiting.js.map +1 -1
  77. package/dist/remote/bridge.d.ts.map +1 -1
  78. package/dist/remote/bridge.js +2 -2
  79. package/dist/remote/bridge.js.map +1 -1
  80. package/dist/resolution.d.ts +9 -0
  81. package/dist/resolution.d.ts.map +1 -1
  82. package/dist/resolution.js +39 -16
  83. package/dist/resolution.js.map +1 -1
  84. package/dist/roles/catalog.d.ts +1 -1
  85. package/dist/runtime/config.d.ts.map +1 -1
  86. package/dist/runtime/config.js +8 -7
  87. package/dist/runtime/config.js.map +1 -1
  88. package/dist/runtime/cross-squad.d.ts.map +1 -1
  89. package/dist/runtime/cross-squad.js +8 -7
  90. package/dist/runtime/cross-squad.js.map +1 -1
  91. package/dist/runtime/scheduler.d.ts.map +1 -1
  92. package/dist/runtime/scheduler.js +8 -8
  93. package/dist/runtime/scheduler.js.map +1 -1
  94. package/dist/runtime/squad-observer.d.ts.map +1 -1
  95. package/dist/runtime/squad-observer.js +7 -4
  96. package/dist/runtime/squad-observer.js.map +1 -1
  97. package/dist/sharing/consult.d.ts +1 -1
  98. package/dist/sharing/consult.d.ts.map +1 -1
  99. package/dist/sharing/consult.js +66 -64
  100. package/dist/sharing/consult.js.map +1 -1
  101. package/dist/sharing/export.d.ts.map +1 -1
  102. package/dist/sharing/export.js +16 -16
  103. package/dist/sharing/export.js.map +1 -1
  104. package/dist/sharing/import.d.ts.map +1 -1
  105. package/dist/sharing/import.js +13 -12
  106. package/dist/sharing/import.js.map +1 -1
  107. package/dist/skills/skill-loader.d.ts.map +1 -1
  108. package/dist/skills/skill-loader.js +10 -9
  109. package/dist/skills/skill-loader.js.map +1 -1
  110. package/dist/skills/skill-script-loader.d.ts.map +1 -1
  111. package/dist/skills/skill-script-loader.js +6 -4
  112. package/dist/skills/skill-script-loader.js.map +1 -1
  113. package/dist/skills/skill-source.d.ts +3 -1
  114. package/dist/skills/skill-source.d.ts.map +1 -1
  115. package/dist/skills/skill-source.js +18 -16
  116. package/dist/skills/skill-source.js.map +1 -1
  117. package/dist/state/collection-map.d.ts +43 -0
  118. package/dist/state/collection-map.d.ts.map +1 -0
  119. package/dist/state/collection-map.js +9 -0
  120. package/dist/state/collection-map.js.map +1 -0
  121. package/dist/state/collections.d.ts +102 -0
  122. package/dist/state/collections.d.ts.map +1 -0
  123. package/dist/state/collections.js +317 -0
  124. package/dist/state/collections.js.map +1 -0
  125. package/dist/state/domain-types.d.ts +122 -0
  126. package/dist/state/domain-types.d.ts.map +1 -0
  127. package/dist/state/domain-types.js +54 -0
  128. package/dist/state/domain-types.js.map +1 -0
  129. package/dist/state/handles.d.ts +16 -0
  130. package/dist/state/handles.d.ts.map +1 -0
  131. package/dist/state/handles.js +161 -0
  132. package/dist/state/handles.js.map +1 -0
  133. package/dist/state/index.d.ts +17 -0
  134. package/dist/state/index.d.ts.map +1 -0
  135. package/dist/state/index.js +15 -0
  136. package/dist/state/index.js.map +1 -0
  137. package/dist/state/io/charter-io.d.ts +28 -0
  138. package/dist/state/io/charter-io.d.ts.map +1 -0
  139. package/dist/state/io/charter-io.js +94 -0
  140. package/dist/state/io/charter-io.js.map +1 -0
  141. package/dist/state/io/decisions-io.d.ts +42 -0
  142. package/dist/state/io/decisions-io.d.ts.map +1 -0
  143. package/dist/state/io/decisions-io.js +66 -0
  144. package/dist/state/io/decisions-io.js.map +1 -0
  145. package/dist/state/io/history-io.d.ts +37 -0
  146. package/dist/state/io/history-io.d.ts.map +1 -0
  147. package/dist/state/io/history-io.js +102 -0
  148. package/dist/state/io/history-io.js.map +1 -0
  149. package/dist/state/io/index.d.ts +19 -0
  150. package/dist/state/io/index.d.ts.map +1 -0
  151. package/dist/state/io/index.js +19 -0
  152. package/dist/state/io/index.js.map +1 -0
  153. package/dist/state/io/routing-io.d.ts +37 -0
  154. package/dist/state/io/routing-io.d.ts.map +1 -0
  155. package/dist/state/io/routing-io.js +99 -0
  156. package/dist/state/io/routing-io.js.map +1 -0
  157. package/dist/state/io/team-io.d.ts +46 -0
  158. package/dist/state/io/team-io.d.ts.map +1 -0
  159. package/dist/state/io/team-io.js +82 -0
  160. package/dist/state/io/team-io.js.map +1 -0
  161. package/dist/state/schema.d.ts +24 -0
  162. package/dist/state/schema.d.ts.map +1 -0
  163. package/dist/state/schema.js +41 -0
  164. package/dist/state/schema.js.map +1 -0
  165. package/dist/state/squad-state.d.ts +42 -0
  166. package/dist/state/squad-state.d.ts.map +1 -0
  167. package/dist/state/squad-state.js +68 -0
  168. package/dist/state/squad-state.js.map +1 -0
  169. package/dist/storage/fs-storage-provider.d.ts +60 -0
  170. package/dist/storage/fs-storage-provider.d.ts.map +1 -0
  171. package/dist/storage/fs-storage-provider.js +377 -0
  172. package/dist/storage/fs-storage-provider.js.map +1 -0
  173. package/dist/storage/in-memory-storage-provider.d.ts +46 -0
  174. package/dist/storage/in-memory-storage-provider.d.ts.map +1 -0
  175. package/dist/storage/in-memory-storage-provider.js +264 -0
  176. package/dist/storage/in-memory-storage-provider.js.map +1 -0
  177. package/dist/storage/index.d.ts +6 -0
  178. package/dist/storage/index.d.ts.map +1 -0
  179. package/dist/storage/index.js +5 -0
  180. package/dist/storage/index.js.map +1 -0
  181. package/dist/storage/sqlite-storage-provider.d.ts +95 -0
  182. package/dist/storage/sqlite-storage-provider.d.ts.map +1 -0
  183. package/dist/storage/sqlite-storage-provider.js +383 -0
  184. package/dist/storage/sqlite-storage-provider.js.map +1 -0
  185. package/dist/storage/storage-error.d.ts +28 -0
  186. package/dist/storage/storage-error.d.ts.map +1 -0
  187. package/dist/storage/storage-error.js +35 -0
  188. package/dist/storage/storage-error.js.map +1 -0
  189. package/dist/storage/storage-provider.d.ts +161 -0
  190. package/dist/storage/storage-provider.d.ts.map +1 -0
  191. package/dist/storage/storage-provider.js +18 -0
  192. package/dist/storage/storage-provider.js.map +1 -0
  193. package/dist/streams/resolver.d.ts.map +1 -1
  194. package/dist/streams/resolver.js +6 -5
  195. package/dist/streams/resolver.js.map +1 -1
  196. package/dist/tools/index.d.ts +5 -1
  197. package/dist/tools/index.d.ts.map +1 -1
  198. package/dist/tools/index.js +54 -15
  199. package/dist/tools/index.js.map +1 -1
  200. package/dist/upstream/resolver.d.ts +3 -2
  201. package/dist/upstream/resolver.d.ts.map +1 -1
  202. package/dist/upstream/resolver.js +33 -32
  203. package/dist/upstream/resolver.js.map +1 -1
  204. package/package.json +33 -1
  205. package/templates/scribe-charter.md +4 -0
  206. package/templates/skills/cross-machine-coordination/SKILL.md +434 -0
  207. package/templates/skills/error-recovery/SKILL.md +99 -0
  208. package/templates/skills/iterative-retrieval/SKILL.md +165 -0
  209. package/templates/skills/notification-routing/SKILL.md +105 -0
  210. package/templates/skills/pr-screenshots/SKILL.md +149 -0
  211. package/templates/skills/ralph-two-pass-scan/SKILL.md +35 -0
  212. package/templates/skills/reflect/SKILL.md +229 -0
  213. package/templates/skills/release-process/SKILL.md +84 -376
  214. package/templates/skills/retro-enforcement/SKILL.md +148 -0
  215. package/templates/skills/tiered-memory/SKILL.md +234 -0
  216. package/templates/skills/windows-compatibility/SKILL.md +24 -0
  217. package/templates/{squad.agent.md → squad.agent.md.template} +57 -28
  218. package/templates/workflows/squad-ci.yml +1 -1
  219. package/templates/workflows/squad-heartbeat.yml +0 -4
  220. package/templates/workflows/squad-insider-release.yml +1 -1
  221. package/templates/workflows/squad-preview.yml +1 -1
  222. package/templates/workflows/squad-release.yml +1 -1
@@ -0,0 +1,19 @@
1
+ /**
2
+ * State I/O barrel — Markdown parsers and serializers for .squad/ domain files.
3
+ *
4
+ * Each module handles round-trip I/O for a single document type:
5
+ * parse(markdown) → typed object → serialize(object) → markdown.
6
+ *
7
+ * @module state/io
8
+ */
9
+ // Charter I/O
10
+ export { parseCharter, serializeCharter } from './charter-io.js';
11
+ // History I/O
12
+ export { parseHistory, serializeHistory, serializeHistoryAppend } from './history-io.js';
13
+ // Decisions I/O
14
+ export { parseDecisions, serializeDecision, serializeDecisions } from './decisions-io.js';
15
+ // Routing I/O
16
+ export { parseRouting, serializeRouting } from './routing-io.js';
17
+ // Team I/O
18
+ export { parseTeam, serializeTeam } from './team-io.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/state/io/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGjE,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzF,gBAAgB;AAChB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1F,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGjE,WAAW;AACX,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Routing Markdown I/O — parse and serialize routing.md files.
3
+ *
4
+ * Wraps the existing `parseRoutingRulesMarkdown()` from markdown-migration.ts
5
+ * and adds serialization for round-trip support.
6
+ *
7
+ * @module state/io/routing-io
8
+ */
9
+ import { type ParsedRoutingRule } from '../../config/markdown-migration.js';
10
+ export type { ParsedRoutingRule };
11
+ /** Result of parsing a routing.md file. */
12
+ export interface ParsedRouting {
13
+ rules: ParsedRoutingRule[];
14
+ moduleOwnership: Map<string, string>;
15
+ }
16
+ /**
17
+ * Parse routing markdown into typed routing rules and module ownership.
18
+ * Delegates rule parsing to `parseRoutingRulesMarkdown()` and also
19
+ * extracts the optional `## Module Ownership` section.
20
+ */
21
+ export declare function parseRouting(markdown: string): ParsedRouting;
22
+ /**
23
+ * Serialize routing rules to a full routing.md file.
24
+ *
25
+ * Produces:
26
+ * ```
27
+ * # Routing Rules
28
+ *
29
+ * ## Routing Table
30
+ *
31
+ * | Work Type | Agent | Examples |
32
+ * |-----------|-------|----------|
33
+ * | feature-dev | Lead | New features |
34
+ * ```
35
+ */
36
+ export declare function serializeRouting(rules: ParsedRoutingRule[]): string;
37
+ //# sourceMappingURL=routing-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-io.d.ts","sourceRoot":"","sources":["../../../src/state/io/routing-io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAGvG,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAElC,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAwDD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAI5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAkBnE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Routing Markdown I/O — parse and serialize routing.md files.
3
+ *
4
+ * Wraps the existing `parseRoutingRulesMarkdown()` from markdown-migration.ts
5
+ * and adds serialization for round-trip support.
6
+ *
7
+ * @module state/io/routing-io
8
+ */
9
+ import { parseRoutingRulesMarkdown } from '../../config/markdown-migration.js';
10
+ import { normalizeEol } from '../../utils/normalize-eol.js';
11
+ /**
12
+ * Parse a `## Module Ownership` table into a Map<module, owner>.
13
+ *
14
+ * Expected format:
15
+ * ```markdown
16
+ * ## Module Ownership
17
+ *
18
+ * | Module | Owner |
19
+ * |--------|-------|
20
+ * | src/storage/ | EECOM |
21
+ * ```
22
+ */
23
+ function parseModuleOwnership(markdown) {
24
+ const map = new Map();
25
+ const lines = normalizeEol(markdown).split('\n');
26
+ let inSection = false;
27
+ let headerPassed = false;
28
+ for (const line of lines) {
29
+ const trimmed = line.trim();
30
+ if (/^##\s+module\s+ownership/i.test(trimmed)) {
31
+ inSection = true;
32
+ headerPassed = false;
33
+ continue;
34
+ }
35
+ // Another ## heading ends the section
36
+ if (inSection && /^##\s+/.test(trimmed) && !/module\s+ownership/i.test(trimmed)) {
37
+ break;
38
+ }
39
+ if (!inSection || !trimmed.startsWith('|'))
40
+ continue;
41
+ // Detect header row (contains "module" or "owner")
42
+ if (!headerPassed && /module|owner/i.test(trimmed)) {
43
+ headerPassed = true;
44
+ continue;
45
+ }
46
+ // Skip separator row
47
+ if (/^[|:\-\s]+$/.test(trimmed))
48
+ continue;
49
+ if (!headerPassed)
50
+ continue;
51
+ const cells = trimmed.split('|').map((c) => c.trim()).filter(Boolean);
52
+ if (cells.length >= 2 && cells[0] && cells[1]) {
53
+ map.set(cells[0], cells[1]);
54
+ }
55
+ }
56
+ return map;
57
+ }
58
+ /**
59
+ * Parse routing markdown into typed routing rules and module ownership.
60
+ * Delegates rule parsing to `parseRoutingRulesMarkdown()` and also
61
+ * extracts the optional `## Module Ownership` section.
62
+ */
63
+ export function parseRouting(markdown) {
64
+ const { rules } = parseRoutingRulesMarkdown(markdown);
65
+ const moduleOwnership = parseModuleOwnership(markdown);
66
+ return { rules, moduleOwnership };
67
+ }
68
+ /**
69
+ * Serialize routing rules to a full routing.md file.
70
+ *
71
+ * Produces:
72
+ * ```
73
+ * # Routing Rules
74
+ *
75
+ * ## Routing Table
76
+ *
77
+ * | Work Type | Agent | Examples |
78
+ * |-----------|-------|----------|
79
+ * | feature-dev | Lead | New features |
80
+ * ```
81
+ */
82
+ export function serializeRouting(rules) {
83
+ const lines = [
84
+ '# Routing Rules',
85
+ '',
86
+ '## Routing Table',
87
+ '',
88
+ '| Work Type | Agent | Examples |',
89
+ '|-----------|-------|----------|',
90
+ ];
91
+ for (const rule of rules) {
92
+ const agents = rule.agents.join(', ');
93
+ const examples = rule.examples ? rule.examples.join(', ') : '';
94
+ lines.push(`| ${rule.workType} | ${agents} | ${examples} |`);
95
+ }
96
+ lines.push('');
97
+ return lines.join('\n');
98
+ }
99
+ //# sourceMappingURL=routing-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing-io.js","sourceRoot":"","sources":["../../../src/state/io/routing-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Team Markdown I/O — parse and serialize team.md files.
3
+ *
4
+ * Wraps the existing `parseTeamMarkdown()` from markdown-migration.ts
5
+ * and adds serialization for round-trip support.
6
+ *
7
+ * @module state/io/team-io
8
+ */
9
+ import { type ParsedAgent } from '../../config/markdown-migration.js';
10
+ export type { ParsedAgent };
11
+ /**
12
+ * Optional metadata for the team.md file header.
13
+ */
14
+ export interface TeamMetadata {
15
+ /** Team name displayed in the title */
16
+ teamName?: string;
17
+ /** Tagline shown below the title */
18
+ tagline?: string;
19
+ }
20
+ /** Result of parsing a team.md file. */
21
+ export interface ParsedTeam {
22
+ agents: ParsedAgent[];
23
+ projectContext: string;
24
+ }
25
+ /**
26
+ * Parse team markdown into typed agent entries and project context.
27
+ * Delegates agent parsing to `parseTeamMarkdown()` and also extracts
28
+ * the project context section above the members table.
29
+ */
30
+ export declare function parseTeam(markdown: string): ParsedTeam;
31
+ /**
32
+ * Serialize agents to a full team.md file.
33
+ *
34
+ * Produces the canonical table format:
35
+ * ```
36
+ * # Team Name
37
+ *
38
+ * ## Members
39
+ *
40
+ * | Name | Role | Charter | Status |
41
+ * |------|------|---------|--------|
42
+ * | Agent | Developer | `.squad/agents/agent/charter.md` | ✅ Active |
43
+ * ```
44
+ */
45
+ export declare function serializeTeam(agents: ParsedAgent[], metadata?: TeamMetadata): string;
46
+ //# sourceMappingURL=team-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-io.d.ts","sourceRoot":"","sources":["../../../src/state/io/team-io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAGzF,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wCAAwC;AACxC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiCD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAItD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,MAAM,CAyBpF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Team Markdown I/O — parse and serialize team.md files.
3
+ *
4
+ * Wraps the existing `parseTeamMarkdown()` from markdown-migration.ts
5
+ * and adds serialization for round-trip support.
6
+ *
7
+ * @module state/io/team-io
8
+ */
9
+ import { parseTeamMarkdown } from '../../config/markdown-migration.js';
10
+ import { normalizeEol } from '../../utils/normalize-eol.js';
11
+ /**
12
+ * Extract project context: everything between the `# Title` line and
13
+ * the `## Members` heading. The title line itself is excluded.
14
+ */
15
+ function extractProjectContext(markdown) {
16
+ const lines = normalizeEol(markdown).split('\n');
17
+ const contextLines = [];
18
+ let pastTitle = false;
19
+ for (const line of lines) {
20
+ const trimmed = line.trim();
21
+ // Skip the title line
22
+ if (!pastTitle) {
23
+ if (/^#\s+/.test(trimmed)) {
24
+ pastTitle = true;
25
+ }
26
+ continue;
27
+ }
28
+ // Stop at ## Members or any ## heading that signals the table section
29
+ if (/^##\s+members/i.test(trimmed)) {
30
+ break;
31
+ }
32
+ contextLines.push(line);
33
+ }
34
+ return contextLines.join('\n').trim();
35
+ }
36
+ /**
37
+ * Parse team markdown into typed agent entries and project context.
38
+ * Delegates agent parsing to `parseTeamMarkdown()` and also extracts
39
+ * the project context section above the members table.
40
+ */
41
+ export function parseTeam(markdown) {
42
+ const { agents } = parseTeamMarkdown(markdown);
43
+ const projectContext = extractProjectContext(markdown);
44
+ return { agents, projectContext };
45
+ }
46
+ /**
47
+ * Serialize agents to a full team.md file.
48
+ *
49
+ * Produces the canonical table format:
50
+ * ```
51
+ * # Team Name
52
+ *
53
+ * ## Members
54
+ *
55
+ * | Name | Role | Charter | Status |
56
+ * |------|------|---------|--------|
57
+ * | Agent | Developer | `.squad/agents/agent/charter.md` | ✅ Active |
58
+ * ```
59
+ */
60
+ export function serializeTeam(agents, metadata) {
61
+ const teamName = metadata?.teamName ?? 'Team';
62
+ const lines = [`# ${teamName}`];
63
+ if (metadata?.tagline) {
64
+ lines.push('');
65
+ lines.push(`> ${metadata.tagline}`);
66
+ }
67
+ lines.push('');
68
+ lines.push('## Members');
69
+ lines.push('');
70
+ lines.push('| Name | Role | Charter | Status |');
71
+ lines.push('|------|------|---------|--------|');
72
+ for (const agent of agents) {
73
+ const name = agent.name;
74
+ const role = agent.role;
75
+ const charter = `.squad/agents/${agent.name}/charter.md`;
76
+ const status = agent.status ?? '✅ Active';
77
+ lines.push(`| ${name} | ${role} | \`${charter}\` | ${status} |`);
78
+ }
79
+ lines.push('');
80
+ return lines.join('\n');
81
+ }
82
+ //# sourceMappingURL=team-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-io.js","sourceRoot":"","sources":["../../../src/state/io/team-io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAoB5D;;;GAGG;AACH,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,sBAAsB;QACtB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,MAAM;QACR,CAAC;QAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACvD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,MAAqB,EAAE,QAAuB;IAC1E,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,IAAI,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAa,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAE1C,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAEjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,OAAO,GAAG,iBAAiB,KAAK,CAAC,IAAI,aAAa,CAAC;QACzD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,IAAI,QAAQ,OAAO,QAAQ,MAAM,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * State Module — Storage Layout Schema
3
+ *
4
+ * Maps collection names to their `.squad/` file paths.
5
+ * Single-entity collections use a static string; multi-entity
6
+ * collections use a function that derives the path from an entity id.
7
+ */
8
+ import type { CollectionName } from './collection-map.js';
9
+ /** Either a static path or a function deriving a path from an entity id. */
10
+ export type CollectionPathResolver = string | ((id: string) => string);
11
+ /**
12
+ * Canonical mapping from collection names to `.squad/` relative paths.
13
+ *
14
+ * Static paths point to a single file (e.g. `decisions.md`).
15
+ * Function paths resolve per-entity directories (e.g. `agents/<name>`).
16
+ */
17
+ export declare const COLLECTION_PATHS: Record<CollectionName, CollectionPathResolver>;
18
+ /**
19
+ * Resolve the storage path for a collection, optionally with an entity id.
20
+ *
21
+ * @throws {Error} if the collection requires an id but none was provided.
22
+ */
23
+ export declare function resolveCollectionPath(collection: CollectionName, id?: string): string;
24
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,4EAA4E;AAC5E,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;AAIvE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,sBAAsB,CAS3E,CAAC;AAIF;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CASrF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * State Module — Storage Layout Schema
3
+ *
4
+ * Maps collection names to their `.squad/` file paths.
5
+ * Single-entity collections use a static string; multi-entity
6
+ * collections use a function that derives the path from an entity id.
7
+ */
8
+ // ── Collection → Path Mapping ──────────────────────────────────────────────
9
+ /**
10
+ * Canonical mapping from collection names to `.squad/` relative paths.
11
+ *
12
+ * Static paths point to a single file (e.g. `decisions.md`).
13
+ * Function paths resolve per-entity directories (e.g. `agents/<name>`).
14
+ */
15
+ export const COLLECTION_PATHS = {
16
+ agents: (id) => `.squad/agents/${id}`,
17
+ decisions: '.squad/decisions.md',
18
+ routing: '.squad/routing.md',
19
+ team: '.squad/team.md',
20
+ skills: (id) => `.squad/skills/${id}`,
21
+ templates: (id) => `.squad/templates/${id}`,
22
+ log: '.squad/log',
23
+ config: '.squad/config.json',
24
+ };
25
+ // ── Helpers ────────────────────────────────────────────────────────────────
26
+ /**
27
+ * Resolve the storage path for a collection, optionally with an entity id.
28
+ *
29
+ * @throws {Error} if the collection requires an id but none was provided.
30
+ */
31
+ export function resolveCollectionPath(collection, id) {
32
+ const resolver = COLLECTION_PATHS[collection];
33
+ if (typeof resolver === 'function') {
34
+ if (!id) {
35
+ throw new Error(`Collection "${collection}" requires an entity id to resolve its path`);
36
+ }
37
+ return resolver(id);
38
+ }
39
+ return resolver;
40
+ }
41
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/state/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAmD;IAC9E,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE;IAC7C,SAAS,EAAE,qBAAqB;IAChC,OAAO,EAAE,mBAAmB;IAC5B,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE;IAC7C,SAAS,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE;IACnD,GAAG,EAAE,YAAY;IACjB,MAAM,EAAE,oBAAoB;CAC7B,CAAC;AAEF,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAA0B,EAAE,EAAW;IAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,6CAA6C,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * State Module — SquadState Facade
3
+ *
4
+ * Top-level typed API for reading and writing `.squad/` state.
5
+ * Composes the collection facades (agents, decisions, routing, team)
6
+ * over a pluggable StorageProvider.
7
+ *
8
+ * @module state/squad-state
9
+ */
10
+ import type { StorageProvider } from '../storage/storage-provider.js';
11
+ import { AgentsCollection, ConfigCollection, DecisionsCollection, LogCollection, RoutingCollection, SkillsCollection, TeamCollection, TemplatesCollection } from './collections.js';
12
+ export declare class SquadState {
13
+ private readonly storage;
14
+ private readonly _rootDir;
15
+ readonly agents: AgentsCollection;
16
+ readonly config: ConfigCollection;
17
+ readonly decisions: DecisionsCollection;
18
+ readonly routing: RoutingCollection;
19
+ readonly team: TeamCollection;
20
+ readonly skills: SkillsCollection;
21
+ readonly templates: TemplatesCollection;
22
+ readonly log: LogCollection;
23
+ private constructor();
24
+ /** The project root directory this SquadState is bound to. */
25
+ get root(): string;
26
+ /** The underlying StorageProvider used by this instance. */
27
+ get provider(): StorageProvider;
28
+ /**
29
+ * Factory method — validates that `rootDir/.squad/` exists before
30
+ * returning a new SquadState instance.
31
+ */
32
+ static create(storage: StorageProvider, rootDir: string): Promise<SquadState>;
33
+ /**
34
+ * Synchronous factory — creates SquadState without validating `.squad/`
35
+ * existence. For internal SDK use where the caller already knows the
36
+ * root is initialized (e.g., modules operating on an existing project).
37
+ */
38
+ static fromStorage(storage: StorageProvider, rootDir: string): SquadState;
39
+ /** Check if a `.squad/` directory exists at the root. */
40
+ isInitialized(): Promise<boolean>;
41
+ }
42
+ //# sourceMappingURL=squad-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"squad-state.d.ts","sourceRoot":"","sources":["../../src/state/squad-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,UAAU;IAWnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAX3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC;IAE5B,OAAO;IAcP,8DAA8D;IAC9D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,4DAA4D;IAC5D,IAAI,QAAQ,IAAI,eAAe,CAE9B;IAED;;;OAGG;WACU,MAAM,CACjB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAStB;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GACd,UAAU;IAIb,yDAAyD;IACnD,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;CAGxC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * State Module — SquadState Facade
3
+ *
4
+ * Top-level typed API for reading and writing `.squad/` state.
5
+ * Composes the collection facades (agents, decisions, routing, team)
6
+ * over a pluggable StorageProvider.
7
+ *
8
+ * @module state/squad-state
9
+ */
10
+ import { AgentsCollection, ConfigCollection, DecisionsCollection, LogCollection, RoutingCollection, SkillsCollection, TeamCollection, TemplatesCollection, } from './collections.js';
11
+ import { NotFoundError } from './domain-types.js';
12
+ export class SquadState {
13
+ storage;
14
+ _rootDir;
15
+ agents;
16
+ config;
17
+ decisions;
18
+ routing;
19
+ team;
20
+ skills;
21
+ templates;
22
+ log;
23
+ constructor(storage, _rootDir) {
24
+ this.storage = storage;
25
+ this._rootDir = _rootDir;
26
+ this.agents = new AgentsCollection(storage, _rootDir);
27
+ this.config = new ConfigCollection(storage, _rootDir);
28
+ this.decisions = new DecisionsCollection(storage, _rootDir);
29
+ this.routing = new RoutingCollection(storage, _rootDir);
30
+ this.team = new TeamCollection(storage, _rootDir);
31
+ this.skills = new SkillsCollection(storage, _rootDir);
32
+ this.templates = new TemplatesCollection(storage, _rootDir);
33
+ this.log = new LogCollection(storage, _rootDir);
34
+ }
35
+ /** The project root directory this SquadState is bound to. */
36
+ get root() {
37
+ return this._rootDir;
38
+ }
39
+ /** The underlying StorageProvider used by this instance. */
40
+ get provider() {
41
+ return this.storage;
42
+ }
43
+ /**
44
+ * Factory method — validates that `rootDir/.squad/` exists before
45
+ * returning a new SquadState instance.
46
+ */
47
+ static async create(storage, rootDir) {
48
+ const squadDir = `${rootDir}/.squad`;
49
+ const exists = await storage.exists(squadDir);
50
+ if (!exists) {
51
+ throw new NotFoundError('squad', rootDir);
52
+ }
53
+ return new SquadState(storage, rootDir);
54
+ }
55
+ /**
56
+ * Synchronous factory — creates SquadState without validating `.squad/`
57
+ * existence. For internal SDK use where the caller already knows the
58
+ * root is initialized (e.g., modules operating on an existing project).
59
+ */
60
+ static fromStorage(storage, rootDir) {
61
+ return new SquadState(storage, rootDir);
62
+ }
63
+ /** Check if a `.squad/` directory exists at the root. */
64
+ async isInitialized() {
65
+ return this.storage.exists(`${this._rootDir}/.squad`);
66
+ }
67
+ }
68
+ //# sourceMappingURL=squad-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"squad-state.js","sourceRoot":"","sources":["../../src/state/squad-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,OAAO,UAAU;IAWF;IACA;IAXV,MAAM,CAAmB;IACzB,MAAM,CAAmB;IACzB,SAAS,CAAsB;IAC/B,OAAO,CAAoB;IAC3B,IAAI,CAAiB;IACrB,MAAM,CAAmB;IACzB,SAAS,CAAsB;IAC/B,GAAG,CAAgB;IAE5B,YACmB,OAAwB,EACxB,QAAgB;QADhB,YAAO,GAAP,OAAO,CAAiB;QACxB,aAAQ,GAAR,QAAQ,CAAQ;QAEjC,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,8DAA8D;IAC9D,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,4DAA4D;IAC5D,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,OAAwB,EACxB,OAAe;QAEf,MAAM,QAAQ,GAAG,GAAG,OAAO,SAAS,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAChB,OAAwB,EACxB,OAAe;QAEf,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,SAAS,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,60 @@
1
+ import type { StorageProvider, StorageStats } from './storage-provider.js';
2
+ /**
3
+ * FSStorageProvider — Node.js `fs` implementation of StorageProvider.
4
+ *
5
+ * - ENOENT reads return `undefined` (no throw).
6
+ * - Writes create parent directories recursively.
7
+ * - Appends create the file (and parent dirs) if missing.
8
+ * - delete is a no-op when the file does not exist.
9
+ * - list returns an empty array for a missing directory.
10
+ * - Optional `rootDir` confines all operations to a specific directory tree.
11
+ */
12
+ export declare class FSStorageProvider implements StorageProvider {
13
+ private static readonly CASE_INSENSITIVE;
14
+ private readonly rootDir?;
15
+ constructor(rootDir?: string);
16
+ private pathStartsWith;
17
+ private pathEquals;
18
+ /**
19
+ * Validates that filePath resolves within rootDir and does not escape
20
+ * via path traversal or symlinks.
21
+ *
22
+ * ⚠️ TOCTOU: This is a user-space check. Between validation and the
23
+ * subsequent fs operation, a path component could theoretically be
24
+ * swapped for a symlink. This is an inherent limitation of user-space
25
+ * path validation on POSIX systems. For defense-in-depth, callers
26
+ * operating in hostile environments should use OS-level confinement
27
+ * (chroot, namespaces, or sandboxing) in addition to this check.
28
+ */
29
+ private assertSafePath;
30
+ private assertSafePathSync;
31
+ read(filePath: string): Promise<string | undefined>;
32
+ write(filePath: string, data: string): Promise<void>;
33
+ append(filePath: string, data: string): Promise<void>;
34
+ exists(filePath: string): Promise<boolean>;
35
+ list(dirPath: string): Promise<string[]>;
36
+ delete(filePath: string): Promise<void>;
37
+ readSync(filePath: string): string | undefined;
38
+ writeSync(filePath: string, data: string): void;
39
+ existsSync(filePath: string): boolean;
40
+ listSync(dirPath: string): string[];
41
+ deleteDir(dirPath: string): Promise<void>;
42
+ isDirectory(targetPath: string): Promise<boolean>;
43
+ mkdir(dirPath: string, options?: {
44
+ recursive?: boolean;
45
+ }): Promise<void>;
46
+ rename(oldPath: string, newPath: string): Promise<void>;
47
+ copy(srcPath: string, destPath: string): Promise<void>;
48
+ stat(targetPath: string): Promise<StorageStats | undefined>;
49
+ isDirectorySync(targetPath: string): boolean;
50
+ mkdirSync(dirPath: string, options?: {
51
+ recursive?: boolean;
52
+ }): void;
53
+ statSync(targetPath: string): StorageStats | undefined;
54
+ appendSync(filePath: string, data: string): void;
55
+ deleteSync(filePath: string): void;
56
+ renameSync(oldPath: string, newPath: string): void;
57
+ copySync(srcPath: string, destPath: string): void;
58
+ deleteDirSync(dirPath: string): void;
59
+ }
60
+ //# sourceMappingURL=fs-storage-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-storage-provider.d.ts","sourceRoot":"","sources":["../../src/storage/fs-storage-provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG3E;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAiE;IACzG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;gBAEtB,OAAO,CAAC,EAAE,MAAM;IAI5B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,UAAU;IAOlB;;;;;;;;;;OAUG;YACW,cAAc;IAwC5B,OAAO,CAAC,kBAAkB;IAwCpB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAUnD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAUxC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAU9C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAU/C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAKrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IAU7B,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtD,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAWjE,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAS5C,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAUnE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWtD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUhD,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUlC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWlD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWjD,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CASrC"}