skill-flow 1.0.4 → 1.0.6

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 (83) hide show
  1. package/README.md +2 -2
  2. package/README.zh.md +1 -1
  3. package/dist/adapters/channel-adapters.js +11 -3
  4. package/dist/adapters/channel-adapters.js.map +1 -1
  5. package/dist/cli.js +64 -6
  6. package/dist/cli.js.map +1 -1
  7. package/dist/domain/types.d.ts +42 -0
  8. package/dist/services/config-coordinator.d.ts +38 -0
  9. package/dist/services/config-coordinator.js +81 -0
  10. package/dist/services/config-coordinator.js.map +1 -0
  11. package/dist/services/doctor-service.d.ts +2 -0
  12. package/dist/services/doctor-service.js +62 -0
  13. package/dist/services/doctor-service.js.map +1 -1
  14. package/dist/services/inventory-service.d.ts +4 -1
  15. package/dist/services/inventory-service.js +54 -26
  16. package/dist/services/inventory-service.js.map +1 -1
  17. package/dist/services/skill-flow.d.ts +38 -16
  18. package/dist/services/skill-flow.js +484 -194
  19. package/dist/services/skill-flow.js.map +1 -1
  20. package/dist/services/source-service.d.ts +14 -11
  21. package/dist/services/source-service.js +389 -81
  22. package/dist/services/source-service.js.map +1 -1
  23. package/dist/services/workspace-bootstrap-service.js +2 -10
  24. package/dist/services/workspace-bootstrap-service.js.map +1 -1
  25. package/dist/state/store.d.ts +16 -0
  26. package/dist/state/store.js +93 -19
  27. package/dist/state/store.js.map +1 -1
  28. package/dist/tests/add-selection-and-find-command.test.d.ts +1 -0
  29. package/dist/tests/add-selection-and-find-command.test.js +89 -0
  30. package/dist/tests/add-selection-and-find-command.test.js.map +1 -0
  31. package/dist/tests/clawhub.test.d.ts +1 -0
  32. package/dist/tests/clawhub.test.js +63 -0
  33. package/dist/tests/clawhub.test.js.map +1 -0
  34. package/dist/tests/cli-utils.test.d.ts +1 -0
  35. package/dist/tests/cli-utils.test.js +15 -0
  36. package/dist/tests/cli-utils.test.js.map +1 -0
  37. package/dist/tests/config-coordinator.test.d.ts +1 -0
  38. package/dist/tests/config-coordinator.test.js +172 -0
  39. package/dist/tests/config-coordinator.test.js.map +1 -0
  40. package/dist/tests/config-integration.test.d.ts +1 -0
  41. package/dist/tests/config-integration.test.js +238 -0
  42. package/dist/tests/config-integration.test.js.map +1 -0
  43. package/dist/tests/config-ui-utils.test.d.ts +1 -0
  44. package/dist/tests/config-ui-utils.test.js +473 -0
  45. package/dist/tests/config-ui-utils.test.js.map +1 -0
  46. package/dist/tests/find-and-naming-utils.test.d.ts +1 -0
  47. package/dist/tests/find-and-naming-utils.test.js +127 -0
  48. package/dist/tests/find-and-naming-utils.test.js.map +1 -0
  49. package/dist/tests/inventory-service-precedence.test.d.ts +1 -0
  50. package/dist/tests/inventory-service-precedence.test.js +42 -0
  51. package/dist/tests/inventory-service-precedence.test.js.map +1 -0
  52. package/dist/tests/skill-flow.test.js +311 -889
  53. package/dist/tests/skill-flow.test.js.map +1 -1
  54. package/dist/tests/source-lifecycle.test.d.ts +1 -0
  55. package/dist/tests/source-lifecycle.test.js +605 -0
  56. package/dist/tests/source-lifecycle.test.js.map +1 -0
  57. package/dist/tests/source-parsing-compatibility.test.d.ts +1 -0
  58. package/dist/tests/source-parsing-compatibility.test.js +71 -0
  59. package/dist/tests/source-parsing-compatibility.test.js.map +1 -0
  60. package/dist/tests/target-definitions.test.d.ts +1 -0
  61. package/dist/tests/target-definitions.test.js +51 -0
  62. package/dist/tests/target-definitions.test.js.map +1 -0
  63. package/dist/tests/test-helpers.d.ts +18 -0
  64. package/dist/tests/test-helpers.js +123 -0
  65. package/dist/tests/test-helpers.js.map +1 -0
  66. package/dist/tui/config-app.d.ts +150 -24
  67. package/dist/tui/config-app.js +1034 -338
  68. package/dist/tui/config-app.js.map +1 -1
  69. package/dist/utils/clawhub.d.ts +3 -0
  70. package/dist/utils/clawhub.js +32 -3
  71. package/dist/utils/clawhub.js.map +1 -1
  72. package/dist/utils/cli.d.ts +1 -0
  73. package/dist/utils/cli.js +15 -0
  74. package/dist/utils/cli.js.map +1 -0
  75. package/dist/utils/constants.d.ts +4 -0
  76. package/dist/utils/constants.js +31 -0
  77. package/dist/utils/constants.js.map +1 -1
  78. package/dist/utils/find-command.js +10 -2
  79. package/dist/utils/find-command.js.map +1 -1
  80. package/dist/utils/fs.d.ts +5 -0
  81. package/dist/utils/fs.js +52 -1
  82. package/dist/utils/fs.js.map +1 -1
  83. package/package.json +1 -1
