@fractary/faber 2.2.1 → 2.3.4

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.
@@ -0,0 +1,351 @@
1
+ /**
2
+ * @fractary/faber - Workflow Resolver
3
+ *
4
+ * Handles workflow inheritance resolution with deterministic merge behavior.
5
+ * This is the SDK equivalent of plugins/faber/skills/faber-config/scripts/merge-workflows.sh
6
+ *
7
+ * Centralized workflow resolution ensures consistent behavior across CLI, MCP, and agents.
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as os from 'os';
11
+ import * as path from 'path';
12
+ // ============================================================================
13
+ // Custom Errors
14
+ // ============================================================================
15
+ export class WorkflowNotFoundError extends Error {
16
+ workflowId;
17
+ searchedPaths;
18
+ constructor(workflowId, searchedPaths) {
19
+ super(`Workflow not found: ${workflowId}`);
20
+ this.workflowId = workflowId;
21
+ this.searchedPaths = searchedPaths;
22
+ this.name = 'WorkflowNotFoundError';
23
+ }
24
+ }
25
+ export class CircularInheritanceError extends Error {
26
+ workflowId;
27
+ chain;
28
+ constructor(workflowId, chain) {
29
+ super(`Circular inheritance detected: ${workflowId} creates inheritance cycle`);
30
+ this.workflowId = workflowId;
31
+ this.chain = chain;
32
+ this.name = 'CircularInheritanceError';
33
+ }
34
+ }
35
+ export class DuplicateStepIdError extends Error {
36
+ duplicateIds;
37
+ constructor(duplicateIds) {
38
+ super(`Duplicate step IDs found: ${duplicateIds.join(', ')}`);
39
+ this.duplicateIds = duplicateIds;
40
+ this.name = 'DuplicateStepIdError';
41
+ }
42
+ }
43
+ export class InvalidWorkflowError extends Error {
44
+ workflowId;
45
+ reason;
46
+ constructor(workflowId, reason) {
47
+ super(`Invalid workflow ${workflowId}: ${reason}`);
48
+ this.workflowId = workflowId;
49
+ this.reason = reason;
50
+ this.name = 'InvalidWorkflowError';
51
+ }
52
+ }
53
+ // ============================================================================
54
+ // Workflow Resolver Class
55
+ // ============================================================================
56
+ /**
57
+ * Resolves workflow inheritance chains and merges phases.
58
+ *
59
+ * Merge algorithm (for each phase):
60
+ * 1. Pre-steps: Root ancestor first (reversed chain order)
61
+ * 2. Main steps: Only from child (first in chain)
62
+ * 3. Post-steps: Child first (chain order)
63
+ *
64
+ * Example for default → core:
65
+ * - chain = ["default", "core"] (child first)
66
+ * - pre_steps: core.pre_steps, then default.pre_steps
67
+ * - steps: only default.steps
68
+ * - post_steps: default.post_steps, then core.post_steps
69
+ */
70
+ export class WorkflowResolver {
71
+ marketplaceRoot;
72
+ projectRoot;
73
+ workflowCache = new Map();
74
+ constructor(options = {}) {
75
+ this.marketplaceRoot =
76
+ options.marketplaceRoot ||
77
+ process.env['CLAUDE_MARKETPLACE_ROOT'] ||
78
+ path.join(process.env['HOME'] || os.homedir(), '.claude/plugins/marketplaces');
79
+ this.projectRoot = options.projectRoot || process.cwd();
80
+ }
81
+ /**
82
+ * Sanitize a path component to prevent path traversal attacks.
83
+ * Rejects components containing '..' or absolute path indicators.
84
+ */
85
+ sanitizePathComponent(component, context) {
86
+ // Reject empty components
87
+ if (!component || component.trim() === '') {
88
+ throw new InvalidWorkflowError(component, `${context} cannot be empty`);
89
+ }
90
+ // Reject path traversal sequences
91
+ if (component.includes('..')) {
92
+ throw new InvalidWorkflowError(component, `${context} cannot contain '..' (path traversal attempt)`);
93
+ }
94
+ // Reject absolute paths (Unix or Windows style)
95
+ if (component.startsWith('/') || component.startsWith('\\') || /^[a-zA-Z]:/.test(component)) {
96
+ throw new InvalidWorkflowError(component, `${context} cannot be an absolute path`);
97
+ }
98
+ // Reject null bytes (could bypass checks in some systems)
99
+ if (component.includes('\0')) {
100
+ throw new InvalidWorkflowError(component, `${context} contains invalid characters`);
101
+ }
102
+ return component;
103
+ }
104
+ /**
105
+ * Resolve a workflow by ID, applying inheritance and merging phases.
106
+ */
107
+ async resolveWorkflow(workflowId) {
108
+ // Build inheritance chain (child first, ancestors last)
109
+ const chain = await this.buildInheritanceChain(workflowId);
110
+ // Load child workflow for base metadata
111
+ const childWorkflow = await this.loadWorkflowFile(chain[0]);
112
+ const skipSteps = childWorkflow.skip_steps || [];
113
+ // Merge phases for the entire chain
114
+ const phases = this.mergePhasesForChain(chain, skipSteps);
115
+ // Validate unique step IDs across all phases
116
+ this.validateUniqueStepIds(phases);
117
+ // Build resolved workflow
118
+ const resolved = {
119
+ id: childWorkflow.id,
120
+ description: childWorkflow.description,
121
+ inheritance_chain: chain,
122
+ phases,
123
+ autonomy: childWorkflow.autonomy,
124
+ critical_artifacts: childWorkflow.critical_artifacts,
125
+ integrations: childWorkflow.integrations,
126
+ };
127
+ if (skipSteps.length > 0) {
128
+ resolved.skipped_steps = skipSteps;
129
+ }
130
+ return resolved;
131
+ }
132
+ /**
133
+ * Build the inheritance chain from a workflow ID.
134
+ * Returns array with child first, root ancestor last.
135
+ */
136
+ async buildInheritanceChain(workflowId) {
137
+ const chain = [];
138
+ const visited = new Set();
139
+ let currentId = workflowId;
140
+ while (currentId) {
141
+ // Check for circular inheritance
142
+ if (visited.has(currentId)) {
143
+ throw new CircularInheritanceError(currentId, chain);
144
+ }
145
+ visited.add(currentId);
146
+ chain.push(currentId);
147
+ // Load workflow and get extends
148
+ const workflow = await this.loadWorkflowFile(currentId);
149
+ currentId = workflow.extends;
150
+ }
151
+ return chain;
152
+ }
153
+ /**
154
+ * Load a workflow file by ID.
155
+ * Supports namespace resolution (fractary-faber:, project:, etc.)
156
+ */
157
+ async loadWorkflowFile(workflowId) {
158
+ // Check cache first
159
+ if (this.workflowCache.has(workflowId)) {
160
+ return this.workflowCache.get(workflowId);
161
+ }
162
+ const filePath = this.resolveWorkflowPath(workflowId);
163
+ const searchedPaths = [filePath];
164
+ if (!fs.existsSync(filePath)) {
165
+ // Fallback: if no explicit namespace, try plugin defaults
166
+ if (!workflowId.includes(':')) {
167
+ const fallbackPath = path.join(this.marketplaceRoot, 'fractary-faber/plugins/faber/config/workflows', `${workflowId}.json`);
168
+ searchedPaths.push(fallbackPath);
169
+ if (fs.existsSync(fallbackPath)) {
170
+ return this.loadAndCacheWorkflow(workflowId, fallbackPath);
171
+ }
172
+ }
173
+ throw new WorkflowNotFoundError(workflowId, searchedPaths);
174
+ }
175
+ return this.loadAndCacheWorkflow(workflowId, filePath);
176
+ }
177
+ /**
178
+ * Load and cache a workflow from a file path.
179
+ */
180
+ loadAndCacheWorkflow(workflowId, filePath) {
181
+ try {
182
+ const content = fs.readFileSync(filePath, 'utf-8');
183
+ const workflow = JSON.parse(content);
184
+ this.workflowCache.set(workflowId, workflow);
185
+ return workflow;
186
+ }
187
+ catch (error) {
188
+ if (error instanceof SyntaxError) {
189
+ throw new InvalidWorkflowError(workflowId, `JSON parse error: ${error.message}`);
190
+ }
191
+ throw error;
192
+ }
193
+ }
194
+ /**
195
+ * Resolve a workflow ID to a file path based on namespace.
196
+ * Validates all path components to prevent path traversal attacks.
197
+ */
198
+ resolveWorkflowPath(workflowId) {
199
+ let namespace;
200
+ let workflowName;
201
+ if (workflowId.includes(':')) {
202
+ const parts = workflowId.split(':');
203
+ namespace = parts[0];
204
+ workflowName = parts.slice(1).join(':');
205
+ }
206
+ else {
207
+ namespace = 'project';
208
+ workflowName = workflowId;
209
+ }
210
+ // Sanitize namespace and workflow name to prevent path traversal
211
+ this.sanitizePathComponent(namespace, 'namespace');
212
+ this.sanitizePathComponent(workflowName, 'workflow name');
213
+ switch (namespace) {
214
+ case 'fractary-faber':
215
+ return path.join(this.marketplaceRoot, 'fractary-faber/plugins/faber/config/workflows', `${workflowName}.json`);
216
+ case 'fractary-faber-cloud':
217
+ return path.join(this.marketplaceRoot, 'fractary-faber/plugins/faber-cloud/config/workflows', `${workflowName}.json`);
218
+ case 'fractary-core': {
219
+ // Extract plugin name from workflow_name if it contains slash
220
+ const parts = workflowName.split('/');
221
+ // Sanitize each part individually
222
+ const plugin = this.sanitizePathComponent(parts[0], 'plugin name');
223
+ const workflow = parts.length > 1
224
+ ? this.sanitizePathComponent(parts.slice(1).join('/'), 'workflow name')
225
+ : plugin;
226
+ return path.join(this.marketplaceRoot, `fractary-core/plugins/${plugin}/config/workflows`, `${workflow}.json`);
227
+ }
228
+ case 'fractary-codex':
229
+ return path.join(this.marketplaceRoot, 'fractary-codex/plugins/codex/config/workflows', `${workflowName}.json`);
230
+ case 'project':
231
+ case '':
232
+ return path.join(this.projectRoot, '.fractary/faber/workflows', `${workflowName}.json`);
233
+ default: {
234
+ // Fallback to old unified marketplace for backward compatibility
235
+ // Sanitize the derived plugin name as well
236
+ const pluginName = this.sanitizePathComponent(namespace.replace('fractary-', ''), 'plugin name');
237
+ return path.join(this.marketplaceRoot, `fractary/plugins/${pluginName}/config/workflows`, `${workflowName}.json`);
238
+ }
239
+ }
240
+ }
241
+ /**
242
+ * Merge phases for an entire inheritance chain.
243
+ */
244
+ mergePhasesForChain(chain, skipSteps) {
245
+ const phaseNames = ['frame', 'architect', 'build', 'evaluate', 'release'];
246
+ const phases = {};
247
+ for (const phaseName of phaseNames) {
248
+ const mergedSteps = this.mergePhaseSteps(chain, phaseName);
249
+ const filteredSteps = this.applySkipSteps(mergedSteps, skipSteps);
250
+ // Get phase config from child workflow
251
+ const childWorkflow = this.workflowCache.get(chain[0]);
252
+ const childPhase = childWorkflow.phases?.[phaseName];
253
+ phases[phaseName] = {
254
+ enabled: childPhase?.enabled ?? true,
255
+ description: childPhase?.description,
256
+ steps: filteredSteps,
257
+ require_approval: childPhase?.require_approval,
258
+ max_retries: phaseName === 'evaluate' ? childPhase?.max_retries ?? 3 : undefined,
259
+ };
260
+ }
261
+ return phases;
262
+ }
263
+ /**
264
+ * Merge steps for a single phase across the inheritance chain.
265
+ *
266
+ * Order:
267
+ * 1. Pre-steps: Root ancestor first (reversed chain - index n-1 to 0)
268
+ * 2. Main steps: Only from child (index 0)
269
+ * 3. Post-steps: Child first (chain order - index 0 to n-1)
270
+ */
271
+ mergePhaseSteps(chain, phaseName) {
272
+ const mergedSteps = [];
273
+ // Pre-steps: iterate from root (last in chain) to child (first) - reversed
274
+ for (let i = chain.length - 1; i >= 0; i--) {
275
+ const workflowId = chain[i];
276
+ const workflow = this.workflowCache.get(workflowId);
277
+ const phase = workflow.phases?.[phaseName];
278
+ const preSteps = phase?.pre_steps || [];
279
+ for (const step of preSteps) {
280
+ mergedSteps.push({
281
+ ...step,
282
+ source: workflowId,
283
+ position: 'pre_step',
284
+ });
285
+ }
286
+ }
287
+ // Main steps: only from child (index 0)
288
+ const childWorkflow = this.workflowCache.get(chain[0]);
289
+ const childPhase = childWorkflow.phases?.[phaseName];
290
+ const mainSteps = childPhase?.steps || [];
291
+ for (const step of mainSteps) {
292
+ mergedSteps.push({
293
+ ...step,
294
+ source: chain[0],
295
+ position: 'step',
296
+ });
297
+ }
298
+ // Post-steps: iterate from child (first) to root (last) - chain order
299
+ for (let i = 0; i < chain.length; i++) {
300
+ const workflowId = chain[i];
301
+ const workflow = this.workflowCache.get(workflowId);
302
+ const phase = workflow.phases?.[phaseName];
303
+ const postSteps = phase?.post_steps || [];
304
+ for (const step of postSteps) {
305
+ mergedSteps.push({
306
+ ...step,
307
+ source: workflowId,
308
+ position: 'post_step',
309
+ });
310
+ }
311
+ }
312
+ return mergedSteps;
313
+ }
314
+ /**
315
+ * Apply skip_steps to filter out specified step IDs.
316
+ */
317
+ applySkipSteps(steps, skipSteps) {
318
+ if (!skipSteps || skipSteps.length === 0) {
319
+ return steps;
320
+ }
321
+ const skipSet = new Set(skipSteps);
322
+ return steps.filter((step) => !skipSet.has(step.id));
323
+ }
324
+ /**
325
+ * Validate that all step IDs are unique across all phases.
326
+ */
327
+ validateUniqueStepIds(phases) {
328
+ const allIds = new Map(); // id -> phase
329
+ const duplicates = [];
330
+ for (const [phaseName, phase] of Object.entries(phases)) {
331
+ for (const step of phase.steps) {
332
+ if (allIds.has(step.id)) {
333
+ duplicates.push(`${step.id} (in ${allIds.get(step.id)} and ${phaseName})`);
334
+ }
335
+ else {
336
+ allIds.set(step.id, phaseName);
337
+ }
338
+ }
339
+ }
340
+ if (duplicates.length > 0) {
341
+ throw new DuplicateStepIdError(duplicates);
342
+ }
343
+ }
344
+ /**
345
+ * Clear the workflow cache (useful for testing or reloading)
346
+ */
347
+ clearCache() {
348
+ this.workflowCache.clear();
349
+ }
350
+ }
351
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/workflow/resolver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,106 +1,111 @@
1
- {
2
- "name": "@fractary/faber",
3
- "version": "2.2.1",
4
- "description": "FABER SDK - Development toolkit for AI-assisted workflows",
5
- "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "default": "./dist/index.js"
12
- },
13
- "./work": {
14
- "types": "./dist/work/index.d.ts",
15
- "default": "./dist/work/index.js"
16
- },
17
- "./repo": {
18
- "types": "./dist/repo/index.d.ts",
19
- "default": "./dist/repo/index.js"
20
- },
21
- "./spec": {
22
- "types": "./dist/spec/index.d.ts",
23
- "default": "./dist/spec/index.js"
24
- },
25
- "./logs": {
26
- "types": "./dist/logs/index.d.ts",
27
- "default": "./dist/logs/index.js"
28
- },
29
- "./state": {
30
- "types": "./dist/state/index.d.ts",
31
- "default": "./dist/state/index.js"
32
- },
33
- "./workflow": {
34
- "types": "./dist/workflow/index.d.ts",
35
- "default": "./dist/workflow/index.js"
36
- },
37
- "./storage": {
38
- "types": "./dist/storage/index.d.ts",
39
- "default": "./dist/storage/index.js"
40
- },
41
- "./agents": {
42
- "types": "./dist/agents/index.d.ts",
43
- "default": "./dist/agents/index.js"
44
- }
45
- },
46
- "files": [
47
- "dist",
48
- "README.md",
49
- "LICENSE"
50
- ],
51
- "scripts": {
52
- "dev": "tsc --watch",
53
- "build": "tsc",
54
- "test": "jest",
55
- "test:watch": "jest --watch",
56
- "lint": "eslint src --ext .ts",
57
- "typecheck": "tsc --noEmit",
58
- "prepublishOnly": "npm run build"
59
- },
60
- "keywords": [
61
- "faber",
62
- "workflow",
63
- "sdk",
64
- "ai",
65
- "development",
66
- "automation",
67
- "github",
68
- "jira",
69
- "linear",
70
- "git"
71
- ],
72
- "author": "Fractary Team",
73
- "license": "MIT",
74
- "publishConfig": {
75
- "access": "public"
76
- },
77
- "dependencies": {
78
- "@fractary/forge": "^1.1.4",
79
- "commander": "^12.0.0",
80
- "js-yaml": "^4.1.1",
81
- "zod": "^3.22.4"
82
- },
83
- "devDependencies": {
84
- "@types/jest": "^30.0.0",
85
- "@types/js-yaml": "^4.0.9",
86
- "@types/node": "^20.19.26",
87
- "@typescript-eslint/eslint-plugin": "^6.19.0",
88
- "@typescript-eslint/parser": "^6.19.0",
89
- "eslint": "^8.56.0",
90
- "jest": "^29.7.0",
91
- "ts-jest": "^29.1.1",
92
- "ts-node": "^10.9.2",
93
- "typescript": "^5.3.3"
94
- },
95
- "engines": {
96
- "node": ">=18.0.0"
97
- },
98
- "repository": {
99
- "type": "git",
100
- "url": "git+https://github.com/fractary/faber.git"
101
- },
102
- "bugs": {
103
- "url": "https://github.com/fractary/faber/issues"
104
- },
105
- "homepage": "https://github.com/fractary/faber#readme"
106
- }
1
+ {
2
+ "name": "@fractary/faber",
3
+ "version": "2.3.4",
4
+ "description": "FABER SDK - Development toolkit for AI-assisted workflows",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./work": {
14
+ "types": "./dist/work/index.d.ts",
15
+ "default": "./dist/work/index.js"
16
+ },
17
+ "./repo": {
18
+ "types": "./dist/repo/index.d.ts",
19
+ "default": "./dist/repo/index.js"
20
+ },
21
+ "./spec": {
22
+ "types": "./dist/spec/index.d.ts",
23
+ "default": "./dist/spec/index.js"
24
+ },
25
+ "./logs": {
26
+ "types": "./dist/logs/index.d.ts",
27
+ "default": "./dist/logs/index.js"
28
+ },
29
+ "./state": {
30
+ "types": "./dist/state/index.d.ts",
31
+ "default": "./dist/state/index.js"
32
+ },
33
+ "./workflow": {
34
+ "types": "./dist/workflow/index.d.ts",
35
+ "default": "./dist/workflow/index.js"
36
+ },
37
+ "./storage": {
38
+ "types": "./dist/storage/index.d.ts",
39
+ "default": "./dist/storage/index.js"
40
+ },
41
+ "./agents": {
42
+ "types": "./dist/agents/index.d.ts",
43
+ "default": "./dist/agents/index.js"
44
+ },
45
+ "./auth": {
46
+ "types": "./dist/auth/index.d.ts",
47
+ "default": "./dist/auth/index.js"
48
+ }
49
+ },
50
+ "files": [
51
+ "dist",
52
+ "README.md",
53
+ "LICENSE"
54
+ ],
55
+ "scripts": {
56
+ "dev": "tsc --watch",
57
+ "build": "tsc",
58
+ "test": "jest",
59
+ "test:watch": "jest --watch",
60
+ "lint": "eslint src --ext .ts",
61
+ "typecheck": "tsc --noEmit",
62
+ "prepublishOnly": "npm run build"
63
+ },
64
+ "keywords": [
65
+ "faber",
66
+ "workflow",
67
+ "sdk",
68
+ "ai",
69
+ "development",
70
+ "automation",
71
+ "github",
72
+ "jira",
73
+ "linear",
74
+ "git"
75
+ ],
76
+ "author": "Fractary Team",
77
+ "license": "MIT",
78
+ "publishConfig": {
79
+ "access": "public"
80
+ },
81
+ "dependencies": {
82
+ "commander": "^12.0.0",
83
+ "js-yaml": "^4.1.1",
84
+ "jsonwebtoken": "^9.0.0",
85
+ "zod": "^3.22.4"
86
+ },
87
+ "devDependencies": {
88
+ "@types/jest": "^30.0.0",
89
+ "@types/js-yaml": "^4.0.9",
90
+ "@types/jsonwebtoken": "^9.0.0",
91
+ "@types/node": "^20.19.26",
92
+ "@typescript-eslint/eslint-plugin": "^6.19.0",
93
+ "@typescript-eslint/parser": "^6.19.0",
94
+ "eslint": "^8.56.0",
95
+ "jest": "^29.7.0",
96
+ "ts-jest": "^29.1.1",
97
+ "ts-node": "^10.9.2",
98
+ "typescript": "^5.3.3"
99
+ },
100
+ "engines": {
101
+ "node": ">=18.0.0"
102
+ },
103
+ "repository": {
104
+ "type": "git",
105
+ "url": "git+https://github.com/fractary/faber.git"
106
+ },
107
+ "bugs": {
108
+ "url": "https://github.com/fractary/faber/issues"
109
+ },
110
+ "homepage": "https://github.com/fractary/faber#readme"
111
+ }