pi-crew 0.1.49 → 0.2.0

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 (249) hide show
  1. package/CHANGELOG.md +74 -1
  2. package/README.md +176 -781
  3. package/agents/analyst.md +11 -11
  4. package/agents/critic.md +11 -11
  5. package/agents/executor.md +11 -11
  6. package/agents/explorer.md +11 -11
  7. package/agents/planner.md +11 -11
  8. package/agents/reviewer.md +11 -11
  9. package/agents/security-reviewer.md +11 -11
  10. package/agents/test-engineer.md +11 -11
  11. package/agents/verifier.md +70 -11
  12. package/agents/writer.md +11 -11
  13. package/docs/actions-reference.md +595 -0
  14. package/docs/commands-reference.md +347 -0
  15. package/docs/runtime-flow.md +148 -148
  16. package/index.ts +6 -6
  17. package/package.json +99 -99
  18. package/skills/async-worker-recovery/SKILL.md +42 -42
  19. package/skills/context-artifact-hygiene/SKILL.md +52 -52
  20. package/skills/delegation-patterns/SKILL.md +54 -54
  21. package/skills/mailbox-interactive/SKILL.md +40 -40
  22. package/skills/model-routing-context/SKILL.md +39 -39
  23. package/skills/multi-perspective-review/SKILL.md +58 -58
  24. package/skills/observability-reliability/SKILL.md +41 -41
  25. package/skills/orchestration/SKILL.md +157 -157
  26. package/skills/ownership-session-security/SKILL.md +41 -41
  27. package/skills/pi-extension-lifecycle/SKILL.md +39 -39
  28. package/skills/requirements-to-task-packet/SKILL.md +63 -63
  29. package/skills/resource-discovery-config/SKILL.md +41 -41
  30. package/skills/runtime-state-reader/SKILL.md +44 -44
  31. package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
  32. package/skills/state-mutation-locking/SKILL.md +42 -42
  33. package/skills/systematic-debugging/SKILL.md +67 -67
  34. package/skills/ui-render-performance/SKILL.md +39 -39
  35. package/skills/verification-before-done/SKILL.md +57 -57
  36. package/skills/worktree-isolation/SKILL.md +39 -39
  37. package/src/adapters/claude-adapter.ts +25 -0
  38. package/src/adapters/codex-adapter.ts +21 -0
  39. package/src/adapters/cursor-adapter.ts +17 -0
  40. package/src/adapters/export-util.ts +137 -0
  41. package/src/adapters/index.ts +15 -0
  42. package/src/adapters/registry.ts +18 -0
  43. package/src/adapters/types.ts +23 -0
  44. package/src/agents/agent-config.ts +2 -0
  45. package/src/agents/agent-search.ts +98 -98
  46. package/src/agents/discover-agents.ts +2 -1
  47. package/src/config/config.ts +14 -1
  48. package/src/config/defaults.ts +5 -5
  49. package/src/config/drift-detector.ts +211 -0
  50. package/src/config/markers.ts +327 -0
  51. package/src/config/resilient-parser.ts +108 -0
  52. package/src/config/suggestions.ts +74 -0
  53. package/src/extension/cross-extension-rpc.ts +103 -82
  54. package/src/extension/project-init.ts +36 -4
  55. package/src/extension/register.ts +67 -22
  56. package/src/extension/registration/commands.ts +77 -8
  57. package/src/extension/registration/subagent-tools.ts +10 -1
  58. package/src/extension/registration/team-tool.ts +10 -1
  59. package/src/extension/registration/viewers.ts +48 -34
  60. package/src/extension/run-bundle-schema.ts +89 -89
  61. package/src/extension/run-export.ts +26 -12
  62. package/src/extension/run-import.ts +25 -1
  63. package/src/extension/run-index.ts +5 -1
  64. package/src/extension/run-maintenance.ts +142 -68
  65. package/src/extension/team-manager-command.ts +10 -1
  66. package/src/extension/team-tool/context.ts +1 -1
  67. package/src/extension/team-tool/doctor.ts +28 -3
  68. package/src/extension/team-tool/handle-settings.ts +195 -188
  69. package/src/extension/team-tool/inspect.ts +41 -41
  70. package/src/extension/team-tool/intent-policy.ts +42 -42
  71. package/src/extension/team-tool/lifecycle-actions.ts +27 -8
  72. package/src/extension/team-tool/plan.ts +19 -19
  73. package/src/extension/team-tool/run.ts +12 -1
  74. package/src/extension/team-tool.ts +14 -3
  75. package/src/i18n.ts +184 -184
  76. package/src/observability/exporters/otlp-exporter.ts +92 -77
  77. package/src/prompt/prompt-runtime.ts +72 -72
  78. package/src/runtime/agent-memory.ts +72 -72
  79. package/src/runtime/agent-observability.ts +114 -114
  80. package/src/runtime/async-marker.ts +26 -26
  81. package/src/runtime/attention-events.ts +28 -28
  82. package/src/runtime/auto-resume.ts +100 -0
  83. package/src/runtime/background-runner.ts +11 -1
  84. package/src/runtime/cancellation-token.ts +89 -89
  85. package/src/runtime/cancellation.ts +61 -61
  86. package/src/runtime/capability-inventory.ts +116 -116
  87. package/src/runtime/child-pi.ts +7 -2
  88. package/src/runtime/compaction-summary.ts +271 -0
  89. package/src/runtime/completion-guard.ts +190 -190
  90. package/src/runtime/concurrency.ts +3 -1
  91. package/src/runtime/crash-recovery.ts +33 -0
  92. package/src/runtime/delta-conflict.ts +360 -0
  93. package/src/runtime/diagnostic-export.ts +3 -1
  94. package/src/runtime/direct-run.ts +35 -35
  95. package/src/runtime/event-stream-bridge.ts +3 -1
  96. package/src/runtime/foreground-control.ts +82 -82
  97. package/src/runtime/green-contract.ts +46 -46
  98. package/src/runtime/group-join.ts +106 -106
  99. package/src/runtime/heartbeat-gradient.ts +28 -28
  100. package/src/runtime/heartbeat-watcher.ts +124 -124
  101. package/src/runtime/iteration-hooks.ts +262 -0
  102. package/src/runtime/live-agent-control.ts +88 -88
  103. package/src/runtime/live-control-realtime.ts +36 -36
  104. package/src/runtime/live-extension-bridge.ts +150 -150
  105. package/src/runtime/live-irc.ts +92 -92
  106. package/src/runtime/live-session-health.ts +100 -100
  107. package/src/runtime/loop-gates.ts +129 -0
  108. package/src/runtime/metric-parser.ts +40 -0
  109. package/src/runtime/notebook-helpers.ts +90 -90
  110. package/src/runtime/orphan-sentinel.ts +7 -7
  111. package/src/runtime/parallel-research.ts +44 -44
  112. package/src/runtime/phase-progress.ts +217 -0
  113. package/src/runtime/pi-args.ts +38 -2
  114. package/src/runtime/pi-json-output.ts +111 -111
  115. package/src/runtime/pi-spawn.ts +74 -6
  116. package/src/runtime/policy-engine.ts +79 -79
  117. package/src/runtime/post-checks.ts +122 -0
  118. package/src/runtime/process-status.ts +14 -1
  119. package/src/runtime/progress-event-coalescer.ts +43 -43
  120. package/src/runtime/prose-compressor.ts +164 -164
  121. package/src/runtime/recovery-recipes.ts +74 -74
  122. package/src/runtime/result-extractor.ts +121 -121
  123. package/src/runtime/role-permission.ts +39 -39
  124. package/src/runtime/sensitive-paths.ts +3 -3
  125. package/src/runtime/session-resources.ts +25 -25
  126. package/src/runtime/session-snapshot.ts +59 -59
  127. package/src/runtime/session-usage.ts +79 -79
  128. package/src/runtime/sidechain-output.ts +29 -29
  129. package/src/runtime/stream-preview.ts +177 -177
  130. package/src/runtime/supervisor-contact.ts +59 -59
  131. package/src/runtime/task-display.ts +38 -38
  132. package/src/runtime/task-graph.ts +207 -0
  133. package/src/runtime/task-quality.ts +207 -0
  134. package/src/runtime/task-runner/capabilities.ts +78 -78
  135. package/src/runtime/task-runner/live-executor.ts +7 -1
  136. package/src/runtime/task-runner/progress.ts +119 -119
  137. package/src/runtime/task-runner/prompt-builder.ts +1 -1
  138. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  139. package/src/runtime/task-runner/result-utils.ts +14 -14
  140. package/src/runtime/task-runner/run-projection.ts +103 -103
  141. package/src/runtime/task-runner/state-helpers.ts +22 -22
  142. package/src/runtime/team-runner.ts +126 -7
  143. package/src/runtime/worker-heartbeat.ts +21 -21
  144. package/src/runtime/worker-startup.ts +57 -57
  145. package/src/runtime/workflow-state.ts +187 -0
  146. package/src/runtime/workspace-tree.ts +298 -298
  147. package/src/schema/config-schema.ts +12 -0
  148. package/src/schema/validation-types.ts +148 -0
  149. package/src/skills/skill-templates.ts +374 -0
  150. package/src/state/active-run-registry.ts +35 -11
  151. package/src/state/atomic-write.ts +33 -26
  152. package/src/state/contracts.ts +1 -0
  153. package/src/state/event-reconstructor.ts +217 -0
  154. package/src/state/locks.ts +2 -11
  155. package/src/state/mailbox.ts +4 -3
  156. package/src/state/state-store.ts +32 -14
  157. package/src/state/task-claims.ts +44 -44
  158. package/src/state/types.ts +9 -0
  159. package/src/state/usage.ts +29 -29
  160. package/src/subagents/async-entry.ts +1 -1
  161. package/src/subagents/index.ts +3 -3
  162. package/src/subagents/live/control.ts +1 -1
  163. package/src/subagents/live/manager.ts +1 -1
  164. package/src/subagents/live/realtime.ts +1 -1
  165. package/src/subagents/live/session-runtime.ts +1 -1
  166. package/src/subagents/manager.ts +1 -1
  167. package/src/subagents/spawn.ts +1 -1
  168. package/src/teams/team-serializer.ts +38 -38
  169. package/src/types/diff.d.ts +18 -18
  170. package/src/ui/crew-footer.ts +101 -101
  171. package/src/ui/crew-select-list.ts +111 -111
  172. package/src/ui/crew-widget.ts +9 -4
  173. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  174. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  175. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  176. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  177. package/src/ui/dashboard-panes/progress-pane.ts +11 -0
  178. package/src/ui/dynamic-border.ts +25 -25
  179. package/src/ui/layout-primitives.ts +106 -106
  180. package/src/ui/loaders.ts +158 -158
  181. package/src/ui/powerbar-publisher.ts +6 -0
  182. package/src/ui/render-coalescer.ts +51 -51
  183. package/src/ui/render-diff.ts +119 -119
  184. package/src/ui/render-scheduler.ts +143 -143
  185. package/src/ui/run-action-dispatcher.ts +10 -1
  186. package/src/ui/spinner.ts +17 -17
  187. package/src/ui/status-colors.ts +58 -58
  188. package/src/ui/syntax-highlight.ts +116 -116
  189. package/src/ui/transcript-entries.ts +258 -258
  190. package/src/utils/completion-dedupe.ts +63 -63
  191. package/src/utils/frontmatter.ts +68 -68
  192. package/src/utils/git.ts +262 -262
  193. package/src/utils/ids.ts +17 -17
  194. package/src/utils/incremental-reader.ts +104 -104
  195. package/src/utils/names.ts +27 -27
  196. package/src/utils/redaction.ts +44 -44
  197. package/src/utils/safe-paths.ts +47 -47
  198. package/src/utils/scan-cache.ts +136 -136
  199. package/src/utils/sleep.ts +40 -26
  200. package/src/utils/task-name-generator.ts +337 -337
  201. package/src/workflows/validate-workflow.ts +40 -40
  202. package/src/worktree/branch-freshness.ts +45 -45
  203. package/src/worktree/worktree-manager.ts +11 -3
  204. package/teams/default.team.md +12 -12
  205. package/teams/fast-fix.team.md +11 -11
  206. package/teams/implementation.team.md +18 -18
  207. package/teams/parallel-research.team.md +14 -14
  208. package/teams/research.team.md +11 -11
  209. package/teams/review.team.md +12 -12
  210. package/workflows/default.workflow.md +30 -29
  211. package/workflows/fast-fix.workflow.md +23 -22
  212. package/workflows/implementation.workflow.md +43 -38
  213. package/workflows/parallel-research.workflow.md +46 -46
  214. package/workflows/research.workflow.md +22 -22
  215. package/workflows/review.workflow.md +30 -30
  216. package/docs/refactor-tasks-phase3.md +0 -394
  217. package/docs/refactor-tasks-phase4.md +0 -564
  218. package/docs/refactor-tasks-phase5.md +0 -402
  219. package/docs/refactor-tasks-phase6.md +0 -662
  220. package/docs/refactor-tasks.md +0 -1484
  221. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
  222. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
  223. package/docs/research/AUDIT_OH_MY_PI.md +0 -261
  224. package/docs/research/AUDIT_PI_CREW.md +0 -457
  225. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
  226. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
  227. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
  228. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
  229. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
  230. package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
  231. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
  232. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
  233. package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
  234. package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
  235. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
  236. package/docs/research-awesome-agent-skills-distillation.md +0 -100
  237. package/docs/research-extension-examples.md +0 -297
  238. package/docs/research-extension-system.md +0 -324
  239. package/docs/research-oh-my-pi-distillation.md +0 -369
  240. package/docs/research-optimization-plan.md +0 -548
  241. package/docs/research-phase10-distillation.md +0 -199
  242. package/docs/research-phase11-distillation.md +0 -201
  243. package/docs/research-phase8-operator-experience-plan.md +0 -819
  244. package/docs/research-phase9-observability-reliability-plan.md +0 -1190
  245. package/docs/research-pi-coding-agent.md +0 -357
  246. package/docs/research-source-pi-crew-reference.md +0 -174
  247. package/docs/research-ui-optimization-plan.md +0 -480
  248. package/docs/source-runtime-refactor-map.md +0 -107
  249. package/src/utils/atomic-write.ts +0 -33
