@prism-d1/cli 1.0.58 → 1.0.59

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.
@@ -1,20 +1,19 @@
1
1
  #!/usr/bin/env bash
2
- # prepare-commit-msg — Detect AI-generated commits and add origin trailers.
2
+ # prepare-commit-msg — add AI-origin trailers to commit messages.
3
3
  #
4
- # This hook detects if the commit was made via Claude Code, Kiro, or other AI tools
5
- # and adds AI-Origin, AI-Model, AI-Token, and Spec-Ref trailers to the commit message.
6
- # Token tracking powered by codeburn (npm install -g codeburn).
4
+ # All detection, token accounting, and cost math now live in
5
+ # `prism-cli git commit-trailers` (Node). This keeps the hook fully portable
6
+ # (Linux/macOS/Windows Git Bash) with NO dependency on jq, bc, sed, or grep -P.
7
+ # Token tracking powered by codeburn / prism-cli.
7
8
  #
8
- # Installation: metric-hooks/install.sh
9
+ # Installation: prism-cli bootstrapper install-git-hooks
9
10
 
10
11
  set -uo pipefail
11
12
 
12
13
  COMMIT_MSG_FILE="$1"
13
14
  COMMIT_SOURCE="${2:-}"
14
- REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo ".")
15
- SHA="${3:-}"
16
15
 
17
- # Skip for merge commits, amend, and squash
16
+ # Skip merge and squash commits
18
17
  if [[ "${COMMIT_SOURCE}" == "merge" || "${COMMIT_SOURCE}" == "squash" ]]; then
19
18
  exit 0
20
19
  fi
@@ -24,161 +23,16 @@ if grep -q '^AI-Origin:' "${COMMIT_MSG_FILE}" 2>/dev/null; then
24
23
  exit 0
25
24
  fi
26
25
 
