musubi-sdd 5.0.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 +164 -145
  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 +247 -125
  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 +83 -80
  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 +53 -44
  87. package/src/monitoring/incident-manager.js +123 -103
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +82 -59
  90. package/src/monitoring/quality-dashboard.js +51 -39
  91. package/src/monitoring/release-manager.js +70 -50
  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,6 +3,13 @@
3
3
  * @module monitoring/cost-tracker
4
4
  * @version 1.0.0
5
5
  * @description Tracks LLM API usage and costs across providers
6
+ *
7
+ * Part of MUSUBI v5.0.0 - Production Readiness
8
+ *
9
+ * @traceability
10
+ * - Requirement: REQ-P5-005 (Cost Tracking)
11
+ * - Design: docs/design/tdd-musubi-v5.0.0.md#3.5
12
+ * - Test: tests/monitoring/cost-tracker.test.js
6
13
  */
7
14
 
8
15
  'use strict';
@@ -17,38 +24,38 @@ const EventEmitter = require('events');
17
24
  */
18
25
  const DEFAULT_PRICING = {
19
26
  // OpenAI
20
- 'gpt-4o': { input: 2.50, output: 10.00 },
21
- 'gpt-4o-mini': { input: 0.15, output: 0.60 },
22
- 'gpt-4-turbo': { input: 10.00, output: 30.00 },
23
- 'gpt-4': { input: 30.00, output: 60.00 },
24
- 'gpt-3.5-turbo': { input: 0.50, output: 1.50 },
25
- 'o1': { input: 15.00, output: 60.00 },
26
- 'o1-mini': { input: 3.00, output: 12.00 },
27
- 'o3-mini': { input: 1.10, output: 4.40 },
28
-
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
+
29
36
  // Anthropic Claude
30
- 'claude-opus-4': { input: 15.00, output: 75.00 },
31
- 'claude-sonnet-4': { input: 3.00, output: 15.00 },
32
- 'claude-3.5-sonnet': { input: 3.00, output: 15.00 },
33
- 'claude-3.5-haiku': { input: 0.80, output: 4.00 },
34
- 'claude-3-opus': { input: 15.00, output: 75.00 },
35
- '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 },
36
43
  'claude-3-haiku': { input: 0.25, output: 1.25 },
37
-
44
+
38
45
  // Google Gemini
39
- 'gemini-2.0-flash': { input: 0.10, output: 0.40 },
40
- 'gemini-1.5-pro': { input: 1.25, output: 5.00 },
41
- 'gemini-1.5-flash': { input: 0.075, output: 0.30 },
42
-
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
+
43
50
  // GitHub Copilot (estimated based on value)
44
- 'github-copilot': { input: 0.00, output: 0.00 }, // Subscription-based
45
-
51
+ 'github-copilot': { input: 0.0, output: 0.0 }, // Subscription-based
52
+
46
53
  // Local models (free)
47
- 'ollama': { input: 0.00, output: 0.00 },
48
- 'llama3.2': { input: 0.00, output: 0.00 },
49
- 'codellama': { input: 0.00, output: 0.00 },
50
- 'mistral': { input: 0.00, output: 0.00 },
51
- '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 },
52
59
  };
53
60
 