@@ -1,67 +1,67 @@
1
- ---
2
- name: systematic-debugging
3
- description: Use when encountering a bug, test failure, blocked run, provider error, stale state, crash, or unexpected behavior before proposing fixes.
4
- ---
5
-
6
- # systematic-debugging
7
-
8
- Core principle: no fixes without root-cause investigation first. Symptom patches create new bugs and hide the real failure.
9
-
10
- Distilled from detailed reads of systematic-debugging, root-cause tracing, TDD, and error-analysis skill patterns.
11
-
12
- ## Four Phases
13
-
14
- ### 1. Root Cause Investigation
15
-
16
- Before any fix:
17
-
18
- - read error messages, stack traces, failing assertions, task status, and logs completely;
19
- - reproduce narrowly and record the exact command/steps;
20
- - check recent diffs, commits, config changes, dependency changes, and environment differences;
21
- - trace data/control flow across component boundaries;
22
- - add temporary diagnostics only when they answer a specific question.
23
-
24
- For pi-crew, trace:
25
-
26
- ```text
27
- user/tool params → config resolution → team/workflow/agent discovery → model/runtime routing → child args/env → state/events/artifacts → status/UI
28
- ```
29
-
30
- ### 2. Pattern Analysis
31
-
32
- - Find a similar working path in the codebase.
33
- - Compare working vs broken behavior field-by-field.
34
- - Identify dependencies: config home, project root markers, env vars, locks, stale caches, provider model capabilities.
35
- - Do not assume small differences are irrelevant.
36
-
37
- ### 3. Hypothesis and Test
38
-
39
- - State one hypothesis: “I think X is the root cause because Y.”
40
- - Test one variable at a time with the smallest read-only probe or targeted test.
41
- - If wrong, discard the hypothesis instead of piling on fixes.
42
- - After three failed fixes, question architecture or assumptions before continuing.
43
-
44
- ### 4. Implementation
45
-
46
- - Add or identify a failing regression test when practical.
47
- - Fix the root cause, not the symptom.
48
- - Avoid “while I’m here” refactors.
49
- - Verify targeted behavior, then broader gates.
50
-
51
- ## Evidence to Collect
52
-
53
- - failing command and exit code;
54
- - relevant manifest/tasks/events/mailbox files;
55
- - effective config paths and redacted config;
56
- - child Pi args/env after redaction;
57
- - git diff and recent commits;
58
- - provider/model/thinking resolution;
59
- - async timing/race indicators.
60
-
61
- ## Anti-patterns
62
-
63
- - Fixing before reproducing.
64
- - Assuming real user global config cannot pollute tests.
65
- - Treating provider errors as only transient network failures.
66
- - Removing guards because they reveal a blocked state.
67
- - Editing unrelated layers before checking the hypothesis.
1
+ ---
2
+ name: systematic-debugging
3
+ description: Use when encountering a bug, test failure, blocked run, provider error, stale state, crash, or unexpected behavior before proposing fixes.
4
+ ---
5
+
6
+ # systematic-debugging
7
+
8
+ Core principle: no fixes without root-cause investigation first. Symptom patches create new bugs and hide the real failure.
9
+
10
+ Distilled from detailed reads of systematic-debugging, root-cause tracing, TDD, and error-analysis skill patterns.
11
+
12
+ ## Four Phases
13
+
14
+ ### 1. Root Cause Investigation
15
+
16
+ Before any fix:
17
+
18
+ - read error messages, stack traces, failing assertions, task status, and logs completely;
19
+ - reproduce narrowly and record the exact command/steps;
20
+ - check recent diffs, commits, config changes, dependency changes, and environment differences;
21
+ - trace data/control flow across component boundaries;
22
+ - add temporary diagnostics only when they answer a specific question.
23
+
24
+ For pi-crew, trace:
25
+
26
+ ```text
27
+ user/tool params → config resolution → team/workflow/agent discovery → model/runtime routing → child args/env → state/events/artifacts → status/UI
28
+ ```
29
+
30
+ ### 2. Pattern Analysis
31
+
32
+ - Find a similar working path in the codebase.
33
+ - Compare working vs broken behavior field-by-field.
34
+ - Identify dependencies: config home, project root markers, env vars, locks, stale caches, provider model capabilities.
35
+ - Do not assume small differences are irrelevant.
36
+
37
+ ### 3. Hypothesis and Test
38
+
39
+ - State one hypothesis: “I think X is the root cause because Y.”
40
+ - Test one variable at a time with the smallest read-only probe or targeted test.
41
+ - If wrong, discard the hypothesis instead of piling on fixes.
42
+ - After three failed fixes, question architecture or assumptions before continuing.
43
+
44
+ ### 4. Implementation
45
+
46
+ - Add or identify a failing regression test when practical.
47
+ - Fix the root cause, not the symptom.
48
+ - Avoid “while I’m here” refactors.
49
+ - Verify targeted behavior, then broader gates.
50
+
51
+ ## Evidence to Collect
52
+
53
+ - failing command and exit code;
54
+ - relevant manifest/tasks/events/mailbox files;
55
+ - effective config paths and redacted config;
56
+ - child Pi args/env after redaction;
57
+ - git diff and recent commits;
58
+ - provider/model/thinking resolution;
59
+ - async timing/race indicators.
60
+
61
+ ## Anti-patterns
62
+
63
+ - Fixing before reproducing.
64
+ - Assuming real user global config cannot pollute tests.
65
+ - Treating provider errors as only transient network failures.
66
+ - Removing guards because they reveal a blocked state.
67
+ - Editing unrelated layers before checking the hypothesis.
@@ -1,39 +1,39 @@
1
- ---
2
- name: ui-render-performance
3
- description: Non-blocking Pi TUI render workflow. Use when changing widgets, powerbar/statusbar segments, dashboard panes, overlays, snapshot caches, or live UI refresh behavior.
4
- ---
5
-
6
- # ui-render-performance
7
-
8
- Use this skill for Pi/pi-crew TUI work.
9
-
10
- ## Source patterns distilled
11
-
12
- - Pi TUI is synchronous immediate-mode/string rendering: `source/pi-mono/packages/coding-agent/src/modes/interactive/interactive-mode.ts`
13
- - Pi extension examples use event-driven state updates, not render-time loading.
14
- - pi-crew UI: `src/extension/register.ts`, `src/ui/run-dashboard.ts`, `src/ui/run-snapshot-cache.ts`, `src/ui/crew-widget.ts`, `src/ui/powerbar-publisher.ts`, `src/ui/render-scheduler.ts`
15
-
16
- ## Rules
17
-
18
- - Treat every `render(width)` and widget/powerbar update as a hot synchronous path.
19
- - Render from in-memory snapshots only. Preload config, manifests, snapshots, agents, and mailbox counts asynchronously.
20
- - Use `RenderScheduler.schedule()` to coalesce renders; avoid direct repeated rendering.
21
- - Prefer `snapshotCache.get(runId)` in render paths. If a sync fallback is unavoidable, classify it as first-load/rare and document why.
22
- - Keep dashboard panes pure: accept a snapshot/model and format strings; do not call `fs.readFileSync`, `fs.readdirSync`, `fs.statSync`, or network APIs from pane render methods.
23
- - On session switch, cancel timers and ensure in-flight async preloads cannot update stale session UI.
24
- - Watch TTL interactions: a preload interval shorter than cache TTL prevents render-time refresh gaps.
25
-
26
- ## Anti-patterns
27
-
28
- - Do not call `loadConfig()`, `manifestCache.list()`, or `refreshIfStale()` repeatedly inside `renderTick()` unless backed by preloaded frame data.
29
- - Do not do large JSON parsing or directory scans inside widget render/update functions.
30
- - Do not show stale health warnings for completed/cancelled/failed runs.
31
-
32
- ## Verification
33
-
34
- ```bash
35
- cd pi-crew
36
- npx tsc --noEmit
37
- node --experimental-strip-types --test test/unit/run-snapshot-cache.test.ts test/unit/crew-widget.test.ts test/unit/powerbar-publisher.test.ts test/unit/run-dashboard.test.ts
38
- npm test
39
- ```
1
+ ---
2
+ name: ui-render-performance
3
+ description: Non-blocking Pi TUI render workflow. Use when changing widgets, powerbar/statusbar segments, dashboard panes, overlays, snapshot caches, or live UI refresh behavior.
4
+ ---
5
+
6
+ # ui-render-performance
7
+
8
+ Use this skill for Pi/pi-crew TUI work.
9
+
10
+ ## Source patterns distilled
11
+
12
+ - Pi TUI is synchronous immediate-mode/string rendering: `source/pi-mono/packages/coding-agent/src/modes/interactive/interactive-mode.ts`
13
+ - Pi extension examples use event-driven state updates, not render-time loading.
14
+ - pi-crew UI: `src/extension/register.ts`, `src/ui/run-dashboard.ts`, `src/ui/run-snapshot-cache.ts`, `src/ui/crew-widget.ts`, `src/ui/powerbar-publisher.ts`, `src/ui/render-scheduler.ts`
15
+
16
+ ## Rules
17
+
18
+ - Treat every `render(width)` and widget/powerbar update as a hot synchronous path.
19
+ - Render from in-memory snapshots only. Preload config, manifests, snapshots, agents, and mailbox counts asynchronously.
20
+ - Use `RenderScheduler.schedule()` to coalesce renders; avoid direct repeated rendering.
21
+ - Prefer `snapshotCache.get(runId)` in render paths. If a sync fallback is unavoidable, classify it as first-load/rare and document why.
22
+ - Keep dashboard panes pure: accept a snapshot/model and format strings; do not call `fs.readFileSync`, `fs.readdirSync`, `fs.statSync`, or network APIs from pane render methods.
23
+ - On session switch, cancel timers and ensure in-flight async preloads cannot update stale session UI.
24
+ - Watch TTL interactions: a preload interval shorter than cache TTL prevents render-time refresh gaps.
25
+
26
+ ## Anti-patterns
27
+
28
+ - Do not call `loadConfig()`, `manifestCache.list()`, or `refreshIfStale()` repeatedly inside `renderTick()` unless backed by preloaded frame data.
29
+ - Do not do large JSON parsing or directory scans inside widget render/update functions.
30
+ - Do not show stale health warnings for completed/cancelled/failed runs.
31
+
32
+ ## Verification
33
+
34
+ ```bash
35
+ cd pi-crew
36
+ npx tsc --noEmit
37
+ node --experimental-strip-types --test test/unit/run-snapshot-cache.test.ts test/unit/crew-widget.test.ts test/unit/powerbar-publisher.test.ts test/unit/run-dashboard.test.ts
38
+ npm test
39
+ ```
@@ -1,57 +1,57 @@
1
- ---
2
- name: verification-before-done
3
- description: Use when about to claim work is complete, fixed, passing, reviewed, committed, or ready to hand off.
4
- ---
5
-
6
- # verification-before-done
7
-
8
- Core principle: evidence before claims. A worker report, green-looking log, or previous run is not fresh verification.
9
-
10
- Distilled from detailed reads of agent-skill patterns for verification-before-completion, TDD, review reception, and QA workflows.
11
-
12
- ## Gate Function
13
-
14
- Before any completion claim:
15
-
16
- 1. Identify the command or inspection that proves the claim.
17
- 2. Run the full command fresh, or explicitly state why a command cannot be run.
18
- 3. Read the output, including exit code and failure counts.
19
- 4. Compare the output to the claim.
20
- 5. Report the claim only with the evidence.
21
-
22
- ## Claim-to-Evidence Table
23
-
24
- | Claim | Requires | Not sufficient |
25
- |---|---|---|
26
- | Tests pass | Fresh test output with zero failures | Prior run, “should pass” |
27
- | Typecheck passes | Typecheck command exit 0 | Lint or targeted tests only |
28
- | Bug fixed | Original symptom/regression test passes | Code changed |
29
- | Requirements met | Checklist against request/plan | Generic test success |
30
- | Agent completed | Worker output plus artifact/diff/state inspection | Worker says DONE |
31
- | Safe to commit | Relevant checks pass and status reviewed | Partial local confidence |
32
-
33
- ## Verification Ladder
34
-
35
- Choose the smallest reliable gate, then escalate when risk requires it:
36
-
37
- 1. Read-only inspection for plans/reviews.
38
- 2. Targeted unit test for touched behavior.
39
- 3. Typecheck for TypeScript/schema/API changes.
40
- 4. Integration test for runtime, subprocess, state, filesystem, UI, config, or session behavior.
41
- 5. Full suite before commit/release or broad changes.
42
- 6. Real Pi smoke only when safe and needed.
43
-
44
- ## Done Report
45
-
46
- Include:
47
-
48
- - changed files or read-only status;
49
- - commands run and pass/fail result;
50
- - artifacts, run IDs, logs, or state paths inspected;
51
- - behavior actually verified;
52
- - skipped checks and why;
53
- - risks and rollback notes.
54
-
55
- ## Red Flags
56
-
57
- Stop before saying done if you are using words like “should”, “probably”, “looks”, “seems”, “I think”, or if you are trusting an agent report without checking evidence.
1
+ ---
2
+ name: verification-before-done
3
+ description: Use when about to claim work is complete, fixed, passing, reviewed, committed, or ready to hand off.
4
+ ---
5
+
6
+ # verification-before-done
7
+
8
+ Core principle: evidence before claims. A worker report, green-looking log, or previous run is not fresh verification.
9
+
10
+ Distilled from detailed reads of agent-skill patterns for verification-before-completion, TDD, review reception, and QA workflows.
11
+
12
+ ## Gate Function
13
+
14
+ Before any completion claim:
15
+
16
+ 1. Identify the command or inspection that proves the claim.
17
+ 2. Run the full command fresh, or explicitly state why a command cannot be run.
18
+ 3. Read the output, including exit code and failure counts.
19
+ 4. Compare the output to the claim.
20
+ 5. Report the claim only with the evidence.
21
+
22
+ ## Claim-to-Evidence Table
23
+
24
+ | Claim | Requires | Not sufficient |
25
+ |---|---|---|
26
+ | Tests pass | Fresh test output with zero failures | Prior run, “should pass” |
27
+ | Typecheck passes | Typecheck command exit 0 | Lint or targeted tests only |
28
+ | Bug fixed | Original symptom/regression test passes | Code changed |
29
+ | Requirements met | Checklist against request/plan | Generic test success |
30
+ | Agent completed | Worker output plus artifact/diff/state inspection | Worker says DONE |
31
+ | Safe to commit | Relevant checks pass and status reviewed | Partial local confidence |
32
+
33
+ ## Verification Ladder
34
+
35
+ Choose the smallest reliable gate, then escalate when risk requires it:
36
+
37
+ 1. Read-only inspection for plans/reviews.
38
+ 2. Targeted unit test for touched behavior.
39
+ 3. Typecheck for TypeScript/schema/API changes.
40
+ 4. Integration test for runtime, subprocess, state, filesystem, UI, config, or session behavior.
41
+ 5. Full suite before commit/release or broad changes.
42
+ 6. Real Pi smoke only when safe and needed.
43
+
44
+ ## Done Report
45
+
46
+ Include:
47
+
48
+ - changed files or read-only status;
49
+ - commands run and pass/fail result;
50
+ - artifacts, run IDs, logs, or state paths inspected;
51
+ - behavior actually verified;
52
+ - skipped checks and why;
53
+ - risks and rollback notes.
54
+
55
+ ## Red Flags
56
+
57
+ Stop before saying done if you are using words like “should”, “probably”, “looks”, “seems”, “I think”, or if you are trusting an agent report without checking evidence.
@@ -1,39 +1,39 @@
1
- ---
2
- name: worktree-isolation
3
- description: Conflict-safe git worktree workflow. Use when running parallel implementation workers, isolating risky edits, or cleaning up task worktrees.
4
- ---
5
-
6
- # worktree-isolation
7
-
8
- Use this skill for worktree-based execution or cleanup.
9
-
10
- ## Source patterns distilled
11
-
12
- - pi-subagents worktree runner and cleanup patterns
13
- - pi-crew worktrees: `src/worktree/worktree-manager.ts`, `src/worktree/cleanup.ts`, `src/worktree/branch-freshness.ts`
14
- - Team runner workspace mode: `src/runtime/team-runner.ts`, workflow/team resource fields
15
-
16
- ## Rules
17
-
18
- - Use worktree mode for parallel or risky code-changing tasks when the repository is clean enough and merge ownership is clear.
19
- - Assign one owner per file/symbol/migration path to avoid conflict-heavy merges.
20
- - Name branches/worktrees deterministically from run/task IDs; avoid user-controlled path fragments without sanitization.
21
- - Before cleanup, check dirty state. Preserve dirty worktrees unless `force` is explicitly set.
22
- - Record worktree paths and branch metadata in artifacts/events so the operator can inspect or recover.
23
- - Do not run destructive git operations without explicit confirmation and evidence of target path containment.
24
-
25
- ## Anti-patterns
26
-
27
- - Parallel editing the same file in multiple worktrees without a merge plan.
28
- - Force-removing dirty worktrees by default.
29
- - Reusing stale worktrees after the base branch has moved without freshness checks.
30
- - Storing worktrees outside the intended contained workspace root.
31
-
32
- ## Verification
33
-
34
- ```bash
35
- cd pi-crew
36
- npx tsc --noEmit
37
- node --experimental-strip-types --test test/integration/worktree-mode.test.ts test/unit/run-index.test.ts
38
- npm test
39
- ```
1
+ ---
2
+ name: worktree-isolation
3
+ description: Conflict-safe git worktree workflow. Use when running parallel implementation workers, isolating risky edits, or cleaning up task worktrees.
4
+ ---
5
+
6
+ # worktree-isolation
7
+
8
+ Use this skill for worktree-based execution or cleanup.
9
+
10
+ ## Source patterns distilled
11
+
12
+ - pi-subagents worktree runner and cleanup patterns
13
+ - pi-crew worktrees: `src/worktree/worktree-manager.ts`, `src/worktree/cleanup.ts`, `src/worktree/branch-freshness.ts`
14
+ - Team runner workspace mode: `src/runtime/team-runner.ts`, workflow/team resource fields
15
+
16
+ ## Rules
17
+
18
+ - Use worktree mode for parallel or risky code-changing tasks when the repository is clean enough and merge ownership is clear.
19
+ - Assign one owner per file/symbol/migration path to avoid conflict-heavy merges.
20
+ - Name branches/worktrees deterministically from run/task IDs; avoid user-controlled path fragments without sanitization.
21
+ - Before cleanup, check dirty state. Preserve dirty worktrees unless `force` is explicitly set.
22
+ - Record worktree paths and branch metadata in artifacts/events so the operator can inspect or recover.
23
+ - Do not run destructive git operations without explicit confirmation and evidence of target path containment.
24
+
25
+ ## Anti-patterns
26
+
27
+ - Parallel editing the same file in multiple worktrees without a merge plan.
28
+ - Force-removing dirty worktrees by default.
29
+ - Reusing stale worktrees after the base branch has moved without freshness checks.
30
+ - Storing worktrees outside the intended contained workspace root.
31
+
32
+ ## Verification
33
+
34
+ ```bash
35
+ cd pi-crew
36
+ npx tsc --noEmit
37
+ node --experimental-strip-types --test test/integration/worktree-mode.test.ts test/unit/run-index.test.ts
38
+ npm test
39
+ ```
@@ -0,0 +1,25 @@
1
+ import type { ExportAdapter, ExportContent } from "./types.ts";
2
+
3
+ export const claudeAdapter: ExportAdapter = {
4
+ toolId: "claude",
5
+ toolName: "Claude Code",
6
+ fileExtension: ".md",
7
+
8
+ getFilePath(content: ExportContent): string {
9
+ return `.claude/commands/pi-crew/${content.id}.md`;
10
+ },
11
+
12
+ formatFile(content: ExportContent): string {
13
+ const tagLines = content.tags.length > 0
14
+ ? ["tags:", ...content.tags.map((tag) => ` - ${JSON.stringify(tag)}`)]
15
+ : [];
16
+ const frontmatter = [
17
+ "---",
18
+ `description: ${JSON.stringify(content.description)}`,
19
+ `category: ${JSON.stringify(content.category)}`,
20
+ ...tagLines,
21
+ "---",
22
+ ].join("\n");
23
+ return `${frontmatter}\n\n# ${content.name}\n\n${content.body}\n`;
24
+ },
25
+ };
@@ -0,0 +1,21 @@
1
+ import type { ExportAdapter, ExportContent } from "./types.ts";
2
+
3
+ export const codexAdapter: ExportAdapter = {
4
+ toolId: "codex",
5
+ toolName: "Codex",
6
+ fileExtension: ".md",
7
+
8
+ getFilePath(_content: ExportContent): string {
9
+ return "AGENTS.md";
10
+ },
11
+
12
+ formatFile(content: ExportContent): string {
13
+ const tags = content.tags.length > 0 ? ` (${content.tags.join(", ")})` : "";
14
+ return [
15
+ `## ${content.name}${tags}\n`,
16
+ `**Source:** ${content.source.type}/${content.source.name} `,
17
+ `**Category:** ${content.category}\n`,
18
+ content.body,
19
+ ].join("\n");
20
+ },
21
+ };
@@ -0,0 +1,17 @@
1
+ import type { ExportAdapter, ExportContent } from "./types.ts";
2
+
3
+ export const cursorAdapter: ExportAdapter = {
4
+ toolId: "cursor",
5
+ toolName: "Cursor",
6
+ fileExtension: ".md",
7
+
8
+ getFilePath(content: ExportContent): string {
9
+ return `.cursor/rules/pi-crew-${content.id}.md`;
10
+ },
11
+
12
+ formatFile(content: ExportContent): string {
13
+ const header = `# ${content.name}\n\n> ${content.description}`;
14
+ const tags = content.tags.length > 0 ? `\n\n**Tags:** ${content.tags.join(", ")}` : "";
15
+ return `${header}${tags}\n\n${content.body}\n`;
16
+ },
17
+ };
@@ -0,0 +1,137 @@
1
+ import type { AgentConfig } from "../agents/agent-config.ts";
2
+ import type { TeamConfig } from "../teams/team-config.ts";
3
+ import type { WorkflowConfig } from "../workflows/workflow-config.ts";
4
+ import type { SkillDescriptor } from "../skills/discover-skills.ts";
5
+ import type { ExportContent } from "./types.ts";
6
+ import { adapterRegistry } from "./registry.ts";
7
+ import { resolveContainedPath } from "../utils/safe-paths.ts";
8
+
9
+ function slugify(value: string): string {
10
+ return value
11
+ .toLowerCase()
12
+ .replace(/[^a-z0-9]+/g, "-")
13
+ .replace(/^-+|-+$/g, "");
14
+ }
15
+
16
+ export function agentToExportContent(agent: AgentConfig): ExportContent {
17
+ const category = agent.routing?.category ?? "agent";
18
+ const tags = agent.routing?.triggers ?? [];
19
+ return {
20
+ id: slugify(agent.name),
21
+ name: agent.name,
22
+ description: agent.description,
23
+ category,
24
+ tags,
25
+ body: agent.systemPrompt,
26
+ source: { type: "agent", name: agent.name },
27
+ };
28
+ }
29
+
30
+ export function teamToExportContent(team: TeamConfig): ExportContent {
31
+ const category = team.routing?.category ?? "team";
32
+ const tags = team.routing?.triggers ?? [];
33
+ const rolesDesc = team.roles
34
+ .map((role) => `- **${role.name}**: ${role.description ?? role.agent}`)
35
+ .join("\n");
36
+ const body = `${team.description}\n\n### Roles\n${rolesDesc}`;
37
+ return {
38
+ id: slugify(team.name),
39
+ name: team.name,
40
+ description: team.description,
41
+ category,
42
+ tags,
43
+ body,
44
+ source: { type: "team", name: team.name },
45
+ };
46
+ }
47
+
48
+ export function workflowToExportContent(workflow: WorkflowConfig): ExportContent {
49
+ const stepsDesc = workflow.steps
50
+ .map((step) => `- **${step.id}** (${step.role}): ${step.task}`)
51
+ .join("\n");
52
+ const body = `${workflow.description}\n\n### Steps\n${stepsDesc}`;
53
+ return {
54
+ id: slugify(workflow.name),
55
+ name: workflow.name,
56
+ description: workflow.description,
57
+ category: "workflow",
58
+ tags: [],
59
+ body,
60
+ source: { type: "workflow", name: workflow.name },
61
+ };
62
+ }
63
+
64
+ export function skillToExportContent(skill: SkillDescriptor): ExportContent {
65
+ return {
66
+ id: slugify(skill.name),
67
+ name: skill.name,
68
+ description: skill.description || `Skill: ${skill.name}`,
69
+ category: "skill",
70
+ tags: [],
71
+ body: `Skill loaded from ${skill.source}: ${skill.path}`,
72
+ source: { type: "skill", name: skill.name },
73
+ };
74
+ }
75
+
76
+ export type ExportableResource =
77
+ | { kind: "agent"; config: AgentConfig }
78
+ | { kind: "team"; config: TeamConfig }
79
+ | { kind: "workflow"; config: WorkflowConfig }
80
+ | { kind: "skill"; config: SkillDescriptor };
81
+
82
+ export function resourcesToExportContent(resources: ExportableResource[]): ExportContent[] {
83
+ return resources.map((resource): ExportContent => {
84
+ switch (resource.kind) {
85
+ case "agent":
86
+ return agentToExportContent(resource.config);
87
+ case "team":
88
+ return teamToExportContent(resource.config);
89
+ case "workflow":
90
+ return workflowToExportContent(resource.config);
91
+ case "skill":
92
+ return skillToExportContent(resource.config);
93
+ }
94
+ });
95
+ }
96
+
97
+ export interface ToolExportResult {
98
+ toolId: string;
99
+ files: Array<{ path: string; content: string }>;
100
+ }
101
+
102
+ export function generateToolExport(
103
+ toolId: string,
104
+ resources: ExportableResource[],
105
+ projectRoot?: string,
106
+ ): ToolExportResult {
107
+ const adapter = adapterRegistry.get(toolId);
108
+ if (!adapter) {
109
+ throw new Error(`Unknown export adapter: ${toolId}. Available: ${adapterRegistry.getAll().map((a) => a.toolId).join(", ")}`);
110
+ }
111
+ const contents = resourcesToExportContent(resources);
112
+ const files = contents.map((content): { path: string; content: string } => {
113
+ const filePath = adapter.getFilePath(content);
114
+ // Validate path containment when a project root is provided
115
+ if (projectRoot) {
116
+ try {
117
+ resolveContainedPath(projectRoot, filePath);
118
+ } catch (e) {
119
+ throw new Error(
120
+ `Export path '${filePath}' escapes project root '${projectRoot}': ${e instanceof Error ? e.message : String(e)}`,
121
+ );
122
+ }
123
+ }
124
+ return {
125
+ path: filePath,
126
+ content: adapter.formatFile(content),
127
+ };
128
+ });
129
+ // Merge duplicate file paths (e.g., codex adapter maps everything to AGENTS.md)
130
+ const merged = new Map<string, string>();
131
+ for (const f of files) {
132
+ const existing = merged.get(f.path);
133
+ merged.set(f.path, existing ? `${existing}\n\n${f.content}` : f.content);
134
+ }
135
+ const mergedFiles = [...merged.entries()].map(([p, content]) => ({ path: p, content }));
136
+ return { toolId, files: mergedFiles };
137
+ }
@@ -0,0 +1,15 @@
1
+ export type { ExportContent, ExportAdapter, AdapterRegistry } from "./types.ts";
2
+ export { createAdapterRegistry, adapterRegistry } from "./registry.ts";
3
+ export { claudeAdapter } from "./claude-adapter.ts";
4
+ export { cursorAdapter } from "./cursor-adapter.ts";
5
+ export { codexAdapter } from "./codex-adapter.ts";
6
+ export { generateToolExport, resourcesToExportContent } from "./export-util.ts";
7
+
8
+ import { adapterRegistry } from "./registry.ts";
9
+ import { claudeAdapter } from "./claude-adapter.ts";
10
+ import { cursorAdapter } from "./cursor-adapter.ts";
11
+ import { codexAdapter } from "./codex-adapter.ts";
12
+
13
+ adapterRegistry.register(claudeAdapter);
14
+ adapterRegistry.register(cursorAdapter);
15
+ adapterRegistry.register(codexAdapter);
@@ -0,0 +1,18 @@
1
+ import type { AdapterRegistry, ExportAdapter } from "./types.ts";
2
+
3
+ export function createAdapterRegistry(): AdapterRegistry {
4
+ const adapters = new Map<string, ExportAdapter>();
5
+ return {
6
+ get(toolId: string): ExportAdapter | undefined {
7
+ return adapters.get(toolId);
8
+ },
9
+ getAll(): ExportAdapter[] {
10
+ return [...adapters.values()];
11
+ },
12
+ register(adapter: ExportAdapter): void {
13
+ adapters.set(adapter.toolId, adapter);
14
+ },
15
+ };
16
+ }
17
+
18
+ export const adapterRegistry: AdapterRegistry = createAdapterRegistry();