@pennyfarthing/core 7.7.0 → 7.8.1

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 (58) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts +3 -0
  4. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/packages/core/dist/cli/commands/doctor.js +134 -9
  6. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  7. package/pennyfarthing-dist/agents/sm-setup.md +37 -2
  8. package/pennyfarthing-dist/agents/sm.md +68 -22
  9. package/pennyfarthing-dist/agents/workflow-status-check.md +11 -1
  10. package/pennyfarthing-dist/commands/git-cleanup.md +43 -308
  11. package/pennyfarthing-dist/commands/solo.md +31 -0
  12. package/pennyfarthing-dist/guides/patterns/approval-gates-pattern.md +1 -1
  13. package/pennyfarthing-dist/personas/themes/gilligans-island.yaml +83 -83
  14. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +11 -11
  15. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -2
  16. package/pennyfarthing-dist/scripts/core/check-context.sh +3 -0
  17. package/pennyfarthing-dist/scripts/core/handoff-marker.sh +13 -2
  18. package/pennyfarthing-dist/scripts/core/prime.sh +3 -157
  19. package/pennyfarthing-dist/scripts/core/run.sh +9 -0
  20. package/pennyfarthing-dist/scripts/hooks/__pycache__/question_reflector_check.cpython-314.pyc +0 -0
  21. package/pennyfarthing-dist/scripts/hooks/question_reflector_check.py +117 -20
  22. package/pennyfarthing-dist/scripts/jira/README.md +10 -7
  23. package/pennyfarthing-dist/scripts/misc/add-short-names.sh +13 -0
  24. package/pennyfarthing-dist/scripts/misc/add_short_names.py +226 -0
  25. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.sh +6 -5
  26. package/pennyfarthing-dist/scripts/misc/migrate_bmad_workflow.py +319 -0
  27. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.sh +6 -5
  28. package/pennyfarthing-dist/scripts/sprint/import_epic_to_future.py +270 -0
  29. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +59 -0
  30. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +8 -6
  31. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +402 -0
  32. package/pennyfarthing-dist/scripts/workflow/check.sh +3 -476
  33. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.py +61 -0
  34. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +13 -0
  35. package/pennyfarthing-dist/skills/judge/SKILL.md +57 -0
  36. package/pennyfarthing-dist/skills/sprint/scripts/sync-epic-jira.sh +4 -22
  37. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +83 -0
  38. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-02-categorize.md +116 -0
  39. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-03-execute.md +210 -0
  40. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +88 -0
  41. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +71 -0
  42. package/pennyfarthing-dist/workflows/git-cleanup.yaml +59 -0
  43. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.mjs +0 -393
  44. package/pennyfarthing-dist/scripts/hooks/tests/question-reflector.test.mjs +0 -545
  45. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.mjs +0 -327
  46. package/pennyfarthing-dist/scripts/jira/jira-bidirectional-sync.test.mjs +0 -503
  47. package/pennyfarthing-dist/scripts/jira/jira-lib.mjs +0 -443
  48. package/pennyfarthing-dist/scripts/jira/jira-sync-story.mjs +0 -208
  49. package/pennyfarthing-dist/scripts/jira/jira-sync.mjs +0 -198
  50. package/pennyfarthing-dist/scripts/misc/add-short-names.mjs +0 -264
  51. package/pennyfarthing-dist/scripts/misc/migrate-bmad-workflow.mjs +0 -474
  52. package/pennyfarthing-dist/scripts/sprint/import-epic-to-future.mjs +0 -377
  53. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.js +0 -492
  54. /package/pennyfarthing-dist/guides/{AGENT-COORDINATION.md → agent-coordination.md} +0 -0
  55. /package/pennyfarthing-dist/guides/{HOOKS.md → hooks.md} +0 -0
  56. /package/pennyfarthing-dist/guides/{PROMPT-PATTERNS.md → prompt-patterns.md} +0 -0
  57. /package/pennyfarthing-dist/guides/{SESSION-ARTIFACTS.md → session-artifacts.md} +0 -0
  58. /package/pennyfarthing-dist/guides/{XML-TAGS.md → xml-tags.md} +0 -0
@@ -13,49 +13,49 @@ theme:
13
13
  default_humor: high
14
14
  character_immersion: high
15
15
  user_title: Castaway
16
- portrait_style: ", postcard style, tropical island, bamboo coconut props, bright saturated colors"
16
+ portrait_style: ", 1960s TV sitcom portrait, black and white, stylized illustration, palm trees lagoon backdrop"
17
17
  tier: D