27
- # ---------------------------------------------------------------------------
28
- # Detect AI tool involvement
29
- # ---------------------------------------------------------------------------
30
- AI_ORIGIN="human"
31
- AI_MODEL=""
32
- AI_TOOL=""
33
-
34
- # Check for Claude Code session
35
- # Claude Code sets CLAUDE_CODE environment variable or leaves markers
36
- if [[ -n "${CLAUDE_CODE:-}" || -n "${CLAUDE_CODE_SESSION_ID:-}" ]]; then
37
- AI_ORIGIN="ai-generated"
38
- AI_TOOL="claude-code"
39
- AI_MODEL="${ANTHROPIC_MODEL:-us.anthropic.claude-sonnet-4-5-20250929-v1:0}"
40
- fi
41
-
42
- # Check for Kiro markers
43
- # Kiro CLI sets KIRO_SESSION_ID; Kiro IDE sets TERM_PROGRAM=kiro
44
- # Kiro Source Control panel sets VSCODE_GIT_ASKPASS_NODE with "kiro" in path
45
- if [[ -n "${KIRO_SESSION_ID:-}" || -n "${KIRO_SESSION:-}" || "${TERM_PROGRAM:-}" == "kiro" || "${VSCODE_GIT_ASKPASS_NODE:-}" == *"kiro"* || "${GIT_ASKPASS:-}" == *"kiro"* ]]; then
46
- AI_ORIGIN="ai-generated"
47
- AI_TOOL="kiro"
48
- fi
49
-
50
- # Check for Amazon Q Developer
51
- if [[ -n "${Q_DEVELOPER_SESSION:-}" ]]; then
52
- AI_ORIGIN="ai-generated"
53
- AI_TOOL="q-developer"
54
- fi
55
-
56
- # ---------------------------------------------------------------------------
57
- # Detect spec references
58
- # ---------------------------------------------------------------------------
59
- SPEC_REF=""
60
-
61
- # Check if any staged file is a spec
62
- STAGED_SPECS=$(git diff --cached --name-only 2>/dev/null | grep -E '(specs/|\.kiro/specs/)' | head -1 || true)
63
- if [[ -n "${STAGED_SPECS}" ]]; then
64
- SPEC_REF="${STAGED_SPECS}"
65
- fi
66
-
67
- # Check for spec reference in commit message
68
- MSG_SPEC=$(grep -oP '(?<=Spec-Ref: ).*' "${COMMIT_MSG_FILE}" 2>/dev/null | head -1 || true)
69
- if [[ -n "${MSG_SPEC}" ]]; then
70
- SPEC_REF="${MSG_SPEC}"
71
- fi
72
-
73
- # ---------------------------------------------------------------------------
74
- # Track AI token usage via codeburn (per-project snapshot delta)
75
- # ---------------------------------------------------------------------------
76
- AI_INPUT_TOKENS=""
77
- AI_OUTPUT_TOKENS=""
78
- AI_COST=""
79
-
80
- if [[ -n "${AI_TOOL}" ]] && (command -v codeburn &>/dev/null || command -v prism-cli &>/dev/null); then
81
- PROJECT_FILTER=$(echo "$REPO_ROOT" | sed 's|^/||; s|/|-|g')
82
- PROJECT_BASENAME=$(basename "$REPO_ROOT")
83
- TRACKER_DIR="${HOME}/.prism/tokentracker"
84
- TRACKER_FILE="${TRACKER_DIR}/${PROJECT_BASENAME}.json"
85
-
86
- # Kiro: CLI (KIRO_SESSION_ID) uses kiro-cli, IDE uses kiro-ide
87
- # Everything else: use codeburn
88
- CODEBURN_JSON=""
89
- if [[ "${AI_TOOL}" == "kiro" ]] && command -v prism-cli &>/dev/null; then
90
- if [[ -n "${KIRO_SESSION_ID:-}" ]]; then
91
- CODEBURN_JSON=$(prism-cli parse-code-tool kiro-cli --session-id "${KIRO_SESSION_ID}" --project "${PROJECT_BASENAME}" --format json 2>/dev/null || echo "")
92
- fi
93
- # Fall back to kiro-ide (covers IDE env vars and CLI sessions without KIRO_SESSION_ID)
94
- if [[ -z "${CODEBURN_JSON}" || "$(echo "${CODEBURN_JSON}" | jq -r '.overview.calls // 0')" == "0" ]]; then
95
- CODEBURN_JSON=$(prism-cli parse-code-tool kiro-ide --project "${PROJECT_BASENAME}" --format json 2>/dev/null || echo "")
96
- fi
97
- elif command -v codeburn &>/dev/null; then
98
- CODEBURN_JSON=$(codeburn report -p all --project "${PROJECT_FILTER}" --format json 2>/dev/null || echo "")
99
- if [[ -z "${CODEBURN_JSON}" || "$(echo "${CODEBURN_JSON}" | jq -r '.overview.calls // 0')" == "0" ]]; then
100
- CODEBURN_JSON=$(codeburn report -p all --project "${PROJECT_BASENAME}" --format json 2>/dev/null || echo "")
101
- fi
102
- else
103
- CODEBURN_JSON=""
104
- fi
105
-
106
- if [[ -n "${CODEBURN_JSON}" ]]; then
107
- CURRENT_INPUT=$(echo "${CODEBURN_JSON}" | jq -r '[.models[]?.inputTokens // 0] | add // 0' 2>/dev/null || echo "0")
108
- CURRENT_OUTPUT=$(echo "${CODEBURN_JSON}" | jq -r '[.models[]?.outputTokens // 0] | add // 0' 2>/dev/null || echo "0")
109
- CURRENT_COST=$(echo "${CODEBURN_JSON}" | jq -r '.overview.cost // 0' 2>/dev/null || echo "0")
110
-
111
- if [[ -f "${TRACKER_FILE}" ]]; then
112
- PREV_INPUT=$(jq -r '.inputTokens // 0' "${TRACKER_FILE}" 2>/dev/null || echo "0")
113
- PREV_OUTPUT=$(jq -r '.outputTokens // 0' "${TRACKER_FILE}" 2>/dev/null || echo "0")
114
- PREV_COST=$(jq -r '.cost // 0' "${TRACKER_FILE}" 2>/dev/null || echo "0")
115
- AI_INPUT_TOKENS=$(( CURRENT_INPUT - PREV_INPUT ))
116
- AI_OUTPUT_TOKENS=$(( CURRENT_OUTPUT - PREV_OUTPUT ))
117
- AI_COST=$(echo "${CURRENT_COST} - ${PREV_COST}" | bc 2>/dev/null || echo "0")
118
- [[ "${AI_INPUT_TOKENS}" -lt 0 ]] && AI_INPUT_TOKENS=0
119
- [[ "${AI_OUTPUT_TOKENS}" -lt 0 ]] && AI_OUTPUT_TOKENS=0
120
- AI_COST_NEGATIVE=$(echo "${AI_COST} < 0" | bc 2>/dev/null || echo "0")
121
- [[ "${AI_COST_NEGATIVE}" == "1" ]] && AI_COST="0"
122
- else
123
- AI_INPUT_TOKENS=0; AI_OUTPUT_TOKENS=0; AI_COST="0"
124
- fi
125
-
126
- mkdir -p "${TRACKER_DIR}"
127
- printf '{"inputTokens":%s,"outputTokens":%s,"cost":%s}\n' \
128
- "$CURRENT_INPUT" "$CURRENT_OUTPUT" "$CURRENT_COST" > "${TRACKER_FILE}"
129
- fi
130
- fi
131
-
132
- # ---------------------------------------------------------------------------
133
- # Load configurable bounds from .prism/config.json
134
- # ---------------------------------------------------------------------------
135
- REPO_CONFIG="${REPO_ROOT}/.prism/config.json"
136
- MAX_TOKENS=1000000
137
- MAX_COST=100
138
- if [[ -f "${REPO_CONFIG}" ]] && command -v jq &>/dev/null; then
139
- MAX_TOKENS=$(jq -r '.max_tokens // 1000000' "${REPO_CONFIG}" 2>/dev/null || echo "1000000")
140
- MAX_COST=$(jq -r '.max_cost // 100' "${REPO_CONFIG}" 2>/dev/null || echo "100")
141
- fi
142
-
143
- # ---------------------------------------------------------------------------
144
- # Append trailers to commit message
145
- # ---------------------------------------------------------------------------
146
-
147
- # Ensure there is a blank line before trailers
148
- if [[ -s "${COMMIT_MSG_FILE}" ]]; then
149
- LAST_LINE=$(tail -1 "${COMMIT_MSG_FILE}")
150
- if [[ -n "${LAST_LINE}" ]]; then
151
- echo "" >> "${COMMIT_MSG_FILE}"
152
- fi
153
- fi
154
-
155
- echo "AI-Origin: ${AI_ORIGIN}" >> "${COMMIT_MSG_FILE}"
156
-
157
- if [[ -n "${AI_TOOL}" ]]; then
158
- echo "AI-Tool: ${AI_TOOL}" >> "${COMMIT_MSG_FILE}"
159
- fi
160
-
161
- if [[ -n "${AI_MODEL}" ]]; then
162
- echo "AI-Model: ${AI_MODEL}" >> "${COMMIT_MSG_FILE}"
163
- fi
164
-
165
- if [[ -n "${AI_INPUT_TOKENS}" ]]; then
166
- [[ ${AI_INPUT_TOKENS} -gt ${MAX_TOKENS} ]] && AI_INPUT_TOKENS=${MAX_TOKENS}
167
- echo "AI-Input-Tokens: ${AI_INPUT_TOKENS}" >> "${COMMIT_MSG_FILE}"
168
- fi
169
-
170
- if [[ -n "${AI_OUTPUT_TOKENS}" ]]; then
171
- [[ ${AI_OUTPUT_TOKENS} -gt ${MAX_TOKENS} ]] && AI_OUTPUT_TOKENS=${MAX_TOKENS}
172
- echo "AI-Output-Tokens: ${AI_OUTPUT_TOKENS}" >> "${COMMIT_MSG_FILE}"
173
- fi
174
-
175
- if [[ -n "${AI_COST}" ]]; then
176
- (( $(echo "${AI_COST} > ${MAX_COST}" | bc -l 2>/dev/null) )) && AI_COST="${MAX_COST}.00"
177
- echo "AI-Cost: \$${AI_COST}" >> "${COMMIT_MSG_FILE}"
26
+ # prism-cli is required. If it isn't installed, the commit proceeds without
27
+ # trailers rather than failing.
28
+ if ! command -v prism-cli >/dev/null 2>&1; then
29
+ exit 0
178
30
  fi
