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.
- package/CHANGELOG.md +74 -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 +14 -1
- package/src/config/defaults.ts +5 -5
- 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 -82
- package/src/extension/project-init.ts +36 -4
- package/src/extension/register.ts +67 -22
- 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-export.ts +26 -12
- 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/context.ts +1 -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 +14 -3
- 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/concurrency.ts +3 -1
- package/src/runtime/crash-recovery.ts +33 -0
- package/src/runtime/delta-conflict.ts +360 -0
- package/src/runtime/diagnostic-export.ts +3 -1
- package/src/runtime/direct-run.ts +35 -35
- package/src/runtime/event-stream-bridge.ts +3 -1
- 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 -2
- package/src/runtime/pi-json-output.ts +111 -111
- package/src/runtime/pi-spawn.ts +74 -6
- package/src/runtime/policy-engine.ts +79 -79
- package/src/runtime/post-checks.ts +122 -0
- package/src/runtime/process-status.ts +14 -1
- 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 +3 -3
- 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-builder.ts +1 -1
- 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 +126 -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 +12 -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 -11
- 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 +9 -4
- 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/powerbar-publisher.ts +6 -0
- 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/src/worktree/worktree-manager.ts +11 -3
- 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 -38
- 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
|
@@ -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();
|