aiblueprint-cli 1.4.59 → 1.4.61

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 (184) hide show
  1. package/README.md +16 -36
  2. package/agents-config/agents/action.md +1 -1
  3. package/agents-config/agents/explore-codebase.md +53 -53
  4. package/agents-config/agents/explore-docs.md +50 -69
  5. package/agents-config/agents/websearch.md +36 -40
  6. package/agents-config/claude-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
  7. package/agents-config/claude-config/scripts/CLAUDE.md +10 -4
  8. package/agents-config/claude-config/scripts/bun.lockb +0 -0
  9. package/agents-config/claude-config/scripts/package.json +22 -30
  10. package/agents-config/claude-config/scripts/statusline/CLAUDE.md +37 -155
  11. package/agents-config/claude-config/scripts/statusline/README.md +18 -94
  12. package/agents-config/claude-config/scripts/statusline/defaults.json +13 -10
  13. package/agents-config/claude-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -4
  14. package/agents-config/claude-config/scripts/statusline/fixtures/test-input.json +4 -4
  15. package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +403 -0
  16. package/agents-config/claude-config/scripts/statusline/src/index.ts +33 -82
  17. package/agents-config/claude-config/scripts/statusline/src/lib/config-types.ts +7 -1
  18. package/agents-config/claude-config/scripts/statusline/src/lib/formatters.ts +40 -0
  19. package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
  20. package/agents-config/claude-config/scripts/statusline/src/lib/render-pure.ts +24 -5
  21. package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +79 -0
  22. package/agents-config/claude-config/scripts/statusline/statusline.config.json +77 -77
  23. package/agents-config/codex-config/config.toml +9 -0
  24. package/agents-config/codex-config/hooks/command-deny-list.ts +203 -0
  25. package/agents-config/commands/prompts/create-vitejs-app.md +272 -0
  26. package/agents-config/commands/prompts/nextjs-add-prisma-db.md +136 -0
  27. package/agents-config/commands/prompts/nextjs-setup-better-auth.md +173 -0
  28. package/agents-config/commands/prompts/nextjs-setup-project.md +200 -0
  29. package/agents-config/commands/prompts/prompt.md +55 -0
  30. package/agents-config/commands/prompts/saas-challenge-idea.md +135 -0
  31. package/agents-config/commands/prompts/saas-create-architecture.md +242 -0
  32. package/agents-config/commands/prompts/saas-create-headline.md +132 -0
  33. package/agents-config/commands/prompts/saas-create-landing-copywritting.md +267 -0
  34. package/agents-config/commands/prompts/saas-create-legals-docs.md +176 -0
  35. package/agents-config/commands/prompts/saas-create-logos.md +240 -0
  36. package/agents-config/commands/prompts/saas-create-prd.md +195 -0
  37. package/agents-config/commands/prompts/saas-create-tasks.md +240 -0
  38. package/agents-config/commands/prompts/saas-define-pricing.md +293 -0
  39. package/agents-config/commands/prompts/saas-find-domain-name.md +190 -0
  40. package/agents-config/commands/prompts/saas-implement-landing-page.md +257 -0
  41. package/agents-config/commands/prompts/setup-tmux.md +160 -0
  42. package/agents-config/commands/prompts/tools.md +148 -0
  43. package/agents-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
  44. package/agents-config/scripts/CLAUDE.md +37 -0
  45. package/agents-config/scripts/biome.json +37 -0
  46. package/agents-config/scripts/bun.lockb +0 -0
  47. package/agents-config/scripts/package.json +24 -0
  48. package/agents-config/scripts/statusline/CLAUDE.md +87 -0
  49. package/agents-config/scripts/statusline/README.md +117 -0
  50. package/agents-config/scripts/statusline/__tests__/context.test.ts +229 -0
  51. package/agents-config/scripts/statusline/__tests__/formatters.test.ts +108 -0
  52. package/agents-config/scripts/statusline/__tests__/statusline.test.ts +309 -0
  53. package/agents-config/scripts/statusline/defaults.json +82 -0
  54. package/agents-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -0
  55. package/agents-config/scripts/statusline/fixtures/test-input.json +35 -0
  56. package/agents-config/scripts/statusline/src/commands/interactive-config.ts +403 -0
  57. package/agents-config/scripts/statusline/src/index.ts +141 -0
  58. package/agents-config/scripts/statusline/src/lib/config-types.ts +110 -0
  59. package/agents-config/scripts/statusline/src/lib/config.ts +21 -0
  60. package/agents-config/scripts/statusline/src/lib/context.ts +103 -0
  61. package/agents-config/scripts/statusline/src/lib/formatters.ts +426 -0
  62. package/agents-config/scripts/statusline/src/lib/git.ts +100 -0
  63. package/agents-config/scripts/statusline/src/lib/menu-factories.ts +224 -0
  64. package/agents-config/scripts/statusline/src/lib/presets.ts +177 -0
  65. package/agents-config/scripts/statusline/src/lib/render-pure.ts +516 -0
  66. package/agents-config/scripts/statusline/src/lib/types.ts +36 -0
  67. package/agents-config/scripts/statusline/src/lib/utils.ts +15 -0
  68. package/agents-config/scripts/statusline/statusline.config.free.json +79 -0
  69. package/agents-config/scripts/statusline/statusline.config.json +79 -0
  70. package/agents-config/scripts/statusline/test-with-fixtures.ts +37 -0
  71. package/agents-config/scripts/statusline/test.ts +20 -0
  72. package/agents-config/scripts/statusline/tsconfig.json +27 -0
  73. package/agents-config/scripts/tsconfig.json +27 -0
  74. package/agents-config/skills/{subagent-creator → agents-managers}/SKILL.md +47 -47
  75. package/agents-config/skills/{subagent-creator/references/subagents.md → agents-managers/references/agents.md} +45 -45
  76. package/agents-config/skills/{subagent-creator → agents-managers}/references/context-management.md +20 -20
  77. package/agents-config/skills/{subagent-creator → agents-managers}/references/debugging-agents.md +27 -27
  78. package/agents-config/skills/{subagent-creator → agents-managers}/references/error-handling-and-recovery.md +19 -19
  79. package/agents-config/skills/{subagent-creator → agents-managers}/references/evaluation-and-testing.md +29 -29
  80. package/agents-config/skills/{subagent-creator → agents-managers}/references/orchestration-patterns.md +5 -5
  81. package/agents-config/skills/{subagent-creator/references/writing-subagent-prompts.md → agents-managers/references/writing-agent-prompts.md} +23 -23
  82. package/agents-config/skills/codex-environment/SKILL.md +2 -0
  83. package/agents-config/skills/commit/SKILL.md +2 -0
  84. package/agents-config/skills/create-pr/SKILL.md +2 -0
  85. package/agents-config/skills/environments-manager/SKILL.md +271 -0
  86. package/agents-config/skills/environments-manager/examples/claude/.worktreeinclude +3 -0
  87. package/agents-config/skills/environments-manager/examples/claude/commands/dev.md +5 -0
  88. package/agents-config/skills/environments-manager/examples/claude/commands/lint.md +5 -0
  89. package/agents-config/skills/environments-manager/examples/claude/commands/test.md +5 -0
  90. package/agents-config/skills/environments-manager/examples/claude/commands/typecheck.md +5 -0
  91. package/agents-config/skills/environments-manager/examples/claude/settings.json +24 -0
  92. package/agents-config/skills/environments-manager/examples/codex/environments/environment.toml +29 -0
  93. package/agents-config/skills/environments-manager/examples/cursor/worktrees.json +3 -0
  94. package/agents-config/skills/environments-manager/examples/scripts/claude-worktree-create.sh +96 -0
  95. package/agents-config/skills/environments-manager/examples/scripts/claude-worktree-remove.sh +66 -0
  96. package/agents-config/skills/environments-manager/examples/scripts/dev.sh +15 -0
  97. package/agents-config/skills/environments-manager/examples/scripts/worktree-down.sh +22 -0
  98. package/agents-config/skills/environments-manager/examples/scripts/worktree-up.sh +50 -0
  99. package/agents-config/skills/environments-manager/references/claude.md +156 -0
  100. package/agents-config/skills/environments-manager/references/codex.md +97 -0
  101. package/agents-config/skills/environments-manager/references/cursor.md +88 -0
  102. package/agents-config/skills/fix-pr-comments/SKILL.md +2 -0
  103. package/agents-config/skills/grill-me/SKILL.md +10 -0
  104. package/agents-config/skills/merge/SKILL.md +2 -0
  105. package/agents-config/skills/rules-manager/SKILL.md +191 -0
  106. package/agents-config/skills/rules-manager/references/agents-vs-claude.md +66 -0
  107. package/agents-config/skills/rules-manager/references/examples.md +117 -0
  108. package/agents-config/skills/skill-manager/SKILL.md +101 -0
  109. package/agents-config/skills/skill-manager/references/claude-code.md +81 -0
  110. package/agents-config/skills/skill-manager/references/codex.md +288 -0
  111. package/agents-config/skills/skill-manager/references/cursor.md +125 -0
  112. package/agents-config/skills/skill-manager/references/description-recommandation.md +97 -0
  113. package/agents-config/skills/skill-manager/scripts/inspect-description.ts +743 -0
  114. package/agents-config/skills/ultrathink/SKILL.md +2 -0
  115. package/dist/cli.js +581 -299
  116. package/package.json +1 -1
  117. package/agents-config/claude-config/scripts/statusline/data/.gitignore +0 -8
  118. package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
  119. package/agents-config/claude-config/scripts/statusline/docs/ARCHITECTURE.md +0 -166
  120. package/agents-config/claude-config/scripts/statusline/src/tests/spend-v2.test.ts +0 -306
  121. package/agents-config/skills/apex/SKILL.md +0 -261
  122. package/agents-config/skills/apex/scripts/setup-templates.sh +0 -100
  123. package/agents-config/skills/apex/scripts/update-progress.sh +0 -80
  124. package/agents-config/skills/apex/steps/step-00-init.md +0 -267
  125. package/agents-config/skills/apex/steps/step-00b-branch.md +0 -126
  126. package/agents-config/skills/apex/steps/step-00b-economy.md +0 -244
  127. package/agents-config/skills/apex/steps/step-00b-interactive.md +0 -153
  128. package/agents-config/skills/apex/steps/step-01-analyze.md +0 -361
  129. package/agents-config/skills/apex/steps/step-02-plan.md +0 -264
  130. package/agents-config/skills/apex/steps/step-03-execute.md +0 -239
  131. package/agents-config/skills/apex/steps/step-04-validate.md +0 -251
  132. package/agents-config/skills/apex/templates/00-context.md +0 -43
  133. package/agents-config/skills/apex/templates/01-analyze.md +0 -10
  134. package/agents-config/skills/apex/templates/02-plan.md +0 -10
  135. package/agents-config/skills/apex/templates/03-execute.md +0 -10
  136. package/agents-config/skills/apex/templates/04-validate.md +0 -10
  137. package/agents-config/skills/apex/templates/README.md +0 -176
  138. package/agents-config/skills/apex/templates/step-complete.md +0 -7
  139. package/agents-config/skills/claude-memory/SKILL.md +0 -293
  140. package/agents-config/skills/claude-memory/references/comprehensive-example.md +0 -175
  141. package/agents-config/skills/claude-memory/references/optimize-guide.md +0 -300
  142. package/agents-config/skills/claude-memory/references/project-patterns.md +0 -334
  143. package/agents-config/skills/claude-memory/references/prompting-techniques.md +0 -411
  144. package/agents-config/skills/claude-memory/references/rules-directory-guide.md +0 -298
  145. package/agents-config/skills/claude-memory/references/section-templates.md +0 -347
  146. package/agents-config/skills/fix-errors/SKILL.md +0 -61
  147. package/agents-config/skills/fix-grammar/SKILL.md +0 -59
  148. package/agents-config/skills/ralph-loop/SKILL.md +0 -117
  149. package/agents-config/skills/ralph-loop/scripts/setup.sh +0 -278
  150. package/agents-config/skills/ralph-loop/steps/step-00-init.md +0 -215
  151. package/agents-config/skills/ralph-loop/steps/step-01-interactive-prd.md +0 -366
  152. package/agents-config/skills/ralph-loop/steps/step-02-create-stories.md +0 -273
  153. package/agents-config/skills/ralph-loop/steps/step-03-finish.md +0 -245
  154. package/agents-config/skills/skill-creator/LICENSE.txt +0 -202
  155. package/agents-config/skills/skill-creator/SKILL.md +0 -421
  156. package/agents-config/skills/skill-creator/package.json +0 -5
  157. package/agents-config/skills/skill-creator/references/output-patterns.md +0 -82
  158. package/agents-config/skills/skill-creator/references/progressive-disclosure-patterns.md +0 -374
  159. package/agents-config/skills/skill-creator/references/prompting-integration.md +0 -363
  160. package/agents-config/skills/skill-creator/references/real-world-examples.md +0 -513
  161. package/agents-config/skills/skill-creator/references/script-patterns.md +0 -385
  162. package/agents-config/skills/skill-creator/references/workflows.md +0 -28
  163. package/agents-config/skills/skill-creator/references/xml-tag-guide.md +0 -606
  164. package/agents-config/skills/skill-creator/scripts/init-skill.ts +0 -214
  165. package/agents-config/skills/skill-creator/scripts/package-skill.ts +0 -146
  166. package/agents-config/skills/skill-creator/scripts/validate.ts +0 -138
  167. package/agents-config/skills/workflow-apex-free/SKILL.md +0 -261
  168. package/agents-config/skills/workflow-apex-free/scripts/setup-templates.sh +0 -100
  169. package/agents-config/skills/workflow-apex-free/scripts/update-progress.sh +0 -80
  170. package/agents-config/skills/workflow-apex-free/steps/step-00-init.md +0 -267
  171. package/agents-config/skills/workflow-apex-free/steps/step-00b-branch.md +0 -126
  172. package/agents-config/skills/workflow-apex-free/steps/step-00b-economy.md +0 -244
  173. package/agents-config/skills/workflow-apex-free/steps/step-00b-interactive.md +0 -153
  174. package/agents-config/skills/workflow-apex-free/steps/step-01-analyze.md +0 -361
  175. package/agents-config/skills/workflow-apex-free/steps/step-02-plan.md +0 -264
  176. package/agents-config/skills/workflow-apex-free/steps/step-03-execute.md +0 -239
  177. package/agents-config/skills/workflow-apex-free/steps/step-04-validate.md +0 -251
  178. package/agents-config/skills/workflow-apex-free/templates/00-context.md +0 -43
  179. package/agents-config/skills/workflow-apex-free/templates/01-analyze.md +0 -10
  180. package/agents-config/skills/workflow-apex-free/templates/02-plan.md +0 -10
  181. package/agents-config/skills/workflow-apex-free/templates/03-execute.md +0 -10
  182. package/agents-config/skills/workflow-apex-free/templates/04-validate.md +0 -10
  183. package/agents-config/skills/workflow-apex-free/templates/README.md +0 -176
  184. package/agents-config/skills/workflow-apex-free/templates/step-complete.md +0 -7
