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,343 +0,0 @@
|
|
|
1
|
-
# Deep Research: pi-powerbar
|
|
2
|
-
|
|
3
|
-
> Source: `Source/pi-powerbar/` — `@juanibiapina/pi-powerbar@0.9.1`
|
|
4
|
-
> Date: 2026-05-08
|
|
5
|
-
|
|
6
|
-
## 1. Tổng quan
|
|
7
|
-
|
|
8
|
-
`pi-powerbar` là Pi extension renders một powerline-style status bar ở dưới/trên editor.
|
|
9
|
-
Kiến trúc: **1 core renderer + N independent producers** — giao tiếp hoàn toàn qua events.
|
|
10
|
-
|
|
11
|
-
| Metric | Value |
|
|
12
|
-
|--------|-------|
|
|
13
|
-
| Package | `@juanibiapina/pi-powerbar@0.9.1` |
|
|
14
|
-
| Author | Juan Ibiapina (@juanibiapina) |
|
|
15
|
-
| Total LOC | 893 (src + test) |
|
|
16
|
-
| Extensions | 7 (1 core + 6 producers) |
|
|
17
|
-
| Dependencies | `pi-extension-settings`, `pi-sub-core` |
|
|
18
|
-
| Pi API surface | `ExtensionAPI`, `ExtensionContext`, `Theme`, `TUI`, `Component` |
|
|
19
|
-
|
|
20
|
-
## 2. Architecture Pattern — Event-Driven Producer/Consumer
|
|
21
|
-
|
|
22
|
-
### 2.1 Core Design
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
Producer extensions ──powerbar:update──▶ powerbar core
|
|
26
|
-
├── segment store (Map<id, Segment>)
|
|
27
|
-
├── render.ts (build single line)
|
|
28
|
-
└── ctx.ui.setWidget (register with Pi TUI)
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Key insight**: Producer extensions KHÔNG import gì từ powerbar core.
|
|
32
|
-
Hợp đồng duy nhất: emit event `powerbar:update` với payload `{id, text?, suffix?, icon?, color?, bar?, barSegments?}`.
|
|
33
|
-
|
|
34
|
-
### 2.2 Multi-Extension Package
|
|
35
|
-
|
|
36
|
-
`package.json` khai báo:
|
|
37
|
-
```json
|
|
38
|
-
"pi": {
|
|
39
|
-
"extensions": ["./dist", "node_modules/@marckrenn/pi-sub-core/index.ts"]
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Pi auto-discovers tất cả `dist/*/index.js` → mỗi subdirectory là 1 extension độc lập.
|
|
44
|
-
|
|
45
|
-
### 2.3 Extension Lifecycle
|
|
46
|
-
|
|
47
|
-
| Event | Core | Git | Tokens | Context | Provider | Model | Sub |
|
|
48
|
-
|-------|------|-----|--------|---------|----------|-------|-----|
|
|
49
|
-
| init | registerSettings, on(update) | register-segment | register-segment | register-segment | register-segment | register-segment | register-segment |
|
|
50
|
-
| session_start | loadSettings, hideFooter, refresh | emitBranch | resetTokens | resetContext | emitProvider | emitModel | - |
|
|
51
|
-
| session_switch | (removed in 0.8.0) | - | - | - | - | - | - |
|
|
52
|
-
| tool_result | - | emitBranch | emitTokens | emitContext | - | - | - |
|
|
53
|
-
| turn_start | - | - | - | emitContext | emitProvider | emitModel | - |
|
|
54
|
-
| turn_end | - | - | emitTokens | emitContext | - | - | - |
|
|
55
|
-
| model_select | - | - | - | - | emitProvider | emitModel | - |
|
|
56
|
-
| sub-core:ready | - | - | - | - | - | - | emitUsage |
|
|
57
|
-
| sub-core:update-current | - | - | - | - | - | - | emitUsage |
|
|
58
|
-
| session_shutdown | clearWidget, cleanup | - | - | - | - | - | - |
|
|
59
|
-
|
|
60
|
-
## 3. Rendering System
|
|
61
|
-
|
|
62
|
-
### 3.1 Layout Algorithm (`render.ts`)
|
|
63
|
-
|
|
64
|
-
```
|
|
65
|
-
[icon text bar suffix] │ [icon text bar suffix] │ ... ←→ [icon text bar suffix] │ ...
|
|
66
|
-
└──────── left side ─────────────────────────┘ └──────── right side ───────────┘
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
1. Read `left[]` and `right[]` from settings
|
|
70
|
-
2. Filter `Map<id, Segment>` → chỉ render segments listed in settings
|
|
71
|
-
3. Skip segments với no text + no suffix + no bar
|
|
72
|
-
4. Render mỗi segment: `[icon] [text] [bar] [suffix]`
|
|
73
|
-
5. Join mỗi side với separator (themed)
|
|
74
|
-
6. Pad middle → left flush-left, right flush-right
|
|
75
|
-
7. **Overflow**: Shrink widest segment(s) bằng `truncateToWidth` cho đến khi fit
|
|
76
|
-
|
|
77
|
-
### 3.2 Progress Bar Styles
|
|
78
|
-
|
|
79
|
-
**Continuous** (default trước 0.7.0):
|
|
80
|
-
```
|
|
81
|
-
██▎ ← █ filled + ▏▎▍▌▋▊▉ partial + space empty
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**Blocks** (default từ 0.7.0):
|
|
85
|
-
```
|
|
86
|
-
▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ← partial-height glyphs
|
|
87
|
-
```
|
|
88
|
-
- Mỗi block có dim background track + filled glyph
|
|
89
|
-
- `barSegments` hint: số discrete blocks (e.g. sub-hourly=5, sub-weekly=7)
|
|
90
|
-
- Trông giống pi-sub visual style
|
|
91
|
-
|
|
92
|
-
### 3.3 Widget Lifecycle
|
|
93
|
-
|
|
94
|
-
```typescript
|
|
95
|
-
// Core: on session_start
|
|
96
|
-
ctx.ui.setWidget("powerbar", (tui, theme) => ({
|
|
97
|
-
render(width): string[] {
|
|
98
|
-
return [renderBar(segments, settings, theme, width)];
|
|
99
|
-
},
|
|
100
|
-
invalidate() {},
|
|
101
|
-
}), { placement: settings.placement });
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Pi TUI gọi `render(width)` khi cần vẽ lại. Powerbar không cache — re-renders every time.
|
|
105
|
-
`invalidate()` rỗng vì không có cached state.
|
|
106
|
-
|
|
107
|
-
### 3.4 Footer Hiding
|
|
108
|
-
|
|
109
|
-
Core extension ẩn Pi's default footer:
|
|
110
|
-
```typescript
|
|
111
|
-
ctx.ui.setFooter(() => ({ render(): string[] { return []; }, invalidate() {} }));
|
|
112
|
-
```
|
|
113
|
-
Vì powerbar đã hiển thị model, tokens, context — footer là redundant.
|
|
114
|
-
|
|
115
|
-
## 4. Settings System
|
|
116
|
-
|
|
117
|
-
### 4.1 pi-extension-settings Integration
|
|
118
|
-
|
|
119
|
-
Settings được register qua event:
|
|
120
|
-
```typescript
|
|
121
|
-
pi.events.emit("pi-extension-settings:register", {
|
|
122
|
-
name: "powerbar",
|
|
123
|
-
settings: definitions,
|
|
124
|
-
});
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### 4.2 Dynamic Segment Catalog
|
|
128
|
-
|
|
129
|
-
Producers register segments dynamic:
|
|
130
|
-
```typescript
|
|
131
|
-
pi.events.emit("powerbar:register-segment", { id: "git-branch", label: "Git Branch" });
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
Core lắng nghe → adds to catalog → re-registers settings với updated options.
|
|
135
|
-
Điều này cho phép **external producers** (từ packages khác) thêm segments vào settings menu!
|
|
136
|
-
|
|
137
|
-
### 4.3 Configuration Values
|
|
138
|
-
|
|
139
|
-
| Setting | Type | Default | Description |
|
|
140
|
-
|---------|------|---------|-------------|
|
|
141
|
-
| left | ordered-list | `git-branch,tokens,context-usage` | Left side segment IDs |
|
|
142
|
-
| right | ordered-list | `provider,model,sub-hourly,sub-weekly` | Right side segment IDs |
|
|
143
|
-
| separator | select | ` │ ` | Between-segment separator |
|
|
144
|
-
| placement | select | `belowEditor` | Widget placement |
|
|
145
|
-
| bar-style | select | `blocks` | `continuous` or `blocks` |
|
|
146
|
-
| bar-width | select | `10` | 4–24 chars |
|
|
147
|
-
|
|
148
|
-
## 5. Key Design Patterns Worth Noting
|
|
149
|
-
|
|
150
|
-
### 5.1 Dedup/No-op Detection (v0.9.1)
|
|
151
|
-
|
|
152
|
-
```typescript
|
|
153
|
-
function segmentEquals(left: Segment | undefined, right: Segment): boolean {
|
|
154
|
-
return left?.text === right.text && ...;
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
Core skip re-render nếu payload identical → giảm widget churn từ chatty producers.
|
|
159
|
-
|
|
160
|
-
### 5.2 No Import Coupling
|
|
161
|
-
|
|
162
|
-
Producers biết:
|
|
163
|
-
- Event name: `"powerbar:update"` and `"powerbar:register-segment"`
|
|
164
|
-
- Payload shape: `{id, text?, suffix?, icon?, color?, bar?, barSegments?}`
|
|
165
|
-
|
|
166
|
-
Core biết:
|
|
167
|
-
- Event name: `"powerbar:update"`
|
|
168
|
-
- How to render a `Segment`
|
|
169
|
-
|
|
170
|
-
→ **Zero coupling**. External extensions có thể emit `powerbar:update` mà không cần install pi-powerbar.
|
|
171
|
-
|
|
172
|
-
### 5.3 Safe Segment Deletion
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
if (!payload.text && payload.bar === undefined) {
|
|
176
|
-
segments.delete(payload.id);
|
|
177
|
-
}
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
Delete khi cả text lẫn bar đều absent. Điều này cho phép segment với chỉ suffix (no text).
|
|
181
|
-
|
|
182
|
-
### 5.4 fgToBgAnsi Hack for Blocks
|
|
183
|
-
|
|
184
|
-
```typescript
|
|
185
|
-
function fgToBgAnsi(fgAnsi: string): string {
|
|
186
|
-
return fgAnsi.replace("\x1b[38;", "\x1b[48;");
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Blocks mode cần dim background → convert foreground ANSI escape to background.
|
|
191
|
-
Direct ANSI manipulation thay vì dùng theme API — workaround cho missing theme API.
|
|
192
|
-
|
|
193
|
-
### 5.5 Sub-Core Event Selection (v0.9.1)
|
|
194
|
-
|
|
195
|
-
Chỉ listen `sub-core:update-current`, bỏ `sub-core:update-all`:
|
|
196
|
-
- `update-all` filters entries by cache TTL → current provider có thể missing
|
|
197
|
-
- `update-current` luôn authoritative cho current provider
|
|
198
|
-
- Fix: https://github.com/marckrenn/pi-sub/issues/58
|
|
199
|
-
|
|
200
|
-
## 6. Comparison: pi-powerbar vs pi-crew Powerbar Publisher
|
|
201
|
-
|
|
202
|
-
| Aspect | pi-powerbar (standalone) | pi-crew `powerbar-publisher.ts` |
|
|
203
|
-
|--------|--------------------------|----------------------------------|
|
|
204
|
-
| Role | Full powerbar renderer + producers | Producer only (emits `powerbar:update`) |
|
|
205
|
-
| Rendering | Owns widget, renders bar, left/right layout | No rendering — delegates to pi-powerbar |
|
|
206
|
-
| Segments | 6 built-in (git, tokens, context, provider, model, sub) | 2 segments (pi-crew-active, pi-crew-progress) |
|
|
207
|
-
| Settings | Full settings system via pi-extension-settings | Config via pi-crew config |
|
|
208
|
-
| Event usage | Both emits and consumes `powerbar:*` | Only emits `powerbar:update` and `powerbar:register-segment` |
|
|
209
|
-
| Coalescing | No coalescing (dedup only) | `RenderCoalescer` 200ms batching |
|
|
210
|
-
| Fallback | Widget-based | Status fallback when no powerbar consumer |
|
|
211
|
-
| Overflow | Shrinks widest segment | N/A (doesn't render) |
|
|
212
|
-
| Progress bars | Continuous + blocks styles | N/A |
|
|
213
|
-
| LOC | 893 total | 176 single file |
|
|
214
|
-
|
|
215
|
-
**pi-crew là một PRODUCER** cho pi-powerbar — đúng pattern. pi-crew emit `powerbar:update` events, pi-powerbar renders chúng.
|
|
216
|
-
|
|
217
|
-
## 7. Code Quality Assessment
|
|
218
|
-
|
|
219
|
-
### 7.1 Strengths
|
|
220
|
-
|
|
221
|
-
1. **Clean separation of concerns** — producer/consumer pattern executed perfectly
|
|
222
|
-
2. **Zero coupling** — producers don't import from core
|
|
223
|
-
3. **Dynamic segment catalog** — external extensions can register segments
|
|
224
|
-
4. **Dedup rendering** — no-op detection prevents churn
|
|
225
|
-
5. **Overflow handling** — shrink widest segment instead of crash
|
|
226
|
-
6. **Comprehensive test** — powerbar-sub has 5 targeted tests covering edge cases
|
|
227
|
-
7. **Good documentation** — PROMPT.md is excellent architecture doc
|
|
228
|
-
8. **Theme-aware rendering** — all colors go through Pi theme API
|
|
229
|
-
|
|
230
|
-
### 7.2 Potential Issues / Observations
|
|
231
|
-
|
|
232
|
-
1. **No error handling in producer event handlers**: Producers use `as` casts without validation:
|
|
233
|
-
```typescript
|
|
234
|
-
const { id, label } = data as SegmentRegistration;
|
|
235
|
-
```
|
|
236
|
-
If malformed event → silent crash. Low risk vì events are internal.
|
|
237
|
-
|
|
238
|
-
2. **Synchronous file reads**: `powerbar-git` uses `readFileSync` trong event handler.
|
|
239
|
-
Acceptable vì chỉ đọc `.git/HEAD` (tiny file).
|
|
240
|
-
|
|
241
|
-
3. **No caching in core**: `refresh()` creates a new widget component every time.
|
|
242
|
-
Widget re-renders fully on every `powerbar:update`. OK vì only 1 line to render.
|
|
243
|
-
|
|
244
|
-
4. **`currentCtx` closure pattern**: Core stores `currentCtx` in module scope.
|
|
245
|
-
Works but not GC-friendly — ctx holds reference until `session_shutdown`.
|
|
246
|
-
|
|
247
|
-
5. **`loadSettings()` on every session_start**: No caching across sessions.
|
|
248
|
-
Acceptable vì settings có thể change between sessions.
|
|
249
|
-
|
|
250
|
-
6. **No test coverage for core render.ts**: Tests only cover powerbar-sub.
|
|
251
|
-
Render logic (progress bars, overflow, truncation) untested.
|
|
252
|
-
|
|
253
|
-
7. **`fgToBgAnsi` string replacement**: Relies on specific ANSI escape format.
|
|
254
|
-
Fragile if Pi theme implementation changes.
|
|
255
|
-
|
|
256
|
-
### 7.3 Missing Features (opportunities)
|
|
257
|
-
|
|
258
|
-
1. **No click/interaction**: Segments không clickable. Could add `onClick` callback.
|
|
259
|
-
2. **No tooltip**: Segments không có hover info.
|
|
260
|
-
3. **No animation**: Progress bars không animate (only static rendering).
|
|
261
|
-
4. **No priority system**: Khi overflow, shrink widest — không có segment priority.
|
|
262
|
-
5. **No segment grouping**: Không có sub-segments hoặc nested layout.
|
|
263
|
-
6. **No conditional visibility**: Segments visible/invisible chỉ qua text=undefined.
|
|
264
|
-
Không có min-width, collapse-threshold, etc.
|
|
265
|
-
|
|
266
|
-
## 8. Lessons for pi-crew
|
|
267
|
-
|
|
268
|
-
### 8.1 Patterns to Adopt
|
|
269
|
-
|
|
270
|
-
1. **Dedup detection** — pi-crew's `requestPowerbarUpdate` coalesces 200ms nhưng không skip identical payloads. Adding segmentEquals check would further reduce churn.
|
|
271
|
-
|
|
272
|
-
2. **Dynamic segment registration** — pi-crew already uses `powerbar:register-segment` (correct pattern).
|
|
273
|
-
|
|
274
|
-
3. **Overflow shrinking** — If pi-crew ever renders its own bar, use the shrink-widest algorithm.
|
|
275
|
-
|
|
276
|
-
4. **Event-only coupling** — pi-crew's powerbar-publisher already follows this pattern (emit-only).
|
|
277
|
-
|
|
278
|
-
### 8.2 pi-crew Powerbar Publisher Improvements
|
|
279
|
-
|
|
280
|
-
1. **Add dedup check**: Skip `updatePiCrewPowerbar()` if segment data unchanged.
|
|
281
|
-
```typescript
|
|
282
|
-
// Before emitting, compare with last emitted state
|
|
283
|
-
if (lastActiveText === activeText && lastProgressSuffix === progressSuffix) return;
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
2. **Use barSegments hint**: pi-crew progress bar currently sends `barSegments: 8`.
|
|
287
|
-
Could make dynamic: `Math.min(total, 10)` for better visual scaling.
|
|
288
|
-
|
|
289
|
-
3. **Color transitions**: pi-crew uses fixed colors. Could add threshold-based:
|
|
290
|
-
- progress < 50% → accent
|
|
291
|
-
- progress 50-80% → warning
|
|
292
|
-
- progress > 80% → error
|
|
293
|
-
- complete → success
|
|
294
|
-
|
|
295
|
-
### 8.3 Potential Integration Points
|
|
296
|
-
|
|
297
|
-
1. **pi-crew team status as powerbar segment**: Already done (`pi-crew-active`, `pi-crew-progress`).
|
|
298
|
-
|
|
299
|
-
2. **Agent health in powerbar**: Could add `pi-crew-health` segment showing dead/stale agents.
|
|
300
|
-
|
|
301
|
-
3. **Run cost in powerbar**: Could add `pi-crew-cost` segment showing cumulative token cost.
|
|
302
|
-
|
|
303
|
-
4. **Multi-run summary**: Could show "3 runs, 7/12 agents done" instead of single-run progress.
|
|
304
|
-
|
|
305
|
-
## 9. File Map
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
Source/pi-powerbar/
|
|
309
|
-
├── src/
|
|
310
|
-
│ ├── powerbar/ # Core renderer
|
|
311
|
-
│ │ ├── index.ts (125 lines) — event listener + widget + footer hiding
|
|
312
|
-
│ │ ├── render.ts (216 lines) — layout algorithm + progress bars
|
|
313
|
-
│ │ └── settings.ts (94 lines) — pi-extension-settings integration
|
|
314
|
-
│ ├── powerbar-git/ # Git branch producer
|
|
315
|
-
│ │ └── index.ts (55 lines) — reads .git/HEAD
|
|
316
|
-
│ ├── powerbar-tokens/ # Token stats producer
|
|
317
|
-
│ │ └── index.ts (65 lines) — sums session entries
|
|
318
|
-
│ ├── powerbar-context/ # Context usage producer
|
|
319
|
-
│ │ └── index.ts (51 lines) — progress bar with color thresholds
|
|
320
|
-
│ ├── powerbar-provider/ # Provider name producer
|
|
321
|
-
│ │ └── index.ts (35 lines) — shows provider from ctx.model
|
|
322
|
-
│ ├── powerbar-model/ # Model name producer
|
|
323
|
-
│ │ └── index.ts (44 lines) — model + thinking level
|
|
324
|
-
│ └── powerbar-sub/ # Subscription usage producer
|
|
325
|
-
│ └── index.ts (74 lines) — sub-core integration
|
|
326
|
-
├── test/
|
|
327
|
-
│ └── powerbar-sub.test.js (134 lines) — 5 unit tests
|
|
328
|
-
├── PROMPT.md # Architecture doc (excellent)
|
|
329
|
-
├── AGENTS.md # Build/check instructions
|
|
330
|
-
└── package.json # Multi-extension package
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
## 10. Summary
|
|
334
|
-
|
|
335
|
-
`pi-powerbar` là một exemplar của clean extension architecture:
|
|
336
|
-
- **Producer/Consumer** pattern với zero coupling
|
|
337
|
-
- **Event-driven** communication — bất kỳ extension nào cũng có thể participate
|
|
338
|
-
- **Dynamic segment discovery** — catalog grows as producers register
|
|
339
|
-
- **Theme-aware rendering** — respects Pi's theme system
|
|
340
|
-
- **Overflow-safe** — graceful degradation on narrow terminals
|
|
341
|
-
|
|
342
|
-
pi-crew's `powerbar-publisher.ts` đã follow đúng pattern này (producer-only, emit events).
|
|
343
|
-
Phù hợp để làm reference implementation cho bất kỳ Pi extension nào muốn hiển thị data trên powerbar.
|