Files
ewoooc/.claude/hooks/cost-tracker.js
ogt cac7303e46 feat(devteam): 引進 my-claude-devteam 架構 V11.0
- CLAUDE.md 升版至 V11.0:整合 P7/P9/P10 工作模式、12 人專家團隊、
  委派鐵律、三條紅線(保留狙擊手模式精神)
- .claude/hooks/:新增 8 個 Hook(momo-prod-guard / commit-quality /
  large-file-warner / mcp-health / audit-log / suggest-compact /
  cost-tracker / session-summary)
- .claude/agents/:新增 11 個 Agent 定義(critic / debugger / db-expert /
  vuln-verifier / fullstack-engineer / planner / refactor-specialist /
  migration-engineer / onboarder / tool-expert / web-researcher)
- .claude/settings.json:啟用 bypassPermissions + Hook 自動政策架構
- .gitignore:加入 settings.local.json 防止 Secret 意外 commit

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 22:13:57 +08:00

37 lines
1.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* cost-tracker.js — Stop Hook
* 追蹤 Token 用量與估算成本。定價已更新為 Claude 4.x。
*/
const fs = require('fs');
const os = require('os');
const path = require('path');
let d = '';
process.stdin.on('data', c => d += c);
process.stdin.on('end', () => {
try {
const i = JSON.parse(d);
const inputTokens = i.usage?.input_tokens || i.input_tokens || 0;
const outputTokens = i.usage?.output_tokens || i.output_tokens || 0;
const model = i.model || 'unknown';
// 定價 [input per M USD, output per M USD]2025 官方定價)
const pricing = {
'claude-haiku-4-5': [0.8, 4],
'claude-sonnet-4-6': [3, 15],
'claude-opus-4-7': [15, 75],
'claude-3-haiku': [0.8, 4],
'claude-3-sonnet': [3, 15],
'claude-3-opus': [15, 75],
};
const matchedKey = Object.keys(pricing).find(k => model.includes(k)) || null;
const [inputRate, outputRate] = matchedKey ? pricing[matchedKey] : [3, 15];
const cost = (inputTokens * inputRate + outputTokens * outputRate) / 1_000_000;
const metricsDir = path.join(os.homedir(), '.claude', 'metrics');
if (!fs.existsSync(metricsDir)) fs.mkdirSync(metricsDir, { recursive: true });
fs.appendFileSync(
path.join(metricsDir, 'costs.jsonl'),
JSON.stringify({ timestamp: new Date().toISOString(), model, input_tokens: inputTokens, output_tokens: outputTokens, cost_usd: cost.toFixed(6) }) + '\n'
);
} catch (e) {}
process.stdout.write(d);
});