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.
- package/CHANGELOG.md +56 -1
- package/README.md +176 -781
- package/agents/analyst.md +11 -11
- package/agents/critic.md +11 -11
- package/agents/executor.md +11 -11
- package/agents/explorer.md +11 -11
- package/agents/planner.md +11 -11
- package/agents/reviewer.md +11 -11
- package/agents/security-reviewer.md +11 -11
- package/agents/test-engineer.md +11 -11
- package/agents/verifier.md +70 -11
- package/agents/writer.md +11 -11
- package/docs/actions-reference.md +595 -0
- package/docs/commands-reference.md +347 -0
- package/docs/runtime-flow.md +148 -148
- package/index.ts +6 -6
- package/package.json +99 -99
- package/skills/async-worker-recovery/SKILL.md +42 -42
- package/skills/context-artifact-hygiene/SKILL.md +52 -52
- package/skills/delegation-patterns/SKILL.md +54 -54
- package/skills/mailbox-interactive/SKILL.md +40 -40
- package/skills/model-routing-context/SKILL.md +39 -39
- package/skills/multi-perspective-review/SKILL.md +58 -58
- package/skills/observability-reliability/SKILL.md +41 -41
- package/skills/orchestration/SKILL.md +157 -157
- package/skills/ownership-session-security/SKILL.md +41 -41
- package/skills/pi-extension-lifecycle/SKILL.md +39 -39
- package/skills/requirements-to-task-packet/SKILL.md +63 -63
- package/skills/resource-discovery-config/SKILL.md +41 -41
- package/skills/runtime-state-reader/SKILL.md +44 -44
- package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
- package/skills/state-mutation-locking/SKILL.md +42 -42
- package/skills/systematic-debugging/SKILL.md +67 -67
- package/skills/ui-render-performance/SKILL.md +39 -39
- package/skills/verification-before-done/SKILL.md +57 -57
- package/skills/worktree-isolation/SKILL.md +39 -39
- package/src/adapters/claude-adapter.ts +25 -0
- package/src/adapters/codex-adapter.ts +21 -0
- package/src/adapters/cursor-adapter.ts +17 -0
- package/src/adapters/export-util.ts +137 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/registry.ts +18 -0
- package/src/adapters/types.ts +23 -0
- package/src/agents/agent-config.ts +2 -0
- package/src/agents/agent-search.ts +98 -98
- package/src/agents/discover-agents.ts +2 -1
- package/src/config/config.ts +13 -1
- package/src/config/drift-detector.ts +211 -0
- package/src/config/markers.ts +327 -0
- package/src/config/resilient-parser.ts +108 -0
- package/src/config/suggestions.ts +74 -0
- package/src/extension/cross-extension-rpc.ts +103 -94
- package/src/extension/project-init.ts +21 -1
- package/src/extension/register.ts +45 -14
- package/src/extension/registration/commands.ts +77 -8
- package/src/extension/registration/subagent-tools.ts +10 -1
- package/src/extension/registration/team-tool.ts +10 -1
- package/src/extension/registration/viewers.ts +48 -34
- package/src/extension/run-bundle-schema.ts +89 -89
- package/src/extension/run-import.ts +25 -1
- package/src/extension/run-index.ts +5 -1
- package/src/extension/run-maintenance.ts +142 -68
- package/src/extension/team-manager-command.ts +10 -1
- package/src/extension/team-tool/doctor.ts +28 -3
- package/src/extension/team-tool/handle-settings.ts +195 -188
- package/src/extension/team-tool/inspect.ts +41 -41
- package/src/extension/team-tool/intent-policy.ts +42 -42
- package/src/extension/team-tool/lifecycle-actions.ts +27 -8
- package/src/extension/team-tool/plan.ts +19 -19
- package/src/extension/team-tool/run.ts +12 -1
- package/src/extension/team-tool.ts +11 -1
- package/src/i18n.ts +184 -184
- package/src/observability/exporters/otlp-exporter.ts +92 -77
- package/src/prompt/prompt-runtime.ts +72 -72
- package/src/runtime/agent-memory.ts +72 -72
- package/src/runtime/agent-observability.ts +114 -114
- package/src/runtime/async-marker.ts +26 -26
- package/src/runtime/attention-events.ts +28 -28
- package/src/runtime/auto-resume.ts +100 -0
- package/src/runtime/background-runner.ts +11 -1
- package/src/runtime/cancellation-token.ts +89 -89
- package/src/runtime/cancellation.ts +61 -61
- package/src/runtime/capability-inventory.ts +116 -116
- package/src/runtime/child-pi.ts +7 -2
- package/src/runtime/compaction-summary.ts +271 -0
- package/src/runtime/completion-guard.ts +190 -190
- package/src/runtime/crash-recovery.ts +33 -0
- package/src/runtime/delta-conflict.ts +360 -0
- package/src/runtime/direct-run.ts +35 -35
- package/src/runtime/foreground-control.ts +82 -82
- package/src/runtime/green-contract.ts +46 -46
- package/src/runtime/group-join.ts +106 -106
- package/src/runtime/heartbeat-gradient.ts +28 -28
- package/src/runtime/heartbeat-watcher.ts +124 -124
- package/src/runtime/iteration-hooks.ts +262 -0
- package/src/runtime/live-agent-control.ts +88 -88
- package/src/runtime/live-control-realtime.ts +36 -36
- package/src/runtime/live-extension-bridge.ts +150 -150
- package/src/runtime/live-irc.ts +92 -92
- package/src/runtime/live-session-health.ts +100 -100
- package/src/runtime/loop-gates.ts +129 -0
- package/src/runtime/metric-parser.ts +40 -0
- package/src/runtime/notebook-helpers.ts +90 -90
- package/src/runtime/orphan-sentinel.ts +7 -7
- package/src/runtime/parallel-research.ts +44 -44
- package/src/runtime/phase-progress.ts +217 -0
- package/src/runtime/pi-args.ts +38 -11
- package/src/runtime/pi-json-output.ts +111 -111
- package/src/runtime/pi-spawn.ts +57 -7
- package/src/runtime/policy-engine.ts +79 -79
- package/src/runtime/post-checks.ts +122 -0
- package/src/runtime/progress-event-coalescer.ts +43 -43
- package/src/runtime/prose-compressor.ts +164 -164
- package/src/runtime/recovery-recipes.ts +74 -74
- package/src/runtime/result-extractor.ts +121 -121
- package/src/runtime/role-permission.ts +39 -39
- package/src/runtime/sensitive-paths.ts +2 -2
- package/src/runtime/session-resources.ts +25 -25
- package/src/runtime/session-snapshot.ts +59 -59
- package/src/runtime/session-usage.ts +79 -79
- package/src/runtime/sidechain-output.ts +29 -29
- package/src/runtime/stream-preview.ts +177 -177
- package/src/runtime/supervisor-contact.ts +59 -59
- package/src/runtime/task-display.ts +38 -38
- package/src/runtime/task-graph.ts +207 -0
- package/src/runtime/task-quality.ts +207 -0
- package/src/runtime/task-runner/capabilities.ts +78 -78
- package/src/runtime/task-runner/live-executor.ts +7 -1
- package/src/runtime/task-runner/progress.ts +119 -119
- package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
- package/src/runtime/task-runner/result-utils.ts +14 -14
- package/src/runtime/task-runner/run-projection.ts +103 -103
- package/src/runtime/task-runner/state-helpers.ts +22 -22
- package/src/runtime/team-runner.ts +117 -7
- package/src/runtime/worker-heartbeat.ts +21 -21
- package/src/runtime/worker-startup.ts +57 -57
- package/src/runtime/workflow-state.ts +187 -0
- package/src/runtime/workspace-tree.ts +298 -298
- package/src/schema/config-schema.ts +11 -0
- package/src/schema/validation-types.ts +148 -0
- package/src/skills/skill-templates.ts +374 -0
- package/src/state/active-run-registry.ts +35 -11
- package/src/state/atomic-write.ts +33 -26
- package/src/state/contracts.ts +1 -0
- package/src/state/event-reconstructor.ts +217 -0
- package/src/state/locks.ts +2 -13
- package/src/state/mailbox.ts +4 -3
- package/src/state/state-store.ts +32 -14
- package/src/state/task-claims.ts +44 -44
- package/src/state/types.ts +9 -0
- package/src/state/usage.ts +29 -29
- package/src/subagents/async-entry.ts +1 -1
- package/src/subagents/index.ts +3 -3
- package/src/subagents/live/control.ts +1 -1
- package/src/subagents/live/manager.ts +1 -1
- package/src/subagents/live/realtime.ts +1 -1
- package/src/subagents/live/session-runtime.ts +1 -1
- package/src/subagents/manager.ts +1 -1
- package/src/subagents/spawn.ts +1 -1
- package/src/teams/team-serializer.ts +38 -38
- package/src/types/diff.d.ts +18 -18
- package/src/ui/crew-footer.ts +101 -101
- package/src/ui/crew-select-list.ts +111 -111
- package/src/ui/crew-widget.ts +5 -2
- package/src/ui/dashboard-panes/cancellation-pane.ts +42 -42
- package/src/ui/dashboard-panes/capability-pane.ts +59 -59
- package/src/ui/dashboard-panes/mailbox-pane.ts +35 -35
- package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
- package/src/ui/dashboard-panes/progress-pane.ts +11 -0
- package/src/ui/dynamic-border.ts +25 -25
- package/src/ui/layout-primitives.ts +106 -106
- package/src/ui/loaders.ts +158 -158
- package/src/ui/render-coalescer.ts +51 -51
- package/src/ui/render-diff.ts +119 -119
- package/src/ui/render-scheduler.ts +143 -143
- package/src/ui/run-action-dispatcher.ts +10 -1
- package/src/ui/spinner.ts +17 -17
- package/src/ui/status-colors.ts +58 -58
- package/src/ui/syntax-highlight.ts +116 -116
- package/src/ui/transcript-entries.ts +258 -258
- package/src/utils/completion-dedupe.ts +63 -63
- package/src/utils/frontmatter.ts +68 -68
- package/src/utils/git.ts +262 -262
- package/src/utils/ids.ts +17 -17
- package/src/utils/incremental-reader.ts +104 -104
- package/src/utils/names.ts +27 -27
- package/src/utils/redaction.ts +44 -44
- package/src/utils/safe-paths.ts +47 -47
- package/src/utils/scan-cache.ts +136 -136
- package/src/utils/sleep.ts +40 -26
- package/src/utils/task-name-generator.ts +337 -337
- package/src/workflows/validate-workflow.ts +40 -40
- package/src/worktree/branch-freshness.ts +45 -45
- package/teams/default.team.md +12 -12
- package/teams/fast-fix.team.md +11 -11
- package/teams/implementation.team.md +18 -18
- package/teams/parallel-research.team.md +14 -14
- package/teams/research.team.md +11 -11
- package/teams/review.team.md +12 -12
- package/workflows/default.workflow.md +30 -29
- package/workflows/fast-fix.workflow.md +23 -22
- package/workflows/implementation.workflow.md +43 -43
- package/workflows/parallel-research.workflow.md +46 -46
- package/workflows/research.workflow.md +22 -22
- package/workflows/review.workflow.md +30 -30
- package/docs/refactor-tasks-phase3.md +0 -394
- package/docs/refactor-tasks-phase4.md +0 -564
- package/docs/refactor-tasks-phase5.md +0 -402
- package/docs/refactor-tasks-phase6.md +0 -662
- package/docs/refactor-tasks.md +0 -1484
- package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +0 -261
- package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +0 -111
- package/docs/research/AUDIT_OH_MY_PI.md +0 -261
- package/docs/research/AUDIT_PI_CREW.md +0 -457
- package/docs/research/CAVEMAN-DEEP-RESEARCH.md +0 -281
- package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +0 -264
- package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +0 -343
- package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +0 -480
- package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +0 -354
- package/docs/research/IMPLEMENTATION_PLAN.md +0 -385
- package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +0 -502
- package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +0 -266
- package/docs/research/REMAINING-GAPS-PLAN.md +0 -363
- package/docs/research/SESSION-SUMMARY-2026-05-08.md +0 -146
- package/docs/research/UI-RESPONSIVENESS-AUDIT.md +0 -173
- package/docs/research-awesome-agent-skills-distillation.md +0 -100
- package/docs/research-extension-examples.md +0 -297
- package/docs/research-extension-system.md +0 -324
- package/docs/research-oh-my-pi-distillation.md +0 -369
- package/docs/research-optimization-plan.md +0 -548
- package/docs/research-phase10-distillation.md +0 -199
- package/docs/research-phase11-distillation.md +0 -201
- package/docs/research-phase8-operator-experience-plan.md +0 -819
- package/docs/research-phase9-observability-reliability-plan.md +0 -1190
- package/docs/research-pi-coding-agent.md +0 -357
- package/docs/research-source-pi-crew-reference.md +0 -174
- package/docs/research-ui-optimization-plan.md +0 -480
- package/docs/source-runtime-refactor-map.md +0 -107
- 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
|
+
}
|