skill-flow 1.0.7 → 1.3.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 (143) hide show
  1. package/README.md +208 -131
  2. package/README.zh.md +169 -131
  3. package/dist/bridge-command.d.ts +9 -0
  4. package/dist/bridge-command.js +385 -0
  5. package/dist/bridge-command.js.map +1 -0
  6. package/dist/cli.js +70 -10
  7. package/dist/cli.js.map +1 -1
  8. package/package.json +11 -2
  9. package/dist/adapters/channel-adapters.d.ts +0 -8
  10. package/dist/adapters/channel-adapters.js +0 -64
  11. package/dist/adapters/channel-adapters.js.map +0 -1
  12. package/dist/domain/types.d.ts +0 -231
  13. package/dist/domain/types.js +0 -2
  14. package/dist/domain/types.js.map +0 -1
  15. package/dist/services/config-coordinator.d.ts +0 -38
  16. package/dist/services/config-coordinator.js +0 -83
  17. package/dist/services/config-coordinator.js.map +0 -1
  18. package/dist/services/deployment-applier.d.ts +0 -6
  19. package/dist/services/deployment-applier.js +0 -60
  20. package/dist/services/deployment-applier.js.map +0 -1
  21. package/dist/services/deployment-planner.d.ts +0 -16
  22. package/dist/services/deployment-planner.js +0 -353
  23. package/dist/services/deployment-planner.js.map +0 -1
  24. package/dist/services/doctor-service.d.ts +0 -7
  25. package/dist/services/doctor-service.js +0 -204
  26. package/dist/services/doctor-service.js.map +0 -1
  27. package/dist/services/inventory-service.d.ts +0 -17
  28. package/dist/services/inventory-service.js +0 -216
  29. package/dist/services/inventory-service.js.map +0 -1
  30. package/dist/services/skill-flow.d.ts +0 -133
  31. package/dist/services/skill-flow.js +0 -1180
  32. package/dist/services/skill-flow.js.map +0 -1
  33. package/dist/services/source-service.d.ts +0 -57
  34. package/dist/services/source-service.js +0 -778
  35. package/dist/services/source-service.js.map +0 -1
  36. package/dist/services/workflow-service.d.ts +0 -5
  37. package/dist/services/workflow-service.js +0 -45
  38. package/dist/services/workflow-service.js.map +0 -1
  39. package/dist/services/workspace-bootstrap-service.d.ts +0 -25
  40. package/dist/services/workspace-bootstrap-service.js +0 -140
  41. package/dist/services/workspace-bootstrap-service.js.map +0 -1
  42. package/dist/state/store.d.ts +0 -35
  43. package/dist/state/store.js +0 -151
  44. package/dist/state/store.js.map +0 -1
  45. package/dist/tests/add-flow-model.test.d.ts +0 -1
  46. package/dist/tests/add-flow-model.test.js +0 -108
  47. package/dist/tests/add-flow-model.test.js.map +0 -1
  48. package/dist/tests/add-flow-ui.test.d.ts +0 -1
  49. package/dist/tests/add-flow-ui.test.js +0 -16
  50. package/dist/tests/add-flow-ui.test.js.map +0 -1
  51. package/dist/tests/add-prepare-flow.test.d.ts +0 -1
  52. package/dist/tests/add-prepare-flow.test.js +0 -166
  53. package/dist/tests/add-prepare-flow.test.js.map +0 -1
  54. package/dist/tests/add-selection-and-find-command.test.d.ts +0 -1
  55. package/dist/tests/add-selection-and-find-command.test.js +0 -89
  56. package/dist/tests/add-selection-and-find-command.test.js.map +0 -1
  57. package/dist/tests/clawhub.test.d.ts +0 -1
  58. package/dist/tests/clawhub.test.js +0 -63
  59. package/dist/tests/clawhub.test.js.map +0 -1
  60. package/dist/tests/cli-utils.test.d.ts +0 -1
  61. package/dist/tests/cli-utils.test.js +0 -15
  62. package/dist/tests/cli-utils.test.js.map +0 -1
  63. package/dist/tests/config-coordinator.test.d.ts +0 -1
  64. package/dist/tests/config-coordinator.test.js +0 -219
  65. package/dist/tests/config-coordinator.test.js.map +0 -1
  66. package/dist/tests/config-integration.test.d.ts +0 -1
  67. package/dist/tests/config-integration.test.js +0 -240
  68. package/dist/tests/config-integration.test.js.map +0 -1
  69. package/dist/tests/config-ui-utils.test.d.ts +0 -1
  70. package/dist/tests/config-ui-utils.test.js +0 -523
  71. package/dist/tests/config-ui-utils.test.js.map +0 -1
  72. package/dist/tests/find-and-naming-utils.test.d.ts +0 -1
  73. package/dist/tests/find-and-naming-utils.test.js +0 -127
  74. package/dist/tests/find-and-naming-utils.test.js.map +0 -1
  75. package/dist/tests/inventory-service-precedence.test.d.ts +0 -1
  76. package/dist/tests/inventory-service-precedence.test.js +0 -42
  77. package/dist/tests/inventory-service-precedence.test.js.map +0 -1
  78. package/dist/tests/skill-flow.test.d.ts +0 -1
  79. package/dist/tests/skill-flow.test.js +0 -880
  80. package/dist/tests/skill-flow.test.js.map +0 -1
  81. package/dist/tests/source-lifecycle.test.d.ts +0 -1
  82. package/dist/tests/source-lifecycle.test.js +0 -605
  83. package/dist/tests/source-lifecycle.test.js.map +0 -1
  84. package/dist/tests/source-parsing-compatibility.test.d.ts +0 -1
  85. package/dist/tests/source-parsing-compatibility.test.js +0 -71
  86. package/dist/tests/source-parsing-compatibility.test.js.map +0 -1
  87. package/dist/tests/target-definitions.test.d.ts +0 -1
  88. package/dist/tests/target-definitions.test.js +0 -51
  89. package/dist/tests/target-definitions.test.js.map +0 -1
  90. package/dist/tests/test-helpers.d.ts +0 -18
  91. package/dist/tests/test-helpers.js +0 -123
  92. package/dist/tests/test-helpers.js.map +0 -1
  93. package/dist/tui/add-flow-model.d.ts +0 -62
  94. package/dist/tui/add-flow-model.js +0 -206
  95. package/dist/tui/add-flow-model.js.map +0 -1
  96. package/dist/tui/add-flow.d.ts +0 -25
  97. package/dist/tui/add-flow.js +0 -533
  98. package/dist/tui/add-flow.js.map +0 -1
  99. package/dist/tui/config-app.d.ts +0 -178
  100. package/dist/tui/config-app.js +0 -1551
  101. package/dist/tui/config-app.js.map +0 -1
  102. package/dist/tui/find-app.d.ts +0 -9
  103. package/dist/tui/find-app.js +0 -150
  104. package/dist/tui/find-app.js.map +0 -1
  105. package/dist/tui/selection-state.d.ts +0 -8
  106. package/dist/tui/selection-state.js +0 -32
  107. package/dist/tui/selection-state.js.map +0 -1
  108. package/dist/utils/builtin-git-sources.d.ts +0 -5
  109. package/dist/utils/builtin-git-sources.js +0 -23
  110. package/dist/utils/builtin-git-sources.js.map +0 -1
  111. package/dist/utils/clawhub.d.ts +0 -41
  112. package/dist/utils/clawhub.js +0 -94
  113. package/dist/utils/clawhub.js.map +0 -1
  114. package/dist/utils/cli.d.ts +0 -1
  115. package/dist/utils/cli.js +0 -15
  116. package/dist/utils/cli.js.map +0 -1
  117. package/dist/utils/constants.d.ts +0 -23
  118. package/dist/utils/constants.js +0 -195
  119. package/dist/utils/constants.js.map +0 -1
  120. package/dist/utils/find-command.d.ts +0 -2
  121. package/dist/utils/find-command.js +0 -29
  122. package/dist/utils/find-command.js.map +0 -1
  123. package/dist/utils/format.d.ts +0 -7
  124. package/dist/utils/format.js +0 -68
  125. package/dist/utils/format.js.map +0 -1
  126. package/dist/utils/fs.d.ts +0 -15
  127. package/dist/utils/fs.js +0 -140
  128. package/dist/utils/fs.js.map +0 -1
  129. package/dist/utils/git.d.ts +0 -3
  130. package/dist/utils/git.js +0 -12
  131. package/dist/utils/git.js.map +0 -1
  132. package/dist/utils/github-catalog.d.ts +0 -1
  133. package/dist/utils/github-catalog.js +0 -25
  134. package/dist/utils/github-catalog.js.map +0 -1
  135. package/dist/utils/naming.d.ts +0 -29
  136. package/dist/utils/naming.js +0 -115
  137. package/dist/utils/naming.js.map +0 -1
  138. package/dist/utils/result.d.ts +0 -4
  139. package/dist/utils/result.js +0 -15
  140. package/dist/utils/result.js.map +0 -1
  141. package/dist/utils/source-id.d.ts +0 -2
  142. package/dist/utils/source-id.js +0 -49
  143. package/dist/utils/source-id.js.map +0 -1