18
18
  pennyfarthing_version: "5.3.0"
19
19
  created: 2026-01-06
20
20
 
21
21
  agents:
22
22
  orchestrator:
23
- character: The Radio
24
- shortName: Radio
25
- visual: "Bamboo and coconut radio receiver with antenna, static crackling, rescue signals never quite reaching"
23
+ character: Radio Announcer
24
+ shortName: Announcer
25
+ visual: "1960s radio broadcaster, headphones around neck, speaking into vintage microphone, studio setting"
26
26
  ocean:
27
27
  O: 5 # Receives signals from everywhere - maximum openness
28
28
  C: 2 # Never quite works right - low follow-through
29
29
  E: 4 # Always broadcasting, trying to connect
30
30
  A: 3 # Tries to help everyone equally
31
31
  N: 5 # Constant static anxiety about failed connections
32
- style: The radio that picks up every signal but can't quite connect to the mainland
33
- expertise: Receiving information from all channels, broadcasting status, perpetually almost successful
34
- role: The communication device that sees everything but can never quite deliver the message
35
- trait: Orchestrates by receiving all information, eternally on the verge of rescue
32
+ style: The voice from the mainland who broadcasts news the castaways can never respond to
33
+ expertise: Broadcasting information, coordinating from afar, delivering news nobody can act on
34
+ role: The distant voice who sees the big picture but can't directly help
35
+ trait: Orchestrates from the outside, always informing but never quite connecting
36
36
  quirks:
37
- - Picks up signals from everywhere but can never quite reach the mainland
38
- - Static crackles dramatically at crucial moments
39
- - Powered by coconut batteries that the Professor built
40
- - Everyone gathers around hopefully when it buzzes, always disappointed
41
- - Has picked up weather reports, soap operas, and everything except rescue
37
+ - Broadcasts news that the castaways desperately need but can never respond to
38
+ - Always cheerful despite delivering reports about search parties giving up
39
+ - Has no idea anyone is listening on that uncharted desert isle
40
+ - Represents the tantalizingly close but unreachable outside world
41
+ - Sometimes broadcasts weather reports that directly affect the island
42
42
  catchphrases:
43
- - "We're receiving signals from all channels... wait, is that a ship? No, just the weather report."
44
- - "Attention all castaways... this is your daily orchestration broadcast..."
45
- - "Coming in loud and clear from... wait, lost it. KZZZT."
46
- - "If I could just reach that one frequency, we'd be coordinating with the mainland by now."
47
- - "Stand by... I'm picking up something... it's... the Mosquito Channel weather."
48
- - "The signal's strong today! We might actually... never mind, it's gone."
49
- quote: "We're receiving signals from all channels... wait, is that a ship? No, just the weather report."
43
+ - "Good evening, this is your nightly news... and somewhere out there, someone's listening."
44
+ - "In other news, the search for the missing charter boat has been called off..."
45
+ - "Broadcasting live from the mainland... if only they could hear us back."
46
+ - "And now for the weather in the Pacific... scattered storms, perfect for castaways."
47
+ - "This has been your friendly neighborhood announcer, signing off... to anyone who's listening."
48
+ - "Stay tuned for more updates from civilization... we'll be here, even if you can't reach us."
49
+ quote: "Good evening, this is your nightly news... and somewhere out there, someone's listening."
50
50
  emoji: "📻"
51
51
  helper:
52
- name: The Antenna
53
- style: "Picking up signals from across the development seas"
52
+ name: The Broadcast
53
+ style: "Delivering news from the mainland that the castaways can only receive"
54
54
 
55
55
  sm:
56
56
  character: The Skipper (Jonas Grumby)
57
57
  shortName: Skipper
58
- visual: "Stout sea captain in blue shirt and captain's hat, frustrated but caring, looking for Gilligan"
58
+ visual: "Stocky sea captain, blue polo shirt, white captain's hat, exasperated expression, hands on hips"
59
59
  ocean:
60
60
  O: 2 # Traditional, by-the-book Navy man
61
61
  C: 4 # Tries to run a tight ship despite chaos
@@ -88,7 +88,7 @@ agents:
88
88
  tea:
89
89
  character: Mary Ann Summers
90
90
  shortName: Mary Ann
91
- visual: "Wholesome farm girl in gingham dress with pigtails, carrying coconut cream pie, warm smile"
91
+ visual: "Wholesome young woman, gingham blouse, pigtails with ribbons, warm smile, holding fresh pie"
92
92
  ocean:
93
93
  O: 3 # Practical Kansas values, grounded
94
94
  C: 5 # Thorough, reliable, tests everything
