fold-agent 0.1.0

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 (74) hide show
  1. package/README.md +14 -0
  2. package/bin/fold-agent.js +2 -0
  3. package/dist/cli/app.d.ts +4 -0
  4. package/dist/cli/app.js +1113 -0
  5. package/dist/cli/app.js.map +1 -0
  6. package/dist/cli/bin.d.ts +2 -0
  7. package/dist/cli/bin.js +8 -0
  8. package/dist/cli/bin.js.map +1 -0
  9. package/dist/cli/context.d.ts +5 -0
  10. package/dist/cli/context.js +2 -0
  11. package/dist/cli/context.js.map +1 -0
  12. package/dist/cli/operations.d.ts +126 -0
  13. package/dist/cli/operations.js +1159 -0
  14. package/dist/cli/operations.js.map +1 -0
  15. package/dist/cli/output.d.ts +22 -0
  16. package/dist/cli/output.js +245 -0
  17. package/dist/cli/output.js.map +1 -0
  18. package/dist/cli/package-info.d.ts +5 -0
  19. package/dist/cli/package-info.js +12 -0
  20. package/dist/cli/package-info.js.map +1 -0
  21. package/dist/cli/results.d.ts +393 -0
  22. package/dist/cli/results.js +2 -0
  23. package/dist/cli/results.js.map +1 -0
  24. package/dist/cli/skill-install.d.ts +7 -0
  25. package/dist/cli/skill-install.js +211 -0
  26. package/dist/cli/skill-install.js.map +1 -0
  27. package/dist/deploy/public-origin.d.ts +15 -0
  28. package/dist/deploy/public-origin.js +59 -0
  29. package/dist/deploy/public-origin.js.map +1 -0
  30. package/dist/rooms/append-log-api.d.ts +16 -0
  31. package/dist/rooms/append-log-api.js +72 -0
  32. package/dist/rooms/append-log-api.js.map +1 -0
  33. package/dist/rooms/append-log-validation.d.ts +2 -0
  34. package/dist/rooms/append-log-validation.js +16 -0
  35. package/dist/rooms/append-log-validation.js.map +1 -0
  36. package/dist/rooms/comments.d.ts +63 -0
  37. package/dist/rooms/comments.js +136 -0
  38. package/dist/rooms/comments.js.map +1 -0
  39. package/dist/rooms/crypto.d.ts +11 -0
  40. package/dist/rooms/crypto.js +44 -0
  41. package/dist/rooms/crypto.js.map +1 -0
  42. package/dist/rooms/encrypted-records.d.ts +5 -0
  43. package/dist/rooms/encrypted-records.js +21 -0
  44. package/dist/rooms/encrypted-records.js.map +1 -0
  45. package/dist/rooms/markdown-snapshot.d.ts +23 -0
  46. package/dist/rooms/markdown-snapshot.js +126 -0
  47. package/dist/rooms/markdown-snapshot.js.map +1 -0
  48. package/dist/rooms/metadata.d.ts +32 -0
  49. package/dist/rooms/metadata.js +118 -0
  50. package/dist/rooms/metadata.js.map +1 -0
  51. package/dist/rooms/personas.d.ts +16 -0
  52. package/dist/rooms/personas.js +78 -0
  53. package/dist/rooms/personas.js.map +1 -0
  54. package/dist/rooms/project-state.d.ts +41 -0
  55. package/dist/rooms/project-state.js +249 -0
  56. package/dist/rooms/project-state.js.map +1 -0
  57. package/dist/rooms/proposals.d.ts +63 -0
  58. package/dist/rooms/proposals.js +254 -0
  59. package/dist/rooms/proposals.js.map +1 -0
  60. package/dist/rooms/replay.d.ts +13 -0
  61. package/dist/rooms/replay.js +19 -0
  62. package/dist/rooms/replay.js.map +1 -0
  63. package/dist/rooms/room-reference.d.ts +21 -0
  64. package/dist/rooms/room-reference.js +142 -0
  65. package/dist/rooms/room-reference.js.map +1 -0
  66. package/dist/rooms/timeline.d.ts +26 -0
  67. package/dist/rooms/timeline.js +68 -0
  68. package/dist/rooms/timeline.js.map +1 -0
  69. package/package.json +35 -0
  70. package/skills/fold/SKILL.md +81 -0
  71. package/skills/fold/agents/openai.yaml +4 -0
  72. package/skills/fold/references/cli.md +33 -0
  73. package/skills/fold/references/security.md +14 -0
  74. package/skills/fold/references/workflow.md +48 -0
