musubi-sdd 5.1.0 → 5.6.1

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 (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -3,9 +3,9 @@
3
3
  * @module monitoring/cost-tracker
4
4
  * @version 1.0.0
5
5
  * @description Tracks LLM API usage and costs across providers
6
- *
6
+ *
7
7
  * Part of MUSUBI v5.0.0 - Production Readiness
8
- *
8
+ *
9
9
  * @traceability
10
10
  * - Requirement: REQ-P5-005 (Cost Tracking)
11
11
  * - Design: docs/design/tdd-musubi-v5.0.0.md#3.5
@@ -24,38 +24,38 @@ const EventEmitter = require('events');
24
24
  */
25
25
  const DEFAULT_PRICING = {
26
26
  // OpenAI
27
- 'gpt-4o': { input: 2.50, output: 10.00 },
28
- 'gpt-4o-mini': { input: 0.15, output: 0.60 },
29
- 'gpt-4-turbo': { input: 10.00, output: 30.00 },
30
- 'gpt-4': { input: 30.00, output: 60.00 },
31
- 'gpt-3.5-turbo': { input: 0.50, output: 1.50 },
32
- 'o1': { input: 15.00, output: 60.00 },
33
- 'o1-mini': { input: 3.00, output: 12.00 },
34
- 'o3-mini': { input: 1.10, output: 4.40 },
35
-
27
+ 'gpt-4o': { input: 2.5, output: 10.0 },
28
+ 'gpt-4o-mini': { input: 0.15, output: 0.6 },
29
+ 'gpt-4-turbo': { input: 10.0, output: 30.0 },
30
+ 'gpt-4': { input: 30.0, output: 60.0 },
31
+ 'gpt-3.5-turbo': { input: 0.5, output: 1.5 },
32
+ o1: { input: 15.0, output: 60.0 },
33
+ 'o1-mini': { input: 3.0, output: 12.0 },
34
+ 'o3-mini': { input: 1.1, output: 4.4 },
35
+
36
36
  // Anthropic Claude
37
- 'claude-opus-4': { input: 15.00, output: 75.00 },
38
- 'claude-sonnet-4': { input: 3.00, output: 15.00 },
39
- 'claude-3.5-sonnet': { input: 3.00, output: 15.00 },
40
- 'claude-3.5-haiku': { input: 0.80, output: 4.00 },
41
- 'claude-3-opus': { input: 15.00, output: 75.00 },
42
- 'claude-3-sonnet': { input: 3.00, output: 15.00 },
37
+ 'claude-opus-4': { input: 15.0, output: 75.0 },
38
+ 'claude-sonnet-4': { input: 3.0, output: 15.0 },
39
+ 'claude-3.5-sonnet': { input: 3.0, output: 15.0 },
40
+ 'claude-3.5-haiku': { input: 0.8, output: 4.0 },
41
+ 'claude-3-opus': { input: 15.0, output: 75.0 },
42
+ 'claude-3-sonnet': { input: 3.0, output: 15.0 },
43
43
  'claude-3-haiku': { input: 0.25, output: 1.25 },
44
-
44
+
45
45
  // Google Gemini
46
- 'gemini-2.0-flash': { input: 0.10, output: 0.40 },
47
- 'gemini-1.5-pro': { input: 1.25, output: 5.00 },
48
- 'gemini-1.5-flash': { input: 0.075, output: 0.30 },
49
-
46
+ 'gemini-2.0-flash': { input: 0.1, output: 0.4 },
47
+ 'gemini-1.5-pro': { input: 1.25, output: 5.0 },
48
+ 'gemini-1.5-flash': { input: 0.075, output: 0.3 },
49
+
50
50
  // GitHub Copilot (estimated based on value)
51
- 'github-copilot': { input: 0.00, output: 0.00 }, // Subscription-based
52
-
51
+ 'github-copilot': { input: 0.0, output: 0.0 }, // Subscription-based
52
+
53
53
  // Local models (free)
54
- 'ollama': { input: 0.00, output: 0.00 },
55
- 'llama3.2': { input: 0.00, output: 0.00 },
56
- 'codellama': { input: 0.00, output: 0.00 },
57
- 'mistral': { input: 0.00, output: 0.00 },
58
- 'qwen2.5': { input: 0.00, output: 0.00 },
54
+ ollama: { input: 0.0, output: 0.0 },
55
+ 'llama3.2': { input: 0.0, output: 0.0 },
56
+ codellama: { input: 0.0, output: 0.0 },
57
+ mistral: { input: 0.0, output: 0.0 },
58
+ 'qwen2.5': { input: 0.0, output: 0.0 },
59
59
  };
60
60
 
61
61
  /**
@@ -90,11 +90,11 @@ class CostTracker extends EventEmitter {
90
90
  this.pricing = { ...DEFAULT_PRICING, ...options.pricing };
91
91
  this.budgetLimit = options.budgetLimit || 0;
92
92
  this.budgetPeriod = options.budgetPeriod || 'monthly';
93
-
93
+
94
94
  // In-memory session tracking
95
95
  this.sessionUsage = [];
96
96
  this.sessionStart = new Date();
97
-
97
+
98
98
  // Running totals for current period
99
99
  this.periodTotals = {
100
100
  inputTokens: 0,
@@ -242,9 +242,8 @@ class CostTracker extends EventEmitter {
242
242
  ...this.periodTotals,
243
243
  budgetLimit: this.budgetLimit,
244
244
  budgetRemaining: this.budgetLimit > 0 ? this.budgetLimit - this.periodTotals.cost : null,
245
- budgetUsedPercent: this.budgetLimit > 0
246
- ? (this.periodTotals.cost / this.budgetLimit) * 100
247
- : null,
245
+ budgetUsedPercent:
246
+ this.budgetLimit > 0 ? (this.periodTotals.cost / this.budgetLimit) * 100 : null,
248
247
  };
249
248
  }
250
249
 
@@ -275,9 +274,7 @@ class CostTracker extends EventEmitter {
275
274
  generateReport(options = {}) {
276
275
  const { period = 'session', format = 'text' } = options;
277
276
 
278
- const summary = period === 'session'
279
- ? this.getSessionSummary()
280
- : this.getPeriodSummary();
277
+ const summary = period === 'session' ? this.getSessionSummary() : this.getPeriodSummary();
281
278
 
282
279
  if (format === 'json') {
283
280
  return JSON.stringify(summary, null, 2);
@@ -304,7 +301,9 @@ class CostTracker extends EventEmitter {
304
301
  lines.push('── By Provider ──────────────────────────────');
305
302
  for (const [provider, stats] of Object.entries(summary.byProvider)) {
306
303
  lines.push(` ${provider}:`);
307
- lines.push(` Requests: ${stats.requests}, Tokens: ${stats.tokens.toLocaleString()}, Cost: $${stats.cost.toFixed(4)}`);
304
+ lines.push(
305
+ ` Requests: ${stats.requests}, Tokens: ${stats.tokens.toLocaleString()}, Cost: $${stats.cost.toFixed(4)}`
306
+ );
308
307
  }
309
308
  lines.push('');
310
309
  }
@@ -313,7 +312,9 @@ class CostTracker extends EventEmitter {
313
312
  lines.push('── By Model ─────────────────────────────────');
314
313
  for (const [model, stats] of Object.entries(summary.byModel)) {
315
314
  lines.push(` ${model}:`);
316
- lines.push(` Requests: ${stats.requests}, Tokens: ${stats.tokens.toLocaleString()}, Cost: $${stats.cost.toFixed(4)}`);
315
+ lines.push(
316
+ ` Requests: ${stats.requests}, Tokens: ${stats.tokens.toLocaleString()}, Cost: $${stats.cost.toFixed(4)}`
317
+ );
317
318
  }
318
319
  }
319
320
  } else {
@@ -322,7 +323,7 @@ class CostTracker extends EventEmitter {
322
323
  lines.push(`Input Tokens: ${summary.inputTokens.toLocaleString()}`);
323
324
  lines.push(`Output Tokens: ${summary.outputTokens.toLocaleString()}`);
324
325
  lines.push(`Total Cost: $${summary.cost.toFixed(4)}`);
325
-
326
+
326
327
  if (summary.budgetLimit) {
327
328
  lines.push('');
328
329
  lines.push('── Budget ───────────────────────────────────');
@@ -400,11 +401,11 @@ class CostTracker extends EventEmitter {
400
401
  */
401
402
  async _loadPeriodTotals() {
402
403
  const periodFile = path.join(this.storageDir, `period-${this.budgetPeriod}.json`);
403
-
404
+
404
405
  try {
405
406
  if (await fs.pathExists(periodFile)) {
406
407
  const data = await fs.readJSON(periodFile);
407
-
408
+
408
409
  // Check if period is still current
409
410
  const periodStart = new Date(data.periodStart);
410
411
  if (this._isCurrentPeriod(periodStart)) {
@@ -422,7 +423,7 @@ class CostTracker extends EventEmitter {
422
423
  */
423
424
  async _savePeriodTotals() {
424
425
  const periodFile = path.join(this.storageDir, `period-${this.budgetPeriod}.json`);
425
-
426
+
426
427
  const data = {
427
428
  periodStart: this._getPeriodStart().toISOString(),
428
429
  period: this.budgetPeriod,
@@ -437,7 +438,7 @@ class CostTracker extends EventEmitter {
437
438
  * @private
438
439
  */
439
440
  _isCurrentPeriod(date) {
440
- const now = new Date();
441
+ const _now = new Date();
441
442
  const periodStart = this._getPeriodStart();
442
443
  return date >= periodStart;
443
444
  }
@@ -448,13 +449,14 @@ class CostTracker extends EventEmitter {
448
449
  */
449
450
  _getPeriodStart() {
450
451
  const now = new Date();
451
-
452
+
452
453
  switch (this.budgetPeriod) {
453
454
  case 'daily':
454
455
  return new Date(now.getFullYear(), now.getMonth(), now.getDate());
455
- case 'weekly':
456
+ case 'weekly': {
456
457
  const day = now.getDay();
457
458
  return new Date(now.getFullYear(), now.getMonth(), now.getDate() - day);
459
+ }
458
460
  case 'monthly':
459
461
  default:
460
462
  return new Date(now.getFullYear(), now.getMonth(), 1);