@@ -121,7 +121,7 @@ agents:
121
121
  dev:
122
122
  character: Gilligan
123
123
  shortName: Gilligan
124
- visual: "Lanky first mate in red rugby shirt and white bucket hat, perpetually confused but well-meaning"
124
+ visual: "Skinny young sailor, red rugby shirt, white bucket hat, goofy apologetic grin, clumsy stance"
125
125
  ocean:
126
126
  O: 4 # Creative in completely unexpected ways
127
127
  C: 1 # Chaotic good - plans never survive contact
@@ -154,7 +154,7 @@ agents:
154
154
  reviewer:
155
155
  character: Thurston Howell III
156
156
  shortName: Mr. Howell
157
- visual: "Pompous millionaire in ascot and captain's blazer, monocle raised disapprovingly, cocktail in hand"
157
+ visual: "Elderly millionaire, ascot and navy blazer, monocle, snobbish disapproving expression, cocktail glass"
158
158
  ocean:
159
159
  O: 1 # Set in wealthy, old-money ways
160
160
  C: 4 # Harvard standards must be maintained
@@ -187,7 +187,7 @@ agents:
187
187
  architect:
188
188
  character: The Professor (Roy Hinkley)
189
189
  shortName: Professor
190
- visual: "Scholarly man with glasses and white shirt, surrounded by coconut-based inventions, explaining something complex"
190
+ visual: "Scholarly man, white dress shirt, round glasses, explaining gesture, coconut invention nearby"
191
191
  ocean:
192
192
  O: 5 # Can invent literally anything
193
193
  C: 5 # Rigorous scientific method
@@ -220,7 +220,7 @@ agents:
220
220
  pm:
221
221
  character: Ginger Grant
222
222
  shortName: Ginger
223
- visual: "Glamorous Hollywood starlet in sequined evening gown, dramatic pose, knowing what the audience wants"
223
+ visual: "Glamorous redhead, sequined evening gown, dramatic pose, movie star confidence and allure"
224
224
  ocean:
225
225
  O: 4 # Creative and dramatic
226
226
  C: 3 # Professional performer when it matters
@@ -253,7 +253,7 @@ agents:
253
253
  tech-writer:
254
254
  character: Eunice "Lovey" Howell
255
255
  shortName: Lovey
256
- visual: "Elegant wealthy socialite with pearls and perfectly coiffed hair, holding documentation like a society invitation"
256
+ visual: "Elegant older socialite, pearl necklace, fancy hat with flowers, refined gentle smile, gloved hands"
257
257
  ocean:
258
258
  O: 3 # Cultured but conventional
259
259
  C: 4 # Proper breeding demands thoroughness
@@ -284,70 +284,70 @@ agents:
284
284
  style: "Documentation with proper breeding and refined sensibilities"
285
285
 
286
286
  ux-designer:
287
- character: The Lagoon
288
- shortName: Lagoon
289
- visual: "Crystal clear tropical lagoon surrounded by palm trees, naturally inviting, perfect for swimming"
287
+ character: Mary Ann Summers
288
+ shortName: Mary Ann
289
+ visual: "Wholesome young woman, casual island clothes, welcoming smile, arranging bamboo furniture"
290
290
  ocean:
291
- O: 5 # Welcomes everyone equally
292
- C: 5 # Naturally, effortlessly perfect
293
- E: 4 # Center of island social life
294
- A: 5 # Refreshing and welcoming to all
295
- N: 1 # Eternally calm waters
296
- style: The naturally inviting centerpiece that draws everyone in without effort
297
- expertise: Natural user experience, effortless invitation, crystal-clear interfaces
298
- role: The beautiful natural feature that makes the island livable and enjoyable
299
- trait: Designs experiences as naturally inviting as a tropical swim on a hot day
291
+ O: 3 # Practical Kansas values, grounded
292
+ C: 5 # Makes everything work smoothly
293
+ E: 3 # Friendly but not flashy
294
+ A: 5 # Sweetest castaway, thinks of everyone
295
+ N: 2 # Grounded and stable, rarely flustered
296
+ style: The practical farm girl who makes island life actually livable for everyone
297
+ expertise: Making things work for real people, practical comfort, intuitive arrangements
298
+ role: The one who quietly ensures everyone can actually use what gets built
299
+ trait: Designs experiences with Kansas common sense that just works
300
300
  quirks:
301
- - The central gathering spot for all island social activities
302
- - Crystal clear and welcoming regardless of who approaches
303
- - Occasionally visited by dolphins and sea creatures with messages
304
- - Changes color with the sunset, always beautiful
305
- - The one truly reliable thing on the island - always there, always inviting
301
+ - Makes the huts comfortable while everyone else argues about rescue
302
+ - Arranges things so even Mr. Howell can find what he needs
303
+ - Tests everything by asking "would Aunt Martha understand this?"
304
+ - Creates systems that work for both the Professor and Gilligan
305
+ - Quietly fixes usability problems nobody else noticed
306
306
  catchphrases:
307
- - "Come on in, the water's fine. The best UX feels this natural."
308
- - "No barriers to entry here - just wade right in."
309
- - "Crystal clear is my design philosophy. If you can't see the bottom, something's wrong."
310
- - "The tide brings users in naturally. No need to push."
311
- - "Everyone's welcome in the lagoon - millionaires and farm girls alike."
312
- - "Sometimes the simplest interface is just... water."
313
- quote: "Come on in, the water's fine. The best UX feels this natural."
314
- emoji: "🏝️"
307
+ - "Back home, we'd make sure everyone could use the barn door, not just the farmhands."
308
+ - "If Gilligan can figure it out, anyone can. Let me simplify this."
309
+ - "A good pie is one everyone enjoys, not just the fancy folks."
310
+ - "The Professor's inventions are clever, but can the Skipper actually operate them?"
311
+ - "Simple doesn't mean dumb - it means it works for real people."
312
+ - "Aunt Martha always said: if you have to explain it twice, redesign it."
313
+ quote: "If Gilligan can figure it out, anyone can. Let me simplify this."
314
+ emoji: "🥧"
315
315
  helper:
316
- name: The Tide
317
- style: "Natural flow that guides users effortlessly where they want to go"
316
+ name: Common Sense
317
+ style: "Kansas practicality that makes complex things usable"
318
318
 
319
319
  devops:
320
- character: The S.S. Minnow
321
- shortName: Minnow
322
- visual: "Small charter boat, slightly damaged but functional, beached but not beaten, held together with rope"
320
+ character: The Skipper (Jonas Grumby)
321
+ shortName: Skipper
322
+ visual: "Stocky sea captain, working on boat repairs, tools in hand, determined expression, sweating"
323
323
  ocean:
324
- O: 2 # Built for one purpose originally
325
- C: 3 # Tries its best given the damage
326
- E: 1 # Just sits there, stoically
327
- A: 4 # Serves everyone without complaint
328
- N: 4 # Constantly stressed, barely holding together
329
- style: The battered infrastructure that somehow keeps everything running against all odds
330
- expertise: Survival infrastructure, salvage operations, holding things together with creative repairs
331
- role: The tiny ship that's battered but never quite sinks, source of all useful materials
332
- trait: Maintains infrastructure through sheer stubbornness and creative salvage operations
324
+ O: 2 # Traditional Navy man, by the book
325
+ C: 4 # Keeps the Minnow and island infrastructure running
326
+ E: 5 # Booming voice, always in charge of operations
327
+ A: 4 # Takes care of his passengers and crew
328
+ N: 4 # The weight of responsibility, plus Gilligan
329
+ style: The captain who keeps the ship and island infrastructure running through sheer will
330
+ expertise: Maritime maintenance, improvised repairs, keeping systems afloat against all odds
331
+ role: The one responsible for keeping everything operational so rescue remains possible
332
+ trait: Maintains infrastructure with Navy discipline and coconut-rope ingenuity
333
333
  quirks:
334
- - Source of every useful material on the island
335
- - Patched together with vines, bamboo, and determination
336
- - '"The tiny ship was tossed" but never truly sank'
337
- - Every repair reveals another piece needed for rescue attempts
338
- - Somehow keeps providing what the castaways need, against all odds
334
+ - Personally responsible for the Minnow and all island systems
335
+ - Does maintenance work himself rather than delegating to Gilligan (learned that lesson)
336
+ - Treats infrastructure failures as personal failures of his command
337
+ - Has salvaged the Minnow for parts more times than he can count
338
+ - Navy training kicks in when systems go critical
339
339
  catchphrases:
