@pennyfarthing/core 6.6.2 → 7.0.2
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 +22 -14
- package/package.json +10 -11
- package/pennyfarthing-dist/agents/README.md +16 -2
- package/pennyfarthing-dist/agents/architect.md +19 -5
- package/pennyfarthing-dist/agents/dev.md +18 -4
- package/pennyfarthing-dist/agents/devops.md +19 -5
- package/pennyfarthing-dist/agents/generic-handoff.md +4 -1
- package/pennyfarthing-dist/agents/orchestrator.md +25 -8
- package/pennyfarthing-dist/agents/pm.md +14 -3
- package/pennyfarthing-dist/agents/reviewer-preflight.md +10 -52
- package/pennyfarthing-dist/agents/reviewer.md +27 -7
- package/pennyfarthing-dist/agents/sm.md +51 -22
- package/pennyfarthing-dist/agents/tea.md +18 -4
- package/pennyfarthing-dist/agents/testing-runner.md +4 -1
- package/pennyfarthing-dist/guides/shared-context.md +1 -1
- package/pennyfarthing-dist/scripts/add-short-names.mjs +0 -0
- package/pennyfarthing-dist/scripts/agent-session.sh +0 -0
- package/pennyfarthing-dist/scripts/check-context.sh +0 -0
- package/pennyfarthing-dist/scripts/check.sh +0 -0
- package/pennyfarthing-dist/scripts/deploy.sh +0 -0
- package/pennyfarthing-dist/scripts/doctor-dogfood.sh +77 -42
- package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
- package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
- package/pennyfarthing-dist/scripts/install-git-hooks.sh +0 -0
- package/pennyfarthing-dist/scripts/prime.sh +0 -0
- package/pennyfarthing-dist/scripts/release.sh +0 -0
- package/pennyfarthing-dist/scripts/repo-utils.sh +0 -0
- package/pennyfarthing-dist/scripts/run-ci.sh +0 -0
- package/pennyfarthing-dist/scripts/run.sh +0 -0
- package/pennyfarthing-dist/scripts/statusline.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
- package/pennyfarthing-dist/scripts/uninstall.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/background-tasks.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/check-status.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/checkpoint.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/common.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/file-lock.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/find-related-work.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/git-status-all.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +0 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +0 -0
- package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +0 -0
- package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/jira-lib.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/jira-sync.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/logging.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/repo-scan.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/retry.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/sprint-common.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/swebench-judge.py +0 -0
- package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/test-setup.sh +0 -0
- package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +0 -0
- package/pennyfarthing-dist/scripts/worktree-manager.sh +0 -0
- package/pennyfarthing-dist/skills/cyclist/SKILL.md +71 -17
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Pennyfarthing
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**v7.0.0** | *The outer loop goes once, the inner loop goes many times.*
|
|
4
4
|
|
|
5
5
|
<img src="pennyfarthing.png" alt="Pennyfarthing Logo" width="75" style="float:left; margin:10px" margin="10px">
|
|
6
6
|
|
|
@@ -30,7 +30,7 @@ Explore all themes with OCEAN spider charts, Chernoff faces, and 1020 character
|
|
|
30
30
|
cd your-project
|
|
31
31
|
|
|
32
32
|
# Install CLI (1.1 MB)
|
|
33
|
-
npm install --save-dev pennyfarthing
|
|
33
|
+
npm install --save-dev @pennyfarthing/core
|
|
34
34
|
|
|
35
35
|
# Initialize (creates symlinks, no file copying)
|
|
36
36
|
npx pennyfarthing init
|
|
@@ -147,11 +147,8 @@ After initialization:
|
|
|
147
147
|
```
|
|
148
148
|
your-project/
|
|
149
149
|
├── .claude/
|
|
150
|
-
│ ├──
|
|
151
|
-
│ ├──
|
|
152
|
-
│ ├── skills/ # → symlink to node_modules/pennyfarthing/pennyfarthing-dist/skills/
|
|
153
|
-
│ ├── personas/ # → symlink to node_modules/pennyfarthing/pennyfarthing-dist/personas/
|
|
154
|
-
│ ├── scripts/ # → symlink to node_modules/pennyfarthing/pennyfarthing-dist/scripts/
|
|
150
|
+
│ ├── commands/ # → symlinks to @pennyfarthing/core commands
|
|
151
|
+
│ ├── skills/ # → symlinks to @pennyfarthing/core skills
|
|
155
152
|
│ ├── project/ # YOUR customizations
|
|
156
153
|
│ │ ├── agents/*-sidecar/ # Agent memory/learnings
|
|
157
154
|
│ │ ├── docs/ # shared-context.md
|
|
@@ -159,6 +156,11 @@ your-project/
|
|
|
159
156
|
│ ├── manifest.json # Installation manifest
|
|
160
157
|
│ └── settings.local.json # Claude Code settings
|
|
161
158
|
├── .pennyfarthing/
|
|
159
|
+
│ ├── agents/ # → symlink to @pennyfarthing/core agents
|
|
160
|
+
│ ├── guides/ # → symlink to @pennyfarthing/core guides
|
|
161
|
+
│ ├── personas/ # → symlink to @pennyfarthing/core personas
|
|
162
|
+
│ ├── scripts/ # → symlink to @pennyfarthing/core scripts
|
|
163
|
+
│ ├── sidecars/ # Agent learning files
|
|
162
164
|
│ └── config.local.yaml # Theme selection (gitignored)
|
|
163
165
|
├── sprint/
|
|
164
166
|
│ ├── current-sprint.yaml # Active sprint
|
|
@@ -229,7 +231,7 @@ Override locally with `.claude/pennyfarthing/preferences.local.yaml` (gitignored
|
|
|
229
231
|
|
|
230
232
|
```bash
|
|
231
233
|
# Update CLI
|
|
232
|
-
npm update pennyfarthing
|
|
234
|
+
npm update @pennyfarthing/core
|
|
233
235
|
|
|
234
236
|
# Update visual terminal (if installed)
|
|
235
237
|
npm update @pennyfarthing/cyclist
|
|
@@ -250,17 +252,23 @@ pennyfarthing uninstall --all
|
|
|
250
252
|
|
|
251
253
|
Archived sprint data (`sprint/archive/`, `sprint/context/`) is always preserved.
|
|
252
254
|
|
|
253
|
-
## What's New in
|
|
255
|
+
## What's New in v7.0
|
|
254
256
|
|
|
255
|
-
- **
|
|
256
|
-
- **
|
|
257
|
-
- **
|
|
258
|
-
- **
|
|
257
|
+
- **BREAKING: Package Renamed** - `pennyfarthing` → `@pennyfarthing/core`
|
|
258
|
+
- **BREAKING: Directory Restructure** - Content moved from `.claude/` to `.pennyfarthing/`
|
|
259
|
+
- **Cyclist Split** - Visual terminal is now optional `@pennyfarthing/cyclist` (160MB → 1.1MB core)
|
|
260
|
+
- **Customizable Workflow Engine** - YAML-based workflow definitions with story routing
|
|
261
|
+
- **BMAD Interoperability** - Parse and export BMAD format stories and epics
|
|
262
|
+
- **Runtime Permission Management** - Approval gates, spot grants, `/permissions` skill
|
|
263
|
+
- **Enhanced OTEL** - Tool enrichment for Bash, Read, Edit, Write, Grep/Glob spans
|
|
264
|
+
- **Agent Modernization** - All agents updated with status tags and shared behavior
|
|
265
|
+
|
|
266
|
+
See [CHANGELOG.md](CHANGELOG.md) for full migration guide.
|
|
259
267
|
|
|
260
268
|
## What's New in v6.5
|
|
261
269
|
|
|
262
270
|
- **Simplified Installation** - Two packages for different needs:
|
|
263
|
-
-
|
|
271
|
+
- `@pennyfarthing/core` - CLI only (1.1 MB)
|
|
264
272
|
- `@pennyfarthing/cyclist` - Optional visual terminal with portraits (160 MB)
|
|
265
273
|
- **Portrait Optimization** - Cyclist bundles only 128px and 256px portraits (saves 450MB)
|
|
266
274
|
- **Agent Modernization** - All agents updated with status tags and consolidated shared behavior
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pennyfarthing/core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.2",
|
|
4
4
|
"description": "Claude Code agent framework with TDD workflow and persona system",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -28,14 +28,6 @@
|
|
|
28
28
|
"bugs": {
|
|
29
29
|
"url": "https://github.com/1898andCo/pennyfarthing/issues"
|
|
30
30
|
},
|
|
31
|
-
"scripts": {
|
|
32
|
-
"build": "pnpm -r build && ./scripts/utils/generate-skill-docs.sh",
|
|
33
|
-
"docs": "./scripts/utils/generate-skill-docs.sh",
|
|
34
|
-
"dev": "pnpm -r --parallel dev",
|
|
35
|
-
"test": "pnpm -r test",
|
|
36
|
-
"lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
|
|
37
|
-
"clean": "pnpm -r clean"
|
|
38
|
-
},
|
|
39
31
|
"dependencies": {
|
|
40
32
|
"chalk": "^5.3.0",
|
|
41
33
|
"commander": "^12.1.0",
|
|
@@ -54,5 +46,12 @@
|
|
|
54
46
|
"engines": {
|
|
55
47
|
"node": ">=18.0.0"
|
|
56
48
|
},
|
|
57
|
-
"
|
|
58
|
-
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "pnpm -r build && ./scripts/utils/generate-skill-docs.sh",
|
|
51
|
+
"docs": "./scripts/utils/generate-skill-docs.sh",
|
|
52
|
+
"dev": "pnpm -r --parallel dev",
|
|
53
|
+
"test": "pnpm -r test",
|
|
54
|
+
"lint": "eslint 'packages/*/src/**/*.ts' --max-warnings 0",
|
|
55
|
+
"clean": "pnpm -r clean"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -49,7 +49,18 @@ Focus on specific repo(s), implement/test/document features.
|
|
|
49
49
|
- **`ux-designer.md`** - UX Designer (UI design, UX)
|
|
50
50
|
|
|
51
51
|
### Official Subagents (Haiku-based)
|
|
52
|
-
Lightweight subagents for mechanical tasks. Invoked via `Task tool` with `subagent_type`.
|
|
52
|
+
Lightweight subagents for mechanical tasks. Invoked via `Task tool` with `subagent_type: "general-purpose"` and `model: "haiku"`.
|
|
53
|
+
|
|
54
|
+
**Invocation pattern:**
|
|
55
|
+
```yaml
|
|
56
|
+
Task tool:
|
|
57
|
+
subagent_type: "general-purpose"
|
|
58
|
+
model: "haiku"
|
|
59
|
+
prompt: |
|
|
60
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
61
|
+
|
|
62
|
+
{PARAMETERS}
|
|
63
|
+
```
|
|
53
64
|
|
|
54
65
|
- **`workflow-status-check.md`** - Detect workflow state
|
|
55
66
|
- **`generic-sm-setup.md`** - Research OR setup mode (Story 31-11)
|
|
@@ -304,9 +315,12 @@ Subagents can run in background using Claude Code's `run_in_background` paramete
|
|
|
304
315
|
|
|
305
316
|
```yaml
|
|
306
317
|
Task tool:
|
|
307
|
-
subagent_type: "
|
|
318
|
+
subagent_type: "general-purpose"
|
|
319
|
+
model: "haiku"
|
|
308
320
|
run_in_background: true
|
|
309
321
|
prompt: |
|
|
322
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
323
|
+
|
|
310
324
|
REPOS: all
|
|
311
325
|
CONTEXT: Background test run while implementing
|
|
312
326
|
RUN_ID: bg-test-001
|
|
@@ -17,10 +17,21 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: Architecture scanning, pattern analysis, codebase exploration.
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `workflow-status-check` - Scan sprint state and active sessions
|
|
22
|
-
- `testing-runner` - Verify builds pass after design changes
|
|
23
|
-
- `sm-file-summary` - Summarize files for context gathering
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `workflow-status-check.md` - Scan sprint state and active sessions
|
|
22
|
+
- `testing-runner.md` - Verify builds pass after design changes
|
|
23
|
+
- `sm-file-summary.md` - Summarize files for context gathering
|
|
24
|
+
|
|
25
|
+
- **Invocation pattern:**
|
|
26
|
+
```yaml
|
|
27
|
+
Task tool:
|
|
28
|
+
subagent_type: "general-purpose"
|
|
29
|
+
model: "haiku"
|
|
30
|
+
prompt: |
|
|
31
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
32
|
+
|
|
33
|
+
{PARAMETERS}
|
|
34
|
+
```
|
|
24
35
|
</helpers>
|
|
25
36
|
|
|
26
37
|
<responsibilities>
|
|
@@ -140,8 +151,11 @@ When design changes may affect build:
|
|
|
140
151
|
|
|
141
152
|
```yaml
|
|
142
153
|
Task tool:
|
|
143
|
-
subagent_type: "
|
|
154
|
+
subagent_type: "general-purpose"
|
|
155
|
+
model: "haiku"
|
|
144
156
|
prompt: |
|
|
157
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
158
|
+
|
|
145
159
|
REPOS: all
|
|
146
160
|
CONTEXT: Verifying build after design change
|
|
147
161
|
RUN_ID: architect-verify
|
|
@@ -17,9 +17,20 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: run tests, gather results, update session for handoff
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `testing-runner` - Run tests, gather results
|
|
22
|
-
- `generic-handoff` - Workflow-driven session update for handoff
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `testing-runner.md` - Run tests, gather results
|
|
22
|
+
- `generic-handoff.md` - Workflow-driven session update for handoff
|
|
23
|
+
|
|
24
|
+
- **Invocation pattern:**
|
|
25
|
+
```yaml
|
|
26
|
+
Task tool:
|
|
27
|
+
subagent_type: "general-purpose"
|
|
28
|
+
model: "haiku"
|
|
29
|
+
prompt: |
|
|
30
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
31
|
+
|
|
32
|
+
{PARAMETERS}
|
|
33
|
+
```
|
|
23
34
|
</helpers>
|
|
24
35
|
|
|
25
36
|
<responsibilities>
|
|
@@ -176,8 +187,11 @@ Then spawn with detected workflow (tdd, trivial, etc.):
|
|
|
176
187
|
|
|
177
188
|
```yaml
|
|
178
189
|
Task tool:
|
|
179
|
-
subagent_type: "
|
|
190
|
+
subagent_type: "general-purpose"
|
|
191
|
+
model: "haiku"
|
|
180
192
|
prompt: |
|
|
193
|
+
Read and follow: .pennyfarthing/agents/generic-handoff.md
|
|
194
|
+
|
|
181
195
|
STORY_ID: {value}
|
|
182
196
|
WORKFLOW: {workflow from session} # e.g., "tdd" or "trivial"
|
|
183
197
|
CURRENT_PHASE: green # or "implement" for trivial workflow
|
|
@@ -17,10 +17,21 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: System checks, log analysis, config scanning.
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `workflow-status-check` - Scan sprint state and active sessions
|
|
22
|
-
- `testing-runner` - Verify CI pipeline and tests pass
|
|
23
|
-
- `sm-file-summary` - Summarize configuration files
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `workflow-status-check.md` - Scan sprint state and active sessions
|
|
22
|
+
- `testing-runner.md` - Verify CI pipeline and tests pass
|
|
23
|
+
- `sm-file-summary.md` - Summarize configuration files
|
|
24
|
+
|
|
25
|
+
- **Invocation pattern:**
|
|
26
|
+
```yaml
|
|
27
|
+
Task tool:
|
|
28
|
+
subagent_type: "general-purpose"
|
|
29
|
+
model: "haiku"
|
|
30
|
+
prompt: |
|
|
31
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
32
|
+
|
|
33
|
+
{PARAMETERS}
|
|
34
|
+
```
|
|
24
35
|
</helpers>
|
|
25
36
|
|
|
26
37
|
<responsibilities>
|
|
@@ -140,8 +151,11 @@ Before any deployment:
|
|
|
140
151
|
|
|
141
152
|
```yaml
|
|
142
153
|
Task tool:
|
|
143
|
-
subagent_type: "
|
|
154
|
+
subagent_type: "general-purpose"
|
|
155
|
+
model: "haiku"
|
|
144
156
|
prompt: |
|
|
157
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
158
|
+
|
|
145
159
|
REPOS: all
|
|
146
160
|
CONTEXT: Pre-deployment verification
|
|
147
161
|
RUN_ID: devops-verify
|
|
@@ -104,8 +104,11 @@ Based on the gate type from the workflow, run the appropriate checks.
|
|
|
104
104
|
If no valid cache or TEST_RESULT not provided, delegate to testing-runner:
|
|
105
105
|
```yaml
|
|
106
106
|
Task tool:
|
|
107
|
-
subagent_type: "
|
|
107
|
+
subagent_type: "general-purpose"
|
|
108
|
+
model: "haiku"
|
|
108
109
|
prompt: |
|
|
110
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
111
|
+
|
|
109
112
|
REPOS: {REPOS}
|
|
110
113
|
CONTEXT: TEA handoff - verify tests are RED
|
|
111
114
|
RUN_ID: {STORY_ID}-tea-handoff
|
|
@@ -17,12 +17,23 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: Status checks, metrics gathering, file scanning.
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `workflow-status-check` - Scan session files and git status
|
|
22
|
-
- `testing-runner` - Run tests to verify changes
|
|
23
|
-
- `sm-file-summary` - Summarize agent files for audit
|
|
24
|
-
- `generic-handoff` - Update session for phase transitions
|
|
25
|
-
- `Explore` - Search for patterns across codebase
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `workflow-status-check.md` - Scan session files and git status
|
|
22
|
+
- `testing-runner.md` - Run tests to verify changes
|
|
23
|
+
- `sm-file-summary.md` - Summarize agent files for audit
|
|
24
|
+
- `generic-handoff.md` - Update session for phase transitions
|
|
25
|
+
- `Explore` - Search for patterns across codebase (Claude Code built-in)
|
|
26
|
+
|
|
27
|
+
- **Invocation pattern:**
|
|
28
|
+
```yaml
|
|
29
|
+
Task tool:
|
|
30
|
+
subagent_type: "general-purpose"
|
|
31
|
+
model: "haiku"
|
|
32
|
+
prompt: |
|
|
33
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
34
|
+
|
|
35
|
+
{PARAMETERS}
|
|
36
|
+
```
|
|
26
37
|
</helpers>
|
|
27
38
|
|
|
28
39
|
<responsibilities>
|
|
@@ -238,8 +249,11 @@ REFLECT: I should follow this pattern for consistency
|
|
|
238
249
|
Never run `just test`, `npm test`, etc. directly. Always spawn:
|
|
239
250
|
```yaml
|
|
240
251
|
Task tool:
|
|
241
|
-
subagent_type: "
|
|
252
|
+
subagent_type: "general-purpose"
|
|
253
|
+
model: "haiku"
|
|
242
254
|
prompt: |
|
|
255
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
256
|
+
|
|
243
257
|
REPOS: pennyfarthing
|
|
244
258
|
CONTEXT: Verify agent file changes don't break tests
|
|
245
259
|
RUN_ID: orchestrator-verify
|
|
@@ -294,8 +308,11 @@ See `/dev-patterns` skill → "Turn-Efficient Patterns" for complete guidance.
|
|
|
294
308
|
After completing file updates, spawn handoff helper:
|
|
295
309
|
```yaml
|
|
296
310
|
Task tool:
|
|
297
|
-
subagent_type: "
|
|
311
|
+
subagent_type: "general-purpose"
|
|
312
|
+
model: "haiku"
|
|
298
313
|
prompt: |
|
|
314
|
+
Read and follow: .pennyfarthing/agents/generic-handoff.md
|
|
315
|
+
|
|
299
316
|
STORY_ID: {value}
|
|
300
317
|
WORKFLOW: agent-docs
|
|
301
318
|
CURRENT_PHASE: implement
|
|
@@ -17,9 +17,20 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: Backlog scanning, Jira queries, velocity calculation, status checks.
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `workflow-status-check` - Scan sprint state and active sessions
|
|
22
|
-
- `sm-file-summary` - Summarize files for context gathering
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `workflow-status-check.md` - Scan sprint state and active sessions
|
|
22
|
+
- `sm-file-summary.md` - Summarize files for context gathering
|
|
23
|
+
|
|
24
|
+
- **Invocation pattern:**
|
|
25
|
+
```yaml
|
|
26
|
+
Task tool:
|
|
27
|
+
subagent_type: "general-purpose"
|
|
28
|
+
model: "haiku"
|
|
29
|
+
prompt: |
|
|
30
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
31
|
+
|
|
32
|
+
{PARAMETERS}
|
|
33
|
+
```
|
|
23
34
|
</helpers>
|
|
24
35
|
|
|
25
36
|
<responsibilities>
|
|
@@ -97,58 +97,16 @@ fi
|
|
|
97
97
|
|
|
98
98
|
Spawn a testing-runner subagent with:
|
|
99
99
|
```yaml
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
## Project Info
|
|
112
|
-
- Project root: $CLAUDE_PROJECT_DIR (set by SessionStart hook)
|
|
113
|
-
- Repo(s) to test: {REPO}
|
|
114
|
-
- Context: PR review pre-flight for Story {STORY_ID}
|
|
115
|
-
- Run ID: {STORY_ID}-review
|
|
116
|
-
|
|
117
|
-
## Execute Tests and Lints
|
|
118
|
-
|
|
119
|
-
Use repo-utils.sh for dynamic repo handling:
|
|
120
|
-
```bash
|
|
121
|
-
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
122
|
-
RUN_ID="{STORY_ID}-review"
|
|
123
|
-
|
|
124
|
-
for repo in $(get_repo_names); do
|
|
125
|
-
repo_path=$(get_repo_path "$repo")
|
|
126
|
-
test_cmd=$(get_test_command "$repo")
|
|
127
|
-
lint_cmd=$(get_lint_command "$repo")
|
|
128
|
-
|
|
129
|
-
cd $CLAUDE_PROJECT_DIR/$repo_path
|
|
130
|
-
|
|
131
|
-
# Run tests
|
|
132
|
-
if [[ -n "$test_cmd" ]]; then
|
|
133
|
-
$test_cmd 2>&1 | tee $CLAUDE_PROJECT_DIR/.session/test-{STORY_ID}-reviewer-verify.log
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
# Run linter
|
|
137
|
-
if [[ -n "$lint_cmd" ]]; then
|
|
138
|
-
$lint_cmd 2>&1 | tee $CLAUDE_PROJECT_DIR/.session/lint-{STORY_ID}-${repo}.log
|
|
139
|
-
fi
|
|
140
|
-
done
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
## Check for Forbidden Skip Patterns
|
|
144
|
-
```bash
|
|
145
|
-
source $CLAUDE_PROJECT_DIR/scripts/repo-utils.sh
|
|
146
|
-
for repo in $(get_repo_names); do
|
|
147
|
-
check_skip_violations "$repo"
|
|
148
|
-
done
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
## Output structured results per testing-runner.md format
|
|
100
|
+
Task tool:
|
|
101
|
+
subagent_type: "general-purpose"
|
|
102
|
+
model: "haiku"
|
|
103
|
+
description: "run tests"
|
|
104
|
+
prompt: |
|
|
105
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
106
|
+
|
|
107
|
+
REPOS: {REPOS}
|
|
108
|
+
CONTEXT: PR review pre-flight for Story {STORY_ID}
|
|
109
|
+
RUN_ID: {STORY_ID}-review
|
|
152
110
|
```
|
|
153
111
|
|
|
154
112
|
If you cannot spawn a subagent, run the tests directly using the testing skill commands.
|
|
@@ -35,10 +35,21 @@ A bug you miss ships to production. A security hole you miss gets exploited. An
|
|
|
35
35
|
<helpers>
|
|
36
36
|
From theme config. Model: haiku. Tasks: gather pre-flight data, update session for approval/rejection
|
|
37
37
|
|
|
38
|
-
- **
|
|
39
|
-
- `testing-runner` - Run tests
|
|
40
|
-
- `reviewer-preflight` - Gather pre-flight data (tests, lint, smells)
|
|
41
|
-
- `generic-handoff` - Workflow-driven session update (approve or reject)
|
|
38
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
39
|
+
- `testing-runner.md` - Run tests
|
|
40
|
+
- `reviewer-preflight.md` - Gather pre-flight data (tests, lint, smells)
|
|
41
|
+
- `generic-handoff.md` - Workflow-driven session update (approve or reject)
|
|
42
|
+
|
|
43
|
+
- **Invocation pattern:**
|
|
44
|
+
```yaml
|
|
45
|
+
Task tool:
|
|
46
|
+
subagent_type: "general-purpose"
|
|
47
|
+
model: "haiku"
|
|
48
|
+
prompt: |
|
|
49
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
50
|
+
|
|
51
|
+
{PARAMETERS}
|
|
52
|
+
```
|
|
42
53
|
</helpers>
|
|
43
54
|
|
|
44
55
|
<responsibilities>
|
|
@@ -109,8 +120,11 @@ Spawn Helper to gather mechanical data:
|
|
|
109
120
|
|
|
110
121
|
```yaml
|
|
111
122
|
Task tool:
|
|
112
|
-
subagent_type: "
|
|
123
|
+
subagent_type: "general-purpose"
|
|
124
|
+
model: "haiku"
|
|
113
125
|
prompt: |
|
|
126
|
+
Read and follow: .pennyfarthing/agents/reviewer-preflight.md
|
|
127
|
+
|
|
114
128
|
STORY_ID: {value}
|
|
115
129
|
REPOS: {value}
|
|
116
130
|
BRANCH: {value}
|
|
@@ -241,8 +255,11 @@ Then spawn with detected workflow:
|
|
|
241
255
|
```yaml
|
|
242
256
|
# Approval
|
|
243
257
|
Task tool:
|
|
244
|
-
subagent_type: "
|
|
258
|
+
subagent_type: "general-purpose"
|
|
259
|
+
model: "haiku"
|
|
245
260
|
prompt: |
|
|
261
|
+
Read and follow: .pennyfarthing/agents/generic-handoff.md
|
|
262
|
+
|
|
246
263
|
STORY_ID: {value}
|
|
247
264
|
WORKFLOW: {workflow from session} # e.g., "tdd" or "trivial"
|
|
248
265
|
CURRENT_PHASE: review
|
|
@@ -252,8 +269,11 @@ Task tool:
|
|
|
252
269
|
|
|
253
270
|
# Rejection
|
|
254
271
|
Task tool:
|
|
255
|
-
subagent_type: "
|
|
272
|
+
subagent_type: "general-purpose"
|
|
273
|
+
model: "haiku"
|
|
256
274
|
prompt: |
|
|
275
|
+
Read and follow: .pennyfarthing/agents/generic-handoff.md
|
|
276
|
+
|
|
257
277
|
STORY_ID: {value}
|
|
258
278
|
WORKFLOW: {workflow from session} # e.g., "tdd" or "trivial"
|
|
259
279
|
CURRENT_PHASE: review
|
|
@@ -16,20 +16,25 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
16
16
|
<helpers>
|
|
17
17
|
From theme config. Model: haiku. Tasks: Status checks, backlog scans, file summaries, Jira updates, session archival.
|
|
18
18
|
|
|
19
|
-
- **
|
|
20
|
-
- `workflow-status-check` - Scan session files and git status
|
|
21
|
-
- `testing-runner` - Run tests
|
|
22
|
-
- `generic-sm-setup` - Research backlog OR setup story (mode: research|setup)
|
|
23
|
-
- `generic-sm-finish` - Preflight checks OR execute finish (phase: preflight|execute)
|
|
24
|
-
- `generic-handoff` - Workflow-driven phase transitions (TEA/Dev/Reviewer)
|
|
25
|
-
- `sm-handoff` - SM→TEA/Dev handoff with Jira claim and branch verification
|
|
26
|
-
- `sm-file-summary` - Read and summarize files for context
|
|
27
|
-
|
|
28
|
-
- **
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
19
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
20
|
+
- `workflow-status-check.md` - Scan session files and git status
|
|
21
|
+
- `testing-runner.md` - Run tests
|
|
22
|
+
- `generic-sm-setup.md` - Research backlog OR setup story (mode: research|setup)
|
|
23
|
+
- `generic-sm-finish.md` - Preflight checks OR execute finish (phase: preflight|execute)
|
|
24
|
+
- `generic-handoff.md` - Workflow-driven phase transitions (TEA/Dev/Reviewer)
|
|
25
|
+
- `sm-handoff.md` - SM→TEA/Dev handoff with Jira claim and branch verification
|
|
26
|
+
- `sm-file-summary.md` - Read and summarize files for context
|
|
27
|
+
|
|
28
|
+
- **Invocation pattern:**
|
|
29
|
+
```yaml
|
|
30
|
+
Task tool:
|
|
31
|
+
subagent_type: "general-purpose"
|
|
32
|
+
model: "haiku"
|
|
33
|
+
prompt: |
|
|
34
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
35
|
+
|
|
36
|
+
{PARAMETERS}
|
|
37
|
+
```
|
|
33
38
|
</helpers>
|
|
34
39
|
|
|
35
40
|
<responsibilities>
|
|
@@ -120,8 +125,11 @@ REFLECT: I should clarify AC4 with the user before proceeding.
|
|
|
120
125
|
1. Run workflow status check:
|
|
121
126
|
```yaml
|
|
122
127
|
Task tool:
|
|
123
|
-
subagent_type: "
|
|
128
|
+
subagent_type: "general-purpose"
|
|
129
|
+
model: "haiku"
|
|
124
130
|
prompt: |
|
|
131
|
+
Read and follow: .pennyfarthing/agents/workflow-status-check.md
|
|
132
|
+
|
|
125
133
|
CALLING_AGENT: SM
|
|
126
134
|
```
|
|
127
135
|
2. Helper returns: `FINISH_STATE`, `NEW_WORK_STATE`, or `IN_PROGRESS_STATE`
|
|
@@ -136,8 +144,11 @@ I send helper to check the workflow status before anything else.
|
|
|
136
144
|
|
|
137
145
|
```yaml
|
|
138
146
|
Task tool:
|
|
139
|
-
subagent_type: "
|
|
147
|
+
subagent_type: "general-purpose"
|
|
148
|
+
model: "haiku"
|
|
140
149
|
prompt: |
|
|
150
|
+
Read and follow: .pennyfarthing/agents/workflow-status-check.md
|
|
151
|
+
|
|
141
152
|
CALLING_AGENT: SM
|
|
142
153
|
```
|
|
143
154
|
|
|
@@ -169,8 +180,11 @@ Task tool:
|
|
|
169
180
|
|
|
170
181
|
```yaml
|
|
171
182
|
Task tool:
|
|
172
|
-
subagent_type: "
|
|
183
|
+
subagent_type: "general-purpose"
|
|
184
|
+
model: "haiku"
|
|
173
185
|
prompt: |
|
|
186
|
+
Read and follow: .pennyfarthing/agents/generic-sm-finish.md
|
|
187
|
+
|
|
174
188
|
PHASE: preflight
|
|
175
189
|
STORY_ID: {value}
|
|
176
190
|
JIRA_KEY: {value from session/YAML jira field, or omit if not found}
|
|
@@ -211,8 +225,11 @@ I read helper's bookkeeping report and write `sprint/context/story-{X-Y}-summary
|
|
|
211
225
|
|
|
212
226
|
```yaml
|
|
213
227
|
Task tool:
|
|
214
|
-
subagent_type: "
|
|
228
|
+
subagent_type: "general-purpose"
|
|
229
|
+
model: "haiku"
|
|
215
230
|
prompt: |
|
|
231
|
+
Read and follow: .pennyfarthing/agents/generic-sm-finish.md
|
|
232
|
+
|
|
216
233
|
PHASE: execute
|
|
217
234
|
STORY_ID: {value}
|
|
218
235
|
SUMMARY_CONTENT: {value}
|
|
@@ -234,8 +251,11 @@ Helper does:
|
|
|
234
251
|
|
|
235
252
|
```yaml
|
|
236
253
|
Task tool:
|
|
237
|
-
subagent_type: "
|
|
254
|
+
subagent_type: "general-purpose"
|
|
255
|
+
model: "haiku"
|
|
238
256
|
prompt: |
|
|
257
|
+
Read and follow: .pennyfarthing/agents/generic-sm-setup.md
|
|
258
|
+
|
|
239
259
|
MODE: research
|
|
240
260
|
```
|
|
241
261
|
|
|
@@ -261,8 +281,11 @@ I receive helper's research report and present to the user:
|
|
|
261
281
|
|
|
262
282
|
```yaml
|
|
263
283
|
Task tool:
|
|
264
|
-
subagent_type: "
|
|
284
|
+
subagent_type: "general-purpose"
|
|
285
|
+
model: "haiku"
|
|
265
286
|
prompt: |
|
|
287
|
+
Read and follow: .pennyfarthing/agents/sm-file-summary.md
|
|
288
|
+
|
|
266
289
|
STORY_ID: {value}
|
|
267
290
|
FILE_LIST: |
|
|
268
291
|
path/to/file1.go
|
|
@@ -344,8 +367,11 @@ Then spawn setup with the detected workflow:
|
|
|
344
367
|
|
|
345
368
|
```yaml
|
|
346
369
|
Task tool:
|
|
347
|
-
subagent_type: "
|
|
370
|
+
subagent_type: "general-purpose"
|
|
371
|
+
model: "haiku"
|
|
348
372
|
prompt: |
|
|
373
|
+
Read and follow: .pennyfarthing/agents/generic-sm-setup.md
|
|
374
|
+
|
|
349
375
|
MODE: setup
|
|
350
376
|
STORY_ID: {value}
|
|
351
377
|
JIRA_KEY: {value}
|
|
@@ -373,8 +399,11 @@ After story setup, spawn Helper to update session file for handoff:
|
|
|
373
399
|
|
|
374
400
|
```yaml
|
|
375
401
|
Task tool:
|
|
376
|
-
subagent_type: "
|
|
402
|
+
subagent_type: "general-purpose"
|
|
403
|
+
model: "haiku"
|
|
377
404
|
prompt: |
|
|
405
|
+
Read and follow: .pennyfarthing/agents/sm-handoff.md
|
|
406
|
+
|
|
378
407
|
STORY_ID: {value}
|
|
379
408
|
REPOS: {value}
|
|
380
409
|
TITLE: {value}
|
|
@@ -17,9 +17,20 @@ Auto-loaded by `agent-session.sh start` from theme config. See output above.
|
|
|
17
17
|
<helpers>
|
|
18
18
|
From theme config. Model: haiku. Tasks: run tests, gather results, update session for handoff
|
|
19
19
|
|
|
20
|
-
- **
|
|
21
|
-
- `testing-runner` - Run tests, gather results
|
|
22
|
-
- `generic-handoff` - Workflow-driven session update for handoff
|
|
20
|
+
- **Subagents:** (use `subagent_type: "general-purpose"` with `model: "haiku"`)
|
|
21
|
+
- `testing-runner.md` - Run tests, gather results
|
|
22
|
+
- `generic-handoff.md` - Workflow-driven session update for handoff
|
|
23
|
+
|
|
24
|
+
- **Invocation pattern:**
|
|
25
|
+
```yaml
|
|
26
|
+
Task tool:
|
|
27
|
+
subagent_type: "general-purpose"
|
|
28
|
+
model: "haiku"
|
|
29
|
+
prompt: |
|
|
30
|
+
Read and follow: .pennyfarthing/agents/{subagent-name}.md
|
|
31
|
+
|
|
32
|
+
{PARAMETERS}
|
|
33
|
+
```
|
|
23
34
|
</helpers>
|
|
24
35
|
|
|
25
36
|
<responsibilities>
|
|
@@ -151,8 +162,11 @@ Then spawn with detected workflow:
|
|
|
151
162
|
|
|
152
163
|
```yaml
|
|
153
164
|
Task tool:
|
|
154
|
-
subagent_type: "
|
|
165
|
+
subagent_type: "general-purpose"
|
|
166
|
+
model: "haiku"
|
|
155
167
|
prompt: |
|
|
168
|
+
Read and follow: .pennyfarthing/agents/generic-handoff.md
|
|
169
|
+
|
|
156
170
|
STORY_ID: {value}
|
|
157
171
|
WORKFLOW: {workflow from session} # e.g., "tdd"
|
|
158
172
|
CURRENT_PHASE: red
|
|
@@ -65,9 +65,12 @@ The testing-runner can be spawned in background mode, allowing the main agent to
|
|
|
65
65
|
|
|
66
66
|
```yaml
|
|
67
67
|
Task tool:
|
|
68
|
-
subagent_type: "
|
|
68
|
+
subagent_type: "general-purpose"
|
|
69
|
+
model: "haiku"
|
|
69
70
|
run_in_background: true
|
|
70
71
|
prompt: |
|
|
72
|
+
Read and follow: .pennyfarthing/agents/testing-runner.md
|
|
73
|
+
|
|
71
74
|
REPOS: all
|
|
72
75
|
CONTEXT: Background test run while implementing
|
|
73
76
|
RUN_ID: bg-test-001
|
|
@@ -9,7 +9,7 @@ Loaded automatically by `/prime --agent <name>` on agent activation.
|
|
|
9
9
|
## Project Info
|
|
10
10
|
|
|
11
11
|
**Project:** Pennyfarthing - Claude Code agent orchestration framework
|
|
12
|
-
**Version:**
|
|
12
|
+
**Version:** 7.0.0
|
|
13
13
|
**Type:** ES module with TypeScript (pnpm monorepo)
|
|
14
14
|
**Node:** >=18.0.0
|
|
15
15
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -119,19 +119,64 @@ echo ""
|
|
|
119
119
|
echo "Checking symlinks..."
|
|
120
120
|
echo ""
|
|
121
121
|
|
|
122
|
-
# Check .
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
122
|
+
# Check .pennyfarthing/ symlinks (new structure)
|
|
123
|
+
PENNYFARTHING_SYMLINKS=("agents" "guides" "personas" "scripts")
|
|
124
|
+
for item in "${PENNYFARTHING_SYMLINKS[@]}"; do
|
|
125
|
+
link_path=".pennyfarthing/$item"
|
|
126
|
+
expected_target="../pennyfarthing-dist/$item"
|
|
127
|
+
|
|
128
|
+
if [[ -L "$link_path" ]]; then
|
|
129
|
+
actual_target=$(readlink "$link_path")
|
|
130
|
+
if [[ "$actual_target" == "$expected_target" ]]; then
|
|
131
|
+
ok ".pennyfarthing/$item -> $expected_target"
|
|
132
|
+
else
|
|
133
|
+
warn ".pennyfarthing/$item points to: $actual_target (expected $expected_target)"
|
|
134
|
+
fi
|
|
135
|
+
elif [[ -d "$link_path" ]]; then
|
|
136
|
+
fail ".pennyfarthing/$item is a directory, should be symlink"
|
|
137
|
+
if $FIX_MODE; then
|
|
138
|
+
rm -rf "$link_path"
|
|
139
|
+
ln -s "$expected_target" "$link_path"
|
|
140
|
+
fix ".pennyfarthing/$item symlink created"
|
|
141
|
+
fi
|
|
127
142
|
else
|
|
128
|
-
fail ".
|
|
143
|
+
fail ".pennyfarthing/$item missing"
|
|
144
|
+
if $FIX_MODE; then
|
|
145
|
+
mkdir -p .pennyfarthing
|
|
146
|
+
ln -s "$expected_target" "$link_path"
|
|
147
|
+
fix ".pennyfarthing/$item symlink created"
|
|
148
|
+
fi
|
|
129
149
|
fi
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
150
|
+
done
|
|
151
|
+
|
|
152
|
+
# Check .claude/ symlinks (commands and skills only)
|
|
153
|
+
CLAUDE_SYMLINKS=("commands" "skills")
|
|
154
|
+
for item in "${CLAUDE_SYMLINKS[@]}"; do
|
|
155
|
+
link_path=".claude/$item"
|
|
156
|
+
expected_target="../pennyfarthing-dist/$item"
|
|
157
|
+
|
|
158
|
+
if [[ -L "$link_path" ]]; then
|
|
159
|
+
actual_target=$(readlink "$link_path")
|
|
160
|
+
if [[ "$actual_target" == "$expected_target" ]]; then
|
|
161
|
+
ok ".claude/$item -> $expected_target"
|
|
162
|
+
else
|
|
163
|
+
warn ".claude/$item points to: $actual_target (expected $expected_target)"
|
|
164
|
+
fi
|
|
165
|
+
elif [[ -d "$link_path" ]]; then
|
|
166
|
+
warn ".claude/$item is a directory, should be symlink to pennyfarthing-dist/$item"
|
|
167
|
+
if $FIX_MODE; then
|
|
168
|
+
rm -rf "$link_path"
|
|
169
|
+
ln -s "$expected_target" "$link_path"
|
|
170
|
+
fix ".claude/$item symlink created"
|
|
171
|
+
fi
|
|
172
|
+
else
|
|
173
|
+
fail ".claude/$item missing"
|
|
174
|
+
if $FIX_MODE; then
|
|
175
|
+
ln -s "$expected_target" "$link_path"
|
|
176
|
+
fix ".claude/$item symlink created"
|
|
177
|
+
fi
|
|
178
|
+
fi
|
|
179
|
+
done
|
|
135
180
|
|
|
136
181
|
# Check scripts directory/symlink
|
|
137
182
|
if [[ -L "scripts" ]]; then
|
|
@@ -194,14 +239,15 @@ echo ""
|
|
|
194
239
|
echo "Checking build..."
|
|
195
240
|
echo ""
|
|
196
241
|
|
|
197
|
-
# Check if dist/ is up to date
|
|
198
|
-
|
|
242
|
+
# Check if packages/core/dist/ is up to date (monorepo structure)
|
|
243
|
+
CORE_DIST="packages/core/dist"
|
|
244
|
+
if [[ -d "$CORE_DIST" ]]; then
|
|
199
245
|
# Check if any src file is newer than its dist counterpart
|
|
200
246
|
OUTDATED=false
|
|
201
|
-
for src_file in src/cli/commands/*.ts; do
|
|
247
|
+
for src_file in packages/core/src/cli/commands/*.ts; do
|
|
202
248
|
if [[ -f "$src_file" ]]; then
|
|
203
249
|
base=$(basename "$src_file" .ts)
|
|
204
|
-
dist_file="
|
|
250
|
+
dist_file="${CORE_DIST}/cli/commands/${base}.js"
|
|
205
251
|
if [[ -f "$dist_file" ]]; then
|
|
206
252
|
if [[ "$src_file" -nt "$dist_file" ]]; then
|
|
207
253
|
OUTDATED=true
|
|
@@ -212,19 +258,19 @@ if [[ -d "dist" ]]; then
|
|
|
212
258
|
done
|
|
213
259
|
|
|
214
260
|
if $OUTDATED; then
|
|
215
|
-
warn "dist/ may be outdated (run: npm run build)"
|
|
261
|
+
warn "packages/core/dist/ may be outdated (run: npm run build)"
|
|
216
262
|
if $FIX_MODE; then
|
|
217
263
|
npm run build >/dev/null 2>&1
|
|
218
|
-
fix "Rebuilt
|
|
264
|
+
fix "Rebuilt packages"
|
|
219
265
|
fi
|
|
220
266
|
else
|
|
221
|
-
ok "dist/ appears up to date"
|
|
267
|
+
ok "packages/core/dist/ appears up to date"
|
|
222
268
|
fi
|
|
223
269
|
else
|
|
224
|
-
fail "dist/
|
|
270
|
+
fail "packages/core/dist/ missing"
|
|
225
271
|
if $FIX_MODE; then
|
|
226
272
|
npm run build >/dev/null 2>&1
|
|
227
|
-
fix "Built
|
|
273
|
+
fix "Built packages"
|
|
228
274
|
fi
|
|
229
275
|
fi
|
|
230
276
|
|
|
@@ -260,30 +306,19 @@ echo ""
|
|
|
260
306
|
echo "Checking file locations..."
|
|
261
307
|
echo ""
|
|
262
308
|
|
|
263
|
-
# Check
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
warn ".pennyfarthing/agents/ is a directory, should be symlink to pennyfarthing/agents"
|
|
270
|
-
((MISPLACED++))
|
|
271
|
-
fi
|
|
272
|
-
|
|
273
|
-
# .claude/commands should be a symlink
|
|
274
|
-
if [[ -d ".claude/commands" ]] && [[ ! -L ".claude/commands" ]]; then
|
|
275
|
-
warn ".claude/commands/ is a directory, should be symlink to pennyfarthing/commands"
|
|
276
|
-
((MISPLACED++))
|
|
277
|
-
fi
|
|
278
|
-
|
|
279
|
-
# .claude/skills should be a symlink
|
|
280
|
-
if [[ -d ".claude/skills" ]] && [[ ! -L ".claude/skills" ]]; then
|
|
281
|
-
warn ".claude/skills/ is a directory, should be symlink to pennyfarthing/skills"
|
|
282
|
-
((MISPLACED++))
|
|
309
|
+
# Check .pennyfarthing/sidecars exists (user-specific, not symlinked)
|
|
310
|
+
if [[ -d ".pennyfarthing/sidecars" ]]; then
|
|
311
|
+
SIDECAR_COUNT=$(find .pennyfarthing/sidecars -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l | tr -d ' ')
|
|
312
|
+
ok ".pennyfarthing/sidecars/ exists ($SIDECAR_COUNT agent sidecars)"
|
|
313
|
+
else
|
|
314
|
+
warn ".pennyfarthing/sidecars/ missing (agent learning files)"
|
|
283
315
|
fi
|
|
284
316
|
|
|
285
|
-
|
|
286
|
-
|
|
317
|
+
# Check .claude/project exists (project-specific customizations)
|
|
318
|
+
if [[ -d ".claude/project" ]]; then
|
|
319
|
+
ok ".claude/project/ exists"
|
|
320
|
+
else
|
|
321
|
+
warn ".claude/project/ missing"
|
|
287
322
|
fi
|
|
288
323
|
|
|
289
324
|
echo ""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -20,6 +20,21 @@ Cyclist is a visual terminal interface for Claude Code that displays:
|
|
|
20
20
|
- Story/session progress tracking
|
|
21
21
|
- Git status and context information
|
|
22
22
|
|
|
23
|
+
## Quick Start (Recommended)
|
|
24
|
+
|
|
25
|
+
Use `just` commands from the project root:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# Start Cyclist Electron (recommended)
|
|
29
|
+
just cyclist-electron
|
|
30
|
+
|
|
31
|
+
# Start Cyclist web server only (browser-based)
|
|
32
|
+
just cyclist-web
|
|
33
|
+
|
|
34
|
+
# Start Cyclist for a different project
|
|
35
|
+
just cyclist-electron project_dir=/path/to/project
|
|
36
|
+
```
|
|
37
|
+
|
|
23
38
|
## Environment Variables
|
|
24
39
|
|
|
25
40
|
| Variable | Description | Default |
|
|
@@ -38,6 +53,20 @@ Cyclist is a visual terminal interface for Claude Code that displays:
|
|
|
38
53
|
|
|
39
54
|
## Launch Commands
|
|
40
55
|
|
|
56
|
+
### Using Just (Recommended)
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Electron mode (from any pennyfarthing project)
|
|
60
|
+
just cyclist-electron
|
|
61
|
+
|
|
62
|
+
# Web mode (browser-based)
|
|
63
|
+
just cyclist-web
|
|
64
|
+
|
|
65
|
+
# With explicit project directory
|
|
66
|
+
just cyclist-electron project_dir=/path/to/project
|
|
67
|
+
just cyclist-web project_dir=/path/to/project
|
|
68
|
+
```
|
|
69
|
+
|
|
41
70
|
### Web Backend (Browser Mode)
|
|
42
71
|
|
|
43
72
|
Run from the **cyclist package directory**:
|
|
@@ -62,19 +91,10 @@ cyclist /path/to/project
|
|
|
62
91
|
|
|
63
92
|
# Direct launch via open
|
|
64
93
|
open -a Cyclist --args --project-dir=/path/to/project
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Quick Launch Examples
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
# Web mode for current directory
|
|
71
|
-
cd packages/cyclist && CYCLIST_PROJECT_DIR=$PWD npm start
|
|
72
|
-
|
|
73
|
-
# Web mode on custom port
|
|
74
|
-
cd packages/cyclist && PORT=3000 CYCLIST_PROJECT_DIR=/path npm start
|
|
75
94
|
|
|
76
|
-
#
|
|
77
|
-
cd packages/cyclist
|
|
95
|
+
# Development (from packages/cyclist)
|
|
96
|
+
cd packages/cyclist
|
|
97
|
+
CYCLIST_PROJECT_DIR=/path/to/project npm run dev
|
|
78
98
|
```
|
|
79
99
|
|
|
80
100
|
## Port Auto-Discovery
|
|
@@ -91,27 +111,61 @@ From `packages/cyclist/`:
|
|
|
91
111
|
|--------|-------------|
|
|
92
112
|
| `npm start` | Run production server |
|
|
93
113
|
| `npm run dev` | Electron dev mode with file watching |
|
|
114
|
+
| `npm run dev:once` | Build and run Electron once (no watching) |
|
|
94
115
|
| `npm run dev:web` | Web server with tsx watch |
|
|
95
116
|
| `npm run dev:server` | Server-only with tsx watch |
|
|
96
117
|
| `npm run build` | Compile TypeScript |
|
|
97
118
|
|
|
119
|
+
## Just Commands Reference
|
|
120
|
+
|
|
121
|
+
| Command | Description |
|
|
122
|
+
|---------|-------------|
|
|
123
|
+
| `just cyclist-electron` | Start Electron dev mode |
|
|
124
|
+
| `just cyclist-web` | Start web server mode |
|
|
125
|
+
| `just cyclist-build` | Build Cyclist TypeScript |
|
|
126
|
+
| `just cyclist-rebuild` | Rebuild native modules (node-pty) |
|
|
127
|
+
| `just cyclist-setup` | Full clean + install + rebuild + build |
|
|
128
|
+
| `just cyclist-build-and-install` | Build and install Cyclist.app |
|
|
129
|
+
| `just test-cyclist` | Run Cyclist tests |
|
|
130
|
+
|
|
98
131
|
## Requirements
|
|
99
132
|
|
|
100
|
-
- Project must have `.
|
|
101
|
-
- For Electron: Cyclist.app must be installed
|
|
133
|
+
- Project must have `.pennyfarthing/` directory with config (Pennyfarthing-enabled)
|
|
134
|
+
- For Electron: Cyclist.app must be installed, or run from source
|
|
102
135
|
- For web: Run from `packages/cyclist/` directory
|
|
103
136
|
|
|
104
137
|
## Troubleshooting
|
|
105
138
|
|
|
139
|
+
### Window not appearing (Electron)
|
|
140
|
+
|
|
141
|
+
The `package.json` has `"main": "dist/server.js"` for npm module use. The `dev` scripts explicitly run `electron dist/main.js` to use the correct entry point. If you run `electron .` directly, it will run the web server instead of the Electron main process.
|
|
142
|
+
|
|
143
|
+
**Fix:** Use `just cyclist-electron` or `npm run dev` which run `electron dist/main.js`.
|
|
144
|
+
|
|
106
145
|
### Server won't start
|
|
107
|
-
|
|
146
|
+
|
|
147
|
+
- Ensure you're in the cyclist package directory (or use `just` commands)
|
|
108
148
|
- Run `npm run build` first if dist/ is stale
|
|
109
149
|
- Check console for port conflict messages
|
|
110
150
|
|
|
111
151
|
### No portraits showing
|
|
152
|
+
|
|
112
153
|
- Verify `pennyfarthing-dist/personas/portraits/` exists
|
|
113
|
-
- Check theme in `.
|
|
154
|
+
- Check theme in `.pennyfarthing/config.local.yaml`
|
|
114
155
|
|
|
115
156
|
### "Not a Pennyfarthing project"
|
|
116
|
-
|
|
157
|
+
|
|
158
|
+
- Ensure project has `.pennyfarthing/` directory with `config.local.yaml` or agent symlinks
|
|
159
|
+
- Or has `.claude/` directory with persona-config.yaml (legacy)
|
|
117
160
|
- Run `pennyfarthing init` in the project first
|
|
161
|
+
- Or set `CYCLIST_PROJECT_DIR` to point to a valid project
|
|
162
|
+
|
|
163
|
+
### Native module issues (node-pty)
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Rebuild native modules for current Electron version
|
|
167
|
+
just cyclist-rebuild
|
|
168
|
+
|
|
169
|
+
# Or full setup from scratch
|
|
170
|
+
just cyclist-setup
|
|
171
|
+
```
|