@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.
Files changed (75) hide show
  1. package/README.md +22 -14
  2. package/package.json +10 -11
  3. package/pennyfarthing-dist/agents/README.md +16 -2
  4. package/pennyfarthing-dist/agents/architect.md +19 -5
  5. package/pennyfarthing-dist/agents/dev.md +18 -4
  6. package/pennyfarthing-dist/agents/devops.md +19 -5
  7. package/pennyfarthing-dist/agents/generic-handoff.md +4 -1
  8. package/pennyfarthing-dist/agents/orchestrator.md +25 -8
  9. package/pennyfarthing-dist/agents/pm.md +14 -3
  10. package/pennyfarthing-dist/agents/reviewer-preflight.md +10 -52
  11. package/pennyfarthing-dist/agents/reviewer.md +27 -7
  12. package/pennyfarthing-dist/agents/sm.md +51 -22
  13. package/pennyfarthing-dist/agents/tea.md +18 -4
  14. package/pennyfarthing-dist/agents/testing-runner.md +4 -1
  15. package/pennyfarthing-dist/guides/shared-context.md +1 -1
  16. package/pennyfarthing-dist/scripts/add-short-names.mjs +0 -0
  17. package/pennyfarthing-dist/scripts/agent-session.sh +0 -0
  18. package/pennyfarthing-dist/scripts/check-context.sh +0 -0
  19. package/pennyfarthing-dist/scripts/check.sh +0 -0
  20. package/pennyfarthing-dist/scripts/deploy.sh +0 -0
  21. package/pennyfarthing-dist/scripts/doctor-dogfood.sh +77 -42
  22. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +0 -0
  23. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +0 -0
  24. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +0 -0
  25. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +0 -0
  26. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +0 -0
  27. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +0 -0
  28. package/pennyfarthing-dist/scripts/hooks/pre-push.sh +0 -0
  29. package/pennyfarthing-dist/scripts/hooks/session-start.sh +0 -0
  30. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +0 -0
  31. package/pennyfarthing-dist/scripts/install-git-hooks.sh +0 -0
  32. package/pennyfarthing-dist/scripts/prime.sh +0 -0
  33. package/pennyfarthing-dist/scripts/release.sh +0 -0
  34. package/pennyfarthing-dist/scripts/repo-utils.sh +0 -0
  35. package/pennyfarthing-dist/scripts/run-ci.sh +0 -0
  36. package/pennyfarthing-dist/scripts/run.sh +0 -0
  37. package/pennyfarthing-dist/scripts/statusline.sh +0 -0
  38. package/pennyfarthing-dist/scripts/tests/check.test.sh +0 -0
  39. package/pennyfarthing-dist/scripts/tests/test-character-voice.sh +0 -0
  40. package/pennyfarthing-dist/scripts/tests/test-drift-detection.sh +0 -0
  41. package/pennyfarthing-dist/scripts/tests/test-post-merge-hook.sh +0 -0
  42. package/pennyfarthing-dist/scripts/tests/test-session-checkpoint.sh +0 -0
  43. package/pennyfarthing-dist/scripts/tests/test-solo-command.sh +0 -0
  44. package/pennyfarthing-dist/scripts/uninstall.sh +0 -0
  45. package/pennyfarthing-dist/scripts/utils/background-tasks.sh +0 -0
  46. package/pennyfarthing-dist/scripts/utils/check-status.sh +0 -0
  47. package/pennyfarthing-dist/scripts/utils/checkpoint.sh +0 -0
  48. package/pennyfarthing-dist/scripts/utils/common.sh +0 -0
  49. package/pennyfarthing-dist/scripts/utils/create-feature-branches.sh +0 -0
  50. package/pennyfarthing-dist/scripts/utils/file-lock.sh +0 -0
  51. package/pennyfarthing-dist/scripts/utils/find-related-work.sh +0 -0
  52. package/pennyfarthing-dist/scripts/utils/generate-skill-docs.sh +0 -0
  53. package/pennyfarthing-dist/scripts/utils/git-status-all.sh +0 -0
  54. package/pennyfarthing-dist/scripts/utils/jira/jira-lib.mjs +0 -0
  55. package/pennyfarthing-dist/scripts/utils/jira/jira-sync-story.mjs +0 -0
  56. package/pennyfarthing-dist/scripts/utils/jira/jira-sync.mjs +0 -0
  57. package/pennyfarthing-dist/scripts/utils/jira-claim-story.sh +0 -0
  58. package/pennyfarthing-dist/scripts/utils/jira-lib.sh +0 -0
  59. package/pennyfarthing-dist/scripts/utils/jira-sync-story.sh +0 -0
  60. package/pennyfarthing-dist/scripts/utils/jira-sync.sh +0 -0
  61. package/pennyfarthing-dist/scripts/utils/log-skill-usage.sh +0 -0
  62. package/pennyfarthing-dist/scripts/utils/logging.sh +0 -0
  63. package/pennyfarthing-dist/scripts/utils/repo-scan.sh +0 -0
  64. package/pennyfarthing-dist/scripts/utils/retry.sh +0 -0
  65. package/pennyfarthing-dist/scripts/utils/run-timestamp.sh +0 -0
  66. package/pennyfarthing-dist/scripts/utils/session-cleanup.sh +0 -0
  67. package/pennyfarthing-dist/scripts/utils/skill-usage-report.sh +0 -0
  68. package/pennyfarthing-dist/scripts/utils/sprint-common.sh +0 -0
  69. package/pennyfarthing-dist/scripts/utils/sprint-metrics.sh +0 -0
  70. package/pennyfarthing-dist/scripts/utils/swebench-judge.py +0 -0
  71. package/pennyfarthing-dist/scripts/utils/sync-epic-to-jira.sh +0 -0
  72. package/pennyfarthing-dist/scripts/utils/test-setup.sh +0 -0
  73. package/pennyfarthing-dist/scripts/utils/validate-subagent-frontmatter.sh +0 -0
  74. package/pennyfarthing-dist/scripts/worktree-manager.sh +0 -0
  75. package/pennyfarthing-dist/skills/cyclist/SKILL.md +71 -17
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pennyfarthing
2
2
 