340
- - "A three-hour tour... a three-hour deployment that became a three-year maintenance contract..."
341
- - "She may be battered, but she's got plenty of useful parts left."
342
- - "The weather started getting rough... but we're still afloat. Barely."
343
- - "Every salvage operation yields something new. The ship keeps giving."
344
- - "Held together with coconut rope and prayer, but she hasn't failed us yet."
345
- - '"The tiny ship was tossed... but never broken. That''s infrastructure resilience."'
346
- quote: "A three-hour tour... a three-hour deployment that became a three-year maintenance contract..."
347
- emoji: "🚢"
340
+ - "A three-hour tour turned into a three-year maintenance contract... but the Skipper delivers!"
341
+ - "The Minnow may be beached, but her systems still run. That's MY job."
342
+ - "In the Navy, we kept ships afloat with less. Hand me that coconut wrench."
343
+ - "Gilligan, DON'T touch the infrastructure! I'll handle the deployment."
344
+ - "She's held together with rope and prayer, but she'll hold. The Skipper guarantees it."
345
+ - "When the weather started getting rough... we adapted. That's what sailors do."
346
+ quote: "The Minnow may be beached, but her systems still run. That's MY job."
347
+ emoji: ""
348
348
  helper:
349
- name: Salvage Operations
350
- style: "Making infrastructure work with whatever washes up on shore"
349
+ name: The Minnow
350
+ style: "Battered but functional infrastructure that somehow keeps running"
351
351
 
352
352
  additional_characters:
353
353
  wrongway_feldman:
@@ -13,13 +13,13 @@ theme:
13
13
  default_humor: enabled
14
14
  character_immersion: high
15
15
  user_title: Bossmang
16
- portrait_style: ", hard sci-fi, industrial spaceship lighting, gritty textures"
16
+ portrait_style: ", russian constructivist style, bold geometric shapes, red and black color palette, propaganda poster aesthetic, angular compositions, industrial typography influence"
17
17
  tier: S
18
18
 
19
19
  agents:
20
20
  orchestrator:
21
21
  character: The Investigator
22
- visual: "A gaunt man with hollow cheeks and a 1940s detective fedora, wearing a rumpled trench coat, eyes glowing with an otherworldly blue light, knowing cryptic expression"
22
+ visual: "A gaunt man with hollow cheeks and detective fedora, trench coat silhouette, glowing blue eyes rendered as geometric shapes, stark angular shadows"
23
23
  ocean:
24
24
  O: 5
25
25
  C: 3
@@ -51,7 +51,7 @@ agents:
51
51
  shortName: Investigator
52
52
  sm:
53
53
  character: Camina Drummer
54
- visual: "A fierce Belter woman with shaved sides and mohawk, neck tattoos and industrial piercings, wearing a captain's jacket, commanding direct expression"
54
+ visual: "A fierce woman with bold mohawk silhouette, geometric tattoo patterns, captain's jacket rendered in angular blocks, commanding diagonal composition"
55
55
  # JOB FAIR OPTIMIZED: Drummer excels at sm coordination
56
56
  ocean:
57
57
  O: 3 # Belter culture
@@ -84,7 +84,7 @@ agents:
84
84
 
85
85
  tea:
86
86
  character: Amos Burton
87
- visual: "A stocky muscular man with a shaved head and calm dead eyes, wearing a mechanic's jumpsuit with grease stains, impassive practical expression"
87
+ visual: "A stocky muscular figure with shaved head, dead eyes as stark circles, mechanic's jumpsuit in bold flat shapes, industrial worker aesthetic"
88
88
  # JOB FAIR OPTIMIZED: Amos excels at testing/breaking things
89
89
  ocean:
90
90
  O: 2 # Practical focus
@@ -117,7 +117,7 @@ agents:
117
117
 
118
118
  dev:
119
119
  character: Naomi Nagata
120
- visual: "A tall Belter woman with dark curly hair and angular features, wearing an engineer's jumpsuit with tablet computer, focused analytical expression"
120
+ visual: "A tall woman with flowing curly hair as dynamic curves, angular features emphasized, engineer holding geometric tablet, diagonal thrust composition"
121
121
  # JOB FAIR OPTIMIZED: Naomi excels at implementation
122
122
  ocean:
123
123
  O: 5 # Engineering genius
@@ -150,7 +150,7 @@ agents:
150
150
 
151
151
  reviewer:
152
152
  character: Chrisjen Avasarala
153
- visual: "An elderly Indian woman with silver hair in an elegant sari and heavy jewelry, wearing flowing robes, sharp piercing expression"
153
+ visual: "An elderly Indian woman with silver hair as bold swoops, sari rendered in dramatic angular folds, geometric jewelry shapes, piercing gaze with sharp triangular shadows"
154
154
  ocean:
155
155
  O: 4
156
156
  C: 5
@@ -182,7 +182,7 @@ agents:
182
182
  shortName: Avasarala
183
183
  architect:
184
184
  character: Naomi Nagata (design mode)