@@ -0,0 +1,309 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { renderStatusline, type StatuslineData } from "../src/index";
3
+ import { defaultConfig, type StatuslineConfig } from "../src/lib/config";
4
+
5
+ function createMockData(
6
+ overrides: Partial<StatuslineData> = {},
7
+ ): StatuslineData {
8
+ return {
9
+ branch: "main",
10
+ dirPath: "~/project",
11
+ modelName: "Sonnet 4.5",
12
+ sessionCost: "0.5",
13
+ sessionDuration: "10m",
14
+ contextTokens: 50000,
15
+ contextPercentage: 25,
16
+ usageLimits: {
17
+ five_hour: { utilization: 30, resets_at: "2025-01-01T15:00:00Z" },
18
+ seven_day: { utilization: 10, resets_at: "2025-01-07T00:00:00Z" },
19
+ },
20
+ periodCost: 1.5,
21
+ todayCost: 2.0,
22
+ ...overrides,
23
+ };
24
+ }
25
+
26
+ function createConfig(
27
+ overrides: Partial<StatuslineConfig> = {},
28
+ ): StatuslineConfig {
29
+ return { ...defaultConfig, ...overrides };
30
+ }
31
+
32
+ describe("renderStatusline", () => {
33
+ describe("basic rendering", () => {
34
+ it("should render branch and directory", () => {
35
+ const data = createMockData();
36
+ const config = createConfig();
37
+ const output = renderStatusline(data, config);
38
+
39
+ expect(output).toContain("main");
40
+ expect(output).toContain("~/project");
41
+ });
42
+
43
+ it("should hide Sonnet model name when showSonnetModel is false", () => {
44
+ const data = createMockData({ modelName: "Sonnet 4.5" });
45
+ const config = createConfig({ showSonnetModel: false });
46
+ const output = renderStatusline(data, config);
47
+
48
+ expect(output).not.toContain("Sonnet");
49
+ });
50
+
51
+ it("should show Sonnet model name when showSonnetModel is true", () => {
52
+ const data = createMockData({ modelName: "Sonnet 4.5" });
53
+ const config = createConfig({ showSonnetModel: true });
54
+ const output = renderStatusline(data, config);
55
+
56
+ expect(output).toContain("Sonnet");
57
+ });
58
+
59
+ it("should always show non-Sonnet models", () => {
60
+ const data = createMockData({ modelName: "Opus 4.5" });
61
+ const config = createConfig({ showSonnetModel: false });
62
+ const output = renderStatusline(data, config);
63
+
64
+ expect(output).toContain("Opus");
65
+ });
66
+ });
67
+
68
+ describe("session info", () => {
69
+ it("should show cost when enabled", () => {
70
+ const data = createMockData({ sessionCost: "1.5" });
71
+ const config = createConfig({
72
+ session: {
73
+ ...defaultConfig.session,
74
+ cost: { enabled: true, format: "decimal1" },
75
+ },
76
+ });
77
+ const output = renderStatusline(data, config);
78
+
79
+ expect(output).toContain("$");
80
+ expect(output).toContain("1.5");
81
+ });
82
+
83
+ it("should hide cost when disabled", () => {
84
+ const data = createMockData({ sessionCost: "1.5" });
85
+ const config = createConfig({
86
+ session: {
87
+ ...defaultConfig.session,
88
+ cost: { enabled: false, format: "decimal1" },
89
+ },
90
+ });
91
+ const output = renderStatusline(data, config);
92
+
93
+ expect(output).toContain("S:");
94
+ });
95
+
96
+ it("should show duration when enabled", () => {
97
+ const data = createMockData({ sessionDuration: "15m" });
98
+ const config = createConfig({
99
+ session: {
100
+ ...defaultConfig.session,
101
+ duration: { enabled: true },
102
+ },
103
+ });
104
+ const output = renderStatusline(data, config);
105
+
106
+ expect(output).toContain("15m");
107
+ });
108
+
109
+ it("should show percentage when enabled", () => {
110
+ const data = createMockData({ contextPercentage: 45 });
111
+ const config = createConfig({
112
+ session: {
113
+ ...defaultConfig.session,
114
+ percentage: {
115
+ enabled: true,
116
+ showValue: true,
117
+ progressBar: {
118
+ ...defaultConfig.session.percentage.progressBar,
119
+ enabled: false,
120
+ },
121
+ },
122
+ },
123
+ });
124
+ const output = renderStatusline(data, config);
125
+
126
+ expect(output).toContain("45");
127
+ expect(output).toContain("%");
128
+ });
129
+ });
130
+
131
+ describe("limits section", () => {
132
+ it("should show limits when enabled", () => {
133
+ const data = createMockData({
134
+ usageLimits: {
135
+ five_hour: { utilization: 50, resets_at: "2025-01-01T15:00:00Z" },
136
+ seven_day: null,
137
+ },
138
+ });
139
+ const config = createConfig({
140
+ limits: {
141
+ ...defaultConfig.limits,
142
+ enabled: true,
143
+ percentage: {
144
+ enabled: true,
145
+ showValue: true,
146
+ progressBar: {
147
+ ...defaultConfig.limits.percentage.progressBar,
148
+ enabled: false,
149
+ },
150
+ },
151
+ },
152
+ });
153
+ const output = renderStatusline(data, config);
154
+
155
+ expect(output).toContain("L:");
156
+ expect(output).toContain("50");
157
+ });
158
+
159
+ it("should hide limits when disabled", () => {
160
+ const data = createMockData();
161
+ const config = createConfig({
162
+ limits: { ...defaultConfig.limits, enabled: false },
163
+ });
164
+ const output = renderStatusline(data, config);
165
+
166
+ expect(output).not.toContain("L:");
167
+ });
168
+
169
+ it("should show reset time when enabled", () => {
170
+ const futureTime = new Date(Date.now() + 3600000).toISOString();
171
+ const data = createMockData({
172
+ usageLimits: {
173
+ five_hour: { utilization: 50, resets_at: futureTime },
174
+ seven_day: null,
175
+ },
176
+ });
177
+ const config = createConfig({
178
+ limits: {
179
+ ...defaultConfig.limits,
180
+ enabled: true,
181
+ showTimeLeft: true,
182
+ },
183
+ });
184
+ const output = renderStatusline(data, config);
185
+
186
+ expect(output).toMatch(/\(\d+[hm]/);
187
+ });
188
+ });
189
+
190
+ describe("weekly usage", () => {
191
+ it("should show weekly when enabled=true", () => {
192
+ const data = createMockData({
193
+ usageLimits: {
194
+ five_hour: { utilization: 30, resets_at: null },
195
+ seven_day: { utilization: 20, resets_at: null },
196
+ },
197
+ });
198
+ const config = createConfig({
199
+ weeklyUsage: {
200
+ ...defaultConfig.weeklyUsage,
201
+ enabled: true,
202
+ percentage: {
203
+ enabled: true,
204
+ showValue: true,
205
+ progressBar: {
206
+ ...defaultConfig.weeklyUsage.percentage.progressBar,
207
+ enabled: false,
208
+ },
209
+ },
210
+ },
211
+ });
212
+ const output = renderStatusline(data, config);
213
+
214
+ expect(output).toContain("W:");
215
+ });
216
+
217
+ it("should show weekly when enabled=90% and five_hour >= 90", () => {
218
+ const data = createMockData({
219
+ usageLimits: {
220
+ five_hour: { utilization: 95, resets_at: null },
221
+ seven_day: { utilization: 20, resets_at: null },
222
+ },
223
+ });
224
+ const config = createConfig({
225
+ weeklyUsage: {
226
+ ...defaultConfig.weeklyUsage,
227
+ enabled: "90%",
228
+ percentage: {
229
+ enabled: true,
230
+ showValue: true,
231
+ progressBar: {
232
+ ...defaultConfig.weeklyUsage.percentage.progressBar,
233
+ enabled: false,
234
+ },
235
+ },
236
+ },
237
+ });
238
+ const output = renderStatusline(data, config);
239
+
240
+ expect(output).toContain("W:");
241
+ });
242
+
243
+ it("should hide weekly when enabled=90% and five_hour < 90", () => {
244
+ const data = createMockData({
245
+ usageLimits: {
246
+ five_hour: { utilization: 50, resets_at: null },
247
+ seven_day: { utilization: 20, resets_at: null },
248
+ },
249
+ });
250
+ const config = createConfig({
251
+ weeklyUsage: { ...defaultConfig.weeklyUsage, enabled: "90%" },
252
+ });
253
+ const output = renderStatusline(data, config);
254
+
255
+ expect(output).not.toContain("W:");
256
+ });
257
+ });
258
+
259
+ describe("daily spend", () => {
260
+ it("should show daily cost when enabled and > 0", () => {
261
+ const data = createMockData({ todayCost: 5.5 });
262
+ const config = createConfig({
263
+ dailySpend: { cost: { enabled: true, format: "decimal1" } },
264
+ });
265
+ const output = renderStatusline(data, config);
266
+
267
+ expect(output).toContain("D:");
268
+ expect(output).toContain("5.5");
269
+ });
270
+
271
+ it("should hide daily cost when todayCost is 0", () => {
272
+ const data = createMockData({ todayCost: 0 });
273
+ const config = createConfig({
274
+ dailySpend: { cost: { enabled: true, format: "decimal1" } },
275
+ });
276
+ const output = renderStatusline(data, config);
277
+
278
+ expect(output).not.toContain("D:");
279
+ });
280
+ });
281
+
282
+ describe("separators", () => {
283
+ it("should use configured separator", () => {
284
+ const data = createMockData();
285
+ const config = createConfig({ separator: "|" });
286
+ const output = renderStatusline(data, config);
287
+
288
+ expect(output).toContain("|");
289
+ });
290
+ });
291
+
292
+ describe("one line vs two lines", () => {
293
+ it("should render on one line when oneLine is true", () => {
294
+ const data = createMockData();
295
+ const config = createConfig({ oneLine: true });
296
+ const output = renderStatusline(data, config);
297
+
298
+ expect(output.split("\n").length).toBe(1);
299
+ });
300
+
301
+ it("should render on two lines when oneLine is false", () => {
302
+ const data = createMockData();
303
+ const config = createConfig({ oneLine: false });
304
+ const output = renderStatusline(data, config);
305
+
306
+ expect(output).toContain("\n");
307
+ });
308
+ });
309
+ });
@@ -0,0 +1,82 @@
1
+ {
2
+ "features": {
3
+ "usageLimits": false,
4
+ "spendTracking": false
5
+ },
6
+ "oneLine": true,
7
+ "showSonnetModel": false,
8
+ "pathDisplayMode": "truncated",
9
+ "git": {
10
+ "enabled": true,
11
+ "showBranch": true,
12
+ "showDirtyIndicator": true,
13
+ "showChanges": false,
14
+ "showStaged": true,
15
+ "showUnstaged": true
16
+ },
17
+ "separator": "•",
18
+ "session": {
19
+ "infoSeparator": null,
20
+ "cost": { "enabled": false, "format": "decimal1" },
21
+ "duration": { "enabled": true },
22
+ "tokens": { "enabled": true, "showMax": false, "showDecimals": false },
23
+ "percentage": {
24
+ "enabled": true,
25
+ "showValue": true,
26
+ "progressBar": {
27
+ "enabled": true,
28
+ "length": 10,
29
+ "style": "braille",
30
+ "color": "progressive",
31
+ "background": "none"
32
+ }
33
+ }
34
+ },
35
+ "context": {
36
+ "usePayloadContextWindow": true,
37
+ "maxContextTokens": 200000,
38
+ "autocompactBufferTokens": 45000,
39
+ "useUsableContextOnly": true,
40
+ "overheadTokens": 0
41
+ },
42
+ "limits": {
43
+ "enabled": false,
44
+ "showTimeLeft": false,
45
+ "showPacingDelta": false,
46
+ "cost": { "enabled": false, "format": "decimal1" },
47
+ "percentage": {
48
+ "enabled": true,
49
+ "showValue": true,
50
+ "progressBar": {
51
+ "enabled": true,
52
+ "length": 10,
53
+ "style": "braille",
54
+ "color": "progressive",
55
+ "background": "none"
56
+ }
57
+ }
58
+ },
59
+ "weeklyUsage": {
60
+ "enabled": false,
61
+ "showTimeLeft": false,
62
+ "showPacingDelta": false,
63
+ "cost": { "enabled": false, "format": "decimal1" },
64
+ "percentage": {
65
+ "enabled": true,
66
+ "showValue": true,
67
+ "progressBar": {
68
+ "enabled": true,
69
+ "length": 10,
70
+ "style": "braille",
71
+ "color": "progressive",
72
+ "background": "none"
73
+ }
74
+ }
75
+ },
76
+ "dailySpend": {
77
+ "cost": { "enabled": false, "format": "decimal1" }
78
+ },
79
+ "thinking": {
80
+ "showDisabledWarning": true
81
+ }
82
+ }
@@ -0,0 +1,4 @@
1
+ {"parentUuid":null,"isSidechain":false,"userType":"external","cwd":"/Users/melvynx/.claude/scripts/statusline","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:00:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_01","type":"message","role":"user","content":[{"type":"text","text":"Hello"}],"usage":{"input_tokens":1000,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":100}},"uuid":"uuid-1"}
2
+ {"parentUuid":"uuid-1","isSidechain":false,"userType":"external","cwd":"/Users/melvynx/.claude/scripts/statusline","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:05:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_02","type":"message","role":"assistant","content":[{"type":"text","text":"Hi there!"}],"usage":{"input_tokens":50000,"cache_creation_input_tokens":30000,"cache_read_input_tokens":0,"output_tokens":200}},"uuid":"uuid-2"}
3
+ {"parentUuid":"uuid-2","isSidechain":false,"userType":"external","cwd":"/Users/melvynx/.claude/scripts/statusline","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:10:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_03","type":"message","role":"user","content":[{"type":"text","text":"Can you help me?"}],"usage":{"input_tokens":20000,"cache_creation_input_tokens":0,"cache_read_input_tokens":40000,"output_tokens":150}},"uuid":"uuid-3"}
4
+ {"parentUuid":"uuid-3","isSidechain":false,"userType":"external","cwd":"/Users/melvynx/.claude/scripts/statusline","sessionId":"demo-session","version":"2.0.31","gitBranch":"main","timestamp":"2025-11-11T10:15:00.000Z","message":{"model":"claude-sonnet-4-5-20250929","id":"msg_04","type":"message","role":"assistant","content":[{"type":"text","text":"Of course! What do you need?"}],"usage":{"input_tokens":30000,"cache_creation_input_tokens":0,"cache_read_input_tokens":45000,"output_tokens":300}},"uuid":"uuid-4"}
@@ -0,0 +1,35 @@
1
+ {
2
+ "session_id": "06a7b019-03f8-4083-a9db-410d95cb01e6",
3
+ "transcript_path": "/Users/melvynx/.claude/scripts/statusline/fixtures/mock-transcript.jsonl",
4
+ "cwd": "/Users/melvynx/.claude",
5
+ "model": {
6
+ "id": "claude-sonnet-4-5-20250929",
7
+ "display_name": "Sonnet 4.5"
8
+ },
9
+ "workspace": {
10
+ "current_dir": "/Users/melvynx/.claude",
11
+ "project_dir": "/Users/melvynx/.claude"
12
+ },
13
+ "version": "2.0.68",
14
+ "output_style": {
15
+ "name": "default"
16
+ },
17
+ "cost": {
18
+ "total_cost_usd": 0.17468000000000003,
19
+ "total_duration_ms": 385160,
20
+ "total_api_duration_ms": 252694,
21
+ "total_lines_added": 185,
22
+ "total_lines_removed": 75
23
+ },
24
+ "context_window": {
25
+ "total_input_tokens": 136349,
26
+ "total_output_tokens": 21612,
27
+ "context_window_size": 200000,
28
+ "current_usage": {
29
+ "input_tokens": 62500,
30
+ "cache_creation_input_tokens": 0,
31
+ "cache_read_input_tokens": 0
32
+ }
33
+ },
34
+ "exceeds_200k_tokens": false
35
+ }