zelari-code 0.2.2 → 0.6.2
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 +97 -2
- package/dist/agents/councilApi.js +7 -7
- package/dist/agents/councilApi.js.map +1 -1
- package/dist/agents/councilDirectives.js +3 -3
- package/dist/agents/promoteMember.js +2 -2
- package/dist/agents/roles.js +32 -32
- package/dist/agents/roles.js.map +1 -1
- package/dist/agents/skills/builtin/debugging.js +4 -4
- package/dist/agents/skills/builtin/debugging.js.map +1 -1
- package/dist/agents/skills/builtin/docs.js +13 -23
- package/dist/agents/skills/builtin/docs.js.map +1 -1
- package/dist/agents/skills/builtin/git-ops.js +3 -3
- package/dist/agents/skills/builtin/git-ops.js.map +1 -1
- package/dist/agents/skills/builtin/planning.js +4 -4
- package/dist/agents/skills/builtin/planning.js.map +1 -1
- package/dist/agents/skills/builtin/refactoring.js +3 -3
- package/dist/agents/skills/builtin/refactoring.js.map +1 -1
- package/dist/agents/skills/builtin/review.js +9 -9
- package/dist/agents/skills/builtin/review.js.map +1 -1
- package/dist/agents/skills/builtin/testing.js +3 -3
- package/dist/agents/skills/builtin/testing.js.map +1 -1
- package/dist/agents/tools.js +9 -2
- package/dist/agents/tools.js.map +1 -1
- package/dist/cli/app.js +94 -1861
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/compaction.js.map +1 -1
- package/dist/cli/components/ChatStream.js +81 -14
- package/dist/cli/components/ChatStream.js.map +1 -1
- package/dist/cli/components/CollapsibleToolOutput.js +26 -3
- package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
- package/dist/cli/components/Header.js +20 -1
- package/dist/cli/components/Header.js.map +1 -1
- package/dist/cli/components/InputBar.js +34 -2
- package/dist/cli/components/InputBar.js.map +1 -1
- package/dist/cli/components/Sidebar.js +30 -10
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/councilDispatcher.js +10 -2
- package/dist/cli/councilDispatcher.js.map +1 -1
- package/dist/cli/headless.js +137 -0
- package/dist/cli/headless.js.map +1 -0
- package/dist/cli/hooks/chatStats.js +28 -0
- package/dist/cli/hooks/chatStats.js.map +1 -0
- package/dist/cli/hooks/eventsToMessages.js +111 -0
- package/dist/cli/hooks/eventsToMessages.js.map +1 -0
- package/dist/cli/hooks/messageHelpers.js +125 -0
- package/dist/cli/hooks/messageHelpers.js.map +1 -0
- package/dist/cli/hooks/skillCompare.js +69 -0
- package/dist/cli/hooks/skillCompare.js.map +1 -0
- package/dist/cli/hooks/steer.js +28 -0
- package/dist/cli/hooks/steer.js.map +1 -0
- package/dist/cli/hooks/useBatchedMessages.js +67 -0
- package/dist/cli/hooks/useBatchedMessages.js.map +1 -0
- package/dist/cli/hooks/useChatTurn.js +363 -0
- package/dist/cli/hooks/useChatTurn.js.map +1 -0
- package/dist/cli/hooks/useSession.js +116 -0
- package/dist/cli/hooks/useSession.js.map +1 -0
- package/dist/cli/hooks/useSlashDispatch.js +303 -0
- package/dist/cli/hooks/useSlashDispatch.js.map +1 -0
- package/dist/cli/hooks/useTerminalSize.js +60 -0
- package/dist/cli/hooks/useTerminalSize.js.map +1 -0
- package/dist/cli/main.bundled.js +25212 -21722
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +86 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/provider/openai-compatible.js +9 -2
- package/dist/cli/provider/openai-compatible.js.map +1 -1
- package/dist/cli/runHeadless.js +160 -0
- package/dist/cli/runHeadless.js.map +1 -0
- package/dist/cli/sessionManager.js +47 -1
- package/dist/cli/sessionManager.js.map +1 -1
- package/dist/cli/skillSuggest.js +1 -1
- package/dist/cli/slashCommands.js +72 -3
- package/dist/cli/slashCommands.js.map +1 -1
- package/dist/cli/slashHandlers/branch.js +57 -0
- package/dist/cli/slashHandlers/branch.js.map +1 -0
- package/dist/cli/slashHandlers/git.js +40 -0
- package/dist/cli/slashHandlers/git.js.map +1 -0
- package/dist/cli/slashHandlers/promoteMember.js +25 -0
- package/dist/cli/slashHandlers/promoteMember.js.map +1 -0
- package/dist/cli/slashHandlers/provider.js +199 -0
- package/dist/cli/slashHandlers/provider.js.map +1 -0
- package/dist/cli/slashHandlers/skills.js +82 -0
- package/dist/cli/slashHandlers/skills.js.map +1 -0
- package/dist/cli/slashHandlers/transcript.js +13 -0
- package/dist/cli/slashHandlers/transcript.js.map +1 -0
- package/dist/cli/slashHandlers/updater.js +40 -0
- package/dist/cli/slashHandlers/updater.js.map +1 -0
- package/dist/cli/slashHandlers/workspace.js +118 -0
- package/dist/cli/slashHandlers/workspace.js.map +1 -0
- package/dist/cli/toolRegistry.js +17 -8
- package/dist/cli/toolRegistry.js.map +1 -1
- package/dist/cli/utils/duration.js +34 -0
- package/dist/cli/utils/duration.js.map +1 -0
- package/dist/cli/wizard/firstRun.js +63 -0
- package/dist/cli/wizard/firstRun.js.map +1 -0
- package/dist/cli/wizard/index.js +150 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/runWizard.js +137 -0
- package/dist/cli/wizard/runWizard.js.map +1 -0
- package/dist/cli/wizard/useWizardState.js +151 -0
- package/dist/cli/wizard/useWizardState.js.map +1 -0
- package/dist/cli/workspace/agentsMd.js +314 -0
- package/dist/cli/workspace/agentsMd.js.map +1 -0
- package/dist/cli/workspace/index.js +24 -0
- package/dist/cli/workspace/index.js.map +1 -0
- package/dist/cli/workspace/paths.js +88 -0
- package/dist/cli/workspace/paths.js.map +1 -0
- package/dist/cli/workspace/postCouncilHook.js +38 -0
- package/dist/cli/workspace/postCouncilHook.js.map +1 -0
- package/dist/cli/workspace/storage.js +392 -0
- package/dist/cli/workspace/storage.js.map +1 -0
- package/dist/cli/workspace/stubs.js +528 -0
- package/dist/cli/workspace/stubs.js.map +1 -0
- package/dist/cli/workspace/toolRegistry.js +61 -0
- package/dist/cli/workspace/toolRegistry.js.map +1 -0
- package/dist/cli/workspace/types.js +10 -0
- package/dist/cli/workspace/types.js.map +1 -0
- package/dist/main/core/tools/builtin/_walk.js +129 -0
- package/dist/main/core/tools/builtin/_walk.js.map +1 -0
- package/dist/main/core/tools/builtin/diff.js +477 -0
- package/dist/main/core/tools/builtin/diff.js.map +1 -0
- package/dist/main/core/tools/builtin/listFiles.js +5 -43
- package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
- package/dist/main/core/tools/builtin/search.js +120 -28
- package/dist/main/core/tools/builtin/search.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workspace/storage.ts — Frontmatter parse/serialize + safe read/write.
|
|
3
|
+
*
|
|
4
|
+
* Zero new deps. Implements a minimal YAML reader that handles the
|
|
5
|
+
* subset we use: flat key-value pairs, single-line values, simple
|
|
6
|
+
* arrays using `[a, b, c]` or `- a\n- b` notation, nested objects
|
|
7
|
+
* using 2-space indentation, strings (quoted/unquoted), numbers,
|
|
8
|
+
* booleans, null.
|
|
9
|
+
*
|
|
10
|
+
* For our frontmatter (plan items, ADRs, risks, reviews, docs) this
|
|
11
|
+
* is more than enough. Anything more complex would warrant pulling in
|
|
12
|
+
* `gray-matter` + `js-yaml`.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, renameSync, } from 'node:fs';
|
|
15
|
+
import { dirname, join } from 'node:path';
|
|
16
|
+
// ── Frontmatter parsing ────────────────────────────────────────────────
|
|
17
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
18
|
+
/** Parse a Markdown string into meta + body. */
|
|
19
|
+
export function parseFrontmatter(md) {
|
|
20
|
+
const m = FRONTMATTER_RE.exec(md);
|
|
21
|
+
if (!m)
|
|
22
|
+
return { meta: {}, body: md };
|
|
23
|
+
const meta = parseYaml(m[1]);
|
|
24
|
+
const body = m[2];
|
|
25
|
+
return { meta, body };
|
|
26
|
+
}
|
|
27
|
+
/** Serialize meta + body back to a Markdown string. */
|
|
28
|
+
export function serializeFrontmatter(meta, body) {
|
|
29
|
+
const yamlStr = serializeYaml(meta);
|
|
30
|
+
// Always end with exactly one \n before body for consistency
|
|
31
|
+
return `---\n${yamlStr}\n---\n${body}`;
|
|
32
|
+
}
|
|
33
|
+
// ── Minimal YAML parser/serializer ─────────────────────────────────────
|
|
34
|
+
// Subset: scalar values, flow/sequence/block-sequence arrays, flow/block maps.
|
|
35
|
+
const VALID_SCALARS = /^(true|false|null|~)$/i;
|
|
36
|
+
/** Parse a YAML subset string into a JS value. */
|
|
37
|
+
export function parseYaml(input) {
|
|
38
|
+
const lines = input.split(/\r?\n/);
|
|
39
|
+
const ctx = { lines, i: 0 };
|
|
40
|
+
return parseNode(ctx, 0);
|
|
41
|
+
}
|
|
42
|
+
function parseNode(ctx, indent) {
|
|
43
|
+
// Skip blank lines and comments
|
|
44
|
+
while (ctx.i < ctx.lines.length) {
|
|
45
|
+
const line = ctx.lines[ctx.i];
|
|
46
|
+
if (line.trim() === '' || line.trim().startsWith('#')) {
|
|
47
|
+
ctx.i++;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
if (ctx.i >= ctx.lines.length)
|
|
53
|
+
return null;
|
|
54
|
+
const line = ctx.lines[ctx.i];
|
|
55
|
+
const lineIndent = countIndent(line);
|
|
56
|
+
// Block sequence at this indent
|
|
57
|
+
if (/^\s*-\s+/.test(line)) {
|
|
58
|
+
return parseBlockSequence(ctx, indent);
|
|
59
|
+
}
|
|
60
|
+
// Flow sequence on a single line: [...]
|
|
61
|
+
if (/^\s*\[.*\]\s*$/.test(line)) {
|
|
62
|
+
const flow = line.trim().replace(/^\[/, '').replace(/\]$/, '');
|
|
63
|
+
return parseFlowSequence(flow);
|
|
64
|
+
}
|
|
65
|
+
// Flow map on a single line: {key: val, ...}
|
|
66
|
+
if (/^\s*\{.*\}\s*$/.test(line)) {
|
|
67
|
+
const flow = line.trim().replace(/^\{/, '').replace(/\}$/, '');
|
|
68
|
+
return parseFlowMap(flow);
|
|
69
|
+
}
|
|
70
|
+
// Block map (key: value, possibly with nested children)
|
|
71
|
+
return parseBlockMap(ctx, indent);
|
|
72
|
+
}
|
|
73
|
+
function parseBlockMap(ctx, indent) {
|
|
74
|
+
const out = {};
|
|
75
|
+
while (ctx.i < ctx.lines.length) {
|
|
76
|
+
const line = ctx.lines[ctx.i];
|
|
77
|
+
if (line.trim() === '' || line.trim().startsWith('#')) {
|
|
78
|
+
ctx.i++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const lineIndent = countIndent(line);
|
|
82
|
+
if (lineIndent < indent)
|
|
83
|
+
break;
|
|
84
|
+
if (lineIndent > indent) {
|
|
85
|
+
// Not expected in well-formed YAML — skip
|
|
86
|
+
ctx.i++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Key: value
|
|
90
|
+
const m = /^([^:]+):\s*(.*)$/.exec(line);
|
|
91
|
+
if (!m) {
|
|
92
|
+
ctx.i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const key = m[1].trim();
|
|
96
|
+
const valuePart = m[2].trim();
|
|
97
|
+
if (valuePart === '' || valuePart === '|' || valuePart === '>') {
|
|
98
|
+
// Multiline value or nested structure
|
|
99
|
+
ctx.i++;
|
|
100
|
+
const nested = parseNode(ctx, indent + 2);
|
|
101
|
+
out[key] = nested;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Flow-style array on the value side: tags: [a, b, c]
|
|
105
|
+
if (valuePart.startsWith('[')) {
|
|
106
|
+
out[key] = parseFlowSequence(stripFlow(valuePart, '[', ']'));
|
|
107
|
+
}
|
|
108
|
+
else if (valuePart.startsWith('{')) {
|
|
109
|
+
// Flow-style map on the value side: meta: {order: 1, color: x}
|
|
110
|
+
out[key] = parseFlowMap(stripFlow(valuePart, '{', '}'));
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
out[key] = parseScalar(valuePart);
|
|
114
|
+
}
|
|
115
|
+
ctx.i++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return out;
|
|
119
|
+
}
|
|
120
|
+
function parseBlockSequence(ctx, indent) {
|
|
121
|
+
const out = [];
|
|
122
|
+
while (ctx.i < ctx.lines.length) {
|
|
123
|
+
const line = ctx.lines[ctx.i];
|
|
124
|
+
if (line.trim() === '') {
|
|
125
|
+
ctx.i++;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const lineIndent = countIndent(line);
|
|
129
|
+
if (lineIndent < indent)
|
|
130
|
+
break;
|
|
131
|
+
if (lineIndent > indent)
|
|
132
|
+
break; // shouldn't happen
|
|
133
|
+
const m = /^-\s*(.*)$/.exec(line);
|
|
134
|
+
if (!m)
|
|
135
|
+
break;
|
|
136
|
+
const rest = m[1];
|
|
137
|
+
if (rest === '') {
|
|
138
|
+
// Indented child of this sequence item
|
|
139
|
+
ctx.i++;
|
|
140
|
+
out.push(parseNode(ctx, indent + 2));
|
|
141
|
+
}
|
|
142
|
+
else if (rest.startsWith('[') || rest.startsWith('{')) {
|
|
143
|
+
// Inline flow collection starting the item
|
|
144
|
+
// Parse the whole line as flow
|
|
145
|
+
let buffer = rest;
|
|
146
|
+
// If line doesn't end with closing bracket, slurp next lines until balanced
|
|
147
|
+
let depthSq = (buffer.match(/\[/g) || []).length - (buffer.match(/\]/g) || []).length;
|
|
148
|
+
let depthCu = (buffer.match(/\{/g) || []).length - (buffer.match(/\}/g) || []).length;
|
|
149
|
+
while ((depthSq > 0 || depthCu > 0) && ctx.i + 1 < ctx.lines.length) {
|
|
150
|
+
ctx.i++;
|
|
151
|
+
const next = ctx.lines[ctx.i].trim();
|
|
152
|
+
buffer += ' ' + next;
|
|
153
|
+
depthSq = (buffer.match(/\[/g) || []).length - (buffer.match(/\]/g) || []).length;
|
|
154
|
+
depthCu = (buffer.match(/\{/g) || []).length - (buffer.match(/\}/g) || []).length;
|
|
155
|
+
}
|
|
156
|
+
if (buffer.startsWith('[')) {
|
|
157
|
+
out.push(parseFlowSequence(buffer.slice(1).replace(/\]$/, '')));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
out.push(parseFlowMap(buffer.slice(1).replace(/\}$/, '')));
|
|
161
|
+
}
|
|
162
|
+
ctx.i++;
|
|
163
|
+
}
|
|
164
|
+
else if (rest.includes(':')) {
|
|
165
|
+
// Map item starting on the dash line: "- key: val"
|
|
166
|
+
// Reconstruct a synthetic line at the right indent to feed parseBlockMap
|
|
167
|
+
ctx.i++;
|
|
168
|
+
const mapCtx = { lines: [' '.repeat(indent + 2) + rest, ...ctx.lines.slice(ctx.i)], i: 0 };
|
|
169
|
+
const val = parseBlockMap(mapCtx, indent + 2);
|
|
170
|
+
// Skip the synthetic line + however many mapCtx consumed from original
|
|
171
|
+
ctx.i += mapCtx.i - 1;
|
|
172
|
+
out.push(val);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
out.push(parseScalar(rest));
|
|
176
|
+
ctx.i++;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
function parseFlowSequence(input) {
|
|
182
|
+
// Split on top-level commas (not inside nested brackets)
|
|
183
|
+
const parts = splitFlow(input);
|
|
184
|
+
return parts.map((p) => {
|
|
185
|
+
const trimmed = p.trim();
|
|
186
|
+
if (trimmed.startsWith('{')) {
|
|
187
|
+
// Inline object inside a flow sequence: [{a: 1, b: 2}]
|
|
188
|
+
return parseFlowMap(stripFlow(trimmed, '{', '}'));
|
|
189
|
+
}
|
|
190
|
+
return parseScalar(trimmed);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/** Strip surrounding flow brackets and any trailing whitespace. */
|
|
194
|
+
function stripFlow(s, open, close) {
|
|
195
|
+
let out = s.trim();
|
|
196
|
+
if (out.startsWith(open))
|
|
197
|
+
out = out.slice(1);
|
|
198
|
+
if (out.endsWith(close))
|
|
199
|
+
out = out.slice(0, -1);
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
function parseFlowMap(input) {
|
|
203
|
+
const parts = splitFlow(input);
|
|
204
|
+
const out = {};
|
|
205
|
+
for (const p of parts) {
|
|
206
|
+
const colonIdx = p.indexOf(':');
|
|
207
|
+
if (colonIdx < 0)
|
|
208
|
+
continue;
|
|
209
|
+
const key = p.slice(0, colonIdx).trim();
|
|
210
|
+
const value = p.slice(colonIdx + 1).trim();
|
|
211
|
+
out[key] = parseScalar(value);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
function splitFlow(input) {
|
|
216
|
+
const out = [];
|
|
217
|
+
let depthSq = 0, depthCu = 0, depthQu = 0;
|
|
218
|
+
let buffer = '';
|
|
219
|
+
for (let i = 0; i < input.length; i++) {
|
|
220
|
+
const c = input[i];
|
|
221
|
+
if (c === '"' || c === "'") {
|
|
222
|
+
depthQu = depthQu === 0 ? (depthQu + 1) : 0;
|
|
223
|
+
buffer += c;
|
|
224
|
+
}
|
|
225
|
+
else if (depthQu === 0) {
|
|
226
|
+
if (c === '[')
|
|
227
|
+
depthSq++;
|
|
228
|
+
else if (c === ']')
|
|
229
|
+
depthSq--;
|
|
230
|
+
else if (c === '{')
|
|
231
|
+
depthCu++;
|
|
232
|
+
else if (c === '}')
|
|
233
|
+
depthCu--;
|
|
234
|
+
else if (c === ',' && depthSq === 0 && depthCu === 0) {
|
|
235
|
+
out.push(buffer);
|
|
236
|
+
buffer = '';
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
buffer += c;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
buffer += c;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (buffer.trim())
|
|
246
|
+
out.push(buffer);
|
|
247
|
+
return out;
|
|
248
|
+
}
|
|
249
|
+
function parseScalar(s) {
|
|
250
|
+
if (s === '' || s === 'null' || s === '~')
|
|
251
|
+
return null;
|
|
252
|
+
if (VALID_SCALARS.test(s))
|
|
253
|
+
return s.toLowerCase() === 'true';
|
|
254
|
+
// Number
|
|
255
|
+
if (/^-?\d+(\.\d+)?$/.test(s))
|
|
256
|
+
return Number(s);
|
|
257
|
+
// Quoted string
|
|
258
|
+
if ((s.startsWith('"') && s.endsWith('"')) || (s.startsWith("'") && s.endsWith("'"))) {
|
|
259
|
+
return s.slice(1, -1);
|
|
260
|
+
}
|
|
261
|
+
// Otherwise plain string
|
|
262
|
+
return s;
|
|
263
|
+
}
|
|
264
|
+
// ── Serializer ────────────────────────────────────────────────────────
|
|
265
|
+
/** Serialize a JS value back to our YAML subset. */
|
|
266
|
+
export function serializeYaml(value, indent = 0) {
|
|
267
|
+
if (value === null || value === undefined)
|
|
268
|
+
return '';
|
|
269
|
+
if (typeof value === 'string') {
|
|
270
|
+
// Quote if contains special chars
|
|
271
|
+
if (/[:#\n\[\]\{\},&*!|>'"%@`]/.test(value)) {
|
|
272
|
+
return JSON.stringify(value);
|
|
273
|
+
}
|
|
274
|
+
return value;
|
|
275
|
+
}
|
|
276
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
277
|
+
return String(value);
|
|
278
|
+
if (Array.isArray(value)) {
|
|
279
|
+
// Flow-style for arrays of scalars AND arrays of objects (simpler parser).
|
|
280
|
+
if (value.length === 0)
|
|
281
|
+
return '[]';
|
|
282
|
+
if (value.every((v) => v === null || typeof v !== 'object')) {
|
|
283
|
+
return `[${value.map(serializeScalarInline).join(', ')}]`;
|
|
284
|
+
}
|
|
285
|
+
// Array of objects → flow-style with JSON-like objects inside.
|
|
286
|
+
return `[${value.map((v) => '{' + serializeInlineObject(v) + '}').join(', ')}]`;
|
|
287
|
+
}
|
|
288
|
+
if (typeof value === 'object') {
|
|
289
|
+
const entries = Object.entries(value).filter(([, v]) => v !== undefined);
|
|
290
|
+
return entries
|
|
291
|
+
.map(([k, v]) => {
|
|
292
|
+
if (v === null || v === undefined)
|
|
293
|
+
return `${k}:`;
|
|
294
|
+
// Scalars and arrays (of any kind) — write inline.
|
|
295
|
+
if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {
|
|
296
|
+
return `${k}: ${serializeScalarInline(v)}`;
|
|
297
|
+
}
|
|
298
|
+
if (Array.isArray(v)) {
|
|
299
|
+
// Arrays always inline (flow-style). Empty → [].
|
|
300
|
+
if (v.length === 0)
|
|
301
|
+
return `${k}: []`;
|
|
302
|
+
if (v.every((x) => x === null || typeof x !== 'object')) {
|
|
303
|
+
return `${k}: [${v.map(serializeScalarInline).join(', ')}]`;
|
|
304
|
+
}
|
|
305
|
+
return `${k}: [${v.map((x) => '{' + serializeInlineObject(x) + '}').join(', ')}]`;
|
|
306
|
+
}
|
|
307
|
+
// Nested object → block-style on subsequent indented lines.
|
|
308
|
+
return `${k}:\n${serializeYaml(v, indent + 2)}`;
|
|
309
|
+
})
|
|
310
|
+
.map((line) => `${' '.repeat(indent)}${line}`)
|
|
311
|
+
.join('\n');
|
|
312
|
+
}
|
|
313
|
+
return String(value);
|
|
314
|
+
}
|
|
315
|
+
function serializeScalarInline(v) {
|
|
316
|
+
if (typeof v === 'string' && /[:#\n\[\]\{\},&*!|>'"%@`]/.test(v))
|
|
317
|
+
return JSON.stringify(v);
|
|
318
|
+
return String(v);
|
|
319
|
+
}
|
|
320
|
+
/** Serialize an object inline as `key: val, key2: val2` (no surrounding braces). */
|
|
321
|
+
function serializeInlineObject(v) {
|
|
322
|
+
if (v === null || typeof v !== 'object' || Array.isArray(v)) {
|
|
323
|
+
return serializeScalarInline(v);
|
|
324
|
+
}
|
|
325
|
+
const entries = Object.entries(v).filter(([, val]) => val !== undefined);
|
|
326
|
+
return entries.map(([k, val]) => `${k}: ${serializeYaml(val)}`).join(', ');
|
|
327
|
+
}
|
|
328
|
+
function countIndent(line) {
|
|
329
|
+
let i = 0;
|
|
330
|
+
while (i < line.length && line[i] === ' ')
|
|
331
|
+
i++;
|
|
332
|
+
return i;
|
|
333
|
+
}
|
|
334
|
+
// ── File I/O ──────────────────────────────────────────────────────────
|
|
335
|
+
export class Storage {
|
|
336
|
+
/** Read a Markdown file with frontmatter. Throws if not found. */
|
|
337
|
+
read(path) {
|
|
338
|
+
if (!existsSync(path)) {
|
|
339
|
+
throw new Error(`File not found: ${path}`);
|
|
340
|
+
}
|
|
341
|
+
const md = readFileSync(path, 'utf8');
|
|
342
|
+
return parseFrontmatter(md);
|
|
343
|
+
}
|
|
344
|
+
/** Read a Markdown file; returns null if not found. */
|
|
345
|
+
readIfExists(path) {
|
|
346
|
+
if (!existsSync(path))
|
|
347
|
+
return null;
|
|
348
|
+
return this.read(path);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Write a Markdown file atomically (tmp + rename). Creates parent dirs.
|
|
352
|
+
* The meta object is serialized as YAML frontmatter; body as Markdown.
|
|
353
|
+
*/
|
|
354
|
+
write(path, meta, body) {
|
|
355
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
356
|
+
const tmp = path + '.tmp-' + process.pid;
|
|
357
|
+
const md = serializeFrontmatter(meta, body);
|
|
358
|
+
writeFileSync(tmp, md, 'utf8');
|
|
359
|
+
renameSync(tmp, path); // atomic on POSIX
|
|
360
|
+
}
|
|
361
|
+
/** List all .md files in a directory (non-recursive). */
|
|
362
|
+
listMarkdown(dir) {
|
|
363
|
+
if (!existsSync(dir))
|
|
364
|
+
return [];
|
|
365
|
+
return readdirSync(dir)
|
|
366
|
+
.filter((f) => f.endsWith('.md') && !f.startsWith('.'))
|
|
367
|
+
.map((f) => join(dir, f));
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/** Simple per-path mutex for concurrent write serialization. */
|
|
371
|
+
class KeyedMutex {
|
|
372
|
+
chains = new Map();
|
|
373
|
+
async run(key, fn) {
|
|
374
|
+
const prev = this.chains.get(key) ?? Promise.resolve();
|
|
375
|
+
let release = () => { };
|
|
376
|
+
const next = new Promise((resolve) => { release = resolve; });
|
|
377
|
+
this.chains.set(key, prev.then(() => next));
|
|
378
|
+
await prev;
|
|
379
|
+
try {
|
|
380
|
+
return await fn();
|
|
381
|
+
}
|
|
382
|
+
finally {
|
|
383
|
+
release();
|
|
384
|
+
// Cleanup if this was the last in chain
|
|
385
|
+
if (this.chains.get(key) === prev.then(() => next)) {
|
|
386
|
+
this.chains.delete(key);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
export const workspaceMutex = new KeyedMutex();
|
|
392
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/cli/workspace/storage.ts"],"names":[],"mappings":"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"}
|