@@ -1,353 +0,0 @@
1
- import fs from "node:fs/promises";
2
- import path from "node:path";
3
- import { buildProjectedSkillNameCandidates, parseGitHubRepo, resolveProjectedSkillNames, } from "../utils/naming.js";
4
- import { ok } from "../utils/result.js";
5
- export class DeploymentPlanner {
6
- adapters;
7
- constructor(adapters) {
8
- this.adapters = adapters;
9
- }
10
- async planForSource(sourceId, manifest, lockFile) {
11
- const binding = manifest.bindings[sourceId] ?? { targets: {} };
12
- const source = manifest.sources.find((item) => item.id === sourceId);
13
- const leafs = lockFile.leafInventory.filter((leaf) => leaf.sourceId === sourceId);
14
- const previousDeployments = lockFile.deployments.filter((deployment) => deployment.sourceId === sourceId);
15
- const actions = [];
16
- const warnings = [];
17
- for (const adapter of this.adapters) {
18
- const detection = await adapter.detect();
19
- const targetBinding = binding.targets[adapter.target];
20
- const desiredLeafIds = targetBinding?.enabled === true ? new Set(targetBinding.leafIds) : new Set();
21
- const projectedLinkNames = this.buildProjectedLinkNameMap(manifest, lockFile, adapter.target);
22
- const plannedForTarget = await this.planTarget(sourceId, adapter, detection.available, detection.rootPath, detection.reason, desiredLeafIds, leafs, previousDeployments, lockFile, projectedLinkNames, {
23
- id: sourceId,
24
- displayName: source?.displayName ?? sourceId,
25
- author: parseGitHubRepo(source?.locator ?? "")?.owner,
26
- });
27
- actions.push(...plannedForTarget.actions);
28
- warnings.push(...plannedForTarget.warnings);
29
- }
30
- return ok({
31
- actions,
32
- warnings,
33
- blocked: actions.filter((action) => action.kind === "blocked"),
34
- });
35
- }
36
- // fetch -> scan -> diff -> replan -> reapply
37
- //
38
- // desired bindings + lock state + disk state
39
- // -> create | update | remove | noop | blocked
40
- async planTarget(sourceId, adapter, targetAvailable, rootPath, unavailableReason, desiredLeafIds, leafs, previousDeployments, lockFile, projectedLinkNames, sourceRef) {
41
- const actions = [];
42
- const warnings = [];
43
- const desiredLeafs = leafs.filter((leaf) => desiredLeafIds.has(leaf.id));
44
- const deploymentsForTarget = previousDeployments.filter((deployment) => deployment.target === adapter.target);
45
- const managedByLeafId = new Map(deploymentsForTarget.map((deployment) => [deployment.leafId, deployment]));
46
- const missingDesiredLeafIds = [...desiredLeafIds].filter((leafId) => !desiredLeafs.some((leaf) => leaf.id === leafId));
47
- for (const missingLeafId of missingDesiredLeafIds) {
48
- const existing = managedByLeafId.get(missingLeafId);
49
- warnings.push({
50
- code: "MISSING_LEAF_SELECTION",
51
- message: `${missingLeafId} no longer exists in source inventory.`,
52
- });
53
- if (existing) {
54
- actions.push({
55
- kind: "remove",
56
- sourceId,
57
- leafId: missingLeafId,
58
- target: existing.target,
59
- strategy: existing.strategy,
60
- sourcePath: "",
61
- targetPath: existing.targetPath,
62
- contentHash: existing.contentHash,
63
- reason: "Selected leaf no longer exists in source inventory.",
64
- });
65
- }
66
- }
67
- for (const leaf of desiredLeafs) {
68
- const existing = managedByLeafId.get(leaf.id);
69
- const projectedLinkName = projectedLinkNames.get(leaf.id) ?? leaf.linkName;
70
- const targetPathCandidates = buildProjectedSkillNameCandidates({
71
- preferredName: projectedLinkName,
72
- groupId: sourceRef.id,
73
- groupName: sourceRef.displayName,
74
- groupAuthor: sourceRef.author,
75
- skillName: leaf.linkName,
76
- }).map((linkName) => ({
77
- linkName,
78
- targetPath: adapter.resolveTargetPath(rootPath, linkName),
79
- }));
80
- const preferredTargetPath = targetPathCandidates[0]?.targetPath ?? adapter.resolveTargetPath(rootPath, projectedLinkName);
81
- if (!targetAvailable) {
82
- const blockedAction = {
83
- kind: "blocked",
84
- sourceId,
85
- leafId: leaf.id,
86
- target: adapter.target,
87
- strategy: adapter.strategy,
88
- sourcePath: leaf.absolutePath,
89
- targetPath: preferredTargetPath,
90
- contentHash: leaf.contentHash,
91
- ...(unavailableReason ? { reason: unavailableReason } : {}),
92
- };
93
- actions.push(blockedAction);
94
- continue;
95
- }
96
- let chosenCandidate;
97
- const inspectedCandidates = [];
98
- for (const candidate of targetPathCandidates) {
99
- const diskState = await this.inspectTargetPath(candidate.targetPath, leaf.absolutePath, leaf, lockFile);
100
- inspectedCandidates.push({
101
- ...candidate,
102
- diskState,
103
- });
104
- if (diskState.managedBySkillFlow &&
105
- !(existing &&
106
- diskState.managedDeployment?.sourceId === existing.sourceId &&
107
- diskState.managedDeployment?.leafId === existing.leafId &&
108
- diskState.managedDeployment?.target === existing.target)) {
109
- continue;
110
- }
111
- if (diskState.foreign && !diskState.externalExactMatch) {
112
- continue;
113
- }
114
- chosenCandidate = {
115
- ...candidate,
116
- diskState,
117
- };
118
- break;
119
- }
120
- if (!chosenCandidate) {
121
- chosenCandidate = await this.buildExternalRelocationCandidate(preferredTargetPath, inspectedCandidates, leaf, rootPath);
122
- }
123
- if (!chosenCandidate) {
124
- actions.push({
125
- kind: "blocked",
126
- sourceId,
127
- leafId: leaf.id,
128
- target: adapter.target,
129
- strategy: adapter.strategy,
130
- sourcePath: leaf.absolutePath,
131
- targetPath: preferredTargetPath,
132
- reason: "Foreign content already exists at target path and no safe fallback name is available.",
133
- contentHash: leaf.contentHash,
134
- });
135
- continue;
136
- }
137
- if (chosenCandidate.targetPath !== preferredTargetPath &&
138
- !chosenCandidate.diskState.externalExactMatch) {
139
- warnings.push({
140
- code: "EXTERNAL_NAME_COLLISION_RENAMED",
141
- message: `${leaf.linkName} kept existing target content at ${preferredTargetPath} and will deploy as ${chosenCandidate.linkName}.`,
142
- });
143
- }
144
- if (chosenCandidate.relocateExternalToTargetPath) {
145
- warnings.push({
146
- code: "EXTERNAL_SKILL_RELOCATED",
147
- message: `${leaf.linkName} reclaimed ${preferredTargetPath} and moved the external skill to ${chosenCandidate.relocateExternalToTargetPath}.`,
148
- });
149
- }
150
- const kind = this.resolveDesiredAction(existing, chosenCandidate.diskState.matchesExpected, leaf);
151
- actions.push({
152
- kind,
153
- sourceId,
154
- leafId: leaf.id,
155
- target: adapter.target,
156
- strategy: adapter.strategy,
157
- sourcePath: leaf.absolutePath,
158
- targetPath: chosenCandidate.targetPath,
159
- ...(existing && existing.targetPath !== chosenCandidate.targetPath
160
- ? { previousTargetPath: existing.targetPath }
161
- : {}),
162
- ...(chosenCandidate.relocateExternalToTargetPath
163
- ? { relocateExternalToTargetPath: chosenCandidate.relocateExternalToTargetPath }
164
- : {}),
165
- contentHash: leaf.contentHash,
166
- });
167
- }
168
- for (const deployment of deploymentsForTarget) {
169
- if (desiredLeafIds.has(deployment.leafId)) {
170
- continue;
171
- }
172
- actions.push({
173
- kind: "remove",
174
- sourceId,
175
- leafId: deployment.leafId,
176
- target: deployment.target,
177
- strategy: deployment.strategy,
178
- sourcePath: "",
179
- targetPath: deployment.targetPath,
180
- contentHash: deployment.contentHash,
181
- });
182
- }
183
- return { actions, warnings, blocked: actions.filter((item) => item.kind === "blocked") };
184
- }
185
- resolveDesiredAction(existing, matchesExpected, leaf) {
186
- if (!existing) {
187
- return matchesExpected ? "noop" : "create";
188
- }
189
- if (!matchesExpected) {
190
- return "update";
191
- }
192
- return existing.contentHash === leaf.contentHash ? "noop" : "update";
193
- }
194
- async inspectTargetPath(targetPath, expectedSourcePath, leaf, lockFile) {
195
- try {
196
- const managedDeployment = lockFile.deployments.find((deployment) => deployment.targetPath === targetPath && deployment.status === "active");
197
- const stats = await fs.lstat(targetPath);
198
- if (stats.isSymbolicLink()) {
199
- const linked = await fs.readlink(targetPath);
200
- const resolved = path.resolve(path.dirname(targetPath), linked);
201
- const matchesExpected = resolved === expectedSourcePath;
202
- return {
203
- exists: true,
204
- matchesExpected,
205
- foreign: !matchesExpected,
206
- managedBySkillFlow: Boolean(managedDeployment),
207
- ...(managedDeployment ? { managedDeployment } : {}),
208
- ...(await this.buildExternalIdentityState(targetPath, leaf, managedDeployment)),
209
- };
210
- }
211
- return {
212
- exists: true,
213
- matchesExpected: false,
214
- foreign: true,
215
- managedBySkillFlow: Boolean(managedDeployment),
216
- ...(managedDeployment ? { managedDeployment } : {}),
217
- ...(await this.buildExternalIdentityState(targetPath, leaf, managedDeployment)),
218
- };
219
- }
220
- catch {
221
- return {
222
- exists: false,
223
- matchesExpected: false,
224
- foreign: false,
225
- managedBySkillFlow: false,
226
- externalExactMatch: false,
227
- };
228
- }
229
- }
230
- async buildExternalIdentityState(targetPath, leaf, managedDeployment) {
231
- const identity = !managedDeployment ? await this.readSkillIdentity(targetPath) : undefined;
232
- return {
233
- externalExactMatch: !managedDeployment &&
234
- identity?.name === leaf.name &&
235
- identity.description === leaf.description,
236
- ...(identity ? { identity } : {}),
237
- };
238
- }
239
- async readSkillIdentity(targetPath) {
240
- try {
241
- const raw = await fs.readFile(path.join(targetPath, "SKILL.md"), "utf8");
242
- const lines = raw.split(/\r?\n/);
243
- if (lines[0]?.trim() !== "---") {
244
- return undefined;
245
- }
246
- const data = {};
247
- let index = 1;
248
- while (index < lines.length) {
249
- const line = lines[index] ?? "";
250
- if (line.trim() === "---") {
251
- break;
252
- }
253
- const pair = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
254
- if (!pair) {
255
- index += 1;
256
- continue;
257
- }
258
- const key = pair[1];
259
- const rest = pair[2];
260
- if (!key || rest === undefined) {
261
- index += 1;
262
- continue;
263
- }
264
- if (rest === "|" || rest === ">") {
265
- const blockLines = [];
266
- index += 1;
267
- while (index < lines.length) {
268
- const blockLine = lines[index] ?? "";
269
- if (blockLine.length === 0) {
270
- blockLines.push("");
271
- index += 1;
272
- continue;
273
- }
274
- if (!blockLine.startsWith(" ")) {
275
- break;
276
- }
277
- blockLines.push(blockLine.slice(2));
278
- index += 1;
279
- }
280
- data[key] = blockLines.join("\n").trim();
281
- continue;
282
- }
283
- data[key] = rest.trim();
284
- index += 1;
285
- }
286
- const name = data.name?.trim();
287
- const description = data.description?.trim();
288
- if (!name || !description) {
289
- return undefined;
290
- }
291
- return { name, description };
292
- }
293
- catch {
294
- return undefined;
295
- }
296
- }
297
- async buildExternalRelocationCandidate(preferredTargetPath, inspectedCandidates, leaf, rootPath) {
298
- const preferredCandidate = inspectedCandidates.find((candidate) => candidate.targetPath === preferredTargetPath);
299
- if (!preferredCandidate ||
300
- !preferredCandidate.diskState.exists ||
301
- preferredCandidate.diskState.managedBySkillFlow ||
302
- preferredCandidate.diskState.externalExactMatch) {
303
- return undefined;
304
- }
305
- const currentLinkName = path.basename(preferredTargetPath);
306
- for (const relocationLinkName of this.buildExternalRelocationLinkNames(currentLinkName)) {
307
- const relocationTargetPath = path.join(rootPath, relocationLinkName);
308
- const relocationState = await this.inspectExistingTargetPath(relocationTargetPath);
309
- if (relocationState.exists) {
310
- continue;
311
- }
312
- return {
313
- linkName: currentLinkName,
314
- targetPath: preferredTargetPath,
315
- diskState: preferredCandidate.diskState,
316
- relocateExternalToTargetPath: relocationTargetPath,
317
- };
318
- }
319
- return undefined;
320
- }
321
- buildExternalRelocationLinkNames(currentLinkName) {
322
- return Array.from({ length: 12 }, (_, index) => index === 0 ? `${currentLinkName}-external` : `${currentLinkName}-external-${index + 1}`);
323
- }
324
- async inspectExistingTargetPath(targetPath) {
325
- try {
326
- await fs.lstat(targetPath);
327
- return { exists: true };
328
- }
329
- catch {
330
- return { exists: false };
331
- }
332
- }
333
- buildProjectedLinkNameMap(manifest, lockFile, target) {
334
- const selectedLeafs = manifest.sources.flatMap((source) => {
335
- const targetBinding = manifest.bindings[source.id]?.targets[target];
336
- if (!targetBinding?.enabled) {
337
- return [];
338
- }
339
- return targetBinding.leafIds
340
- .map((leafId) => lockFile.leafInventory.find((leaf) => leaf.id === leafId))
341
- .filter((leaf) => Boolean(leaf));
342
- });
343
- const sourcesById = new Map(manifest.sources.map((source) => [source.id, source]));
344
- return resolveProjectedSkillNames(selectedLeafs.map((leaf) => ({
345
- leafId: leaf.id,
346
- groupId: leaf.sourceId,
347
- groupName: sourcesById.get(leaf.sourceId)?.displayName ?? leaf.sourceId,
348
- groupAuthor: parseGitHubRepo(sourcesById.get(leaf.sourceId)?.locator ?? "")?.owner,
349
- skillName: leaf.linkName,
350
- })));
351
- }
352
- }
353
- //# sourceMappingURL=deployment-planner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deployment-planner.js","sourceRoot":"","sources":["../../src/services/deployment-planner.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { DoctorReport, LockFile, Manifest, Result } from "../domain/types.js";
2
- export declare class DoctorService {
3
- private readonly adapters;
4
- run(manifest: Manifest, lockFile: LockFile): Promise<Result<DoctorReport>>;
5
- private getLeafPath;
6
- private reportUnmanagedExternalSkills;
7
- }
@@ -1,204 +0,0 @@
1
- import path from "node:path";
2
- import fs from "node:fs/promises";
3
- import { createChannelAdapters } from "../adapters/channel-adapters.js";
4
- import { hashDirectory, isBrokenSymlink, pathExists } from "../utils/fs.js";
5
- import { formatGroupLabel } from "../utils/naming.js";
6
- import { ok } from "../utils/result.js";
7
- export class DoctorService {
8
- adapters = createChannelAdapters();
9
- async run(manifest, lockFile) {
10
- const issues = [];
11
- for (const source of manifest.sources) {
12
- const binding = manifest.bindings[source.id] ?? { targets: {} };
13
- const sourceLock = lockFile.sources.find((item) => item.id === source.id);
14
- const invalidLeafPaths = new Set(sourceLock?.invalidLeafs.map((leaf) => leaf.path) ?? []);
15
- for (const adapter of this.adapters) {
16
- const configured = binding.targets[adapter.target];
17
- if (!configured?.enabled) {
18
- continue;
19
- }
20
- const detection = await adapter.detect();
21
- if (!detection.available) {
22
- issues.push({
23
- severity: "error",
24
- sourceId: source.id,
25
- sourceLabel: formatGroupLabel(source),
26
- target: adapter.target,
27
- code: "TARGET_UNAVAILABLE",
28
- message: detection.reason ?? "Target is unavailable.",
29
- });
30
- continue;
31
- }
32
- for (const leafId of configured.leafIds) {
33
- const selectedPath = this.getLeafPath(source.id, leafId);
34
- if (selectedPath && invalidLeafPaths.has(selectedPath)) {
35
- issues.push({
36
- severity: "error",
37
- sourceId: source.id,
38
- sourceLabel: formatGroupLabel(source),
39
- target: adapter.target,
40
- leafId,
41
- leafLabel: path.basename(selectedPath) || selectedPath,
42
- code: "INVALIDATED_SELECTED_LEAF",
43
- message: "This selected skill is invalid in the current source inventory.",
44
- });
45
- continue;
46
- }
47
- const leaf = lockFile.leafInventory.find((item) => item.id === leafId);
48
- const deployment = lockFile.deployments.find((item) => item.sourceId === source.id &&
49
- item.leafId === leafId &&
50
- item.target === adapter.target);
51
- if (!leaf) {
52
- issues.push({
53
- severity: "error",
54
- sourceId: source.id,
55
- sourceLabel: formatGroupLabel(source),
56
- target: adapter.target,
57
- leafId,
58
- code: "LEAF_MISSING",
59
- message: "This saved selection no longer exists in the source inventory.",
60
- });
61
- continue;
62
- }
63
- const targetPath = deployment?.targetPath ?? adapter.resolveTargetPath(detection.rootPath, leaf.linkName);
64
- if (!deployment) {
65
- issues.push({
66
- severity: "warning",
67
- sourceId: source.id,
68
- sourceLabel: formatGroupLabel(source),
69
- target: adapter.target,
70
- leafId,
71
- leafLabel: leaf.linkName,
72
- code: "DRIFT_NOT_DEPLOYED",
73
- message: "This selected skill is not currently projected to disk.",
74
- });
75
- continue;
76
- }
77
- if (!(await pathExists(targetPath))) {
78
- issues.push({
79
- severity: "error",
80
- sourceId: source.id,
81
- sourceLabel: formatGroupLabel(source),
82
- target: adapter.target,
83
- leafId,
84
- leafLabel: leaf.linkName,
85
- code: "TARGET_MISSING",
86
- message: "Projected target is missing on disk.",
87
- });
88
- continue;
89
- }
90
- if (deployment.strategy === "symlink") {
91
- const stats = await fs.lstat(targetPath);
92
- if (!stats.isSymbolicLink()) {
93
- issues.push({
94
- severity: "warning",
95
- sourceId: source.id,
96
- sourceLabel: formatGroupLabel(source),
97
- target: adapter.target,
98
- leafId,
99
- leafLabel: leaf.linkName,
100
- code: "DRIFT_TYPE",
101
- message: "Expected a symlink, but found foreign content.",
102
- });
103
- continue;
104
- }
105
- if (await isBrokenSymlink(targetPath)) {
106
- issues.push({
107
- severity: "error",
108
- sourceId: source.id,
109
- sourceLabel: formatGroupLabel(source),
110
- target: adapter.target,
111
- leafId,
112
- leafLabel: leaf.linkName,
113
- code: "BROKEN_SYMLINK",
114
- message: "Projected symlink is broken.",
115
- });
116
- }
117
- }
118
- else {
119
- const onDiskHash = await hashDirectory(targetPath);
120
- if (onDiskHash !== deployment.contentHash) {
121
- issues.push({
122
- severity: "warning",
123
- sourceId: source.id,
124
- sourceLabel: formatGroupLabel(source),
125
- target: adapter.target,
126
- leafId,
127
- leafLabel: leaf.linkName,
128
- code: "DRIFT_COPY",
129
- message: "Projected copy no longer matches saved state.",
130
- });
131
- }
132
- }
133
- }
134
- }
135
- }
136
- await this.reportUnmanagedExternalSkills(lockFile, issues);
137
- for (const deployment of lockFile.deployments) {
138
- const sourceStillExists = manifest.sources.some((source) => source.id === deployment.sourceId);
139
- if (!sourceStillExists) {
140
- issues.push({
141
- severity: "warning",
142
- sourceId: deployment.sourceId,
143
- target: deployment.target,
144
- leafId: deployment.leafId,
145
- code: "STALE_DEPLOYMENT",
146
- message: "Saved deployment exists for a skills group that is no longer registered.",
147
- });
148
- }
149
- }
150
- const hasError = issues.some((issue) => issue.severity === "error");
151
- const hasWarning = issues.some((issue) => issue.severity === "warning");
152
- const status = hasError
153
- ? "BLOCKED"
154
- : hasWarning
155
- ? "PARTIAL"
156
- : "HEALTHY";
157
- return ok({ status, issues });
158
- }
159
- getLeafPath(sourceId, leafId) {
160
- const prefix = `${sourceId}:`;
161
- if (!leafId.startsWith(prefix)) {
162
- return undefined;
163
- }
164
- return leafId.slice(prefix.length);
165
- }
166
- async reportUnmanagedExternalSkills(lockFile, issues) {
167
- const managedTargetPaths = new Set(lockFile.deployments.map((deployment) => path.resolve(deployment.targetPath)));
168
- const seenPaths = new Set();
169
- for (const adapter of this.adapters) {
170
- const detection = await adapter.detect();
171
- if (!detection.available) {
172
- continue;
173
- }
174
- const entries = await fs.readdir(detection.rootPath, { withFileTypes: true });
175
- for (const entry of entries) {
176
- const skillDir = path.join(detection.rootPath, entry.name);
177
- const isDirectoryLike = entry.isDirectory() ||
178
- (entry.isSymbolicLink() &&
179
- (await fs.stat(skillDir).then((stats) => stats.isDirectory()).catch(() => false)));
180
- if (!isDirectoryLike) {
181
- continue;
182
- }
183
- if (!(await pathExists(path.join(skillDir, "SKILL.md")))) {
184
- continue;
185
- }
186
- const resolvedPath = await fs.realpath(skillDir).catch(() => path.resolve(skillDir));
187
- if (managedTargetPaths.has(path.resolve(skillDir)) || seenPaths.has(resolvedPath)) {
188
- continue;
189
- }
190
- seenPaths.add(resolvedPath);
191
- issues.push({
192
- severity: "warning",
193
- sourceId: `unmanaged:${adapter.target}:${entry.name}`,
194
- sourceLabel: "Unmanaged external skill",
195
- target: adapter.target,
196
- leafLabel: entry.name,
197
- code: "UNMANAGED_EXTERNAL_TARGET_SKILL",
198
- message: `Unmanaged skill discovered at ${resolvedPath}.`,
199
- });
200
- }
201
- }
202
- }
203
- }
204
- //# sourceMappingURL=doctor-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { DuplicateLeafRecord, InvalidLeafRecord, LeafRecord } from "../domain/types.js";
2
- type InventoryScan = {
3
- leafs: LeafRecord[];
4
- invalidLeafs: InvalidLeafRecord[];
5
- duplicateLeafs: DuplicateLeafRecord[];
6
- skillFileCount: number;
7
- };
8
- export declare class InventoryService {
9
- private static readonly IGNORED_DIRECTORIES;
10
- scanSource(sourceId: string, checkoutPath: string, rootLinkName?: string): Promise<InventoryScan>;
11
- private findSkillFiles;
12
- private walkSkillTree;
13
- private parseSkillFile;
14
- private dedupeCandidates;
15
- private parseFrontmatter;
16
- }
17
- export {};