54
61
  /**
@@ -83,11 +90,11 @@ class CostTracker extends EventEmitter {
83
90
  this.pricing = { ...DEFAULT_PRICING, ...options.pricing };
84
91
  this.budgetLimit = options.budgetLimit || 0;
85
92
  this.budgetPeriod = options.budgetPeriod || 'monthly';
86
-
93
+
87
94
  // In-memory session tracking
88
95
  this.sessionUsage = [];
89
96
  this.sessionStart = new Date();
90
-
97
+
91
98
  // Running totals for current period
92
99
  this.periodTotals = {
93
100
  inputTokens: 0,
@@ -235,9 +242,8 @@ class CostTracker extends EventEmitter {
235
242
  ...this.periodTotals,
236
243
  budgetLimit: this.budgetLimit,
237
244
  budgetRemaining: this.budgetLimit > 0 ? this.budgetLimit - this.periodTotals.cost : null,
238
- budgetUsedPercent: this.budgetLimit > 0
239
- ? (this.periodTotals.cost / this.budgetLimit) * 100
240
- : null,
245
+ budgetUsedPercent:
246
+ this.budgetLimit > 0 ? (this.periodTotals.cost / this.budgetLimit) * 100 : null,
241
247
  };
242
248
  }
243
249
 
@@ -268,9 +274,7 @@ class CostTracker extends EventEmitter {
268
274
  generateReport(options = {}) {
269
275
  const { period = 'session', format = 'text' } = options;
270
276
 
271
- const summary = period === 'session'
272
- ? this.getSessionSummary()
273
- : this.getPeriodSummary();
277
+ const summary = period === 'session' ? this.getSessionSummary() : this.getPeriodSummary();
274
278
 
275
279
  if (format === 'json') {
276
280
  return JSON.stringify(summary, null, 2);
@@ -297,7 +301,9 @@ class CostTracker extends EventEmitter {
297
301
  lines.push('── By Provider ──────────────────────────────');
298
302
  for (const [provider, stats] of Object.entries(summary.byProvider)) {
299
303
  lines.push(` ${provider}:`);
300
- 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
+ );
301
307
  }
302
308
  lines.push('');
303
309
  }
@@ -306,7 +312,9 @@ class CostTracker extends EventEmitter {
306
312
  lines.push('── By Model ─────────────────────────────────');
307
313
  for (const [model, stats] of Object.entries(summary.byModel)) {
308
314
  lines.push(` ${model}:`);
309
- 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
+ );
310
318
  }
311
319
  }
312
320
  } else {
@@ -315,7 +323,7 @@ class CostTracker extends EventEmitter {
315
323
  lines.push(`Input Tokens: ${summary.inputTokens.toLocaleString()}`);
316
324
  lines.push(`Output Tokens: ${summary.outputTokens.toLocaleString()}`);
317
325
  lines.push(`Total Cost: $${summary.cost.toFixed(4)}`);
318
-
326
+
319
327
  if (summary.budgetLimit) {
320
328
  lines.push('');
321
329
  lines.push('── Budget ───────────────────────────────────');
@@ -393,11 +401,11 @@ class CostTracker extends EventEmitter {
393
401
  */
394
402
  async _loadPeriodTotals() {
395
403
  const periodFile = path.join(this.storageDir, `period-${this.budgetPeriod}.json`);
396
-
404
+
397
405
  try {
398
406
  if (await fs.pathExists(periodFile)) {
399
407
  const data = await fs.readJSON(periodFile);
400
-
408
+
401
409
  // Check if period is still current
402
410
  const periodStart = new Date(data.periodStart);
403
411
  if (this._isCurrentPeriod(periodStart)) {
@@ -415,7 +423,7 @@ class CostTracker extends EventEmitter {
415
423
  */
416
424
  async _savePeriodTotals() {
417
425
  const periodFile = path.join(this.storageDir, `period-${this.budgetPeriod}.json`);
418
-
426
+
419
427
  const data = {
420
428
  periodStart: this._getPeriodStart().toISOString(),
421
429
  period: this.budgetPeriod,
@@ -430,7 +438,7 @@ class CostTracker extends EventEmitter {
430
438
  * @private
431
439
  */
432
440
  _isCurrentPeriod(date) {
433
- const now = new Date();
441
+ const _now = new Date();
434
442
  const periodStart = this._getPeriodStart();
435
443
  return date >= periodStart;
436
444
  }
@@ -441,13 +449,14 @@ class CostTracker extends EventEmitter {
441
449
  */
442
450
  _getPeriodStart() {
443
451
  const now = new Date();
444
-
452
+
445
453
  switch (this.budgetPeriod) {
446
454
  case 'daily':
447
455
  return new Date(now.getFullYear(), now.getMonth(), now.getDate());
448
- case 'weekly':
456
+ case 'weekly': {
449
457
  const day = now.getDay();
450
458
  return new Date(now.getFullYear(), now.getMonth(), now.getDate() - day);
459
+ }
451
460
  case 'monthly':
452
461
  default:
453
462
  return new Date(now.getFullYear(), now.getMonth(), 1);