skill-flow 1.0.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 (87) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +108 -0
  3. package/README.zh.md +108 -0
  4. package/dist/adapters/channel-adapters.d.ts +8 -0
  5. package/dist/adapters/channel-adapters.js +56 -0
  6. package/dist/adapters/channel-adapters.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +118 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/domain/types.d.ts +133 -0
  11. package/dist/domain/types.js +2 -0
  12. package/dist/domain/types.js.map +1 -0
  13. package/dist/services/deployment-applier.d.ts +6 -0
  14. package/dist/services/deployment-applier.js +54 -0
  15. package/dist/services/deployment-applier.js.map +1 -0
  16. package/dist/services/deployment-planner.d.ts +11 -0
  17. package/dist/services/deployment-planner.js +179 -0
  18. package/dist/services/deployment-planner.js.map +1 -0
  19. package/dist/services/doctor-service.d.ts +5 -0
  20. package/dist/services/doctor-service.js +129 -0
  21. package/dist/services/doctor-service.js.map +1 -0
  22. package/dist/services/inventory-service.d.ts +14 -0
  23. package/dist/services/inventory-service.js +186 -0
  24. package/dist/services/inventory-service.js.map +1 -0
  25. package/dist/services/skill-flow.d.ts +60 -0
  26. package/dist/services/skill-flow.js +260 -0
  27. package/dist/services/skill-flow.js.map +1 -0
  28. package/dist/services/source-service.d.ts +35 -0
  29. package/dist/services/source-service.js +270 -0
  30. package/dist/services/source-service.js.map +1 -0
  31. package/dist/services/workflow-service.d.ts +5 -0
  32. package/dist/services/workflow-service.js +32 -0
  33. package/dist/services/workflow-service.js.map +1 -0
  34. package/dist/state/store.d.ts +14 -0
  35. package/dist/state/store.js +59 -0
  36. package/dist/state/store.js.map +1 -0
  37. package/dist/tests/skill-flow.test.d.ts +1 -0
  38. package/dist/tests/skill-flow.test.js +926 -0
  39. package/dist/tests/skill-flow.test.js.map +1 -0
  40. package/dist/tui/config-app.d.ts +47 -0
  41. package/dist/tui/config-app.js +732 -0
  42. package/dist/tui/config-app.js.map +1 -0
  43. package/dist/tui/selection-state.d.ts +8 -0
  44. package/dist/tui/selection-state.js +32 -0
  45. package/dist/tui/selection-state.js.map +1 -0
  46. package/dist/utils/constants.d.ts +19 -0
  47. package/dist/utils/constants.js +164 -0
  48. package/dist/utils/constants.js.map +1 -0
  49. package/dist/utils/format.d.ts +6 -0
  50. package/dist/utils/format.js +45 -0
  51. package/dist/utils/format.js.map +1 -0
  52. package/dist/utils/fs.d.ts +10 -0
  53. package/dist/utils/fs.js +89 -0
  54. package/dist/utils/fs.js.map +1 -0
  55. package/dist/utils/git.d.ts +3 -0
  56. package/dist/utils/git.js +12 -0
  57. package/dist/utils/git.js.map +1 -0
  58. package/dist/utils/result.d.ts +4 -0
  59. package/dist/utils/result.js +15 -0
  60. package/dist/utils/result.js.map +1 -0
  61. package/dist/utils/source-id.d.ts +2 -0
  62. package/dist/utils/source-id.js +16 -0
  63. package/dist/utils/source-id.js.map +1 -0
  64. package/img/img-1.jpg +0 -0
  65. package/package.json +39 -0
  66. package/src/adapters/channel-adapters.ts +75 -0
  67. package/src/cli.tsx +147 -0
  68. package/src/domain/types.ts +175 -0
  69. package/src/services/deployment-applier.ts +81 -0
  70. package/src/services/deployment-planner.ts +259 -0
  71. package/src/services/doctor-service.ts +156 -0
  72. package/src/services/inventory-service.ts +251 -0
  73. package/src/services/skill-flow.ts +381 -0
  74. package/src/services/source-service.ts +427 -0
  75. package/src/services/workflow-service.ts +56 -0
  76. package/src/state/store.ts +68 -0
  77. package/src/tests/skill-flow.test.ts +1184 -0
  78. package/src/tui/config-app.tsx +1094 -0
  79. package/src/tui/selection-state.ts +45 -0
  80. package/src/utils/constants.ts +201 -0
  81. package/src/utils/format.ts +59 -0
  82. package/src/utils/fs.ts +102 -0
  83. package/src/utils/git.ts +16 -0
  84. package/src/utils/result.ts +23 -0
  85. package/src/utils/source-id.ts +19 -0
  86. package/tsconfig.json +22 -0
  87. package/vitest.config.ts +8 -0
