pi-crew 0.1.51 → 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 (239) hide show
  1. package/CHANGELOG.md +56 -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 +13 -1
  48. package/src/config/drift-detector.ts +211 -0
  49. package/src/config/markers.ts +327 -0
  50. package/src/config/resilient-parser.ts +108 -0
  51. package/src/config/suggestions.ts +74 -0
  52. package/src/extension/cross-extension-rpc.ts +103 -94
  53. package/src/extension/project-init.ts +21 -1
  54. package/src/extension/register.ts +45 -14
  55. package/src/extension/registration/commands.ts +77 -8
  56. package/src/extension/registration/subagent-tools.ts +10 -1
  57. package/src/extension/registration/team-tool.ts +10 -1
  58. package/src/extension/registration/viewers.ts +48 -34
  59. package/src/extension/run-bundle-schema.ts +89 -89
  60. package/src/extension/run-import.ts +25 -1
  61. package/src/extension/run-index.ts +5 -1
  62. package/src/extension/run-maintenance.ts +142 -68
  63. package/src/extension/team-manager-command.ts +10 -1
  64. package/src/extension/team-tool/doctor.ts +28 -3
  65. package/src/extension/team-tool/handle-settings.ts +195 -188
  66. package/src/extension/team-tool/inspect.ts +41 -41
  67. package/src/extension/team-tool/intent-policy.ts +42 -42
  68. package/src/extension/team-tool/lifecycle-actions.ts +27 -8
  69. package/src/extension/team-tool/plan.ts +19 -19
  70. package/src/extension/team-tool/run.ts +12 -1
  71. package/src/extension/team-tool.ts +11 -1
  72. package/src/i18n.ts +184 -184
  73. package/src/observability/exporters/otlp-exporter.ts +92 -77
  74. package/src/prompt/prompt-runtime.ts +72 -72
  75. package/src/runtime/agent-memory.ts +72 -72
  76. package/src/runtime/agent-observability.ts +114 -114
  77. package/src/runtime/async-marker.ts +26 -26
  78. package/src/runtime/attention-events.ts +28 -28
  79. package/src/runtime/auto-resume.ts +100 -0
  80. package/src/runtime/background-runner.ts +11 -1
  81. package/src/runtime/cancellation-token.ts +89 -89
  82. package/src/runtime/cancellation.ts +61 -61
  83. package/src/runtime/capability-inventory.ts +116 -116
  84. package/src/runtime/child-pi.ts +7 -2
  85. package/src/runtime/compaction-summary.ts +271 -0
  86. package/src/runtime/completion-guard.ts +190 -190
  87. package/src/runtime/crash-recovery.ts +33 -0
  88. package/src/runtime/delta-conflict.ts +360 -0
  89. package/src/runtime/direct-run.ts +35 -35
  90. package/src/runtime/foreground-control.ts +82 -82
  91. package/src/runtime/green-contract.ts +46 -46
  92. package/src/runtime/group-join.ts +106 -106
  93. package/src/runtime/heartbeat-gradient.ts +28 -28
  94. package/src/runtime/heartbeat-watcher.ts +124 -124
  95. package/src/runtime/iteration-hooks.ts +262 -0
  96. package/src/runtime/live-agent-control.ts +88 -88
  97. package/src/runtime/live-control-realtime.ts +36 -36
  98. package/src/runtime/live-extension-bridge.ts +150 -150
  99. package/src/runtime/live-irc.ts +92 -92
  100. package/src/runtime/live-session-health.ts +100 -100
  101. package/src/runtime/loop-gates.ts +129 -0
  102. package/src/runtime/metric-parser.ts +40 -0
  103. package/src/runtime/notebook-helpers.ts +90 -90
  104. package/src/runtime/orphan-sentinel.ts +7 -7
  105. package/src/runtime/parallel-research.ts +44 -44
  106. package/src/runtime/phase-progress.ts +217 -0
  107. package/src/runtime/pi-args.ts +38 -11
  108. package/src/runtime/pi-json-output.ts +111 -111
  109. package/src/runtime/pi-spawn.ts +57 -7
  110. package/src/runtime/policy-engine.ts +79 -79
  111. package/src/runtime/post-checks.ts +122 -0
  112. package/src/runtime/progress-event-coalescer.ts +43 -43
  113. package/src/runtime/prose-compressor.ts +164 -164
  114. package/src/runtime/recovery-recipes.ts +74 -74
  115. package/src/runtime/result-extractor.ts +121 -121
  116. package/src/runtime/role-permission.ts +39 -39
  117. package/src/runtime/sensitive-paths.ts +2 -2
  118. package/src/runtime/session-resources.ts +25 -25
  119. package/src/runtime/session-snapshot.ts +59 -59
  120. package/src/runtime/session-usage.ts +79 -79
  121. package/src/runtime/sidechain-output.ts +29 -29
  122. package/src/runtime/stream-preview.ts +177 -177
  123. package/src/runtime/supervisor-contact.ts +59 -59
  124. package/src/runtime/task-display.ts +38 -38
  125. package/src/runtime/task-graph.ts +207 -0
  126. package/src/runtime/task-quality.ts +207 -0
  127. package/src/runtime/task-runner/capabilities.ts +78 -78
  128. package/src/runtime/task-runner/live-executor.ts +7 -1
  129. package/src/runtime/task-runner/progress.ts +119 -119
  130. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  131. package/src/runtime/task-runner/result-utils.ts +14 -14
  132. package/src/runtime/task-runner/run-projection.ts +103 -103
  133. package/src/runtime/task-runner/state-helpers.ts +22 -22
  134. package/src/runtime/team-runner.ts +117 -7
  135. package/src/runtime/worker-heartbeat.ts +21 -21
  136. package/src/runtime/worker-startup.ts +57 -57
  137. package/src/runtime/workflow-state.ts +187 -0
  138. package/src/runtime/workspace-tree.ts +298 -298
  139. package/src/schema/config-schema.ts +11 -0
  140. package/src/schema/validation-types.ts +148 -0
  141. package/src/skills/skill-templates.ts +374 -0
  142. package/src/state/active-run-registry.ts +35 -11
  143. package/src/state/atomic-write.ts +33 -26
  144. package/src/state/contracts.ts +1 -0
  145. package/src/state/event-reconstructor.ts +217 -0
  146. package/src/state/locks.ts +2 -13
  147. package/src/state/mailbox.ts +4 -3
  148. package/src/state/state-store.ts +32 -14
  149. package/src/state/task-claims.ts +44 -44
  150. package/src/state/types.ts +9 -0
  151. package/src/state/usage.ts +29 -29
  152. package/src/subagents/async-entry.ts +1 -1
  153. package/src/subagents/index.ts +3 -3
  154. package/src/subagents/live/control.ts +1 -1
  155. package/src/subagents/live/manager.ts +1 -1
  156. package/src/subagents/live/realtime.ts +1 -1
  157. package/src/subagents/live/session-runtime.ts +1 -1
  158. package/src/subagents/manager.ts +1 -1
  159. package/src/subagents/spawn.ts +1 -1
  160. package/src/teams/team-serializer.ts +38 -38
  161. package/src/types/diff.d.ts +18 -18
  162. package/src/ui/crew-footer.ts +101 -101
  163. package/src/ui/crew-select-list.ts +111 -111
  164. package/src/ui/crew-widget.ts +5 -2
  165. package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
  166. package/src/ui/dashboard-panes/capability-pane.ts +59 -59
  167. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
  168. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  169. package/src/ui/dashboard-panes/progress-pane.ts +11 -0
  170. package/src/ui/dynamic-border.ts +25 -25
  171. package/src/ui/layout-primitives.ts +106 -106
  172. package/src/ui/loaders.ts +158 -158
  173. package/src/ui/render-coalescer.ts +51 -51
  174. package/src/ui/render-diff.ts +119 -119
  175. package/src/ui/render-scheduler.ts +143 -143
  176. package/src/ui/run-action-dispatcher.ts +10 -1
  177. package/src/ui/spinner.ts +17 -17
  178. package/src/ui/status-colors.ts +58 -58
  179. package/src/ui/syntax-highlight.ts +116 -116
  180. package/src/ui/transcript-entries.ts +258 -258
  181. package/src/utils/completion-dedupe.ts +63 -63
  182. package/src/utils/frontmatter.ts +68 -68
  183. package/src/utils/git.ts +262 -262
  184. package/src/utils/ids.ts +17 -17
  185. package/src/utils/incremental-reader.ts +104 -104
  186. package/src/utils/names.ts +27 -27
  187. package/src/utils/redaction.ts +44 -44
  188. package/src/utils/safe-paths.ts +47 -47
  189. package/src/utils/scan-cache.ts +136 -136
  190. package/src/utils/sleep.ts +40 -26
  191. package/src/utils/task-name-generator.ts +337 -337
  192. package/src/workflows/validate-workflow.ts +40 -40
  193. package/src/worktree/branch-freshness.ts +45 -45
  194. package/teams/default.team.md +12 -12
  195. package/teams/fast-fix.team.md +11 -11
  196. package/teams/implementation.team.md +18 -18
  197. package/teams/parallel-research.team.md +14 -14
  198. package/teams/research.team.md +11 -11
  199. package/teams/review.team.md +12 -12
  200. package/workflows/default.workflow.md +30 -29
  201. package/workflows/fast-fix.workflow.md +23 -22
  202. package/workflows/implementation.workflow.md +43 -43
  203. package/workflows/parallel-research.workflow.md +46 -46
  204. package/workflows/research.workflow.md +22 -22
  205. package/workflows/review.workflow.md +30 -30
  206. package/docs/refactor-tasks-phase3.md +0 -394
  207. package/docs/refactor-tasks-phase4.md +0 -564
  208. package/docs/refactor-tasks-phase5.md +0 -402
  209. package/docs/refactor-tasks-phase6.md +0 -662
  210. package/docs/refactor-tasks.md +0 -1484
  211. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
  212. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
  213. package/docs/research/AUDIT_OH_MY_PI.md +0 -261
  214. package/docs/research/AUDIT_PI_CREW.md +0 -457
  215. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
  216. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
  217. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
  218. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
  219. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
  220. package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
  221. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
  222. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
  223. package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
  224. package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
  225. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
  226. package/docs/research-awesome-agent-skills-distillation.md +0 -100
  227. package/docs/research-extension-examples.md +0 -297
  228. package/docs/research-extension-system.md +0 -324
  229. package/docs/research-oh-my-pi-distillation.md +0 -369
  230. package/docs/research-optimization-plan.md +0 -548
  231. package/docs/research-phase10-distillation.md +0 -199
  232. package/docs/research-phase11-distillation.md +0 -201
  233. package/docs/research-phase8-operator-experience-plan.md +0 -819
  234. package/docs/research-phase9-observability-reliability-plan.md +0 -1190
  235. package/docs/research-pi-coding-agent.md +0 -357
  236. package/docs/research-source-pi-crew-reference.md +0 -174
  237. package/docs/research-ui-optimization-plan.md +0 -480
  238. package/docs/source-runtime-refactor-map.md +0 -107
  239. 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
+ }