pi-crew 0.1.46 → 0.1.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/agents/analyst.md +11 -11
  3. package/agents/critic.md +11 -11
  4. package/agents/executor.md +11 -11
  5. package/agents/explorer.md +11 -11
  6. package/agents/planner.md +11 -11
  7. package/agents/reviewer.md +11 -11
  8. package/agents/security-reviewer.md +11 -11
  9. package/agents/test-engineer.md +11 -11
  10. package/agents/verifier.md +11 -11
  11. package/agents/writer.md +11 -11
  12. package/docs/next-upgrade-roadmap.md +117 -42
  13. package/docs/refactor-tasks-phase3.md +394 -394
  14. package/docs/refactor-tasks-phase4.md +564 -564
  15. package/docs/refactor-tasks-phase5.md +402 -402
  16. package/docs/refactor-tasks-phase6.md +662 -662
  17. package/docs/research/AGENT-EXECUTION-ARCHITECTURE.md +261 -0
  18. package/docs/research/AGENT-LIFECYCLE-COMPARISON.md +111 -0
  19. package/docs/research/AUDIT_OH_MY_PI.md +261 -0
  20. package/docs/research/AUDIT_PI_CREW.md +457 -0
  21. package/docs/research/CAVEMAN-DEEP-RESEARCH.md +281 -0
  22. package/docs/research/COMPARISON_OH_MY_PI_VS_PI_CREW.md +264 -0
  23. package/docs/research/DEEP-RESEARCH-PI-POWERBAR.md +343 -0
  24. package/docs/research/DEEP_RESEARCH_SUBAGENT_ARCHITECTURE.md +480 -0
  25. package/docs/research/GAP_CLOSURE_IMPLEMENTATION_PLAN.md +354 -0
  26. package/docs/research/IMPLEMENTATION_PLAN.md +385 -0
  27. package/docs/research/LIVE-SESSION-PRODUCTION-READY-PLAN.md +502 -0
  28. package/docs/research/OH-MY-PI-DEEP-RESEARCH-v14.7.6.md +266 -0
  29. package/docs/research/REMAINING-GAPS-PLAN.md +363 -0
  30. package/docs/research/SESSION-SUMMARY-2026-05-08.md +146 -0
  31. package/docs/research/UI-RESPONSIVENESS-AUDIT.md +173 -0
  32. package/docs/research-awesome-agent-skills-distillation.md +100 -100
  33. package/docs/research-extension-examples.md +297 -297
  34. package/docs/research-extension-system.md +324 -324
  35. package/docs/research-oh-my-pi-distillation.md +56 -9
  36. package/docs/research-optimization-plan.md +548 -548
  37. package/docs/research-phase10-distillation.md +198 -198
  38. package/docs/research-phase11-distillation.md +201 -201
  39. package/docs/research-pi-coding-agent.md +357 -357
  40. package/docs/research-source-pi-crew-reference.md +174 -174
  41. package/docs/runtime-flow.md +148 -148
  42. package/docs/source-runtime-refactor-map.md +107 -107
  43. package/index.ts +6 -6
  44. package/package.json +99 -98
  45. package/schema.json +8 -0
  46. package/skills/async-worker-recovery/SKILL.md +42 -42
  47. package/skills/context-artifact-hygiene/SKILL.md +52 -52
  48. package/skills/delegation-patterns/SKILL.md +54 -54
  49. package/skills/mailbox-interactive/SKILL.md +40 -40
  50. package/skills/model-routing-context/SKILL.md +39 -39
  51. package/skills/multi-perspective-review/SKILL.md +58 -58
  52. package/skills/observability-reliability/SKILL.md +41 -41
  53. package/skills/orchestration/SKILL.md +157 -0
  54. package/skills/ownership-session-security/SKILL.md +41 -41
  55. package/skills/pi-extension-lifecycle/SKILL.md +39 -39
  56. package/skills/requirements-to-task-packet/SKILL.md +63 -63
  57. package/skills/resource-discovery-config/SKILL.md +41 -41
  58. package/skills/runtime-state-reader/SKILL.md +44 -44
  59. package/skills/secure-agent-orchestration-review/SKILL.md +45 -45
  60. package/skills/state-mutation-locking/SKILL.md +42 -42
  61. package/skills/systematic-debugging/SKILL.md +67 -67
  62. package/skills/ui-render-performance/SKILL.md +39 -39
  63. package/skills/verification-before-done/SKILL.md +57 -57
  64. package/skills/worktree-isolation/SKILL.md +39 -39
  65. package/src/agents/agent-config.ts +6 -0
  66. package/src/agents/agent-search.ts +98 -0
  67. package/src/agents/agent-serializer.ts +4 -0
  68. package/src/agents/discover-agents.ts +17 -4
  69. package/src/config/config.ts +24 -0
  70. package/src/config/defaults.ts +11 -0
  71. package/src/extension/autonomous-policy.ts +26 -33
  72. package/src/extension/cross-extension-rpc.ts +82 -82
  73. package/src/extension/help.ts +1 -0
  74. package/src/extension/management.ts +5 -0
  75. package/src/extension/register.ts +58 -13
  76. package/src/extension/registration/commands.ts +33 -1
  77. package/src/extension/registration/compaction-guard.ts +125 -125
  78. package/src/extension/registration/team-tool.ts +6 -4
  79. package/src/extension/run-bundle-schema.ts +89 -89
  80. package/src/extension/run-index.ts +24 -18
  81. package/src/extension/run-maintenance.ts +68 -62
  82. package/src/extension/team-tool/api.ts +23 -2
  83. package/src/extension/team-tool/cancel.ts +86 -11
  84. package/src/extension/team-tool/context.ts +3 -0
  85. package/src/extension/team-tool/handle-settings.ts +188 -188
  86. package/src/extension/team-tool/inspect.ts +41 -41
  87. package/src/extension/team-tool/intent-policy.ts +42 -0
  88. package/src/extension/team-tool/lifecycle-actions.ts +47 -18
  89. package/src/extension/team-tool/parallel-dispatch.ts +156 -0
  90. package/src/extension/team-tool/plan.ts +19 -19
  91. package/src/extension/team-tool/respond.ts +10 -2
  92. package/src/extension/team-tool/run.ts +3 -2
  93. package/src/extension/team-tool/status.ts +1 -1
  94. package/src/extension/team-tool-types.ts +1 -0
  95. package/src/extension/team-tool.ts +13 -3
  96. package/src/hooks/registry.ts +61 -0
  97. package/src/hooks/types.ts +41 -0
  98. package/src/i18n.ts +184 -184
  99. package/src/observability/exporters/otlp-exporter.ts +77 -77
  100. package/src/prompt/prompt-runtime.ts +72 -72
  101. package/src/runtime/agent-control.ts +108 -2
  102. package/src/runtime/agent-memory.ts +72 -72
  103. package/src/runtime/agent-observability.ts +114 -114
  104. package/src/runtime/async-marker.ts +26 -26
  105. package/src/runtime/async-runner.ts +3 -1
  106. package/src/runtime/attention-events.ts +28 -28
  107. package/src/runtime/background-runner.ts +19 -0
  108. package/src/runtime/cancellation-token.ts +89 -0
  109. package/src/runtime/cancellation.ts +61 -51
  110. package/src/runtime/capability-inventory.ts +116 -0
  111. package/src/runtime/child-pi.ts +2 -1
  112. package/src/runtime/code-summary.ts +247 -0
  113. package/src/runtime/completion-guard.ts +190 -190
  114. package/src/runtime/crash-recovery.ts +181 -0
  115. package/src/runtime/crew-agent-records.ts +35 -7
  116. package/src/runtime/crew-agent-runtime.ts +1 -0
  117. package/src/runtime/custom-tools/irc-tool.ts +201 -0
  118. package/src/runtime/custom-tools/submit-result-tool.ts +90 -0
  119. package/src/runtime/delivery-coordinator.ts +3 -1
  120. package/src/runtime/direct-run.ts +35 -35
  121. package/src/runtime/effectiveness.ts +81 -76
  122. package/src/runtime/event-stream-bridge.ts +90 -0
  123. package/src/runtime/foreground-control.ts +82 -82
  124. package/src/runtime/green-contract.ts +46 -46
  125. package/src/runtime/group-join.ts +106 -106
  126. package/src/runtime/heartbeat-gradient.ts +28 -28
  127. package/src/runtime/heartbeat-watcher.ts +124 -124
  128. package/src/runtime/live-agent-control.ts +88 -88
  129. package/src/runtime/live-agent-manager.ts +78 -2
  130. package/src/runtime/live-control-realtime.ts +36 -36
  131. package/src/runtime/live-extension-bridge.ts +150 -0
  132. package/src/runtime/live-irc.ts +92 -0
  133. package/src/runtime/live-session-health.ts +100 -0
  134. package/src/runtime/live-session-runtime.ts +297 -7
  135. package/src/runtime/mcp-proxy.ts +113 -0
  136. package/src/runtime/notebook-helpers.ts +90 -0
  137. package/src/runtime/orphan-sentinel.ts +7 -0
  138. package/src/runtime/output-validator.ts +187 -0
  139. package/src/runtime/parallel-research.ts +44 -44
  140. package/src/runtime/parallel-utils.ts +57 -0
  141. package/src/runtime/parent-guard.ts +80 -0
  142. package/src/runtime/pi-json-output.ts +111 -111
  143. package/src/runtime/policy-engine.ts +79 -79
  144. package/src/runtime/progress-event-coalescer.ts +43 -43
  145. package/src/runtime/prose-compressor.ts +164 -0
  146. package/src/runtime/recovery-recipes.ts +74 -74
  147. package/src/runtime/result-extractor.ts +121 -0
  148. package/src/runtime/role-permission.ts +39 -39
  149. package/src/runtime/runtime-resolver.ts +1 -4
  150. package/src/runtime/semaphore.ts +131 -0
  151. package/src/runtime/sensitive-paths.ts +92 -0
  152. package/src/runtime/session-resources.ts +25 -25
  153. package/src/runtime/session-snapshot.ts +59 -59
  154. package/src/runtime/session-usage.ts +79 -79
  155. package/src/runtime/sidechain-output.ts +29 -29
  156. package/src/runtime/stream-preview.ts +177 -0
  157. package/src/runtime/subagent-manager.ts +3 -2
  158. package/src/runtime/subprocess-tool-registry.ts +67 -0
  159. package/src/runtime/supervisor-contact.ts +59 -59
  160. package/src/runtime/task-display.ts +38 -38
  161. package/src/runtime/task-output-context.ts +59 -9
  162. package/src/runtime/task-runner/capabilities.ts +78 -78
  163. package/src/runtime/task-runner/live-executor.ts +2 -0
  164. package/src/runtime/task-runner/progress.ts +119 -119
  165. package/src/runtime/task-runner/prompt-builder.ts +70 -8
  166. package/src/runtime/task-runner/prompt-pipeline.ts +64 -64
  167. package/src/runtime/task-runner/result-utils.ts +14 -14
  168. package/src/runtime/task-runner/run-projection.ts +104 -0
  169. package/src/runtime/task-runner/state-helpers.ts +22 -22
  170. package/src/runtime/task-runner.ts +75 -4
  171. package/src/runtime/team-runner.ts +60 -8
  172. package/src/runtime/worker-heartbeat.ts +21 -21
  173. package/src/runtime/worker-startup.ts +57 -57
  174. package/src/runtime/workspace-tree.ts +298 -0
  175. package/src/runtime/yield-handler.ts +189 -0
  176. package/src/schema/config-schema.ts +6 -0
  177. package/src/schema/team-tool-schema.ts +11 -1
  178. package/src/skills/discover-skills.ts +67 -0
  179. package/src/state/active-run-registry.ts +4 -2
  180. package/src/state/artifact-store.ts +4 -1
  181. package/src/state/atomic-write.ts +50 -1
  182. package/src/state/blob-store.ts +117 -0
  183. package/src/state/contracts.ts +1 -0
  184. package/src/state/event-log-rotation.ts +158 -0
  185. package/src/state/event-log.ts +52 -2
  186. package/src/state/mailbox.ts +87 -7
  187. package/src/state/state-store.ts +24 -4
  188. package/src/state/task-claims.ts +44 -44
  189. package/src/state/types.ts +20 -0
  190. package/src/state/usage.ts +29 -29
  191. package/src/subagents/async-entry.ts +1 -1
  192. package/src/subagents/index.ts +3 -3
  193. package/src/subagents/live/control.ts +1 -1
  194. package/src/subagents/live/manager.ts +1 -1
  195. package/src/subagents/live/realtime.ts +1 -1
  196. package/src/subagents/live/session-runtime.ts +1 -1
  197. package/src/subagents/manager.ts +1 -1
  198. package/src/subagents/spawn.ts +1 -1
  199. package/src/teams/team-serializer.ts +38 -38
  200. package/src/types/diff.d.ts +18 -18
  201. package/src/ui/agent-management-overlay.ts +144 -0
  202. package/src/ui/crew-footer.ts +101 -101
  203. package/src/ui/crew-select-list.ts +111 -111
  204. package/src/ui/crew-widget.ts +11 -2
  205. package/src/ui/dashboard-panes/cancellation-pane.ts +43 -0
  206. package/src/ui/dashboard-panes/capability-pane.ts +60 -0
  207. package/src/ui/dashboard-panes/mailbox-pane.ts +35 -11
  208. package/src/ui/dashboard-panes/metrics-pane.ts +34 -34
  209. package/src/ui/dynamic-border.ts +25 -25
  210. package/src/ui/layout-primitives.ts +106 -106
  211. package/src/ui/live-run-sidebar.ts +4 -0
  212. package/src/ui/loaders.ts +158 -158
  213. package/src/ui/powerbar-publisher.ts +77 -15
  214. package/src/ui/render-coalescer.ts +51 -0
  215. package/src/ui/render-diff.ts +119 -119
  216. package/src/ui/render-scheduler.ts +143 -143
  217. package/src/ui/run-dashboard.ts +4 -0
  218. package/src/ui/run-event-bus.ts +209 -0
  219. package/src/ui/run-snapshot-cache.ts +68 -16
  220. package/src/ui/snapshot-types.ts +8 -0
  221. package/src/ui/spinner.ts +17 -17
  222. package/src/ui/status-colors.ts +58 -58
  223. package/src/ui/syntax-highlight.ts +116 -116
  224. package/src/ui/transcript-entries.ts +258 -0
  225. package/src/utils/atomic-write.ts +33 -33
  226. package/src/utils/completion-dedupe.ts +63 -63
  227. package/src/utils/frontmatter.ts +68 -68
  228. package/src/utils/git.ts +262 -262
  229. package/src/utils/ids.ts +17 -12
  230. package/src/utils/incremental-reader.ts +104 -0
  231. package/src/utils/names.ts +27 -27
  232. package/src/utils/redaction.ts +44 -44
  233. package/src/utils/safe-paths.ts +47 -47
  234. package/src/utils/scan-cache.ts +137 -0
  235. package/src/utils/sleep.ts +32 -32
  236. package/src/utils/sse-parser.ts +134 -0
  237. package/src/utils/task-name-generator.ts +337 -0
  238. package/src/utils/visual.ts +33 -2
  239. package/src/workflows/validate-workflow.ts +40 -40
  240. package/src/worktree/branch-freshness.ts +45 -45
  241. package/src/worktree/cleanup.ts +2 -1
  242. package/teams/default.team.md +12 -12
  243. package/teams/fast-fix.team.md +11 -11
  244. package/teams/implementation.team.md +18 -18
  245. package/teams/parallel-research.team.md +14 -14
  246. package/teams/research.team.md +11 -11
  247. package/teams/review.team.md +12 -12
  248. package/workflows/default.workflow.md +29 -29
  249. package/workflows/fast-fix.workflow.md +22 -22
  250. package/workflows/implementation.workflow.md +38 -38
  251. package/workflows/parallel-research.workflow.md +46 -46
  252. package/workflows/research.workflow.md +22 -22
  253. package/workflows/review.workflow.md +30 -30
@@ -0,0 +1,343 @@
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.