3
- **v6.5.0** | *The outer loop goes once, the inner loop goes many times.*
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
- │ ├── agents/ # → symlink to node_modules/pennyfarthing/pennyfarthing-dist/agents/
151
- │ ├── commands/ # → symlink to node_modules/pennyfarthing/pennyfarthing-dist/commands/
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 v6.4
255
+ ## What's New in v7.0
254
256
 
255
- - **102 Themes** - 11 new themes added since v6.0
256
- - **20 Skills** - Expanded knowledge domains
257
- - **43 Commands** - More workflow entry points
258
- - **Sprint 10** - Customizable workflows and runtime permissions
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
- - `pennyfarthing` - CLI only (1.1 MB)
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": "6.6.2",
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
- "packageManager": "pnpm@9.0.0"
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: "testing-runner"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "testing-runner"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "generic-handoff"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "testing-runner"
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: "testing-runner"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "testing-runner"
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: "generic-handoff"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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
- subagent_type: "testing-runner"
101
- model: "haiku"
102
- description: "run tests"
103
- prompt: |
104
- You are a testing runner for the Conductor project.
105
- Run tests and report structured results.
106
-
107
- ## Skills Reference
108
- Read the testing skill at .claude/skills/testing/SKILL.md for test commands.
109
- For troubleshooting failures, see .claude/skills/testing/references/troubleshooting.md
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "reviewer-preflight"
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: "generic-handoff"
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: "generic-handoff"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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
- - **Removed subagents:** (deleted - use consolidated versions above)
29
- - `sm-work-research` → use `generic-sm-setup` with MODE=research
30
- - `sm-story-setup` → use `generic-sm-setup` with MODE=setup
31
- - `sm-finish-bookkeeping` → use `generic-sm-finish` with PHASE=preflight
32
- - `sm-finish-execution` → use `generic-sm-finish` with PHASE=execute
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: "workflow-status-check"
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: "workflow-status-check"
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: "generic-sm-finish"
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: "generic-sm-finish"
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: "generic-sm-setup"
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: "sm-file-summary"
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: "generic-sm-setup"
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: "sm-handoff"
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
- - **Official subagents:** (use `subagent_type: "{name}"`)
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: "generic-handoff"
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: "testing-runner"
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:** 6.3.0
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 .claude/pennyfarthing symlink
123
- if [[ -L ".claude/pennyfarthing" ]]; then
124
- TARGET=$(readlink ".claude/pennyfarthing")
125
- if [[ "$TARGET" == "../pennyfarthing-dist" ]]; then
126
- ok ".claude/pennyfarthing -> ../pennyfarthing-dist"
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 ".claude/pennyfarthing points to wrong target: $TARGET"
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
- elif [[ -d ".claude/pennyfarthing" ]]; then
131
- fail ".claude/pennyfarthing is a directory, should be symlink"
132
- else
133
- fail ".claude/pennyfarthing missing"
134
- fi
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
- if [[ -d "dist" ]]; then
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="dist/cli/commands/${base}.js"
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 dist/"
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/ directory missing"
270
+ fail "packages/core/dist/ missing"
225
271
  if $FIX_MODE; then
226
272
  npm run build >/dev/null 2>&1
227
- fix "Built dist/"
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 for files that should be in pennyfarthing-dist but aren't
264
- # Only check directories that are NOT symlinks (symlink dirs are fine)
265
- MISPLACED=0
266
-
267
- # .claude/agents should be a symlink, not a real directory with files
268
- if [[ -d ".claude/agents" ]] && [[ ! -L ".claude/agents" ]]; then
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
- if [[ $MISPLACED -eq 0 ]]; then
286
- ok "All .claude/ directories properly symlinked"
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
@@ -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
- # Dev mode with hot reload
77
- cd packages/cyclist && CYCLIST_DEV_WEB=1 CYCLIST_PROJECT_DIR=/path npm run dev:server
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 `.claude/` directory (Pennyfarthing-enabled)
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
- - Ensure you're in the cyclist package directory
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 `.claude/persona-config.yaml`
154
+ - Check theme in `.pennyfarthing/config.local.yaml`
114
155
 
115
156
  ### "Not a Pennyfarthing project"
116
- - Ensure project has `.claude/` directory
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
+ ```