@@ -0,0 +1,393 @@
1
+ import type { MarkdownDocumentSummary } from '../rooms/markdown-snapshot.js';
2
+ import type { ProjectSummary } from '../rooms/project-state.js';
3
+ import type { RoomComment } from '../rooms/comments.js';
4
+ import type { ProposalStatus, ProposalView } from '../rooms/proposals.js';
5
+ import type { TimelineEvent } from '../rooms/timeline.js';
6
+ export interface PublicRoomResult {
7
+ roomId: string;
8
+ alias: string | null;
9
+ appUrl: string;
10
+ syncUrl: string;
11
+ serverUrl: string;
12
+ serverRoomUrl: string;
13
+ url: string;
14
+ token: string;
15
+ hasClientKey: boolean;
16
+ }
17
+ export interface SafeRoomResult {
18
+ roomId: string;
19
+ alias: string | null;
20
+ appUrl: string;
21
+ syncUrl: string;
22
+ serverUrl: string;
23
+ serverRoomUrl: string;
24
+ hasClientKey: boolean;
25
+ }
26
+ export interface MetadataResult {
27
+ path: string;
28
+ saved: boolean;
29
+ }
30
+ export interface PublishResult {
31
+ schema: 'fold.publish.result.v1';
32
+ ok: true;
33
+ mode: 'server-backed';
34
+ room: PublicRoomResult;
35
+ metadata: MetadataResult;
36
+ document: MarkdownDocumentSummary;
37
+ project: ProjectSummary;
38
+ server: {
39
+ recordCount: number;
40
+ latestSeq: number;
41
+ };
42
+ }
43
+ export interface ExportResult {
44
+ schema: 'fold.export.result.v1';
45
+ ok: true;
46
+ mode: 'server-backed';
47
+ room: SafeRoomResult;
48
+ metadata: {
49
+ path: string;
50
+ found: boolean;
51
+ };
52
+ output: {
53
+ path: string | null;
54
+ written: boolean;
55
+ bytes: number;
56
+ sha256: string;
57
+ paths?: string[];
58
+ };
59
+ document: MarkdownDocumentSummary & {
60
+ markdown: string;
61
+ };
62
+ project: ProjectSummary;
63
+ server: {
64
+ recordCount: number;
65
+ latestSeq: number | null;
66
+ };
67
+ }
68
+ export interface StatusResult {
69
+ schema: 'fold.status.result.v1';
70
+ ok: true;
71
+ mode: 'server-backed';
72
+ room: SafeRoomResult;
73
+ metadata: {
74
+ path: string;
75
+ found: boolean;
76
+ sourcePath: string | null;
77
+ createdAt: string | null;
78
+ updatedAt: string | null;
79
+ };
80
+ document: MarkdownDocumentSummary | null;
81
+ project: ProjectSummary | null;
82
+ server: {
83
+ checked: true;
84
+ recordCount: number;
85
+ latestSeq: number | null;
86
+ };
87
+ }
88
+ export interface ContextResult {
89
+ schema: 'fold.context.result.v1';
90
+ ok: true;
91
+ mode: 'agent-context';
92
+ room: SafeRoomResult;
93
+ document: MarkdownDocumentSummary;
94
+ project: ProjectSummary;
95
+ files: Array<{
96
+ path: string;
97
+ markdown: string;
98
+ bytes: number;
99
+ sha256: string;
100
+ }>;
101
+ comments: {
102
+ unresolved: RoomComment[];
103
+ };
104
+ proposals: {
105
+ pending: ProposalListItem[];
106
+ accepted: ProposalListItem[];
107
+ rejected: ProposalListItem[];
108
+ };
109
+ server: {
110
+ recordCount: number;
111
+ latestSeq: number | null;
112
+ };
113
+ }
114
+ export interface ResumeResult {
115
+ schema: 'fold.resume.result.v1';
116
+ ok: true;
117
+ mode: 'agent-resume';
118
+ room: SafeRoomResult;
119
+ metadata: {
120
+ path: string;
121
+ alias: string;
122
+ imported: boolean;
123
+ };
124
+ skill: {
125
+ url: string;
126
+ install: {
127
+ required: false;
128
+ repeatAgents: string;
129
+ command: string;
130
+ updateCommand: string;
131
+ };
132
+ };
133
+ status: StatusResult;
134
+ export: ExportResult | null;
135
+ context: ContextResult;
136
+ requests: CommentsResult;
137
+ comments: CommentsResult;
138
+ proposals: ProposalsResult;
139
+ nextCommands: {
140
+ post: string | null;
141
+ propose: string | null;
142
+ requests: string;
143
+ comments: string;
144
+ proposals: string;
145
+ reply: string;
146
+ context: string;
147
+ };
148
+ }
149
+ export type SkillInstallScope = 'project' | 'global' | 'all';
150
+ export interface SkillInstallTargetResult {
151
+ path: string;
152
+ version: string;
153
+ host: 'agents' | 'codex';
154
+ autoLoadKnown: boolean;
155
+ reason?: 'same_version' | 'unmanaged_existing' | 'newer_managed' | 'modified_existing' | 'target_unavailable' | 'permission_denied';
156
+ }
157
+ export interface SkillInstallResult {
158
+ schema: 'fold.skill.result.v1';
159
+ ok: true;
160
+ package: {
161
+ name: 'fold-agent';
162
+ version: string;
163
+ };
164
+ scope: SkillInstallScope;
165
+ installed: SkillInstallTargetResult[];
166
+ updated: SkillInstallTargetResult[];
167
+ skipped: SkillInstallTargetResult[];
168
+ }
169
+ export interface BootstrapResult {
170
+ schema: 'fold.bootstrap.result.v1';
171
+ ok: true;
172
+ package: {
173
+ name: 'fold-agent';
174
+ version: string;
175
+ };
176
+ skill: SkillInstallResult | null;
177
+ resume: ResumeResult;
178
+ nextCommands: {
179
+ post: string | null;
180
+ propose: string | null;
181
+ requests: string;
182
+ comments: string;
183
+ proposals: string;
184
+ reply: string;
185
+ context: string;
186
+ };
187
+ }
188
+ export interface PostResult {
189
+ schema: 'fold.post.result.v1';
190
+ ok: true;
191
+ mode: 'accepted-file';
192
+ room: SafeRoomResult;
193
+ metadata: {
194
+ path: string;
195
+ found: boolean;
196
+ };
197
+ file: {
198
+ path: string;
199
+ } & MarkdownDocumentSummary;
200
+ project: ProjectSummary;
201
+ timeline: TimelineEvent;
202
+ server: {
203
+ recordCount: number;
204
+ latestSeq: number;
205
+ };
206
+ }
207
+ export interface PatchResult {
208
+ schema: 'fold.patch.result.v1';
209
+ ok: true;
210
+ mode: 'suggestion';
211
+ room: SafeRoomResult;
212
+ metadata: {
213
+ path: string;
214
+ found: boolean;
215
+ };
216
+ base: MarkdownDocumentSummary;
217
+ proposed: MarkdownDocumentSummary;
218
+ suggestion: {
219
+ id: string;
220
+ kind: 'whole-document-replacement';
221
+ baseSha256: string;
222
+ proposedSha256: string;
223
+ };
224
+ server: {
225
+ recordCount: number;
226
+ latestSeq: number;
227
+ };
228
+ }
229
+ export interface ProposeResult {
230
+ schema: 'fold.propose.result.v1';
231
+ ok: true;
232
+ mode: 'proposal';
233
+ room: SafeRoomResult;
234
+ metadata: {
235
+ path: string;
236
+ found: boolean;
237
+ };
238
+ base: MarkdownDocumentSummary;
239
+ proposed: MarkdownDocumentSummary;
240
+ project: {
241
+ base: ProjectSummary;
242
+ proposed: ProjectSummary;
243
+ };
244
+ proposal: ProposalSummaryResult;
245
+ timeline: TimelineEvent;
246
+ server: {
247
+ recordCount: number;
248
+ latestSeq: number;
249
+ };
250
+ }
251
+ export interface ProposalsResult {
252
+ schema: 'fold.proposals.result.v1';
253
+ ok: true;
254
+ mode: 'proposal-list';
255
+ room: SafeRoomResult;
256
+ proposals: ProposalListItem[];
257
+ server: {
258
+ recordCount: number;
259
+ latestSeq: number | null;
260
+ };
261
+ }
262
+ export interface ProposalListItem {
263
+ id: string;
264
+ title: string;
265
+ comment: string;
266
+ status: ProposalStatus;
267
+ createdAt: string;
268
+ updatedAt: string;
269
+ persona: ProposalView['persona'];
270
+ base: MarkdownDocumentSummary;
271
+ proposed: MarkdownDocumentSummary;
272
+ }
273
+ export interface ProposalSummaryResult {
274
+ id: string;
275
+ kind: ProposalView['kind'];
276
+ title: string;
277
+ comment: string;
278
+ status: ProposalStatus;
279
+ createdAt: string;
280
+ updatedAt: string;
281
+ persona: ProposalView['persona'];
282
+ base: MarkdownDocumentSummary;
283
+ proposed: MarkdownDocumentSummary;
284
+ path?: string;
285
+ project?: ProjectSummary;
286
+ }
287
+ export interface ShowProposalResult {
288
+ schema: 'fold.show-proposal.result.v1';
289
+ ok: true;
290
+ mode: 'proposal';
291
+ room: SafeRoomResult;
292
+ proposal: ProposalView;
293
+ timeline: TimelineEvent[];
294
+ server: {
295
+ recordCount: number;
296
+ latestSeq: number | null;
297
+ };
298
+ }
299
+ export interface DecideProposalResult {
300
+ schema: 'fold.accept.result.v1' | 'fold.reject.result.v1';
301
+ ok: true;
302
+ mode: 'proposal-decision';
303
+ room: SafeRoomResult;
304
+ proposal: ProposalSummaryResult;
305
+ status: 'accepted' | 'rejected';
306
+ document: MarkdownDocumentSummary | null;
307
+ project: ProjectSummary | null;
308
+ timeline: TimelineEvent;
309
+ server: {
310
+ recordCount: number;
311
+ latestSeq: number;
312
+ };
313
+ }
314
+ export interface RoomProfileResult {
315
+ schema: 'fold.room.add.result.v1' | 'fold.room.show.result.v1' | 'fold.room.set-url.result.v1';
316
+ ok: true;
317
+ room: PublicRoomResult;
318
+ metadata: {
319
+ path: string;
320
+ alias: string;
321
+ };
322
+ }
323
+ export interface RoomCreateResult {
324
+ schema: 'fold.room.create.result.v1';
325
+ ok: true;
326
+ mode: 'server-backed';
327
+ room: PublicRoomResult;
328
+ metadata: {
329
+ path: string;
330
+ alias: string;
331
+ saved: true;
332
+ };
333
+ document: MarkdownDocumentSummary;
334
+ project: ProjectSummary;
335
+ server: {
336
+ recordCount: number;
337
+ latestSeq: number;
338
+ };
339
+ }
340
+ export interface RoomListResult {
341
+ schema: 'fold.room.list.result.v1';
342
+ ok: true;
343
+ metadata: {
344
+ path: string;
345
+ };
346
+ rooms: SafeRoomResult[];
347
+ }
348
+ export interface RoomForgetResult {
349
+ schema: 'fold.room.forget.result.v1';
350
+ ok: true;
351
+ metadata: {
352
+ path: string;
353
+ alias: string;
354
+ };
355
+ }
356
+ export interface RoomInviteResult {
357
+ schema: 'fold.room.invite.result.v1';
358
+ ok: true;
359
+ audience: 'human' | 'agent';
360
+ room: PublicRoomResult | SafeRoomResult;
361
+ warnings: string[];
362
+ invite: {
363
+ text: string;
364
+ skillUrl: string | null;
365
+ };
366
+ }
367
+ export interface CommentsResult {
368
+ schema: 'fold.comments.result.v1';
369
+ ok: true;
370
+ mode: 'comment-list';
371
+ room: SafeRoomResult;
372
+ filters: {
373
+ type: 'all' | 'comment' | 'request';
374
+ open: boolean;
375
+ path: string | null;
376
+ };
377
+ comments: RoomComment[];
378
+ server: {
379
+ recordCount: number;
380
+ latestSeq: number | null;
381
+ };
382
+ }
383
+ export interface CommentResult {
384
+ schema: 'fold.comment.result.v1' | 'fold.reply.result.v1';
385
+ ok: true;
386
+ mode: 'comment';
387
+ room: SafeRoomResult;
388
+ comment: RoomComment;
389
+ server: {
390
+ recordCount: number;
391
+ latestSeq: number;
392
+ };
393
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../../../src/cli/results.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { SkillInstallResult, SkillInstallScope } from './results.js';
2
+ export interface InstallFoldSkillOptions {
3
+ cwd: string;
4
+ scope: SkillInstallScope;
5
+ mode: 'install' | 'status' | 'update';
6
+ }
7
+ export declare function installFoldSkill(options: InstallFoldSkillOptions): Promise<SkillInstallResult>;
@@ -0,0 +1,211 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { cp, mkdir, readdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { FOLD_AGENT_PACKAGE_NAME, FOLD_AGENT_VERSION, foldAgentBundledSkillPath } from './package-info.js';
5
+ const MANIFEST_FILE = '.fold-skill-manifest.json';
6
+ const VERSION_FILE = '.fold-skill-version';
7
+ export async function installFoldSkill(options) {
8
+ const sourcePath = foldAgentBundledSkillPath();
9
+ const targets = skillTargets(options.cwd, options.scope);
10
+ const sourceManifest = await buildManifest(sourcePath);
11
+ const installed = [];
12
+ const updated = [];
13
+ const skipped = [];
14
+ for (const target of targets) {
15
+ const outcome = await inspectTarget(target, sourceManifest);
16
+ if (outcome.action === 'skip') {
17
+ skipped.push({
18
+ path: target.path,
19
+ version: outcome.version,
20
+ host: target.host,
21
+ autoLoadKnown: target.autoLoadKnown,
22
+ reason: outcome.reason,
23
+ });
24
+ continue;
25
+ }
26
+ if (options.mode === 'status') {
27
+ skipped.push({
28
+ path: target.path,
29
+ version: outcome.version,
30
+ host: target.host,
31
+ autoLoadKnown: target.autoLoadKnown,
32
+ reason: outcome.action === 'install' ? 'target_unavailable' : 'same_version',
33
+ });
34
+ continue;
35
+ }
36
+ await replaceSkillDirectory(sourcePath, target.path, sourceManifest);
37
+ const targetResult = {
38
+ path: target.path,
39
+ version: FOLD_AGENT_VERSION,
40
+ host: target.host,
41
+ autoLoadKnown: target.autoLoadKnown,
42
+ };
43
+ if (outcome.action === 'install')
44
+ installed.push(targetResult);
45
+ else
46
+ updated.push(targetResult);
47
+ }
48
+ return {
49
+ schema: 'fold.skill.result.v1',
50
+ ok: true,
51
+ package: {
52
+ name: FOLD_AGENT_PACKAGE_NAME,
53
+ version: FOLD_AGENT_VERSION,
54
+ },
55
+ scope: options.scope,
56
+ installed,
57
+ updated,
58
+ skipped,
59
+ };
60
+ }
61
+ function skillTargets(cwd, scope) {
62
+ const home = process.env.HOME;
63
+ const targets = [];
64
+ if (scope === 'project' || scope === 'all') {
65
+ targets.push({
66
+ path: resolve(cwd, '.agents/skills/fold'),
67
+ host: 'agents',
68
+ autoLoadKnown: false,
69
+ });
70
+ }
71
+ if ((scope === 'global' || scope === 'all') && home) {
72
+ targets.push({
73
+ path: resolve(home, '.agents/skills/fold'),
74
+ host: 'agents',
75
+ autoLoadKnown: false,
76
+ });
77
+ targets.push({
78
+ path: resolve(home, '.codex/skills/fold'),
79
+ host: 'codex',
80
+ autoLoadKnown: true,
81
+ });
82
+ }
83
+ return targets;
84
+ }
85
+ async function inspectTarget(target, sourceManifest) {
86
+ try {
87
+ await stat(target.path);
88
+ }
89
+ catch (error) {
90
+ if (isNodeError(error, 'ENOENT'))
91
+ return { action: 'install', version: FOLD_AGENT_VERSION };
92
+ if (isNodeError(error, 'EACCES') || isNodeError(error, 'EPERM')) {
93
+ return { action: 'skip', version: FOLD_AGENT_VERSION, reason: 'permission_denied' };
94
+ }
95
+ return { action: 'skip', version: FOLD_AGENT_VERSION, reason: 'target_unavailable' };
96
+ }
97
+ const manifest = await readManagedManifest(target.path);
98
+ if (!manifest) {
99
+ return { action: 'skip', version: 'unknown', reason: 'unmanaged_existing' };
100
+ }
101
+ if (compareSemver(manifest.version, FOLD_AGENT_VERSION) > 0) {
102
+ return { action: 'skip', version: manifest.version, reason: 'newer_managed' };
103
+ }
104
+ const currentManifest = await buildManifest(target.path, { ignoreManagedFiles: true });
105
+ if (manifest.contentHash !== currentManifest.contentHash) {
106
+ return { action: 'skip', version: manifest.version, reason: 'modified_existing' };
107
+ }
108
+ if (manifest.version === FOLD_AGENT_VERSION && manifest.contentHash === sourceManifest.contentHash) {
109
+ return { action: 'skip', version: manifest.version, reason: 'same_version' };
110
+ }
111
+ return { action: 'update', version: manifest.version };
112
+ }
113
+ async function replaceSkillDirectory(sourcePath, targetPath, manifest) {
114
+ await mkdir(dirname(targetPath), { recursive: true });
115
+ const parent = dirname(targetPath);
116
+ const unique = `${process.pid}-${Date.now()}-${basename(targetPath)}`;
117
+ const tempPath = join(parent, `.fold-skill-${unique}.tmp`);
118
+ const backupPath = join(parent, `.fold-skill-${unique}.backup`);
119
+ await rm(tempPath, { force: true, recursive: true });
120
+ await rm(backupPath, { force: true, recursive: true });
121
+ await cp(sourcePath, tempPath, { recursive: true });
122
+ await writeFile(join(tempPath, VERSION_FILE), `${FOLD_AGENT_VERSION}\n`, 'utf8');
123
+ await writeFile(join(tempPath, MANIFEST_FILE), `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
124
+ const hadTarget = await exists(targetPath);
125
+ try {
126
+ if (hadTarget)
127
+ await rename(targetPath, backupPath);
128
+ await rename(tempPath, targetPath);
129
+ await rm(backupPath, { force: true, recursive: true });
130
+ }
131
+ catch (error) {
132
+ await rm(tempPath, { force: true, recursive: true });
133
+ if (hadTarget && await exists(backupPath) && !(await exists(targetPath))) {
134
+ await rename(backupPath, targetPath);
135
+ }
136
+ throw error;
137
+ }
138
+ }
139
+ async function buildManifest(root, options = {}) {
140
+ const files = await listFiles(root);
141
+ const hashedFiles = [];
142
+ for (const file of files) {
143
+ if (options.ignoreManagedFiles && (file === MANIFEST_FILE || file === VERSION_FILE))
144
+ continue;
145
+ const bytes = await readFile(join(root, file));
146
+ hashedFiles.push({
147
+ path: file,
148
+ sha256: createHash('sha256').update(bytes).digest('hex'),
149
+ });
150
+ }
151
+ hashedFiles.sort((a, b) => a.path.localeCompare(b.path));
152
+ const contentHash = createHash('sha256').update(JSON.stringify(hashedFiles)).digest('hex');
153
+ return {
154
+ package: 'fold-agent',
155
+ version: FOLD_AGENT_VERSION,
156
+ contentHash,
157
+ files: hashedFiles,
158
+ };
159
+ }
160
+ async function listFiles(root, prefix = '') {
161
+ const entries = await readdir(join(root, prefix), { withFileTypes: true });
162
+ const files = [];
163
+ for (const entry of entries) {
164
+ const relative = prefix ? `${prefix}/${entry.name}` : entry.name;
165
+ if (entry.isDirectory()) {
166
+ files.push(...await listFiles(root, relative));
167
+ }
168
+ else if (entry.isFile()) {
169
+ files.push(relative);
170
+ }
171
+ }
172
+ return files;
173
+ }
174
+ async function readManagedManifest(targetPath) {
175
+ try {
176
+ const raw = await readFile(join(targetPath, MANIFEST_FILE), 'utf8');
177
+ const parsed = JSON.parse(raw);
178
+ if (parsed.package !== 'fold-agent' || typeof parsed.version !== 'string' || typeof parsed.contentHash !== 'string') {
179
+ return null;
180
+ }
181
+ return parsed;
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ }
187
+ function isNodeError(error, code) {
188
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === code;
189
+ }
190
+ async function exists(path) {
191
+ try {
192
+ await stat(path);
193
+ return true;
194
+ }
195
+ catch (error) {
196
+ if (isNodeError(error, 'ENOENT'))
197
+ return false;
198
+ throw error;
199
+ }
200
+ }
201
+ function compareSemver(left, right) {
202
+ const leftParts = left.split('.').map((part) => Number.parseInt(part, 10) || 0);
203
+ const rightParts = right.split('.').map((part) => Number.parseInt(part, 10) || 0);
204
+ for (let index = 0; index < Math.max(leftParts.length, rightParts.length); index += 1) {
205
+ const delta = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);
206
+ if (delta !== 0)
207
+ return delta;
208
+ }
209
+ return 0;
210
+ }
211
+ //# sourceMappingURL=skill-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-install.js","sourceRoot":"","sources":["../../../../src/cli/skill-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface PublicOriginConfig {
2
+ appUrl: string;
3
+ syncUrl: string;
4
+ source: 'explicit' | 'fold-public-url' | 'split-environment' | 'provider' | 'default';
5
+ }
6
+ export interface PublicOriginOptions {
7
+ appUrl?: string;
8
+ syncUrl?: string;
9
+ serverUrl?: string;
10
+ defaultUrl: string;
11
+ env?: Record<string, string | undefined>;
12
+ }
13
+ export declare function resolvePublicOrigin(options: PublicOriginOptions): PublicOriginConfig;
14
+ export declare function publicOriginFromProviderEnv(env?: Record<string, string | undefined>): string | undefined;
15
+ export declare function hostedPortFromEnv(env?: Record<string, string | undefined>, fallback?: number): number;