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
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Workflow Phase State Machine
3
+ *
4
+ * Tracks phase-level progression through a workflow, validating that each
5
+ * phase's declared inputs (required artifacts) are satisfied before it can
6
+ * start. All transition functions are immutable — they return new machine
7
+ * state rather than mutating in place.
8
+ */
9
+
10
+ // ── Public types ──────────────────────────────────────────────────────────────
11
+
12
+ export type PhaseStatus = "pending" | "running" | "completed" | "failed" | "skipped";
13
+
14
+ export interface PhaseGuardContext {
15
+ /** Artifact paths that currently exist on disk. */
16
+ completedArtifacts: string[];
17
+ /** Status of the phase immediately preceding the target phase. */
18
+ previousPhaseStatus: PhaseStatus;
19
+ /** Results from tasks that have already completed. */
20
+ taskResults: Array<{ taskId: string; status: string; outputPath?: string }>;
21
+ }
22
+
23
+ export interface GuardResult {
24
+ allowed: boolean;
25
+ reason?: string;
26
+ }
27
+
28
+ export interface PhaseTransition {
29
+ from: PhaseStatus;
30
+ to: PhaseStatus;
31
+ guard?: (context: PhaseGuardContext) => GuardResult;
32
+ }
33
+
34
+ export interface PhaseState {
35
+ name: string;
36
+ status: PhaseStatus;
37
+ /** Artifact names required before this phase can start. */
38
+ inputs: string[];
39
+ /** Artifact names this phase produces. */
40
+ outputs: string[];
41
+ startedAt?: string;
42
+ finishedAt?: string;
43
+ }
44
+
45
+ export interface WorkflowStateMachine {
46
+ phases: PhaseState[];
47
+ currentPhaseIndex: number;
48
+ }
49
+
50
+ // ── Factory ───────────────────────────────────────────────────────────────────
51
+
52
+ /**
53
+ * Create a new workflow state machine from an initial set of phases.
54
+ * All phases start as "pending" and the current index is set to 0.
55
+ */
56
+ export function createWorkflowStateMachine(phases: PhaseState[]): WorkflowStateMachine {
57
+ return {
58
+ phases: phases.map((phase) => ({
59
+ ...phase,
60
+ status: phase.status ?? "pending",
61
+ })),
62
+ currentPhaseIndex: 0,
63
+ };
64
+ }
65
+
66
+ // ── Queries ───────────────────────────────────────────────────────────────────
67
+
68
+ /**
69
+ * Return the declared inputs for a given phase index.
70
+ * Returns an empty array for out-of-bounds indices.
71
+ */
72
+ export function getPhaseInputs(machine: WorkflowStateMachine, phaseIndex: number): string[] {
73
+ const phase = machine.phases[phaseIndex];
74
+ if (!phase) return [];
75
+ return phase.inputs;
76
+ }
77
+
78
+ /**
79
+ * Check whether a transition to a specific phase is allowed.
80
+ *
81
+ * Rules (evaluated in order):
82
+ * 1. `phaseIndex` must be in bounds.
83
+ * 2. If this is not the first phase, the previous phase must be "completed" or "skipped".
84
+ * 3. All declared `inputs` for the target phase must appear in `completedArtifacts`.
85
+ * 4. If a custom `guard` is supplied on a transition, it must also approve.
86
+ */
87
+ export function canTransitionToPhase(
88
+ machine: WorkflowStateMachine,
89
+ phaseIndex: number,
90
+ context: PhaseGuardContext,
91
+ ): GuardResult {
92
+ if (phaseIndex < 0 || phaseIndex >= machine.phases.length) {
93
+ return { allowed: false, reason: `Phase index ${phaseIndex} is out of bounds (0..${machine.phases.length - 1}).` };
94
+ }
95
+
96
+ // Previous phase must have completed (or been skipped).
97
+ if (phaseIndex > 0) {
98
+ const prevStatus = context.previousPhaseStatus;
99
+ if (prevStatus !== "completed" && prevStatus !== "skipped") {
100
+ return { allowed: false, reason: `Previous phase status is '${prevStatus}'; expected 'completed' or 'skipped'.` };
101
+ }
102
+ }
103
+
104
+ // All declared inputs must be satisfied.
105
+ const phase = machine.phases[phaseIndex]!;
106
+ if (phase.inputs.length > 0) {
107
+ const artifactSet = new Set(context.completedArtifacts);
108
+ const missing = phase.inputs.filter((input) => !artifactSet.has(input));
109
+ if (missing.length > 0) {
110
+ return { allowed: false, reason: `Missing required artifacts: ${missing.join(", ")}.` };
111
+ }
112
+ }
113
+
114
+ return { allowed: true };
115
+ }
116
+
117
+ /**
118
+ * Validate that all preconditions for the *current* phase are met.
119
+ * Returns the subset of declared inputs that are not yet present in `completedArtifacts`.
120
+ */
121
+ export function validatePhasePreconditions(
122
+ machine: WorkflowStateMachine,
123
+ context: PhaseGuardContext,
124
+ ): { ready: boolean; blocking: string[] } {
125
+ const phase = machine.phases[machine.currentPhaseIndex];
126
+ if (!phase) {
127
+ return { ready: false, blocking: [`No phase at index ${machine.currentPhaseIndex}.`] };
128
+ }
129
+
130
+ const artifactSet = new Set(context.completedArtifacts);
131
+ const missing = phase.inputs.filter((input) => !artifactSet.has(input));
132
+ return { ready: missing.length === 0, blocking: missing };
133
+ }
134
+
135
+ // ── Transitions ───────────────────────────────────────────────────────────────
136
+
137
+ /** Result of a phase transition: the (potentially unchanged) machine and an optional guard result. */
138
+ export interface TransitionResult {
139
+ machine: WorkflowStateMachine;
140
+ guardResult?: GuardResult;
141
+ }
142
+
143
+ /**
144
+ * Transition a phase to a new status. Returns a `TransitionResult` containing
145
+ * the new `WorkflowStateMachine` and an optional `guardResult` when the guard
146
+ * was checked.
147
+ *
148
+ * If `context` is provided and the guard fails, the machine is returned
149
+ * **UNCHANGED** (the phase is NOT auto-failed) along with the `guardResult`
150
+ * so the caller can decide what to do.
151
+ *
152
+ * For the "pending → running" transition the `startedAt` timestamp is set.
153
+ * For terminal transitions ("completed", "failed", "skipped") the `finishedAt` timestamp is set.
154
+ * On success the `currentPhaseIndex` advances to `phaseIndex` (or stays if already there).
155
+ */
156
+ export function transitionPhase(
157
+ machine: WorkflowStateMachine,
158
+ phaseIndex: number,
159
+ status: PhaseStatus,
160
+ context?: PhaseGuardContext,
161
+ ): TransitionResult {
162
+ if (context) {
163
+ const check = canTransitionToPhase(machine, phaseIndex, context);
164
+ if (!check.allowed) {
165
+ // Return machine UNCHANGED with guard result — caller decides what to do
166
+ return { machine, guardResult: check };
167
+ }
168
+ }
169
+
170
+ const now = new Date().toISOString();
171
+ const phases = machine.phases.map((phase, index) => {
172
+ if (index !== phaseIndex) return phase;
173
+ return {
174
+ ...phase,
175
+ status,
176
+ ...(status === "running" && !phase.startedAt ? { startedAt: now } : {}),
177
+ ...((status === "completed" || status === "failed" || status === "skipped") && !phase.finishedAt ? { finishedAt: now } : {}),
178
+ };
179
+ });
180
+
181
+ return {
182
+ machine: {
183
+ phases,
184
+ currentPhaseIndex: Math.max(machine.currentPhaseIndex, phaseIndex),
185
+ },
186
+ };
187
+ }