@fractary/faber-cli 1.5.8 → 1.5.12
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.
- package/README.md +20 -273
- package/dist/commands/auth/index.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -8
- package/dist/lib/anthropic-client.d.ts +0 -4
- package/dist/lib/anthropic-client.d.ts.map +1 -1
- package/dist/lib/anthropic-client.js +9 -19
- package/dist/lib/github-app-setup.d.ts +0 -6
- package/dist/lib/github-app-setup.d.ts.map +1 -1
- package/dist/lib/github-app-setup.js +0 -9
- package/package.json +3 -2
- package/schemas/plan.schema.json +230 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @fractary/faber-cli
|
|
2
2
|
|
|
3
|
-
Command-line interface for FABER development toolkit.
|
|
3
|
+
Command-line interface for FABER development toolkit.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -16,205 +16,35 @@ npx @fractary/faber-cli --help
|
|
|
16
16
|
|
|
17
17
|
## Quick Start
|
|
18
18
|
|
|
19
|
-
### 1.
|
|
19
|
+
### 1. Authenticate
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install -g @fractary/faber-cli
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Or use directly with `npx`:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx @fractary/faber-cli --help
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### 2. Authenticate with GitHub
|
|
32
|
-
|
|
33
|
-
**Option A: Automated Setup (Recommended)**
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
cd your-project
|
|
37
22
|
fractary-faber auth setup
|
|
38
23
|
```
|
|
39
24
|
|
|
40
|
-
|
|
41
|
-
1. Detect your GitHub organization and repository
|
|
42
|
-
2. Show you a URL to create a GitHub App
|
|
43
|
-
3. Guide you through copying the authorization code
|
|
44
|
-
4. Automatically configure FABER CLI
|
|
45
|
-
|
|
46
|
-
All in ~30 seconds!
|
|
47
|
-
|
|
48
|
-
**Option B: Manual Setup**
|
|
49
|
-
|
|
50
|
-
See [GitHub App Setup Guide](../docs/github-app-setup.md) for detailed manual instructions.
|
|
51
|
-
|
|
52
|
-
### 3. Initialize a FABER project
|
|
25
|
+
### 2. Initialize
|
|
53
26
|
|
|
54
27
|
```bash
|
|
55
28
|
fractary-faber init
|
|
56
|
-
fractary-faber init --preset minimal
|
|
57
|
-
fractary-faber init --preset enterprise
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Workflow Commands
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
# Start a FABER workflow
|
|
64
|
-
fractary-faber run --work-id 123
|
|
65
|
-
|
|
66
|
-
# Check workflow status
|
|
67
|
-
fractary-faber status
|
|
68
|
-
fractary-faber status --workflow-id <id>
|
|
69
|
-
|
|
70
|
-
# Pause/resume workflows
|
|
71
|
-
fractary-faber pause <workflow-id>
|
|
72
|
-
fractary-faber resume <workflow-id>
|
|
73
|
-
|
|
74
|
-
# Recover from checkpoint
|
|
75
|
-
fractary-faber recover <workflow-id>
|
|
76
|
-
|
|
77
|
-
# Clean up old workflows
|
|
78
|
-
fractary-faber cleanup --max-age 30
|
|
79
29
|
```
|
|
80
30
|
|
|
81
|
-
###
|
|
31
|
+
### 3. Run a Workflow
|
|
82
32
|
|
|
83
33
|
```bash
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
fractary-faber
|
|
87
|
-
fractary-faber work issue update 123 --title "Updated"
|
|
88
|
-
fractary-faber work issue close 123
|
|
89
|
-
fractary-faber work issue search --query "bug fix"
|
|
90
|
-
|
|
91
|
-
# Comment operations
|
|
92
|
-
fractary-faber work comment create 123 --body "This is a comment"
|
|
93
|
-
fractary-faber work comment list 123
|
|
94
|
-
|
|
95
|
-
# Label operations
|
|
96
|
-
fractary-faber work label add 123 --label "bug,critical"
|
|
97
|
-
fractary-faber work label remove 123 --label "wontfix"
|
|
98
|
-
fractary-faber work label list
|
|
99
|
-
|
|
100
|
-
# Milestone operations
|
|
101
|
-
fractary-faber work milestone create --title "v1.0" --due-on "2025-12-31"
|
|
102
|
-
fractary-faber work milestone list
|
|
103
|
-
fractary-faber work milestone set 123 --milestone "v1.0"
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Repository Commands
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# Branch operations
|
|
110
|
-
fractary-faber repo branch create "feat/new-feature"
|
|
111
|
-
fractary-faber repo branch list
|
|
112
|
-
fractary-faber repo branch delete feat/old-feature
|
|
113
|
-
|
|
114
|
-
# Commit operations
|
|
115
|
-
fractary-faber repo commit "feat: add new feature"
|
|
116
|
-
|
|
117
|
-
# Pull request operations
|
|
118
|
-
fractary-faber repo pr create "Add new feature" --body "Description"
|
|
119
|
-
fractary-faber repo pr list
|
|
120
|
-
fractary-faber repo pr merge 42
|
|
121
|
-
fractary-faber repo pr review 42
|
|
122
|
-
|
|
123
|
-
# Tag operations
|
|
124
|
-
fractary-faber repo tag create v1.0.0
|
|
125
|
-
fractary-faber repo tag push v1.0.0
|
|
126
|
-
fractary-faber repo tag list
|
|
127
|
-
|
|
128
|
-
# Worktree operations
|
|
129
|
-
fractary-faber repo worktree create feat/new-feature
|
|
130
|
-
fractary-faber repo worktree list
|
|
131
|
-
fractary-faber repo worktree remove feat/new-feature
|
|
34
|
+
faber plan --work-id 123
|
|
35
|
+
cd ~/.claude-worktrees/{org}-{project}-123
|
|
36
|
+
/fractary-faber:workflow-run 123
|
|
132
37
|
```
|
|
133
38
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```bash
|
|
137
|
-
# Create specifications
|
|
138
|
-
fractary-faber spec create "My Specification"
|
|
139
|
-
|
|
140
|
-
# Get specification
|
|
141
|
-
fractary-faber spec get <id>
|
|
142
|
-
|
|
143
|
-
# List specifications
|
|
144
|
-
fractary-faber spec list
|
|
145
|
-
|
|
146
|
-
# Update specification
|
|
147
|
-
fractary-faber spec update <id> --title "Updated"
|
|
148
|
-
|
|
149
|
-
# Validate specification
|
|
150
|
-
fractary-faber spec validate <id>
|
|
151
|
-
|
|
152
|
-
# Refine specification
|
|
153
|
-
fractary-faber spec refine <id>
|
|
154
|
-
|
|
155
|
-
# Delete specification
|
|
156
|
-
fractary-faber spec delete <id>
|
|
157
|
-
```
|
|
39
|
+
## Commands
|
|
158
40
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
fractary-faber logs stop <session-id>
|
|
167
|
-
|
|
168
|
-
# Write logs
|
|
169
|
-
fractary-faber logs write --message "Log message"
|
|
170
|
-
|
|
171
|
-
# Read logs
|
|
172
|
-
fractary-faber logs read <session-id>
|
|
173
|
-
|
|
174
|
-
# Search logs
|
|
175
|
-
fractary-faber logs search --query "error"
|
|
176
|
-
|
|
177
|
-
# List logs
|
|
178
|
-
fractary-faber logs list
|
|
179
|
-
|
|
180
|
-
# Archive logs
|
|
181
|
-
fractary-faber logs archive --older-than 30
|
|
182
|
-
|
|
183
|
-
# Delete logs
|
|
184
|
-
fractary-faber logs delete <session-id>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## Configuration
|
|
188
|
-
|
|
189
|
-
FABER is configured via `.fractary/faber/config.json`:
|
|
190
|
-
|
|
191
|
-
```json
|
|
192
|
-
{
|
|
193
|
-
"version": "1.0.0",
|
|
194
|
-
"preset": "default",
|
|
195
|
-
"work": {
|
|
196
|
-
"provider": "github"
|
|
197
|
-
},
|
|
198
|
-
"repo": {
|
|
199
|
-
"provider": "github",
|
|
200
|
-
"defaultBranch": "main"
|
|
201
|
-
},
|
|
202
|
-
"spec": {
|
|
203
|
-
"directory": ".fractary/faber/specs"
|
|
204
|
-
},
|
|
205
|
-
"logs": {
|
|
206
|
-
"directory": ".fractary/faber/logs"
|
|
207
|
-
},
|
|
208
|
-
"workflow": {
|
|
209
|
-
"defaultAutonomy": "guarded",
|
|
210
|
-
"phases": ["frame", "architect", "build", "evaluate", "release"],
|
|
211
|
-
"checkpoints": true
|
|
212
|
-
},
|
|
213
|
-
"state": {
|
|
214
|
-
"directory": ".fractary/faber/state"
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
```
|
|
41
|
+
| Category | Commands |
|
|
42
|
+
|----------|----------|
|
|
43
|
+
| **Workflow** | `run`, `status`, `pause`, `resume`, `recover`, `cleanup` |
|
|
44
|
+
| **Work** | `issue`, `comment`, `label`, `milestone` |
|
|
45
|
+
| **Repo** | `branch`, `commit`, `pr`, `tag`, `worktree` |
|
|
46
|
+
| **Spec** | `create`, `get`, `list`, `validate`, `refine` |
|
|
47
|
+
| **Logs** | `capture`, `stop`, `read`, `search`, `archive` |
|
|
218
48
|
|
|
219
49
|
## Options
|
|
220
50
|
|
|
@@ -224,96 +54,13 @@ All commands support:
|
|
|
224
54
|
- `--debug` - Enable debug output
|
|
225
55
|
- `--help` - Show command help
|
|
226
56
|
|
|
227
|
-
##
|
|
228
|
-
|
|
229
|
-
### GitHub App Authentication (Recommended)
|
|
230
|
-
|
|
231
|
-
For enhanced security, audit trails, and enterprise readiness, use GitHub App authentication instead of Personal Access Tokens.
|
|
232
|
-
|
|
233
|
-
**Quick Setup (Automated):**
|
|
234
|
-
|
|
235
|
-
```bash
|
|
236
|
-
fractary-faber auth setup
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
This command will guide you through creating and configuring a GitHub App in ~30 seconds.
|
|
240
|
-
|
|
241
|
-
**Manual Configuration (`.fractary/settings.json`):**
|
|
242
|
-
```json
|
|
243
|
-
{
|
|
244
|
-
"github": {
|
|
245
|
-
"organization": "your-org",
|
|
246
|
-
"project": "your-repo",
|
|
247
|
-
"app": {
|
|
248
|
-
"id": "123456",
|
|
249
|
-
"installation_id": "12345678",
|
|
250
|
-
"private_key_path": "~/.github/faber-app.pem"
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
**For CI/CD (environment variable):**
|
|
257
|
-
```json
|
|
258
|
-
{
|
|
259
|
-
"github": {
|
|
260
|
-
"organization": "your-org",
|
|
261
|
-
"project": "your-repo",
|
|
262
|
-
"app": {
|
|
263
|
-
"id": "123456",
|
|
264
|
-
"installation_id": "12345678",
|
|
265
|
-
"private_key_env_var": "GITHUB_APP_PRIVATE_KEY"
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
```bash
|
|
272
|
-
export GITHUB_APP_PRIVATE_KEY=$(cat ~/.github/faber-app.pem | base64)
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**See detailed setup guide:** [docs/github-app-setup.md](../docs/github-app-setup.md)
|
|
276
|
-
|
|
277
|
-
### Personal Access Token (Legacy)
|
|
278
|
-
|
|
279
|
-
Still supported for backward compatibility:
|
|
280
|
-
|
|
281
|
-
```bash
|
|
282
|
-
export GITHUB_TOKEN=<token>
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
Or in `.fractary/settings.json`:
|
|
286
|
-
```json
|
|
287
|
-
{
|
|
288
|
-
"github": {
|
|
289
|
-
"token": "ghp_xxxxxxxxxxxx",
|
|
290
|
-
"organization": "your-org",
|
|
291
|
-
"project": "your-repo"
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### Other Providers
|
|
297
|
-
|
|
298
|
-
```bash
|
|
299
|
-
# Jira
|
|
300
|
-
export JIRA_BASE_URL=<url>
|
|
301
|
-
export JIRA_USERNAME=<username>
|
|
302
|
-
export JIRA_API_TOKEN=<token>
|
|
303
|
-
|
|
304
|
-
# Linear
|
|
305
|
-
export LINEAR_API_KEY=<key>
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
## Architecture
|
|
57
|
+
## Documentation
|
|
309
58
|
|
|
310
|
-
|
|
59
|
+
For complete documentation, see:
|
|
311
60
|
|
|
312
|
-
|
|
313
|
-
-
|
|
314
|
-
-
|
|
315
|
-
- Located: `/cli` at root of repository
|
|
316
|
-
- Depends on: `@fractary/faber` SDK
|
|
61
|
+
- **[Commands Reference](../docs/cli/commands.md)** - All commands
|
|
62
|
+
- **[Authentication Guide](../docs/cli/authentication.md)** - GitHub App and PAT setup
|
|
63
|
+
- **[Configuration Guide](../docs/guides/configuration.md)** - Configuration options
|
|
317
64
|
|
|
318
65
|
## License
|
|
319
66
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAehD;AAojBD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAyKxC"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,6 @@ import chalk from 'chalk';
|
|
|
13
13
|
import { createRunCommand, createStatusCommand, createResumeCommand, createPauseCommand, createRecoverCommand, createCleanupCommand } from './commands/workflow/index.js';
|
|
14
14
|
import { createWorkCommand } from './commands/work/index.js';
|
|
15
15
|
import { createRepoCommand } from './commands/repo/index.js';
|
|
16
|
-
import { createSpecCommand } from './commands/spec/index.js';
|
|
17
16
|
import { createLogsCommand } from './commands/logs/index.js';
|
|
18
17
|
import { createInitCommand } from './commands/init.js';
|
|
19
18
|
import { createMigrateCommand } from './commands/migrate.js';
|
|
@@ -23,15 +22,14 @@ import { createAuthCommand } from './commands/auth/index.js';
|
|
|
23
22
|
if (process.stdout.isTTY) {
|
|
24
23
|
process.stdout._handle?.setBlocking?.(true);
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
const version = '1.5.8';
|
|
25
|
+
const version = '1.5.12';
|
|
28
26
|
/**
|
|
29
27
|
* Create and configure the main CLI program
|
|
30
28
|
*/
|
|
31
29
|
export function createFaberCLI() {
|
|
32
30
|
const program = new Command('fractary-faber');
|
|
33
31
|
program
|
|
34
|
-
.description('FABER development toolkit (workflow, work, repo,
|
|
32
|
+
.description('FABER development toolkit (workflow, work, repo, logs, auth)')
|
|
35
33
|
.version(version)
|
|
36
34
|
.enablePositionalOptions();
|
|
37
35
|
// Global options
|
|
@@ -153,7 +151,6 @@ export function createFaberCLI() {
|
|
|
153
151
|
program.addCommand(createAuthCommand());
|
|
154
152
|
program.addCommand(createWorkCommand());
|
|
155
153
|
program.addCommand(createRepoCommand());
|
|
156
|
-
program.addCommand(createSpecCommand());
|
|
157
154
|
program.addCommand(createLogsCommand());
|
|
158
155
|
// Help command
|
|
159
156
|
program.addCommand(new Command('help')
|
|
@@ -172,11 +169,8 @@ export function createFaberCLI() {
|
|
|
172
169
|
const isMainModule = import.meta.url === `file://${process.argv[1]}` ||
|
|
173
170
|
process.argv[1]?.endsWith('fractary-faber');
|
|
174
171
|
if (isMainModule) {
|
|
175
|
-
console.error('[DEBUG] Creating CLI program');
|
|
176
172
|
const program = createFaberCLI();
|
|
177
|
-
console.error('[DEBUG] Parsing argv');
|
|
178
173
|
program.parse(process.argv);
|
|
179
|
-
console.error('[DEBUG] Parse complete');
|
|
180
174
|
// Show help if no command provided
|
|
181
175
|
if (!process.argv.slice(2).length) {
|
|
182
176
|
program.outputHelp();
|
|
@@ -48,10 +48,6 @@ export declare class AnthropicClient {
|
|
|
48
48
|
* Generate workflow plan via Claude API
|
|
49
49
|
*/
|
|
50
50
|
generatePlan(input: GeneratePlanInput): Promise<WorkflowPlan>;
|
|
51
|
-
/**
|
|
52
|
-
* Load workflow configuration
|
|
53
|
-
*/
|
|
54
|
-
private loadWorkflowConfig;
|
|
55
51
|
/**
|
|
56
52
|
* Construct planning prompt for Claude
|
|
57
53
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-client.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAK5D,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,UAAU,CAAM;gBAEZ,MAAM,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"anthropic-client.d.ts","sourceRoot":"","sources":["../../src/lib/anthropic-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAK5D,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,UAAU,CAAM;gBAEZ,MAAM,EAAE,iBAAiB;IAiBrC;;OAEG;YACW,cAAc;IAiB5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA8DnE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqD/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;YACW,eAAe;CAqB9B"}
|
|
@@ -8,7 +8,7 @@ import Ajv from 'ajv';
|
|
|
8
8
|
import fs from 'fs/promises';
|
|
9
9
|
import path from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
|
-
import { Git } from '@fractary/faber';
|
|
11
|
+
import { Git, WorkflowResolver } from '@fractary/faber';
|
|
12
12
|
import { validateJsonSize } from '../utils/validation.js';
|
|
13
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
14
|
const __dirname = path.dirname(__filename);
|
|
@@ -19,7 +19,9 @@ export class AnthropicClient {
|
|
|
19
19
|
constructor(config) {
|
|
20
20
|
this.config = config;
|
|
21
21
|
this.git = new Git();
|
|
22
|
-
|
|
22
|
+
// validateFormats: false suppresses warnings about unknown formats (uri, date-time)
|
|
23
|
+
// These formats are used for documentation, not strict validation
|
|
24
|
+
this.ajv = new Ajv({ strict: false, validateFormats: false });
|
|
23
25
|
const apiKey = config.anthropic?.api_key;
|
|
24
26
|
if (!apiKey) {
|
|
25
27
|
throw new Error('Anthropic API key not found. Set ANTHROPIC_API_KEY environment variable.');
|
|
@@ -36,8 +38,8 @@ export class AnthropicClient {
|
|
|
36
38
|
return; // Already loaded
|
|
37
39
|
}
|
|
38
40
|
try {
|
|
39
|
-
// Schema
|
|
40
|
-
const schemaPath = path.resolve(__dirname, '
|
|
41
|
+
// Schema bundled with CLI package (cli/schemas/plan.schema.json)
|
|
42
|
+
const schemaPath = path.resolve(__dirname, '../../schemas/plan.schema.json');
|
|
41
43
|
const schemaContent = await fs.readFile(schemaPath, 'utf8');
|
|
42
44
|
this.planSchema = JSON.parse(schemaContent);
|
|
43
45
|
}
|
|
@@ -68,8 +70,9 @@ export class AnthropicClient {
|
|
|
68
70
|
async generatePlan(input) {
|
|
69
71
|
// Load plan schema for validation
|
|
70
72
|
await this.loadPlanSchema();
|
|
71
|
-
//
|
|
72
|
-
const
|
|
73
|
+
// Resolve workflow with inheritance (uses SDK WorkflowResolver)
|
|
74
|
+
const resolver = new WorkflowResolver({ projectRoot: process.cwd() });
|
|
75
|
+
const workflowConfig = await resolver.resolveWorkflow(input.workflow);
|
|
73
76
|
// Generate plan ID
|
|
74
77
|
const timestamp = new Date().toISOString().replace(/[-:]/g, '').replace(/\.\d+Z/, '').replace('T', '-');
|
|
75
78
|
const planId = `fractary-faber-${input.issueNumber}-${timestamp}`;
|
|
@@ -115,19 +118,6 @@ export class AnthropicClient {
|
|
|
115
118
|
this.validatePlan(plan);
|
|
116
119
|
return plan;
|
|
117
120
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Load workflow configuration
|
|
120
|
-
*/
|
|
121
|
-
async loadWorkflowConfig(workflow) {
|
|
122
|
-
const workflowPath = path.join(this.config.workflow?.config_path || './plugins/faber/config/workflows', `${workflow}.json`);
|
|
123
|
-
try {
|
|
124
|
-
const content = await fs.readFile(workflowPath, 'utf-8');
|
|
125
|
-
return JSON.parse(content);
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
throw new Error(`Failed to load workflow config: ${workflow} (${workflowPath})`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
121
|
/**
|
|
132
122
|
* Construct planning prompt for Claude
|
|
133
123
|
*/
|
|
@@ -92,12 +92,6 @@ export declare function generateAppManifest(config: ManifestConfig): GitHubAppMa
|
|
|
92
92
|
* @returns HTML content ready to save to file
|
|
93
93
|
*/
|
|
94
94
|
export declare function generateManifestHtml(manifest: GitHubAppManifest, organization: string): string;
|
|
95
|
-
/**
|
|
96
|
-
* Generate GitHub App creation URL (legacy - prefer generateManifestHtml)
|
|
97
|
-
*
|
|
98
|
-
* @deprecated Use generateManifestHtml() instead for proper manifest flow
|
|
99
|
-
*/
|
|
100
|
-
export declare function getManifestCreationUrl(manifest: GitHubAppManifest): string;
|
|
101
95
|
/**
|
|
102
96
|
* Exchange manifest code for app credentials
|
|
103
97
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-app-setup.d.ts","sourceRoot":"","sources":["../../src/lib/github-app-setup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB,EAAE;QACnB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAC3B,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QACzB,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAqBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAqB7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EAAE,MAAM,GACnB,MAAM,CAiHR;AAED
|
|
1
|
+
{"version":3,"file":"github-app-setup.d.ts","sourceRoot":"","sources":["../../src/lib/github-app-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -155,15 +155,6 @@ export function generateManifestHtml(manifest, organization) {
|
|
|
155
155
|
</body>
|
|
156
156
|
</html>`;
|
|
157
157
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Generate GitHub App creation URL (legacy - prefer generateManifestHtml)
|
|
160
|
-
*
|
|
161
|
-
* @deprecated Use generateManifestHtml() instead for proper manifest flow
|
|
162
|
-
*/
|
|
163
|
-
export function getManifestCreationUrl(manifest) {
|
|
164
|
-
// For backward compatibility, return the basic GitHub App creation page
|
|
165
|
-
return 'https://github.com/settings/apps/new';
|
|
166
|
-
}
|
|
167
158
|
/**
|
|
168
159
|
* Exchange manifest code for app credentials
|
|
169
160
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fractary/faber-cli",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.12",
|
|
4
4
|
"description": "FABER CLI - Command-line interface for FABER development toolkit",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"type": "module",
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
|
+
"schemas",
|
|
12
13
|
"README.md",
|
|
13
14
|
"LICENSE"
|
|
14
15
|
],
|
|
@@ -37,7 +38,7 @@
|
|
|
37
38
|
},
|
|
38
39
|
"dependencies": {
|
|
39
40
|
"@fractary/core": "^0.5.0",
|
|
40
|
-
"@fractary/faber": "^2.
|
|
41
|
+
"@fractary/faber": "^2.3.0",
|
|
41
42
|
"ajv": "^8.12.0",
|
|
42
43
|
"chalk": "^5.0.0",
|
|
43
44
|
"commander": "^12.0.0",
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/fractary/faber/main/plugins/faber/config/schemas/plan.schema.json",
|
|
4
|
+
"title": "FABER Plan Schema",
|
|
5
|
+
"description": "JSON Schema for FABER workflow plans generated by CLI or Claude plugin",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["plan_id", "created_by", "created_at", "workflow", "phases"],
|
|
8
|
+
"additionalProperties": true,
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"format": "uri",
|
|
13
|
+
"description": "JSON Schema reference for IDE validation"
|
|
14
|
+
},
|
|
15
|
+
"plan_id": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"pattern": "^fractary-faber-[0-9]+-[0-9]{8}-[0-9]{6}$",
|
|
18
|
+
"description": "Unique plan identifier (format: fractary-faber-{work-id}-{YYYYMMDD}-{HHMMSS})",
|
|
19
|
+
"examples": ["fractary-faber-258-20260106-143022"]
|
|
20
|
+
},
|
|
21
|
+
"created_by": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"enum": ["cli", "claude", "api"],
|
|
24
|
+
"description": "Tool that created the plan"
|
|
25
|
+
},
|
|
26
|
+
"cli_version": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
29
|
+
"description": "Version of CLI that created the plan (if created_by: cli)",
|
|
30
|
+
"examples": ["3.4.0"]
|
|
31
|
+
},
|
|
32
|
+
"created_at": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"format": "date-time",
|
|
35
|
+
"description": "ISO 8601 timestamp when plan was created"
|
|
36
|
+
},
|
|
37
|
+
"issue": {
|
|
38
|
+
"type": "object",
|
|
39
|
+
"required": ["source", "id"],
|
|
40
|
+
"description": "Issue metadata - links plan to originating work item",
|
|
41
|
+
"properties": {
|
|
42
|
+
"source": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"enum": ["github", "jira", "linear", "manual"],
|
|
45
|
+
"description": "Issue tracking system"
|
|
46
|
+
},
|
|
47
|
+
"id": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "Issue identifier (e.g., issue number)"
|
|
50
|
+
},
|
|
51
|
+
"url": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"format": "uri",
|
|
54
|
+
"description": "Full URL to issue"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"branch": {
|
|
59
|
+
"type": "string",
|
|
60
|
+
"description": "Git branch name for this workflow (e.g., feature/258)"
|
|
61
|
+
},
|
|
62
|
+
"worktree": {
|
|
63
|
+
"type": "string",
|
|
64
|
+
"description": "Git worktree path (e.g., ~/.claude-worktrees/fractary-myproject-258)"
|
|
65
|
+
},
|
|
66
|
+
"workflow": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"description": "Workflow type identifier (e.g., etl, bugfix, core)"
|
|
69
|
+
},
|
|
70
|
+
"overall_complexity": {
|
|
71
|
+
"type": "string",
|
|
72
|
+
"enum": ["low", "medium", "high"],
|
|
73
|
+
"description": "Overall estimated complexity"
|
|
74
|
+
},
|
|
75
|
+
"estimated_phases": {
|
|
76
|
+
"type": "integer",
|
|
77
|
+
"minimum": 1,
|
|
78
|
+
"description": "Estimated number of phases to complete"
|
|
79
|
+
},
|
|
80
|
+
"special_considerations": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": {
|
|
83
|
+
"type": "string"
|
|
84
|
+
},
|
|
85
|
+
"description": "Special notes or warnings for this workflow"
|
|
86
|
+
},
|
|
87
|
+
"phases": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"description": "Ordered list of workflow phases",
|
|
90
|
+
"items": {
|
|
91
|
+
"$ref": "#/definitions/phase"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"metadata": {
|
|
95
|
+
"type": "object",
|
|
96
|
+
"description": "Additional metadata (flexible)",
|
|
97
|
+
"properties": {
|
|
98
|
+
"org": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"description": "GitHub organization"
|
|
101
|
+
},
|
|
102
|
+
"project": {
|
|
103
|
+
"type": "string",
|
|
104
|
+
"description": "Project/repository name"
|
|
105
|
+
},
|
|
106
|
+
"subproject": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"description": "Subproject identifier (optional)"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"autonomy": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"enum": ["supervised", "assisted", "autonomous", "guarded"],
|
|
115
|
+
"description": "Autonomy level for workflow execution"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"definitions": {
|
|
119
|
+
"phase": {
|
|
120
|
+
"type": "object",
|
|
121
|
+
"required": ["phase", "description", "steps"],
|
|
122
|
+
"properties": {
|
|
123
|
+
"phase": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Phase identifier (e.g., frame, architect, build, evaluate, release)"
|
|
126
|
+
},
|
|
127
|
+
"description": {
|
|
128
|
+
"type": "string",
|
|
129
|
+
"description": "What this phase accomplishes"
|
|
130
|
+
},
|
|
131
|
+
"steps": {
|
|
132
|
+
"type": "array",
|
|
133
|
+
"description": "Specific steps for this phase",
|
|
134
|
+
"items": {
|
|
135
|
+
"$ref": "#/definitions/step"
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"success_criteria": {
|
|
139
|
+
"type": "array",
|
|
140
|
+
"description": "Criteria to verify phase completion",
|
|
141
|
+
"items": {
|
|
142
|
+
"type": "string"
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"complexity": {
|
|
146
|
+
"type": "string",
|
|
147
|
+
"enum": ["low", "medium", "high"],
|
|
148
|
+
"description": "Phase complexity estimate"
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"step": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"required": ["action"],
|
|
155
|
+
"properties": {
|
|
156
|
+
"action": {
|
|
157
|
+
"type": "string",
|
|
158
|
+
"description": "Specific action to take"
|
|
159
|
+
},
|
|
160
|
+
"details": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"description": "Additional context or requirements"
|
|
163
|
+
},
|
|
164
|
+
"command": {
|
|
165
|
+
"type": ["string", "null"],
|
|
166
|
+
"description": "Shell command to execute (optional)"
|
|
167
|
+
},
|
|
168
|
+
"prompt": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"description": "LLM prompt for this step (optional)"
|
|
171
|
+
},
|
|
172
|
+
"artifacts": {
|
|
173
|
+
"type": "object",
|
|
174
|
+
"description": "Expected artifacts from this step"
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
"examples": [
|
|
180
|
+
{
|
|
181
|
+
"plan_id": "fractary-faber-258-20260106-143022",
|
|
182
|
+
"created_by": "cli",
|
|
183
|
+
"cli_version": "3.4.0",
|
|
184
|
+
"created_at": "2026-01-06T14:30:22Z",
|
|
185
|
+
"issue": {
|
|
186
|
+
"source": "github",
|
|
187
|
+
"id": "258",
|
|
188
|
+
"url": "https://github.com/fractary/myproject/issues/258"
|
|
189
|
+
},
|
|
190
|
+
"branch": "feature/258",
|
|
191
|
+
"worktree": "~/.claude-worktrees/fractary-myproject-258",
|
|
192
|
+
"workflow": "etl",
|
|
193
|
+
"overall_complexity": "medium",
|
|
194
|
+
"estimated_phases": 5,
|
|
195
|
+
"phases": [
|
|
196
|
+
{
|
|
197
|
+
"phase": "frame",
|
|
198
|
+
"description": "Understand requirements and plan approach",
|
|
199
|
+
"steps": [
|
|
200
|
+
{
|
|
201
|
+
"action": "Read issue description and extract requirements",
|
|
202
|
+
"details": "Identify data source, target format, and validation rules"
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"success_criteria": [
|
|
206
|
+
"Requirements documented",
|
|
207
|
+
"Data source identified"
|
|
208
|
+
],
|
|
209
|
+
"complexity": "low"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"phase": "architect",
|
|
213
|
+
"description": "Design ETL pipeline architecture",
|
|
214
|
+
"steps": [
|
|
215
|
+
{
|
|
216
|
+
"action": "Design data transformation logic",
|
|
217
|
+
"details": "Map source fields to target schema"
|
|
218
|
+
}
|
|
219
|
+
],
|
|
220
|
+
"success_criteria": [
|
|
221
|
+
"Architecture documented",
|
|
222
|
+
"Data flow mapped"
|
|
223
|
+
],
|
|
224
|
+
"complexity": "medium"
|
|
225
|
+
}
|
|
226
|
+
],
|
|
227
|
+
"autonomy": "supervised"
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
}
|