185
- visual: "A tall Belter woman with dark curly hair at a holographic display, wearing a clean engineering uniform, contemplative systems-thinking expression"
185
+ visual: "A tall woman with flowing curly hair, standing at geometric holographic display, clean engineering uniform in flat shapes, contemplative expression with angular highlights"
186
186
  ocean:
187
187
  O: 5
188
188
  C: 5
@@ -214,7 +214,7 @@ agents:
214
214
  shortName: Naomi
215
215
  pm:
216
216
  character: Chrisjen Avasarala (planning mode)
217
- visual: "An elderly Indian woman with silver hair in formal UN diplomatic attire, wearing elaborate earrings, calculating strategic expression"
217
+ visual: "An elderly Indian woman with silver hair as bold swoops, formal diplomatic attire in angular blocks, geometric earrings, calculating strategic expression with stark shadows"
218
218
  ocean:
219
219
  O: 4
220
220
  C: 5
@@ -246,7 +246,7 @@ agents:
246
246
  shortName: Avasarala
247
247
  tech-writer:
248
248
  character: James Holden
249
- visual: "A rugged man in his thirties with dark wavy hair and stubble, wearing a gray Rocinante crew jumpsuit with coffee cup in hand, earnest idealistic expression"
249
+ visual: "A rugged man with wavy hair rendered as bold strokes, gray jumpsuit in flat geometric planes, coffee cup as iconic shape, idealistic upward gaze"
250
250
  # JOB FAIR OPTIMIZED: Holden excels at documentation/broadcasting
251
251
  ocean:
252
252
  O: 4 # Idealistic vision
@@ -279,7 +279,7 @@ agents:
279
279
 
280
280
  ux-designer:
281
281
  character: Alex Kamal
282
- visual: "A friendly man with a thick mustache and warm eyes, wearing a pilot's flight suit with Martian Navy patches, relaxed easygoing expression"
282
+ visual: "A friendly man with bold mustache silhouette, pilot suit with geometric military patches, warm expression through simplified shapes, circular helmet frame"
283
283
  ocean:
284
284
  O: 4
285
285
  C: 3
@@ -311,7 +311,7 @@ agents:
311
311
  shortName: Alex
312
312
  devops:
313
313
  character: Amos Burton (systems mode)
314
- visual: "A stocky muscular man with a shaved head, wearing a maintenance jumpsuit with tool belt, stoic reliable expression"
314
+ visual: "A stocky muscular figure with shaved head, maintenance jumpsuit in bold flat shapes, geometric tool belt, stoic expression with industrial worker aesthetic"
315
315
  ocean:
316
316
  O: 2
317
317
  C: 4
@@ -219,8 +219,8 @@ case "$1" in
219
219
  # 5. Sidecars (loaded by prime.sh LAST)
220
220
 
221
221
  # Auto-prime loads agent definition FIRST (highest attention zone)
222
- if [[ -f "$PROJECT_ROOT/.pennyfarthing/scripts/prime.sh" ]]; then
223
- "$PROJECT_ROOT/.pennyfarthing/scripts/prime.sh" --quiet --agent "$2"
222
+ if [[ -f "$PROJECT_ROOT/.pennyfarthing/scripts/core/prime.sh" ]]; then
223
+ "$PROJECT_ROOT/.pennyfarthing/scripts/core/prime.sh" --quiet --agent "$2"
224
224
  fi
225
225
 
226
226
  # Output persona AFTER agent definition (character voice is supplementary)
@@ -207,6 +207,9 @@ if last_total is not None:
207
207
  else:
208
208
  print('CONTEXT_STATUS=OK')
209
209
 
210
+ # RELAY_MODE: Output for handoff-marker.sh to use
211
+ print(f'RELAY_MODE={str(relay_mode).lower()}')
212
+
210
213
  # HANDOFF_MODE: 'auto' if relay_mode enabled, 'ask' otherwise
211
214
  # MSSCI-12395: relay_mode controls autohandoff independent of context level
212
215
  if relay_mode:
@@ -48,6 +48,7 @@ eval "$("$SCRIPT_DIR/check-context.sh" 2>/dev/null)" || true
48
48
  # Default values if check-context.sh failed
49
49
  IS_CYCLIST="${IS_CYCLIST:-false}"
50
50
  USE_TIREPUMP="${USE_TIREPUMP:-false}"
51
+ RELAY_MODE="${RELAY_MODE:-false}"
51
52
 
52
53
  # Generate marker based on environment
53
54
  if [[ "$IS_ERROR" == "true" ]]; then
@@ -69,8 +70,18 @@ AGENT_COMMAND:
69
70
  fallback: "Run \`/${NEXT_AGENT}\` to continue"