179
31
 
180
- if [[ -n "${SPEC_REF}" ]]; then
181
- echo "Spec-Ref: ${SPEC_REF}" >> "${COMMIT_MSG_FILE}"
182
- fi
32
+ # Delegate everything to prism-cli. It appends the trailers to the commit
33
+ # message file directly. Never block the commit on failure.
34
+ prism-cli git commit-trailers \
35
+ --commit-msg-file "${COMMIT_MSG_FILE}" \
36
+ --source "${COMMIT_SOURCE}" >/dev/null 2>&1 || true
183
37
 
184
38
  exit 0
@@ -130,27 +130,12 @@ export default {
130
130
  installClaudeSessionHook();
131
131
  },
132
132
  };
133
- const CLAUDE_SESSION_HOOK_SCRIPT = `#!/usr/bin/env bash
134
- INPUT=$(cat)
135
- SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty')
136
- jq -n --arg ctx "CLAUDE_CODE_SESSION_ID=$SESSION_ID" \\
137
- '{ hookSpecificOutput: { hookEventName: "SessionStart", additionalContext: $ctx } }'
138
- if [ -n "$CLAUDE_ENV_FILE" ] && ! grep -q "CLAUDE_CODE_SESSION_ID" "$CLAUDE_ENV_FILE" 2>/dev/null; then
139
- echo "export CLAUDE_CODE_SESSION_ID=\\"$SESSION_ID\\"" > "$CLAUDE_ENV_FILE"
140
- fi
141
- `;
133
+ const CLAUDE_HOOK_COMMAND = 'prism-cli git claude-session-context';
142
134
  function installClaudeSessionHook() {
143
135
  const home = homedir();
144
- const binDir = resolve(home, '.local/bin');
145
- const hookScriptPath = resolve(binDir, 'claude-session-id-hook');
146
- mkdirSync(binDir, { recursive: true });
147
- writeFileSync(hookScriptPath, CLAUDE_SESSION_HOOK_SCRIPT, { mode: 0o755 });
148
- const pathDirs = (process.env.PATH || '').split(':');
149
- if (!pathDirs.includes(binDir)) {
150
- console.log(`\n ⚠️ ${binDir} is not in your PATH.`);
151
- console.log(` Add to your shell profile: export PATH="$HOME/.local/bin:$PATH"\n`);
152
- }
153
- // Register in ~/.claude/settings.json
136
+ // Register the SessionStart hook in ~/.claude/settings.json.
137
+ // The hook is served by `prism-cli git claude-session-context` (Node, no jq),
138
+ // so there's no standalone script in ~/.local/bin and no PATH requirement.
154
139
  const claudeDir = resolve(home, '.claude');
155
140
  const settingsPath = resolve(claudeDir, 'settings.json');
156
141
  mkdirSync(claudeDir, { recursive: true });
@@ -163,14 +148,13 @@ function installClaudeSessionHook() {
163
148
  }
164
149
  if (!settings.hooks)
165
150
  settings.hooks = {};
166
- const hook = { matcher: '', hooks: [{ type: 'command', command: 'claude-session-id-hook', timeout: 5000 }] };
167
- if (!settings.hooks.SessionStart) {
168
- settings.hooks.SessionStart = [hook];
169
- }
170
- else if (!settings.hooks.SessionStart.some((e) => e.hooks?.some((h) => h.command === 'claude-session-id-hook'))) {
171
- settings.hooks.SessionStart.push(hook);
172
- }
151
+ let sessionStart = Array.isArray(settings.hooks.SessionStart) ? settings.hooks.SessionStart : [];
152
+ // Drop any prior PRISM entry (legacy 'claude-session-id-hook' script or this
153
+ // command) so re-running the installer upgrades cleanly without duplicates.
154
+ sessionStart = sessionStart.filter((e) => !e?.hooks?.some((h) => h.command === 'claude-session-id-hook' || h.command === CLAUDE_HOOK_COMMAND));
155
+ sessionStart.push({ matcher: '', hooks: [{ type: 'command', command: CLAUDE_HOOK_COMMAND, timeout: 5000 }] });
156
+ settings.hooks.SessionStart = sessionStart;
173
157
  writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
174
- console.log('Claude Code session hook installed.');
158
+ console.log(`Claude Code session hook installed (${CLAUDE_HOOK_COMMAND}).`);
175
159
  }
