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.
- package/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- 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.
|
|
28
|
-
'gpt-4o-mini': { input: 0.15, output: 0.
|
|
29
|
-
'gpt-4-turbo': { input: 10.
|
|
30
|
-
'gpt-4': { input: 30.
|
|
31
|
-
'gpt-3.5-turbo': { input: 0.
|
|
32
|
-
|
|
33
|
-
'o1-mini': { input: 3.
|
|
34
|
-
'o3-mini': { input: 1.
|
|
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.
|
|
38
|
-
'claude-sonnet-4': { input: 3.
|
|
39
|
-
'claude-3.5-sonnet': { input: 3.
|
|
40
|
-
'claude-3.5-haiku': { input: 0.
|
|
41
|
-
'claude-3-opus': { input: 15.
|
|
42
|
-
'claude-3-sonnet': { input: 3.
|
|
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.
|
|
47
|
-
'gemini-1.5-pro': { input: 1.25, output: 5.
|
|
48
|
-
'gemini-1.5-flash': { input: 0.075, output: 0.
|
|
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.
|
|
52
|
-
|
|
51
|
+
'github-copilot': { input: 0.0, output: 0.0 }, // Subscription-based
|
|
52
|
+
|
|
53
53
|
// Local models (free)
|
|
54
|
-
|
|
55
|
-
'llama3.2': { input: 0.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
'qwen2.5': { input: 0.
|
|
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:
|
|
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(
|
|
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(
|
|
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
|
|
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);
|