@@ -0,0 +1,270 @@
1
+ import path from "node:path";
2
+ import { ensureDir, pathExists, removePath } from "../utils/fs.js";
3
+ import { git } from "../utils/git.js";
4
+ import { fail, ok } from "../utils/result.js";
5
+ import { deriveDisplayName, deriveSourceId } from "../utils/source-id.js";
6
+ export class SourceService {
7
+ store;
8
+ inventoryService;
9
+ constructor(store, inventoryService) {
10
+ this.store = store;
11
+ this.inventoryService = inventoryService;
12
+ }
13
+ async addSource(locator) {
14
+ await this.store.init();
15
+ const manifest = await this.store.readManifest();
16
+ const lockFile = await this.store.readLock();
17
+ const normalizedLocator = await this.normalizeLocator(locator);
18
+ const displayName = deriveDisplayName(locator);
19
+ const sourceId = deriveSourceId(locator);
20
+ if (manifest.sources.some((source) => source.id === sourceId)) {
21
+ return fail({
22
+ code: "SOURCE_EXISTS",
23
+ message: `Workflow group '${sourceId}' is already registered.`,
24
+ });
25
+ }
26
+ const checkoutPath = path.join(this.store.sourceRoot, sourceId);
27
+ await ensureDir(this.store.sourceRoot);
28
+ try {
29
+ await git(["clone", "--depth", "1", normalizedLocator, checkoutPath]);
30
+ }
31
+ catch (error) {
32
+ await removePath(checkoutPath);
33
+ return fail({
34
+ code: "GIT_CLONE_FAILED",
35
+ message: `Unable to fetch source '${locator}': ${String(error)}`,
36
+ });
37
+ }
38
+ const snapshot = await this.buildSnapshot(sourceId, locator, displayName, checkoutPath);
39
+ if (!snapshot.ok) {
40
+ await removePath(checkoutPath);
41
+ return fail(snapshot.errors, snapshot.warnings);
42
+ }
43
+ manifest.sources.push(snapshot.data.manifest);
44
+ manifest.bindings[sourceId] = { targets: {} };
45
+ lockFile.sources.push(snapshot.data.lock);
46
+ lockFile.leafInventory.push(...snapshot.data.leafs);
47
+ await this.store.writeManifest(manifest);
48
+ await this.store.writeLock(lockFile);
49
+ return ok({
50
+ manifest: snapshot.data.manifest,
51
+ lock: snapshot.data.lock,
52
+ leafCount: snapshot.data.leafs.length,
53
+ invalidLeafCount: snapshot.data.lock.invalidLeafs.length,
54
+ }, snapshot.warnings);
55
+ }
56
+ async updateSources(sourceIds) {
57
+ await this.store.init();
58
+ const manifest = await this.store.readManifest();
59
+ const lockFile = await this.store.readLock();
60
+ const selectedIds = sourceIds?.length
61
+ ? sourceIds
62
+ : manifest.sources.map((source) => source.id);
63
+ const updated = [];
64
+ for (const sourceId of selectedIds) {
65
+ const source = manifest.sources.find((item) => item.id === sourceId);
66
+ const currentLock = lockFile.sources.find((item) => item.id === sourceId);
67
+ if (!source || !currentLock) {
68
+ return fail({
69
+ code: "SOURCE_NOT_FOUND",
70
+ message: `Workflow group '${sourceId}' is not registered.`,
71
+ });
72
+ }
73
+ try {
74
+ await git(["pull", "--ff-only"], { cwd: currentLock.checkoutPath });
75
+ }
76
+ catch (error) {
77
+ return fail({
78
+ code: "GIT_UPDATE_FAILED",
79
+ message: `Unable to update '${sourceId}': ${String(error)}`,
80
+ });
81
+ }
82
+ const latestCommitSha = await git(["rev-parse", "HEAD"], {
83
+ cwd: currentLock.checkoutPath,
84
+ });
85
+ if (latestCommitSha === currentLock.commitSha) {
86
+ updated.push({
87
+ sourceId,
88
+ changed: false,
89
+ addedLeafIds: [],
90
+ removedLeafIds: [],
91
+ invalidatedLeafIds: [],
92
+ });
93
+ continue;
94
+ }
95
+ const snapshot = await this.buildSnapshot(source.id, source.locator, source.displayName, currentLock.checkoutPath, { allowEmptyLeafs: true });
96
+ if (!snapshot.ok) {
97
+ return fail(snapshot.errors, snapshot.warnings);
98
+ }
99
+ const previousLeafs = lockFile.leafInventory.filter((leaf) => leaf.sourceId === sourceId);
100
+ const previousLeafIds = new Set(previousLeafs.map((leaf) => leaf.id));
101
+ const nextLeafIds = new Set(snapshot.data.leafs.map((leaf) => leaf.id));
102
+ const previousInvalidPaths = new Set(currentLock.invalidLeafs.map((leaf) => leaf.path));
103
+ const nextInvalidPaths = new Set(snapshot.data.lock.invalidLeafs.map((leaf) => leaf.path));
104
+ lockFile.sources = lockFile.sources.map((item) => item.id === sourceId ? snapshot.data.lock : item);
105
+ lockFile.leafInventory = [
106
+ ...lockFile.leafInventory.filter((leaf) => leaf.sourceId !== sourceId),
107
+ ...snapshot.data.leafs,
108
+ ];
109
+ updated.push({
110
+ sourceId,
111
+ changed: true,
112
+ addedLeafIds: [...nextLeafIds].filter((id) => !previousLeafIds.has(id)),
113
+ removedLeafIds: [...previousLeafIds].filter((id) => !nextLeafIds.has(id)),
114
+ invalidatedLeafIds: [...nextInvalidPaths].filter((value) => !previousInvalidPaths.has(value)),
115
+ });
116
+ }
117
+ await this.store.writeLock(lockFile);
118
+ return ok({ updated });
119
+ }
120
+ async removeSource(sourceIds) {
121
+ await this.store.init();
122
+ const manifest = await this.store.readManifest();
123
+ const lockFile = await this.store.readLock();
124
+ const removed = [];
125
+ for (const sourceId of sourceIds) {
126
+ const currentSource = manifest.sources.find((source) => source.id === sourceId);
127
+ const currentLock = lockFile.sources.find((source) => source.id === sourceId);
128
+ if (!currentSource || !currentLock) {
129
+ return fail({
130
+ code: "SOURCE_NOT_FOUND",
131
+ message: `Workflow group '${sourceId}' is not registered.`,
132
+ });
133
+ }
134
+ manifest.sources = manifest.sources.filter((source) => source.id !== sourceId);
135
+ delete manifest.bindings[sourceId];
136
+ lockFile.sources = lockFile.sources.filter((source) => source.id !== sourceId);
137
+ lockFile.leafInventory = lockFile.leafInventory.filter((leaf) => leaf.sourceId !== sourceId);
138
+ lockFile.deployments = lockFile.deployments.filter((deployment) => deployment.sourceId !== sourceId);
139
+ if (currentLock && (await pathExists(currentLock.checkoutPath))) {
140
+ await removePath(currentLock.checkoutPath);
141
+ }
142
+ removed.push(sourceId);
143
+ }
144
+ await this.store.writeManifest(manifest);
145
+ await this.store.writeLock(lockFile);
146
+ return ok({ removed });
147
+ }
148
+ async reconcileInventory(sourceIds, options = {}) {
149
+ await this.store.init();
150
+ const manifest = await this.store.readManifest();
151
+ const lockFile = await this.store.readLock();
152
+ const selectedIds = sourceIds?.length
153
+ ? sourceIds
154
+ : manifest.sources.map((source) => source.id);
155
+ const updatedSourceIds = [];
156
+ for (const sourceId of selectedIds) {
157
+ const source = manifest.sources.find((item) => item.id === sourceId);
158
+ const currentLock = lockFile.sources.find((item) => item.id === sourceId);
159
+ if (!source || !currentLock) {
160
+ continue;
161
+ }
162
+ const sourceLeafs = lockFile.leafInventory.filter((leaf) => leaf.sourceId === sourceId);
163
+ const sourceDeployments = lockFile.deployments.filter((deployment) => deployment.sourceId === sourceId);
164
+ if (!options.force &&
165
+ !this.needsInventoryReconcile(sourceId, sourceLeafs, sourceDeployments)) {
166
+ continue;
167
+ }
168
+ const snapshot = await this.buildSnapshot(source.id, source.locator, source.displayName, currentLock.checkoutPath, { allowEmptyLeafs: true });
169
+ if (!snapshot.ok) {
170
+ return fail(snapshot.errors, snapshot.warnings);
171
+ }
172
+ const leafIdsChanged = JSON.stringify(currentLock.leafIds) !==
173
+ JSON.stringify(snapshot.data.lock.leafIds);
174
+ const invalidLeafsChanged = JSON.stringify(currentLock.invalidLeafs) !==
175
+ JSON.stringify(snapshot.data.lock.invalidLeafs);
176
+ const leafInventoryChanged = JSON.stringify(sourceLeafs) !== JSON.stringify(snapshot.data.leafs);
177
+ if (!options.force &&
178
+ !leafIdsChanged &&
179
+ !invalidLeafsChanged &&
180
+ !leafInventoryChanged) {
181
+ continue;
182
+ }
183
+ lockFile.sources = lockFile.sources.map((item) => item.id === sourceId ? snapshot.data.lock : item);
184
+ lockFile.leafInventory = [
185
+ ...lockFile.leafInventory.filter((leaf) => leaf.sourceId !== sourceId),
186
+ ...snapshot.data.leafs,
187
+ ];
188
+ const nextLeafIds = new Set(snapshot.data.leafs.map((leaf) => leaf.id));
189
+ const binding = manifest.bindings[sourceId];
190
+ if (binding) {
191
+ for (const targetBinding of Object.values(binding.targets)) {
192
+ if (!targetBinding) {
193
+ continue;
194
+ }
195
+ targetBinding.leafIds = targetBinding.leafIds.filter((leafId) => nextLeafIds.has(leafId));
196
+ }
197
+ }
198
+ updatedSourceIds.push(sourceId);
199
+ }
200
+ if (updatedSourceIds.length > 0) {
201
+ await this.store.writeManifest(manifest);
202
+ await this.store.writeLock(lockFile);
203
+ }
204
+ return ok({ updatedSourceIds });
205
+ }
206
+ needsInventoryReconcile(sourceId, sourceLeafs, sourceDeployments) {
207
+ const hasGeneratedLeafs = sourceLeafs.some((leaf) => /^(?:\.agents|\.claude|\.codex|\.opencode|\.openclaw)(?:\/|$)/.test(leaf.relativePath));
208
+ const hasLegacyTargetNames = sourceDeployments.some((deployment) => path.basename(deployment.targetPath).startsWith(`${sourceId}--`));
209
+ return hasGeneratedLeafs || hasLegacyTargetNames;
210
+ }
211
+ async buildSnapshot(sourceId, locator, displayName, checkoutPath, options = {}) {
212
+ const commitSha = await git(["rev-parse", "HEAD"], { cwd: checkoutPath });
213
+ const scanned = await this.inventoryService.scanSource(sourceId, checkoutPath);
214
+ const metadataWarnings = scanned.leafs.flatMap((leaf) => leaf.metadataWarnings.map((message) => ({
215
+ code: "SKILL_METADATA_WARNING",
216
+ message: `${leaf.relativePath}: ${message}`,
217
+ })));
218
+ if (scanned.leafs.length === 0 && !options.allowEmptyLeafs) {
219
+ return fail({
220
+ code: "NO_VALID_LEAFS",
221
+ message: `Source '${displayName}' has no valid skills.`,
222
+ }, scanned.invalidLeafs.map((leaf) => ({
223
+ code: "INVALID_LEAF",
224
+ message: `${leaf.path}: ${leaf.reason}`,
225
+ })));
226
+ }
227
+ return ok({
228
+ manifest: {
229
+ id: sourceId,
230
+ locator,
231
+ kind: "git",
232
+ displayName,
233
+ addedAt: new Date().toISOString(),
234
+ },
235
+ lock: {
236
+ id: sourceId,
237
+ locator,
238
+ kind: "git",
239
+ displayName,
240
+ checkoutPath,
241
+ commitSha,
242
+ updatedAt: new Date().toISOString(),
243
+ leafIds: scanned.leafs.map((leaf) => leaf.id),
244
+ invalidLeafs: scanned.invalidLeafs,
245
+ },
246
+ leafs: scanned.leafs,
247
+ }, [
248
+ ...metadataWarnings,
249
+ ...scanned.invalidLeafs.map((leaf) => ({
250
+ code: "INVALID_LEAF",
251
+ message: `${leaf.path}: ${leaf.reason}`,
252
+ })),
253
+ ]);
254
+ }
255
+ async normalizeLocator(locator) {
256
+ const trimmed = locator.trim();
257
+ if (/^[^/\s]+\/[^/\s]+$/.test(trimmed)) {
258
+ return `https://github.com/${trimmed}.git`;
259
+ }
260
+ if (trimmed.startsWith("git@") || trimmed.startsWith("http")) {
261
+ return trimmed;
262
+ }
263
+ const resolvedPath = path.resolve(trimmed);
264
+ if (await pathExists(resolvedPath)) {
265
+ return resolvedPath;
266
+ }
267
+ return trimmed;
268
+ }
269
+ }
270
+ //# sourceMappingURL=source-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-service.js","sourceRoot":"","sources":["../../src/services/source-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { LockFile, Manifest, WorkflowSummary } from "../domain/types.js";
2
+ export declare class WorkflowService {
3
+ getSummaries(manifest: Manifest, lockFile: LockFile): WorkflowSummary[];
4
+ private resolveHealth;
5
+ }
@@ -0,0 +1,32 @@
1
+ export class WorkflowService {
2
+ getSummaries(manifest, lockFile) {
3
+ return manifest.sources.map((source) => {
4
+ const lock = lockFile.sources.find((item) => item.id === source.id);
5
+ const leafs = lockFile.leafInventory.filter((leaf) => leaf.sourceId === source.id);
6
+ const bindings = manifest.bindings[source.id] ?? { targets: {} };
7
+ const activeTargetCount = Object.values(bindings.targets).filter((binding) => binding?.enabled).length;
8
+ const warningCount = leafs.reduce((count, leaf) => count + leaf.metadataWarnings.length, 0);
9
+ return {
10
+ source,
11
+ lock,
12
+ leafs,
13
+ bindings,
14
+ activeTargetCount,
15
+ health: this.resolveHealth(lock ? lock.invalidLeafs.length : 0, warningCount, activeTargetCount, lock),
16
+ };
17
+ });
18
+ }
19
+ resolveHealth(invalidLeafCount, warningCount, activeTargetCount, lock) {
20
+ if (!lock) {
21
+ return "BLOCKED";
22
+ }
23
+ if (invalidLeafCount > 0 || warningCount > 0) {
24
+ return "PARTIAL";
25
+ }
26
+ if (activeTargetCount === 0) {
27
+ return "INACTIVE";
28
+ }
29
+ return "ACTIVE";
30
+ }
31
+ }
32
+ //# sourceMappingURL=workflow-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-service.js","sourceRoot":"","sources":["../../src/services/workflow-service.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,eAAe;IAC1B,YAAY,CAAC,QAAkB,EAAE,QAAkB;QACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;YACnF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAK,EAAE,OAAO,EAAE,EAAE,EAA2B,CAAC;YAC3F,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAC9D,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,OAAO,CAC9B,CAAC,MAAM,CAAC;YACT,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAC/B,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EACrD,CAAC,CACF,CAAC;YAEF,OAAO;gBACL,MAAM;gBACN,IAAI;gBACJ,KAAK;gBACL,QAAQ;gBACR,iBAAiB;gBACjB,MAAM,EAAE,IAAI,CAAC,aAAa,CACxB,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EACnC,YAAY,EACZ,iBAAiB,EACjB,IAAI,CACL;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CACnB,gBAAwB,EACxB,YAAoB,EACpB,iBAAyB,EACzB,IAAkC;QAElC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,gBAAgB,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YAC7C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { LockFile, Manifest } from "../domain/types.js";
2
+ export declare class StateStore {
3
+ private readonly stateRoot;
4
+ constructor(stateRoot?: string);
5
+ get rootPath(): string;
6
+ get sourceRoot(): string;
7
+ get manifestPath(): string;
8
+ get lockPath(): string;
9
+ init(): Promise<void>;
10
+ readManifest(): Promise<Manifest>;
11
+ writeManifest(manifest: Manifest): Promise<void>;
12
+ readLock(): Promise<LockFile>;
13
+ writeLock(lockFile: LockFile): Promise<void>;
14
+ }
@@ -0,0 +1,59 @@
1
+ import path from "node:path";
2
+ import { SCHEMA_VERSION, getStateRoot } from "../utils/constants.js";
3
+ import { ensureDir, readJsonFile, writeJsonFile } from "../utils/fs.js";
4
+ export class StateStore {
5
+ stateRoot;
6
+ constructor(stateRoot = getStateRoot()) {
7
+ this.stateRoot = stateRoot;
8
+ }
9
+ get rootPath() {
10
+ return this.stateRoot;
11
+ }
12
+ get sourceRoot() {
13
+ return path.join(this.stateRoot, "source", "git");
14
+ }
15
+ get manifestPath() {
16
+ return path.join(this.stateRoot, "manifest.json");
17
+ }
18
+ get lockPath() {
19
+ return path.join(this.stateRoot, "lock.json");
20
+ }
21
+ async init() {
22
+ await ensureDir(this.sourceRoot);
23
+ await this.writeManifest(await this.readManifest());
24
+ await this.writeLock(await this.readLock());
25
+ }
26
+ async readManifest() {
27
+ return readJsonFile(this.manifestPath, {
28
+ schemaVersion: SCHEMA_VERSION,
29
+ sources: [],
30
+ bindings: {},
31
+ });
32
+ }
33
+ async writeManifest(manifest) {
34
+ await writeJsonFile(this.manifestPath, manifest);
35
+ }
36
+ async readLock() {
37
+ const lockFile = await readJsonFile(this.lockPath, {
38
+ schemaVersion: SCHEMA_VERSION,
39
+ sources: [],
40
+ leafInventory: [],
41
+ deployments: [],
42
+ });
43
+ return {
44
+ ...lockFile,
45
+ leafInventory: lockFile.leafInventory.map((leaf) => ({
46
+ ...leaf,
47
+ linkName: leaf.linkName ??
48
+ (leaf.relativePath === "."
49
+ ? leaf.name
50
+ : path.basename(leaf.relativePath) || leaf.name),
51
+ metadataWarnings: leaf.metadataWarnings ?? [],
52
+ })),
53
+ };
54
+ }
55
+ async writeLock(lockFile) {
56
+ await writeJsonFile(this.lockPath, lockFile);
57
+ }
58
+ }
59
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAExE,MAAM,OAAO,UAAU;IACQ;IAA7B,YAA6B,YAAY,YAAY,EAAE;QAA1B,cAAS,GAAT,SAAS,CAAiB;IAAG,CAAC;IAE3D,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,YAAY,CAAW,IAAI,CAAC,YAAY,EAAE;YAC/C,aAAa,EAAE,cAAc;YAC7B,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;SACb,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAkB;QACpC,MAAM,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAW,IAAI,CAAC,QAAQ,EAAE;YAC3D,aAAa,EAAE,cAAc;YAC7B,OAAO,EAAE,EAAE;YACX,aAAa,EAAE,EAAE;YACjB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,QAAQ;YACX,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACnD,GAAG,IAAI;gBACP,QAAQ,EACN,IAAI,CAAC,QAAQ;oBACb,CAAC,IAAI,CAAC,YAAY,KAAK,GAAG;wBACxB,CAAC,CAAC,IAAI,CAAC,IAAI;wBACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;gBACpD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;aAC9C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAkB;QAChC,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};