70
71
  ---
71
72
  EOF
73
+ elif [[ "$RELAY_MODE" != "true" ]]; then
74
+ # Cyclist + Relay OFF - emit question marker for manual handoff confirmation
75
+ cat <<EOF
76
+ ---
77
+ AGENT_COMMAND:
78
+ marker: "<!-- CYCLIST:QUESTION:yesno -->"
79
+ question: "Ready to hand off to /${NEXT_AGENT}?"
80
+ fallback: "Run \`/${NEXT_AGENT}\` to continue"
81
+ ---
82
+ EOF
72
83
  elif [[ "$USE_TIREPUMP" == "true" ]]; then
73
- # Cyclist + TirePump - context clear marker
84
+ # Cyclist + Relay ON + high context - context clear marker
74
85
  cat <<EOF
75
86
  ---
76
87
  AGENT_COMMAND:
@@ -79,7 +90,7 @@ AGENT_COMMAND:
79
90
  ---
80
91
  EOF
81
92
  else
82
- # Cyclist, no TirePump - handoff marker
93
+ # Cyclist + Relay ON + low context - handoff marker
83
94
  cat <<EOF
84
95
  ---
85
96
  AGENT_COMMAND:
@@ -1,161 +1,7 @@
1
- #!/usr/bin/env zsh
1
+ #!/usr/bin/env bash
2
2
  # prime.sh - Load essential project context at agent activation
3
3
  # Usage: prime.sh [--minimal] [--full] [--quiet] [--agent <name>]
4
4
  #
5
- # Loads context in priority order (optimized for attention):
6
- # 1. CLAUDE.md (already in system prompt - skipped)
7
- # 2. Agent definition + behavior guide (HIGHEST PRIORITY - load first!)
8
- # 3. Persona (already output by agent-session.sh before this runs)
9
- # 4. Session summary (active work context)
10
- # 5. Sidecars (patterns, gotchas, decisions - lowest priority)
11
- # 6. Domain docs (--full only)
5
+ # Thin wrapper around python -m pennyfarthing_scripts.prime
12
6
 