176
160
  //# sourceMappingURL=install-git-hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-git-hooks.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-git-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-git-hooks.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/install-git-hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ declare const _default: {
2
+ description: string;
3
+ options: never[];
4
+ action(): Promise<void>;
5
+ };
6
+ export default _default;
7
+ //# sourceMappingURL=claude-session-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-session-context.d.ts","sourceRoot":"","sources":["../../../../src/commands/git/claude-session-context.ts"],"names":[],"mappings":";;;;;AAoBA,wBA+BE"}
@@ -0,0 +1,58 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ /**
3
+ * Claude Code SessionStart hook (Node port — no jq).
4
+ *
5
+ * Claude Code pipes a JSON event ({ session_id, ... }) to this command on
6
+ * session start. We (a) echo the id back as `additionalContext` so the model
7
+ * sees it, and (b) persist `CLAUDE_CODE_SESSION_ID` to the env file Claude
8
+ * sources, so later `git commit`s detect claude-code and attribute tokens.
9
+ *
10
+ * Registered in ~/.claude/settings.json by `bootstrapper install-git-hooks`.
11
+ */
12
+ async function readStdin() {
13
+ if (process.stdin.isTTY)
14
+ return '';
15
+ const chunks = [];
16
+ for await (const chunk of process.stdin)
17
+ chunks.push(chunk);
18
+ return Buffer.concat(chunks).toString('utf8');
19
+ }
20
+ export default {
21
+ description: 'Claude Code SessionStart hook: capture the session id for AI-origin commit attribution (no jq required)',
22
+ options: [],
23
+ async action() {
24
+ const raw = await readStdin();
25
+ let sessionId = '';
26
+ try {
27
+ const evt = JSON.parse(raw);
28
+ sessionId = evt.session_id || '';
29
+ }
30
+ catch { /* malformed/empty input → no session id */ }
31
+ // Feed the id back to Claude Code as additional context
32
+ process.stdout.write(JSON.stringify({
33
+ hookSpecificOutput: {
34
+ hookEventName: 'SessionStart',
35
+ additionalContext: `CLAUDE_CODE_SESSION_ID=${sessionId}`,
36
+ },
37
+ }));
38
+ // Persist to the env file Claude sources, so subsequent git commits see it.
39
+ // Only write when we actually resolved an id and it's not already present.
40
+ const envFile = process.env.CLAUDE_ENV_FILE;
41
+ if (envFile && sessionId) {
42
+ let existing = '';
43
+ if (existsSync(envFile)) {
44
+ try {
45
+ existing = readFileSync(envFile, 'utf8');
46
+ }
47
+ catch { /* ignore */ }
48
+ }
49
+ if (!existing.includes('CLAUDE_CODE_SESSION_ID')) {
50
+ try {
51
+ writeFileSync(envFile, `export CLAUDE_CODE_SESSION_ID="${sessionId}"\n`);
52
+ }
53
+ catch { /* non-fatal */ }
54
+ }
55
+ }
56
+ },
57
+ };
58
+ //# sourceMappingURL=claude-session-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-session-context.js","sourceRoot":"","sources":["../../../../src/commands/git/claude-session-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;;;;GASG;AAEH,KAAK,UAAU,SAAS;IACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,eAAe;IACb,WAAW,EAAE,yGAAyG;IACtH,OAAO,EAAE,EAAE;IACX,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAE9B,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;YACvD,SAAS,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC,CAAC,2CAA2C,CAAC,CAAC;QAEvD,wDAAwD;QACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAClC,kBAAkB,EAAE;gBAClB,aAAa,EAAE,cAAc;gBAC7B,iBAAiB,EAAE,0BAA0B,SAAS,EAAE;aACzD;SACF,CAAC,CAAC,CAAC;QAEJ,4EAA4E;QAC5E,2EAA2E;QAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC5C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;YACzB,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAAC,CAAC;YACrG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC;oBAAC,aAAa,CAAC,OAAO,EAAE,kCAAkC,SAAS,KAAK,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ declare const _default: {
2
+ description: string;
3
+ options: {
4
+ flags: string;
5
+ description: string;
6
+ }[];
7
+ action(opts: {
8
+ commitMsgFile?: string;
9
+ source?: string;
10
+ repo?: string;
11
+ }): Promise<void>;
12
+ };
13
+ export default _default;
14
+ //# sourceMappingURL=commit-trailers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-trailers.d.ts","sourceRoot":"","sources":["../../../../src/commands/git/commit-trailers.ts"],"names":[],"mappings":";;;;;;iBAkIqB;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;;AAP/E,wBA0FE"}
@@ -0,0 +1,217 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
3
+ import { resolve, basename } from 'node:path';
4
+ import { homedir } from 'node:os';
5
+ import { collectKiroCli } from '../parse-code-tool/kiro-cli.js';
6
+ import { collectKiroIde } from '../parse-code-tool/kiro-ide.js';
7
+ const DEFAULT_CLAUDE_MODEL = 'us.anthropic.claude-sonnet-4-5-20250929-v1:0';
8
+ function gitRoot(explicit) {
9
+ if (explicit)
10
+ return explicit;
11
+ const r = spawnSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8' });
12
+ if (r.status === 0 && r.stdout)
13
+ return r.stdout.trim();
14
+ return process.cwd();
15
+ }
16
+ /** Detect the AI tool that produced this commit from the environment. */
17
+ function detectTool() {
18
+ const env = process.env;
19
+ let origin = 'human', tool = '', model = '';
20
+ // Claude Code
21
+ if (env.CLAUDE_CODE || env.CLAUDE_CODE_SESSION_ID) {
22
+ origin = 'ai-generated';
23
+ tool = 'claude-code';
24
+ model = env.ANTHROPIC_MODEL || DEFAULT_CLAUDE_MODEL;
25
+ }
26
+ // Kiro CLI (KIRO_SESSION_ID) / IDE terminal (TERM_PROGRAM) / Source Control panel (askpass paths)
27
+ if (env.KIRO_SESSION_ID ||
28
+ env.KIRO_SESSION ||
29
+ env.TERM_PROGRAM === 'kiro' ||
30
+ (env.VSCODE_GIT_ASKPASS_NODE || '').includes('kiro') ||
31
+ (env.GIT_ASKPASS || '').includes('kiro')) {
32
+ origin = 'ai-generated';
33
+ tool = 'kiro';
34
+ model = '';
35
+ }
36
+ // Amazon Q Developer
37
+ if (env.Q_DEVELOPER_SESSION) {
38
+ origin = 'ai-generated';
39
+ tool = 'q-developer';
40
+ }
41
+ return { origin, tool, model };
42
+ }
43
+ /** Find a spec reference: an explicit Spec-Ref in the message wins, else a staged spec file. */
44
+ function detectSpecRef(repoRoot, msg) {
45
+ const explicit = msg.match(/^Spec-Ref:\s*(.+)$/m);
46
+ if (explicit)
47
+ return explicit[1].trim();
48
+ const r = spawnSync('git', ['diff', '--cached', '--name-only'], { encoding: 'utf8', cwd: repoRoot });
49
+ if (r.status === 0 && r.stdout) {
50
+ for (const f of r.stdout.split('\n')) {
51
+ if (/specs\/|\.kiro\/specs\//.test(f))
52
+ return f.trim();
53
+ }
54
+ }
55
+ return '';
56
+ }
57
+ /** Run `codeburn report` and parse its JSON. Returns null if codeburn is absent or errors. */
58
+ function runCodeburn(projectFilter) {
59
+ const isWin = process.platform === 'win32';
60
+ const r = isWin
61
+ ? spawnSync(`codeburn report -p all --project "${projectFilter}" --format json`, { encoding: 'utf8', shell: true })
62
+ : spawnSync('codeburn', ['report', '-p', 'all', '--project', projectFilter, '--format', 'json'], { encoding: 'utf8' });
63
+ if (!r || r.status !== 0 || !r.stdout)
64
+ return null;
65
+ try {
66
+ return JSON.parse(r.stdout);
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ }
72
+ /** Collect cumulative token usage for the given tool + project. */
73
+ async function collectUsage(tool, projectBasename, projectFilter) {
74
+ if (tool === 'kiro') {
75
+ let out = null;
76
+ if (process.env.KIRO_SESSION_ID) {
77
+ out = await collectKiroCli(process.env.KIRO_SESSION_ID, projectBasename);
78
+ }
79
+ if (!out || out.overview.calls === 0) {
80
+ out = await collectKiroIde(projectBasename);
81
+ }
82
+ return out;
83
+ }
84
+ // claude-code / q-developer → codeburn (full-path slug, then basename fallback)
85
+ let out = runCodeburn(projectFilter);
86
+ if (!out || out.overview.calls === 0)
87
+ out = runCodeburn(projectBasename);
88
+ return out;
89
+ }
90
+ function sumTokens(o, key) {
91
+ return (o.models || []).reduce((s, m) => s + (m[key] || 0), 0);
92
+ }
93
+ function readBounds(repoRoot) {
94
+ let maxTokens = 1_000_000, maxCost = 100;
95
+ const cfg = resolve(repoRoot, '.prism', 'config.json');
96
+ if (existsSync(cfg)) {
97
+ try {
98
+ const j = JSON.parse(readFileSync(cfg, 'utf8'));
99
+ if (typeof j.max_tokens === 'number')
100
+ maxTokens = j.max_tokens;
101
+ if (typeof j.max_cost === 'number')
102
+ maxCost = j.max_cost;
103
+ }
104
+ catch { /* fall through to defaults */ }
105
+ }
106
+ return { maxTokens, maxCost };
107
+ }
108
+ /** Format a USD cost: up to 4 dp, trailing zeros trimmed (matches the old bc output style). */
109
+ function formatCost(c) {
110
+ return (Math.round(c * 10000) / 10000).toString();
111
+ }
112
+ export default {
113
+ description: 'Emit AI-origin git commit trailers (used by prepare-commit-msg). Portable: no jq/bc/sed required.',
114
+ options: [
115
+ { flags: '--commit-msg-file <path>', description: 'Commit message file to append trailers to (git hook $1). If omitted, prints to stdout' },
116
+ { flags: '--source <source>', description: 'Commit source (git hook $2): merge, squash, message, template, commit' },
117
+ { flags: '--repo <path>', description: 'Repository root (defaults to git rev-parse --show-toplevel)' },
118
+ ],
119
+ async action(opts) {
120
+ // Skip merge/squash commits
121
+ if (opts.source === 'merge' || opts.source === 'squash')
122
+ return;
123
+ const repoRoot = gitRoot(opts.repo);
124
+ let existingMsg = '';
125
+ if (opts.commitMsgFile && existsSync(opts.commitMsgFile)) {
126
+ try {
127
+ existingMsg = readFileSync(opts.commitMsgFile, 'utf8');
128
+ }
129
+ catch { /* ignore */ }
130
+ }
131
+ // Don't double-add trailers
132
+ if (/^AI-Origin:/m.test(existingMsg))
133
+ return;
134
+ const { origin, tool, model } = detectTool();
135
+ const specRef = detectSpecRef(repoRoot, existingMsg);
136
+ const projectBasename = basename(repoRoot);
137
+ const projectFilter = repoRoot.replace(/^\//, '').replace(/\//g, '-');
138
+ // Token tracking (snapshot delta) — only when an AI tool is detected
139
+ let inputTokens = null;
140
+ let outputTokens = null;
141
+ let cost = null;
142
+ if (tool) {
143
+ const usage = await collectUsage(tool, projectBasename, projectFilter);
144
+ if (usage) {
145
+ const curIn = sumTokens(usage, 'inputTokens');
146
+ const curOut = sumTokens(usage, 'outputTokens');
147
+ const curCost = usage.overview?.cost ?? 0;
148
+ const trackerDir = resolve(homedir(), '.prism', 'tokentracker');
149
+ const trackerFile = resolve(trackerDir, `${projectBasename}.json`);
150
+ if (existsSync(trackerFile)) {
151
+ try {
152
+ const prev = JSON.parse(readFileSync(trackerFile, 'utf8'));
153
+ inputTokens = Math.max(0, curIn - (prev.inputTokens || 0));
154
+ outputTokens = Math.max(0, curOut - (prev.outputTokens || 0));
155
+ cost = Math.max(0, curCost - (prev.cost || 0));
156
+ }
157
+ catch {
158
+ inputTokens = 0;
159
+ outputTokens = 0;
160
+ cost = 0;
161
+ }
162
+ }
163
+ else {
164
+ // First commit for this project — no delta baseline yet
165
+ inputTokens = 0;
166
+ outputTokens = 0;
167
+ cost = 0;
168
+ }
169
+ // Persist the new snapshot for the next commit's delta
170
+ try {
171
+ mkdirSync(trackerDir, { recursive: true });
172
+ const snap = { inputTokens: curIn, outputTokens: curOut, cost: curCost };
173
+ writeFileSync(trackerFile, JSON.stringify(snap) + '\n');
174
+ }
175
+ catch { /* non-fatal */ }
176
+ }
177
+ }
178
+ // Clamp to configured bounds
179
+ const { maxTokens, maxCost } = readBounds(repoRoot);
180
+ if (inputTokens !== null)
181
+ inputTokens = Math.min(inputTokens, maxTokens);
182
+ if (outputTokens !== null)
183
+ outputTokens = Math.min(outputTokens, maxTokens);
184
+ if (cost !== null && cost > maxCost)
185
+ cost = maxCost;
186
+ // Build trailer block
187
+ const lines = [`AI-Origin: ${origin}`];
188
+ if (tool)
189
+ lines.push(`AI-Tool: ${tool}`);
190
+ if (model)
191
+ lines.push(`AI-Model: ${model}`);
192
+ if (inputTokens !== null)
193
+ lines.push(`AI-Input-Tokens: ${inputTokens}`);
194
+ if (outputTokens !== null)
195
+ lines.push(`AI-Output-Tokens: ${outputTokens}`);
196
+ if (cost !== null)
197
+ lines.push(`AI-Cost: $${formatCost(cost)}`);
198
+ if (specRef)
199
+ lines.push(`Spec-Ref: ${specRef}`);
200
+ const block = lines.join('\n');
201
+ if (opts.commitMsgFile) {
202
+ // Ensure a blank line separates the message body from the trailers
203
+ let out = existingMsg;
204
+ if (out.length > 0)
205
+ out = out.replace(/\n+$/, '') + '\n\n';
206
+ out += block + '\n';
207
+ try {
208
+ writeFileSync(opts.commitMsgFile, out);
209
+ }
210
+ catch { /* fail open — never block the commit */ }
211
+ }
212
+ else {
213
+ console.log(block);
214
+ }
215
+ },
216
+ };
217
+ //# sourceMappingURL=commit-trailers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-trailers.js","sourceRoot":"","sources":["../../../../src/commands/git/commit-trailers.ts"],"names":[],"mappings":"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"}