@@ -0,0 +1,172 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import { ConfigCoordinator } from "../services/config-coordinator.js";
3
+ const manifest = {
4
+ schemaVersion: 1,
5
+ sources: [
6
+ {
7
+ id: "alpha",
8
+ locator: "/tmp/alpha",
9
+ kind: "local",
10
+ displayName: "alpha",
11
+ addedAt: "2026-03-23T00:00:00.000Z",
12
+ },
13
+ {
14
+ id: "beta",
15
+ locator: "/tmp/beta",
16
+ kind: "local",
17
+ displayName: "beta",
18
+ addedAt: "2026-03-23T00:00:00.000Z",
19
+ },
20
+ ],
21
+ bindings: {
22
+ alpha: {
23
+ targets: {
24
+ codex: {
25
+ enabled: true,
26
+ leafIds: ["alpha:browse"],
27
+ },
28
+ },
29
+ },
30
+ beta: {
31
+ targets: {},
32
+ },
33
+ },
34
+ };
35
+ const lockFile = {
36
+ schemaVersion: 1,
37
+ sources: [],
38
+ leafInventory: [
39
+ {
40
+ id: "alpha:browse",
41
+ sourceId: "alpha",
42
+ name: "browse",
43
+ linkName: "browse",
44
+ title: "browse",
45
+ description: "Browse things.",
46
+ relativePath: "browse",
47
+ absolutePath: "/tmp/alpha/browse",
48
+ skillFilePath: "/tmp/alpha/browse/SKILL.md",
49
+ contentHash: "hash-alpha",
50
+ metadataWarnings: [],
51
+ valid: true,
52
+ },
53
+ ],
54
+ deployments: [],
55
+ };
56
+ const audit = {
57
+ status: "HEALTHY",
58
+ issues: [],
59
+ };
60
+ const summaries = [
61
+ {
62
+ source: manifest.sources[0],
63
+ lock: undefined,
64
+ leafs: [lockFile.leafInventory[0]],
65
+ bindings: manifest.bindings.alpha,
66
+ activeTargetCount: 1,
67
+ health: "ACTIVE",
68
+ issueCounts: { warning: 0, error: 0 },
69
+ },
70
+ {
71
+ source: manifest.sources[1],
72
+ lock: undefined,
73
+ leafs: [],
74
+ bindings: manifest.bindings.beta,
75
+ activeTargetCount: 0,
76
+ health: "INACTIVE",
77
+ issueCounts: { warning: 0, error: 0 },
78
+ },
79
+ ];
80
+ describe("ConfigCoordinator", () => {
81
+ test("boots config and derives initial drafts from normalized summaries", async () => {
82
+ const coordinator = new ConfigCoordinator({
83
+ store: {
84
+ init: vi.fn().mockResolvedValue(undefined),
85
+ readManifest: vi.fn(),
86
+ },
87
+ doctorService: {
88
+ run: vi.fn().mockResolvedValue({ ok: true, data: audit, warnings: [], errors: [] }),
89
+ },
90
+ workflowService: {
91
+ getSummaries: vi.fn().mockReturnValue(summaries),
92
+ },
93
+ getAvailableTargets: vi.fn().mockResolvedValue(["codex"]),
94
+ pruneMissingCheckouts: vi.fn().mockResolvedValue({
95
+ ok: true,
96
+ data: { removedSourceIds: [] },
97
+ warnings: [],
98
+ errors: [],
99
+ }),
100
+ getConfigData: vi.fn().mockResolvedValue({
101
+ ok: true,
102
+ data: { manifest, lockFile, summaries },
103
+ warnings: [],
104
+ errors: [],
105
+ }),
106
+ });
107
+ const result = await coordinator.bootstrapWorkspaceState();
108
+ expect(result.ok).toBe(true);
109
+ if (!result.ok) {
110
+ return;
111
+ }
112
+ expect(result.data.bootStatus).toEqual({
113
+ phase: "success",
114
+ updatedSourceIds: [],
115
+ failedSources: [],
116
+ });
117
+ expect(result.data.initialDrafts).toEqual({
118
+ alpha: {
119
+ enabledTargets: ["codex"],
120
+ selectedLeafIds: ["alpha:browse"],
121
+ },
122
+ beta: {
123
+ enabledTargets: [],
124
+ selectedLeafIds: [],
125
+ },
126
+ });
127
+ });
128
+ test("keeps config boot usable when prune removes missing groups", async () => {
129
+ const onEvent = vi.fn();
130
+ const coordinator = new ConfigCoordinator({
131
+ store: {
132
+ init: vi.fn().mockResolvedValue(undefined),
133
+ readManifest: vi.fn(),
134
+ },
135
+ doctorService: {
136
+ run: vi.fn().mockResolvedValue({ ok: true, data: audit, warnings: [], errors: [] }),
137
+ },
138
+ workflowService: {
139
+ getSummaries: vi.fn().mockReturnValue(summaries),
140
+ },
141
+ getAvailableTargets: vi.fn().mockResolvedValue(["codex"]),
142
+ pruneMissingCheckouts: vi.fn().mockResolvedValue({
143
+ ok: true,
144
+ data: { removedSourceIds: ["beta"] },
145
+ warnings: [],
146
+ errors: [],
147
+ }),
148
+ getConfigData: vi.fn().mockResolvedValue({
149
+ ok: true,
150
+ data: { manifest, lockFile, summaries },
151
+ warnings: [],
152
+ errors: [],
153
+ }),
154
+ });
155
+ const result = await coordinator.bootstrapWorkspaceState(onEvent);
156
+ expect(result.ok).toBe(true);
157
+ if (!result.ok) {
158
+ return;
159
+ }
160
+ expect(result.data.bootStatus).toEqual({
161
+ phase: "success",
162
+ updatedSourceIds: [],
163
+ failedSources: [],
164
+ });
165
+ expect(onEvent).toHaveBeenCalledWith({
166
+ phase: "refresh-sources",
167
+ level: "warning",
168
+ message: "Removed 1 missing group from config state.",
169
+ });
170
+ });
171
+ });
172
+ //# sourceMappingURL=config-coordinator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-coordinator.test.js","sourceRoot":"","sources":["../../src/tests/config-coordinator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,238 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { describe, expect, test } from "vitest";
4
+ import { SkillFlowApp } from "../services/skill-flow.js";
5
+ import { createRepo, pathExists, skillDoc, useSkillFlowSandbox, writeRepoFiles, } from "./test-helpers.js";
6
+ describe.sequential("config integration", () => {
7
+ const sandbox = useSkillFlowSandbox();
8
+ test("store init is safe under concurrent callers", async () => {
9
+ const app = new SkillFlowApp();
10
+ await Promise.all(Array.from({ length: 12 }, () => app.store.init()));
11
+ expect(await pathExists(app.store.manifestPath)).toBe(true);
12
+ expect(await pathExists(app.store.lockPath)).toBe(true);
13
+ expect(await app.store.readManifest()).toEqual({
14
+ schemaVersion: 1,
15
+ sources: [],
16
+ bindings: {},
17
+ });
18
+ expect(await app.store.readLock()).toEqual({
19
+ schemaVersion: 1,
20
+ sources: [],
21
+ leafInventory: [],
22
+ deployments: [],
23
+ });
24
+ });
25
+ test("bootstrap detects symlinked skills inside agent roots", async () => {
26
+ const app = new SkillFlowApp();
27
+ const externalRoot = path.join(sandbox.sandboxRoot, "external-skill");
28
+ await writeRepoFiles(externalRoot, {
29
+ "SKILL.md": skillDoc("linked-skill", "Symlinked external skill."),
30
+ });
31
+ await fs.symlink(externalRoot, path.join(process.env.SKILL_FLOW_TARGET_CODEX, "linked-skill"), "junction");
32
+ await app.store.init();
33
+ const manifest = await app.store.readManifest();
34
+ const lock = await app.store.readLock();
35
+ const detected = await app.workspaceBootstrapService.detectUnmanagedExternalSkills(manifest, lock);
36
+ expect(detected.some((item) => item.displayName === "linked-skill")).toBe(true);
37
+ expect(await app.store.readManifest()).toEqual(manifest);
38
+ expect(await app.store.readLock()).toEqual(lock);
39
+ });
40
+ test("config boot prunes groups whose local checkout is missing", async () => {
41
+ const liveRepo = await createRepo(sandbox.sandboxRoot, {
42
+ "slides/SKILL.md": skillDoc("slides", "Slides flow."),
43
+ });
44
+ const staleRepo = await createRepo(sandbox.sandboxRoot, {
45
+ "eval/SKILL.md": skillDoc("eval", "Eval flow."),
46
+ });
47
+ const app = new SkillFlowApp();
48
+ const live = await app.addSource(liveRepo, { project: false });
49
+ const stale = await app.addSource(staleRepo, { project: false });
50
+ expect(live.ok).toBe(true);
51
+ expect(stale.ok).toBe(true);
52
+ if (!live.ok || !stale.ok) {
53
+ return;
54
+ }
55
+ await app.applyDraft(stale.data.manifest.id, {
56
+ enabledTargets: ["openclaw"],
57
+ selectedLeafIds: [`${stale.data.manifest.id}:eval`],
58
+ });
59
+ await fs.rm(stale.data.lock.checkoutPath, { recursive: true, force: true });
60
+ const boot = await app.configCoordinator.bootstrapWorkspaceState();
61
+ expect(boot.ok).toBe(true);
62
+ if (!boot.ok) {
63
+ return;
64
+ }
65
+ expect(boot.data.summaries.map((summary) => summary.source.id)).toEqual([
66
+ live.data.manifest.id,
67
+ ]);
68
+ expect(boot.data.bootStatus.failedSources).toEqual([]);
69
+ const manifest = await app.store.readManifest();
70
+ expect(manifest.sources.map((source) => source.id)).toEqual([live.data.manifest.id]);
71
+ expect(await pathExists(path.join(process.env.SKILL_FLOW_TARGET_OPENCLAW, "eval"))).toBe(false);
72
+ });
73
+ test("previewDraft is read-only and does not reconcile inventory on its own", async () => {
74
+ const repoPath = await createRepo(sandbox.sandboxRoot, {
75
+ "browse/SKILL.md": skillDoc("browse", "Browser flow."),
76
+ });
77
+ const app = new SkillFlowApp();
78
+ const added = await app.addSource(repoPath);
79
+ expect(added.ok).toBe(true);
80
+ if (!added.ok) {
81
+ return;
82
+ }
83
+ const sourceId = added.data.manifest.id;
84
+ const lockPath = path.join(sandbox.stateRoot, "lock.json");
85
+ const lock = JSON.parse(await fs.readFile(lockPath, "utf8"));
86
+ const existingLeaf = lock.leafInventory[0];
87
+ const generatedLeafId = `${sourceId}:.agents/skills/generated`;
88
+ lock.sources[0].leafIds.push(generatedLeafId);
89
+ lock.leafInventory.push({
90
+ ...existingLeaf,
91
+ id: generatedLeafId,
92
+ relativePath: ".agents/skills/generated",
93
+ absolutePath: path.join(sandbox.stateRoot, "source", "git", sourceId, ".agents/skills/generated"),
94
+ skillFilePath: path.join(sandbox.stateRoot, "source", "git", sourceId, ".agents/skills/generated/SKILL.md"),
95
+ linkName: "generated",
96
+ name: "generated",
97
+ title: "generated",
98
+ });
99
+ const mutatedLock = `${JSON.stringify(lock, null, 2)}\n`;
100
+ await fs.writeFile(lockPath, mutatedLock, "utf8");
101
+ const preview = await app.previewDraft(sourceId, {
102
+ enabledTargets: ["claude-code"],
103
+ selectedLeafIds: [`${sourceId}:browse`],
104
+ });
105
+ expect(preview.ok).toBe(true);
106
+ expect(await fs.readFile(lockPath, "utf8")).toBe(mutatedLock);
107
+ });
108
+ test("getConfigData normalizes per-target bindings to the config draft model", async () => {
109
+ const repoPath = await createRepo(sandbox.sandboxRoot, {
110
+ "browse/SKILL.md": skillDoc("browse", "Browser flow."),
111
+ "review/SKILL.md": skillDoc("review", "Review flow."),
112
+ });
113
+ const app = new SkillFlowApp();
114
+ const added = await app.addSource(repoPath);
115
+ expect(added.ok).toBe(true);
116
+ if (!added.ok) {
117
+ return;
118
+ }
119
+ const sourceId = added.data.manifest.id;
120
+ const manifest = await app.store.readManifest();
121
+ manifest.bindings[sourceId] = {
122
+ targets: {
123
+ "claude-code": {
124
+ enabled: true,
125
+ leafIds: [`${sourceId}:browse`],
126
+ },
127
+ codex: {
128
+ enabled: true,
129
+ leafIds: [`${sourceId}:review`],
130
+ },
131
+ },
132
+ };
133
+ await app.store.writeManifest(manifest);
134
+ const result = await app.getConfigData();
135
+ expect(result.ok).toBe(true);
136
+ if (!result.ok) {
137
+ return;
138
+ }
139
+ const normalizedManifest = await app.store.readManifest();
140
+ expect(normalizedManifest.bindings[sourceId]).toEqual({
141
+ targets: {
142
+ "claude-code": {
143
+ enabled: true,
144
+ leafIds: [`${sourceId}:browse`, `${sourceId}:review`],
145
+ },
146
+ codex: {
147
+ enabled: true,
148
+ leafIds: [`${sourceId}:browse`, `${sourceId}:review`],
149
+ },
150
+ },
151
+ });
152
+ expect(result.data.summaries.find((summary) => summary.source.id === sourceId)?.bindings).toEqual(normalizedManifest.bindings[sourceId]);
153
+ });
154
+ test("preview and apply can run concurrently without corrupting state files", async () => {
155
+ const repoPath = await createRepo(sandbox.sandboxRoot, {
156
+ "browse/SKILL.md": skillDoc("browse", "Browser flow."),
157
+ });
158
+ const app = new SkillFlowApp();
159
+ const added = await app.addSource(repoPath, { project: false });
160
+ expect(added.ok).toBe(true);
161
+ if (!added.ok) {
162
+ return;
163
+ }
164
+ const sourceId = added.data.manifest.id;
165
+ const nextDraft = {
166
+ enabledTargets: ["claude-code"],
167
+ selectedLeafIds: [`${sourceId}:browse`],
168
+ };
169
+ const results = await Promise.all([
170
+ app.previewDraft(sourceId, nextDraft),
171
+ app.applyDraft(sourceId, nextDraft),
172
+ app.previewDraft(sourceId, nextDraft),
173
+ ]);
174
+ expect(results.every((result) => result.ok)).toBe(true);
175
+ const manifest = await app.store.readManifest();
176
+ const lock = await app.store.readLock();
177
+ expect(manifest.bindings[sourceId]?.targets["claude-code"]?.leafIds).toEqual([
178
+ `${sourceId}:browse`,
179
+ ]);
180
+ expect(lock.sources.map((source) => source.id)).toEqual([sourceId]);
181
+ });
182
+ test("concurrent applyDraft calls are serialized and keep the last draft", async () => {
183
+ const repoPath = await createRepo(sandbox.sandboxRoot, {
184
+ "browse/SKILL.md": skillDoc("browse", "Browser flow."),
185
+ });
186
+ const app = new SkillFlowApp();
187
+ const added = await app.addSource(repoPath, { project: false });
188
+ expect(added.ok).toBe(true);
189
+ if (!added.ok) {
190
+ return;
191
+ }
192
+ const sourceId = added.data.manifest.id;
193
+ const leafId = `${sourceId}:browse`;
194
+ const [first, second] = await Promise.all([
195
+ app.applyDraft(sourceId, {
196
+ enabledTargets: ["claude-code"],
197
+ selectedLeafIds: [leafId],
198
+ }),
199
+ app.applyDraft(sourceId, {
200
+ enabledTargets: ["codex"],
201
+ selectedLeafIds: [leafId],
202
+ }),
203
+ ]);
204
+ expect(first.ok).toBe(true);
205
+ expect(second.ok).toBe(true);
206
+ const manifest = await app.store.readManifest();
207
+ expect(manifest.bindings[sourceId]).toEqual({
208
+ targets: {
209
+ codex: {
210
+ enabled: true,
211
+ leafIds: [leafId],
212
+ },
213
+ },
214
+ });
215
+ });
216
+ test("concurrent app instances do not lose sources while mutating the same state root", async () => {
217
+ const repoA = await createRepo(sandbox.sandboxRoot, {
218
+ "browse/SKILL.md": skillDoc("browse", "Browser flow A."),
219
+ });
220
+ const repoB = await createRepo(sandbox.sandboxRoot, {
221
+ "review/SKILL.md": skillDoc("review", "Review flow B."),
222
+ });
223
+ const appA = new SkillFlowApp();
224
+ const appB = new SkillFlowApp();
225
+ const [addedA, addedB] = await Promise.all([
226
+ appA.addSource(repoA, { project: false }),
227
+ appB.addSource(repoB, { project: false }),
228
+ ]);
229
+ expect(addedA.ok).toBe(true);
230
+ expect(addedB.ok).toBe(true);
231
+ if (!addedA.ok || !addedB.ok) {
232
+ return;
233
+ }
234
+ const manifest = await appA.store.readManifest();
235
+ expect(manifest.sources.map((source) => source.id).sort()).toEqual([addedA.data.manifest.id, addedB.data.manifest.id].sort());
236
+ });
237
+ });
238
+ //# sourceMappingURL=config-integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-integration.test.js","sourceRoot":"","sources":["../../src/tests/config-integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};