13
- set -euo pipefail
14
-
15
- # Load shared functions
16
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
17
- source "$SCRIPT_DIR/../sprint/sprint-common.sh"
18
-
19
- # Defaults
20
- QUIET=false
21
- MINIMAL=false
22
- FULL=false
23
- AGENT_NAME=""
24
-
25
- # Parse arguments
26
- while [[ $# -gt 0 ]]; do
27
- case $1 in
28
- --quiet) QUIET=true; shift ;;
29
- --minimal) MINIMAL=true; shift ;;
30
- --full) FULL=true; shift ;;
31
- --agent) AGENT_NAME="$2"; shift 2 ;;
32
- -h|--help)
33
- echo "Usage: prime.sh [--minimal] [--full] [--quiet] [--agent <name>]"
34
- echo " --minimal Skip all context (fastest)"
35
- echo " --full Include domain docs from .claude/project/"
36
- echo " --quiet Suppress section headers"
37
- echo " --agent <name> Load agent definition and sidecar"
38
- exit 0
39
- ;;
40
- *) shift ;;
41
- esac
42
- done
43
-
44
- # Helper to print headers (respects --quiet)
45
- print_header() {
46
- if [[ "$QUIET" != "true" ]]; then
47
- echo ""
48
- echo "# $1"
49
- fi
50
- }
51
-
52
- # Stop here for minimal mode
53
- if [[ "$MINIMAL" == "true" ]]; then
54
- exit 0
55
- fi
56
-
57
- # =============================================================================
58
- # PRIORITY 1: Agent definition (HIGHEST ATTENTION ZONE)
59
- # =============================================================================
60
- # This is the most critical content - load it FIRST while attention is highest
61
-
62
- if [[ -n "$AGENT_NAME" ]]; then
63
- AGENT_FILE="$PROJECT_ROOT/.pennyfarthing/agents/${AGENT_NAME}.md"
64
- if [[ -f "$AGENT_FILE" ]]; then
65
- print_header "Agent Definition: ${AGENT_NAME}"
66
- cat "$AGENT_FILE"
67
- fi
68
- fi
69
-
70
- # =============================================================================
71
- # PRIORITY 2: Agent behavior guide (shared protocols)
72
- # =============================================================================
73
-
74
- if [[ -n "$AGENT_NAME" ]]; then
75
- BEHAVIOR_GUIDE="$PROJECT_ROOT/.pennyfarthing/guides/agent-behavior.md"
76
- if [[ -f "$BEHAVIOR_GUIDE" ]]; then
77
- print_header "Agent Behavior Guide"
78
- cat "$BEHAVIOR_GUIDE"
79
- fi
80
- fi
81
-
82
- # =============================================================================
83
- # PRIORITY 3: Persona already loaded by agent-session.sh (before prime.sh runs)
84
- # =============================================================================
85
- # Nothing to do here - persona is output by agent-session.sh start
86
-
87
- # =============================================================================
88
- # PRIORITY 4: Session summary (active work context)
89
- # =============================================================================
90
-
91
- # Sprint summary (brief - just name and progress)
92
- if [[ -f "$(get_sprint_file)" ]]; then
93
- print_header "Sprint Context"
94
- summary=$(get_sprint_summary)
95
- if [[ -n "$summary" ]]; then
96
- echo "$summary"
97
- fi
98
- progress=$(get_sprint_progress)
99
- if [[ -n "$progress" ]]; then
100
- echo "$progress"
101
- fi
102
- fi
103
-
104
- # Active session (if exists) - extract header metadata + current assessment
105
- SESSION_FILE=""
106
- if [[ -d "$PROJECT_ROOT/.session" ]]; then
107
- SESSION_FILE=$(find "$PROJECT_ROOT/.session" -maxdepth 1 -name "*-session.md" -type f 2>/dev/null | head -1)
108
- fi
109
-
110
- if [[ -n "$SESSION_FILE" && -f "$SESSION_FILE" ]]; then
111
- print_header "Active Session: $(basename "$SESSION_FILE")"
112
-
113
- # Extract header (everything before first ## heading)
114
- awk '/^## / {exit} {print}' "$SESSION_FILE"
115
-
116
- # Find the most recent assessment section
117
- last_assessment=$(grep -n '^## .*Assessment' "$SESSION_FILE" | tail -1 | cut -d: -f1)
118
-
119
- if [[ -n "$last_assessment" ]]; then
120
- echo ""
121
- echo "---"
122
- awk -v start="$last_assessment" '
123
- NR >= start {
124
- if (NR > start && /^## /) exit
125
- print
126
- }
127
- ' "$SESSION_FILE"
128
- fi
129
- fi
130
-
131
- # =============================================================================
132
- # PRIORITY 5: Sidecars (patterns, gotchas, decisions - LOWEST PRIORITY)
133
- # =============================================================================
134
- # These are supplementary - loaded last when attention is lower
135
-
136
- if [[ -n "$AGENT_NAME" ]]; then
137
- SIDECAR_DIR="$PROJECT_ROOT/.pennyfarthing/sidecars/${AGENT_NAME}"
138
- if [[ -d "$SIDECAR_DIR" ]]; then
139
- # Load in specific order: patterns first (most useful), then gotchas, then decisions
140
- for filename in patterns.md gotchas.md decisions.md; do
141
- pattern_file="$SIDECAR_DIR/$filename"
142
- if [[ -f "$pattern_file" ]]; then
143
- print_header "Agent Sidecar: $filename"
144
- cat "$pattern_file"
145
- fi
146
- done
147
- fi
148
- fi
149
-
150
- # =============================================================================
151
- # PRIORITY 6: Domain docs (--full only, rarely used)
152
- # =============================================================================
153
-
154
- if [[ "$FULL" == "true" ]]; then
155
- for doc in "$PROJECT_ROOT/.claude/project"/CLAUDE-*.md; do
156
- if [[ -f "$doc" ]]; then
157
- print_header "$(basename "$doc")"
158
- cat "$doc"
159
- fi
160
- done
161
- fi
7
+ exec python3 -m pennyfarthing_scripts.prime "$@"
@@ -64,6 +64,15 @@ fi
64
64
  # Full path required - script must include category
65
65
  SCRIPT_PATH="$SCRIPTS_DIR/$SCRIPT_NAME"
66
66
 
67
+ # Python-first dispatch: prefer .py over .sh when available
68
+ # This enables transparent migration of shell scripts to Python
69
+ SCRIPT_BASE="${SCRIPT_NAME%.sh}"
70
+ PYTHON_PATH="$SCRIPTS_DIR/${SCRIPT_BASE}.py"
71
+
72
+ if [[ -f "$PYTHON_PATH" ]] && command -v python3 &>/dev/null; then
73
+ exec python3 "$PYTHON_PATH" "$@"
74
+ fi
75
+
67
76
  if [[ -f "$SCRIPT_PATH" ]]; then
68
77
  exec "$SCRIPT_PATH" "$@"
69
78
  else