devflow-kit 1.6.1 → 1.8.0

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 (203) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +31 -0
  3. package/dist/cli.js +3 -1
  4. package/dist/commands/hud.d.ts +22 -0
  5. package/dist/commands/hud.js +180 -0
  6. package/dist/commands/init.d.ts +1 -0
  7. package/dist/commands/init.js +114 -5
  8. package/dist/commands/list.js +1 -0
  9. package/dist/commands/uninstall.js +9 -16
  10. package/dist/hud/cache.d.ts +14 -0
  11. package/dist/hud/cache.js +54 -0
  12. package/dist/hud/colors.d.ts +23 -0
  13. package/dist/hud/colors.js +62 -0
  14. package/dist/hud/components/config-counts.d.ts +8 -0
  15. package/dist/hud/components/config-counts.js +91 -0
  16. package/dist/hud/components/context-usage.d.ts +8 -0
  17. package/dist/hud/components/context-usage.js +49 -0
  18. package/dist/hud/components/diff-stats.d.ts +3 -0
  19. package/dist/hud/components/diff-stats.js +36 -0
  20. package/dist/hud/components/directory.d.ts +3 -0
  21. package/dist/hud/components/directory.js +10 -0
  22. package/dist/hud/components/git-ahead-behind.d.ts +3 -0
  23. package/dist/hud/components/git-ahead-behind.js +16 -0
  24. package/dist/hud/components/git-branch.d.ts +3 -0
  25. package/dist/hud/components/git-branch.js +14 -0
  26. package/dist/hud/components/model.d.ts +3 -0
  27. package/dist/hud/components/model.js +21 -0
  28. package/dist/hud/components/release-info.d.ts +3 -0
  29. package/dist/hud/components/release-info.js +9 -0
  30. package/dist/hud/components/session-cost.d.ts +3 -0
  31. package/dist/hud/components/session-cost.js +9 -0
  32. package/dist/hud/components/session-duration.d.ts +3 -0
  33. package/dist/hud/components/session-duration.js +18 -0
  34. package/dist/hud/components/todo-progress.d.ts +3 -0
  35. package/dist/hud/components/todo-progress.js +11 -0
  36. package/dist/hud/components/usage-quota.d.ts +3 -0
  37. package/dist/hud/components/usage-quota.js +45 -0
  38. package/dist/hud/components/version-badge.d.ts +3 -0
  39. package/dist/hud/components/version-badge.js +80 -0
  40. package/dist/hud/components/worktree-count.d.ts +3 -0
  41. package/dist/hud/components/worktree-count.js +8 -0
  42. package/dist/hud/config.d.ts +10 -0
  43. package/dist/hud/config.js +55 -0
  44. package/dist/hud/credentials.d.ts +17 -0
  45. package/dist/hud/credentials.js +99 -0
  46. package/dist/hud/git.d.ts +7 -0
  47. package/dist/hud/git.js +153 -0
  48. package/dist/hud/index.d.ts +2 -0
  49. package/dist/hud/index.js +81 -0
  50. package/dist/hud/render.d.ts +7 -0
  51. package/dist/hud/render.js +111 -0
  52. package/dist/hud/stdin.d.ts +6 -0
  53. package/dist/hud/stdin.js +25 -0
  54. package/dist/hud/transcript.d.ts +7 -0
  55. package/dist/hud/transcript.js +130 -0
  56. package/dist/hud/types.d.ts +116 -0
  57. package/dist/hud/types.js +2 -0
  58. package/dist/hud/usage-api.d.ts +7 -0
  59. package/dist/hud/usage-api.js +84 -0
  60. package/dist/utils/manifest.d.ts +1 -0
  61. package/package.json +5 -2
  62. package/plugins/devflow-accessibility/.claude-plugin/plugin.json +1 -1
  63. package/plugins/devflow-ambient/.claude-plugin/plugin.json +1 -1
  64. package/plugins/devflow-ambient/agents/scrutinizer.md +6 -4
  65. package/plugins/devflow-ambient/agents/shepherd.md +26 -12
  66. package/plugins/devflow-ambient/agents/simplifier.md +24 -15
  67. package/plugins/devflow-ambient/agents/skimmer.md +71 -21
  68. package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +1 -1
  69. package/plugins/devflow-code-review/.claude-plugin/plugin.json +1 -1
  70. package/plugins/devflow-core-skills/.claude-plugin/plugin.json +1 -1
  71. package/plugins/devflow-debug/.claude-plugin/plugin.json +1 -1
  72. package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +1 -1
  73. package/plugins/devflow-go/.claude-plugin/plugin.json +1 -1
  74. package/plugins/devflow-implement/.claude-plugin/plugin.json +1 -1
  75. package/plugins/devflow-implement/agents/scrutinizer.md +6 -4
  76. package/plugins/devflow-implement/agents/shepherd.md +26 -12
  77. package/plugins/devflow-implement/agents/simplifier.md +24 -15
  78. package/plugins/devflow-implement/agents/skimmer.md +71 -21
  79. package/plugins/devflow-implement/commands/implement-teams.md +1 -1
  80. package/plugins/devflow-implement/commands/implement.md +1 -1
  81. package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +135 -0
  82. package/plugins/devflow-java/.claude-plugin/plugin.json +1 -1
  83. package/plugins/devflow-python/.claude-plugin/plugin.json +1 -1
  84. package/plugins/devflow-react/.claude-plugin/plugin.json +1 -1
  85. package/plugins/devflow-resolve/.claude-plugin/plugin.json +1 -1
  86. package/plugins/devflow-resolve/agents/simplifier.md +24 -15
  87. package/plugins/devflow-rust/.claude-plugin/plugin.json +1 -1
  88. package/plugins/devflow-self-review/.claude-plugin/plugin.json +1 -1
  89. package/plugins/devflow-self-review/agents/scrutinizer.md +6 -4
  90. package/plugins/devflow-self-review/agents/simplifier.md +24 -15
  91. package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +135 -0
  92. package/plugins/devflow-specify/.claude-plugin/plugin.json +1 -1
  93. package/plugins/devflow-specify/agents/skimmer.md +71 -21
  94. package/plugins/devflow-specify/commands/specify-teams.md +1 -1
  95. package/plugins/devflow-specify/commands/specify.md +1 -1
  96. package/plugins/devflow-typescript/.claude-plugin/plugin.json +1 -1
  97. package/scripts/hud/cache.d.ts +14 -0
  98. package/scripts/hud/cache.d.ts.map +1 -0
  99. package/scripts/hud/cache.js +54 -0
  100. package/scripts/hud/cache.js.map +1 -0
  101. package/scripts/hud/colors.d.ts +23 -0
  102. package/scripts/hud/colors.d.ts.map +1 -0
  103. package/scripts/hud/colors.js +62 -0
  104. package/scripts/hud/colors.js.map +1 -0
  105. package/scripts/hud/components/config-counts.d.ts +8 -0
  106. package/scripts/hud/components/config-counts.d.ts.map +1 -0
  107. package/scripts/hud/components/config-counts.js +91 -0
  108. package/scripts/hud/components/config-counts.js.map +1 -0
  109. package/scripts/hud/components/context-usage.d.ts +8 -0
  110. package/scripts/hud/components/context-usage.d.ts.map +1 -0
  111. package/scripts/hud/components/context-usage.js +49 -0
  112. package/scripts/hud/components/context-usage.js.map +1 -0
  113. package/scripts/hud/components/diff-stats.d.ts +3 -0
  114. package/scripts/hud/components/diff-stats.d.ts.map +1 -0
  115. package/scripts/hud/components/diff-stats.js +36 -0
  116. package/scripts/hud/components/diff-stats.js.map +1 -0
  117. package/scripts/hud/components/directory.d.ts +3 -0
  118. package/scripts/hud/components/directory.d.ts.map +1 -0
  119. package/scripts/hud/components/directory.js +10 -0
  120. package/scripts/hud/components/directory.js.map +1 -0
  121. package/scripts/hud/components/git-ahead-behind.d.ts +3 -0
  122. package/scripts/hud/components/git-ahead-behind.d.ts.map +1 -0
  123. package/scripts/hud/components/git-ahead-behind.js +16 -0
  124. package/scripts/hud/components/git-ahead-behind.js.map +1 -0
  125. package/scripts/hud/components/git-branch.d.ts +3 -0
  126. package/scripts/hud/components/git-branch.d.ts.map +1 -0
  127. package/scripts/hud/components/git-branch.js +14 -0
  128. package/scripts/hud/components/git-branch.js.map +1 -0
  129. package/scripts/hud/components/model.d.ts +3 -0
  130. package/scripts/hud/components/model.d.ts.map +1 -0
  131. package/scripts/hud/components/model.js +21 -0
  132. package/scripts/hud/components/model.js.map +1 -0
  133. package/scripts/hud/components/release-info.d.ts +3 -0
  134. package/scripts/hud/components/release-info.d.ts.map +1 -0
  135. package/scripts/hud/components/release-info.js +9 -0
  136. package/scripts/hud/components/release-info.js.map +1 -0
  137. package/scripts/hud/components/session-cost.d.ts +3 -0
  138. package/scripts/hud/components/session-cost.d.ts.map +1 -0
  139. package/scripts/hud/components/session-cost.js +9 -0
  140. package/scripts/hud/components/session-cost.js.map +1 -0
  141. package/scripts/hud/components/session-duration.d.ts +3 -0
  142. package/scripts/hud/components/session-duration.d.ts.map +1 -0
  143. package/scripts/hud/components/session-duration.js +18 -0
  144. package/scripts/hud/components/session-duration.js.map +1 -0
  145. package/scripts/hud/components/todo-progress.d.ts +3 -0
  146. package/scripts/hud/components/todo-progress.d.ts.map +1 -0
  147. package/scripts/hud/components/todo-progress.js +11 -0
  148. package/scripts/hud/components/todo-progress.js.map +1 -0
  149. package/scripts/hud/components/usage-quota.d.ts +3 -0
  150. package/scripts/hud/components/usage-quota.d.ts.map +1 -0
  151. package/scripts/hud/components/usage-quota.js +45 -0
  152. package/scripts/hud/components/usage-quota.js.map +1 -0
  153. package/scripts/hud/components/version-badge.d.ts +3 -0
  154. package/scripts/hud/components/version-badge.d.ts.map +1 -0
  155. package/scripts/hud/components/version-badge.js +80 -0
  156. package/scripts/hud/components/version-badge.js.map +1 -0
  157. package/scripts/hud/components/worktree-count.d.ts +3 -0
  158. package/scripts/hud/components/worktree-count.d.ts.map +1 -0
  159. package/scripts/hud/components/worktree-count.js +8 -0
  160. package/scripts/hud/components/worktree-count.js.map +1 -0
  161. package/scripts/hud/config.d.ts +10 -0
  162. package/scripts/hud/config.d.ts.map +1 -0
  163. package/scripts/hud/config.js +55 -0
  164. package/scripts/hud/config.js.map +1 -0
  165. package/scripts/hud/credentials.d.ts +17 -0
  166. package/scripts/hud/credentials.d.ts.map +1 -0
  167. package/scripts/hud/credentials.js +99 -0
  168. package/scripts/hud/credentials.js.map +1 -0
  169. package/scripts/hud/git.d.ts +7 -0
  170. package/scripts/hud/git.d.ts.map +1 -0
  171. package/scripts/hud/git.js +153 -0
  172. package/scripts/hud/git.js.map +1 -0
  173. package/scripts/hud/index.d.ts +2 -0
  174. package/scripts/hud/index.d.ts.map +1 -0
  175. package/scripts/hud/index.js +81 -0
  176. package/scripts/hud/index.js.map +1 -0
  177. package/scripts/hud/render.d.ts +7 -0
  178. package/scripts/hud/render.d.ts.map +1 -0
  179. package/scripts/hud/render.js +111 -0
  180. package/scripts/hud/render.js.map +1 -0
  181. package/scripts/hud/stdin.d.ts +6 -0
  182. package/scripts/hud/stdin.d.ts.map +1 -0
  183. package/scripts/hud/stdin.js +25 -0
  184. package/scripts/hud/stdin.js.map +1 -0
  185. package/scripts/hud/transcript.d.ts +7 -0
  186. package/scripts/hud/transcript.d.ts.map +1 -0
  187. package/scripts/hud/transcript.js +130 -0
  188. package/scripts/hud/transcript.js.map +1 -0
  189. package/scripts/hud/types.d.ts +116 -0
  190. package/scripts/hud/types.d.ts.map +1 -0
  191. package/scripts/hud/types.js +2 -0
  192. package/scripts/hud/types.js.map +1 -0
  193. package/scripts/hud/usage-api.d.ts +7 -0
  194. package/scripts/hud/usage-api.d.ts.map +1 -0
  195. package/scripts/hud/usage-api.js +84 -0
  196. package/scripts/hud/usage-api.js.map +1 -0
  197. package/scripts/hud.sh +5 -0
  198. package/shared/agents/scrutinizer.md +6 -4
  199. package/shared/agents/shepherd.md +26 -12
  200. package/shared/agents/simplifier.md +24 -15
  201. package/shared/agents/skimmer.md +71 -21
  202. package/shared/skills/self-review/references/stub-detection.md +135 -0
  203. package/src/templates/settings.json +1 -1
@@ -0,0 +1,81 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { readStdin } from './stdin.js';
5
+ import { loadConfig, resolveComponents } from './config.js';
6
+ import { gatherGitStatus } from './git.js';
7
+ import { parseTranscript } from './transcript.js';
8
+ import { fetchUsageData } from './usage-api.js';
9
+ import { gatherConfigCounts } from './components/config-counts.js';
10
+ import { render } from './render.js';
11
+ const OVERALL_TIMEOUT = 2000; // 2 second overall timeout
12
+ async function main() {
13
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), OVERALL_TIMEOUT));
14
+ try {
15
+ const result = await Promise.race([run(), timeoutPromise]);
16
+ process.stdout.write(result);
17
+ }
18
+ catch {
19
+ // Timeout or error — output nothing (graceful degradation)
20
+ }
21
+ }
22
+ async function run() {
23
+ const stdin = await readStdin();
24
+ // Debug: dump raw stdin to file when DEVFLOW_HUD_DEBUG is set
25
+ if (process.env.DEVFLOW_HUD_DEBUG) {
26
+ fs.writeFileSync(process.env.DEVFLOW_HUD_DEBUG, JSON.stringify(stdin, null, 2));
27
+ }
28
+ const config = loadConfig();
29
+ const resolved = resolveComponents(config);
30
+ const components = new Set(resolved);
31
+ const cwd = stdin.cwd || process.cwd();
32
+ const devflowDir = process.env.DEVFLOW_DIR ||
33
+ path.join(process.env.HOME || homedir(), '.devflow');
34
+ // Determine what data to gather based on enabled components
35
+ const needsGit = components.has('gitBranch') ||
36
+ components.has('gitAheadBehind') ||
37
+ components.has('diffStats') ||
38
+ components.has('releaseInfo') ||
39
+ components.has('worktreeCount');
40
+ const needsTranscript = components.has('todoProgress') ||
41
+ components.has('configCounts');
42
+ const needsUsage = components.has('usageQuota');
43
+ const needsConfigCounts = components.has('configCounts');
44
+ // Parallel data gathering — only fetch what's needed
45
+ const [git, transcript, usage] = await Promise.all([
46
+ needsGit ? gatherGitStatus(cwd) : Promise.resolve(null),
47
+ needsTranscript && stdin.transcript_path
48
+ ? parseTranscript(stdin.transcript_path)
49
+ : Promise.resolve(null),
50
+ needsUsage ? fetchUsageData() : Promise.resolve(null),
51
+ ]);
52
+ // Session start time from transcript file creation time
53
+ let sessionStartTime = null;
54
+ if (stdin.transcript_path) {
55
+ try {
56
+ const stat = fs.statSync(stdin.transcript_path);
57
+ sessionStartTime = stat.birthtime.getTime();
58
+ }
59
+ catch { /* file may not exist yet */ }
60
+ }
61
+ // Config counts (fast, synchronous filesystem reads)
62
+ const configCountsData = needsConfigCounts
63
+ ? gatherConfigCounts(cwd)
64
+ : null;
65
+ // Terminal width via stderr (stdout is piped to Claude Code)
66
+ const terminalWidth = process.stderr.columns || 120;
67
+ const ctx = {
68
+ stdin,
69
+ git,
70
+ transcript,
71
+ usage,
72
+ configCounts: configCountsData,
73
+ config: { ...config, components: resolved },
74
+ devflowDir,
75
+ sessionStartTime,
76
+ terminalWidth,
77
+ };
78
+ return render(ctx);
79
+ }
80
+ main();
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/hud/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { GatherContext } from './types.js';
2
+ /**
3
+ * Render all enabled components into a multi-line HUD string.
4
+ * Components that return null are excluded. Empty lines are skipped.
5
+ */
6
+ export declare function render(ctx: GatherContext): Promise<string>;
7
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/cli/hud/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,aAAa,EAEd,MAAM,YAAY,CAAC;AAsDpB;;;GAGG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DhE"}
@@ -0,0 +1,111 @@
1
+ import { dim } from './colors.js';
2
+ import directory from './components/directory.js';
3
+ import gitBranch from './components/git-branch.js';
4
+ import gitAheadBehind from './components/git-ahead-behind.js';
5
+ import diffStats from './components/diff-stats.js';
6
+ import model from './components/model.js';
7
+ import contextUsage from './components/context-usage.js';
8
+ import versionBadge from './components/version-badge.js';
9
+ import sessionDuration from './components/session-duration.js';
10
+ import usageQuota from './components/usage-quota.js';
11
+ import todoProgress from './components/todo-progress.js';
12
+ import configCounts from './components/config-counts.js';
13
+ import sessionCost from './components/session-cost.js';
14
+ import releaseInfo from './components/release-info.js';
15
+ import worktreeCount from './components/worktree-count.js';
16
+ const COMPONENT_MAP = {
17
+ directory,
18
+ gitBranch,
19
+ gitAheadBehind,
20
+ diffStats,
21
+ model,
22
+ contextUsage,
23
+ versionBadge,
24
+ sessionDuration,
25
+ usageQuota,
26
+ todoProgress,
27
+ configCounts,
28
+ sessionCost,
29
+ releaseInfo,
30
+ worktreeCount,
31
+ };
32
+ /**
33
+ * Line groupings for smart layout.
34
+ * Components are assigned to lines and only rendered if enabled.
35
+ * null entries denote section breaks (blank line between sections).
36
+ */
37
+ const LINE_GROUPS = [
38
+ // Section 1: Info (3 lines)
39
+ ['directory', 'gitBranch', 'gitAheadBehind', 'releaseInfo', 'worktreeCount', 'diffStats'],
40
+ ['contextUsage', 'usageQuota'],
41
+ ['model', 'sessionDuration', 'sessionCost', 'configCounts'],
42
+ // --- section break ---
43
+ null,
44
+ // Section 2: Activity
45
+ ['todoProgress'],
46
+ ['versionBadge'],
47
+ ];
48
+ const SEPARATOR = dim(' \u00B7 ');
49
+ /**
50
+ * Render all enabled components into a multi-line HUD string.
51
+ * Components that return null are excluded. Empty lines are skipped.
52
+ */
53
+ export async function render(ctx) {
54
+ const enabled = new Set(ctx.config.components);
55
+ // Render all enabled components in parallel
56
+ const results = new Map();
57
+ const promises = [];
58
+ for (const id of enabled) {
59
+ const fn = COMPONENT_MAP[id];
60
+ if (!fn)
61
+ continue;
62
+ promises.push(fn(ctx)
63
+ .then((result) => {
64
+ if (result)
65
+ results.set(id, result);
66
+ })
67
+ .catch(() => {
68
+ /* Component failure is non-fatal */
69
+ }));
70
+ }
71
+ await Promise.all(promises);
72
+ // Assemble lines using smart layout with section breaks
73
+ const lines = [];
74
+ let pendingBreak = false;
75
+ for (const entry of LINE_GROUPS) {
76
+ if (entry === null) {
77
+ if (lines.length > 0)
78
+ pendingBreak = true;
79
+ continue;
80
+ }
81
+ const lineResults = entry
82
+ .filter((id) => enabled.has(id) && results.has(id))
83
+ .map((id) => results.get(id));
84
+ if (lineResults.length > 0) {
85
+ if (pendingBreak) {
86
+ lines.push('');
87
+ pendingBreak = false;
88
+ }
89
+ // Separate multi-line results (containing newlines) from single-line
90
+ const singleLine = [];
91
+ for (const r of lineResults) {
92
+ if (r.text.includes('\n')) {
93
+ // Flush any accumulated single-line parts first
94
+ if (singleLine.length > 0) {
95
+ lines.push(singleLine.join(SEPARATOR));
96
+ singleLine.length = 0;
97
+ }
98
+ lines.push(r.text);
99
+ }
100
+ else {
101
+ singleLine.push(r.text);
102
+ }
103
+ }
104
+ if (singleLine.length > 0) {
105
+ lines.push(singleLine.join(SEPARATOR));
106
+ }
107
+ }
108
+ }
109
+ return lines.join('\n');
110
+ }
111
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/cli/hud/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { StdinData } from './types.js';
2
+ /**
3
+ * Read and parse JSON from stdin. Returns empty object on parse failure.
4
+ */
5
+ export declare function readStdin(): Promise<StdinData>;
6
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/cli/hud/stdin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC,CAmB9C"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Read and parse JSON from stdin. Returns empty object on parse failure.
3
+ */
4
+ export function readStdin() {
5
+ return new Promise((resolve) => {
6
+ let data = '';
7
+ process.stdin.setEncoding('utf-8');
8
+ process.stdin.on('data', (chunk) => {
9
+ data += chunk;
10
+ });
11
+ process.stdin.on('end', () => {
12
+ try {
13
+ resolve(JSON.parse(data));
14
+ }
15
+ catch {
16
+ resolve({});
17
+ }
18
+ });
19
+ process.stdin.on('error', () => {
20
+ resolve({});
21
+ });
22
+ process.stdin.resume();
23
+ });
24
+ }
25
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/cli/hud/stdin.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,IAAI,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TranscriptData } from './types.js';
2
+ /**
3
+ * Parse a Claude Code session transcript (JSONL) to extract tool/agent activity and todo progress.
4
+ * Returns null if the file doesn't exist or can't be parsed.
5
+ */
6
+ export declare function parseTranscript(transcriptPath: string): Promise<TranscriptData | null>;
7
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/cli/hud/transcript.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsDhC"}
@@ -0,0 +1,130 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as readline from 'node:readline';
4
+ // Precompiled patterns
5
+ const TODO_WRITE_NAME = /^TodoWrite$/i;
6
+ /**
7
+ * Parse a Claude Code session transcript (JSONL) to extract tool/agent activity and todo progress.
8
+ * Returns null if the file doesn't exist or can't be parsed.
9
+ */
10
+ export async function parseTranscript(transcriptPath) {
11
+ try {
12
+ if (!fs.existsSync(transcriptPath))
13
+ return null;
14
+ const tools = new Map();
15
+ const agents = new Map();
16
+ const skills = new Set();
17
+ let todosCompleted = 0;
18
+ let todosTotal = 0;
19
+ const stream = fs.createReadStream(transcriptPath, { encoding: 'utf-8' });
20
+ const rl = readline.createInterface({
21
+ input: stream,
22
+ crlfDelay: Infinity,
23
+ });
24
+ for await (const line of rl) {
25
+ if (!line.trim())
26
+ continue;
27
+ try {
28
+ const entry = JSON.parse(line);
29
+ // Turn boundary: clear tools and agents on each human message
30
+ // so only the current turn's activity shows in the HUD
31
+ if (entry.type === 'human') {
32
+ tools.clear();
33
+ agents.clear();
34
+ continue;
35
+ }
36
+ const todoResult = processEntry(entry, tools, agents, skills);
37
+ if (todoResult) {
38
+ todosCompleted = todoResult.completed;
39
+ todosTotal = todoResult.total;
40
+ }
41
+ }
42
+ catch {
43
+ // Skip malformed lines
44
+ }
45
+ }
46
+ return {
47
+ tools: Array.from(tools.values()),
48
+ agents: Array.from(agents.values()),
49
+ todos: { completed: todosCompleted, total: todosTotal },
50
+ skills: Array.from(skills),
51
+ };
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ function processEntry(entry, tools, agents, skills) {
58
+ if (entry.type !== 'assistant' || !entry.message)
59
+ return null;
60
+ const message = entry.message;
61
+ if (!Array.isArray(message.content))
62
+ return null;
63
+ let todoResult = null;
64
+ for (const block of message.content) {
65
+ const blockType = block.type;
66
+ if (blockType === 'tool_use') {
67
+ const name = block.name;
68
+ const id = block.id;
69
+ if (name === 'Agent' || name === 'Task') {
70
+ // Agent spawn
71
+ const input = block.input;
72
+ const agentType = input?.subagent_type || 'Agent';
73
+ const agentDesc = typeof input?.description === 'string' ? input.description : undefined;
74
+ agents.set(id, {
75
+ name: agentType,
76
+ model: input?.model,
77
+ status: 'running',
78
+ description: agentDesc,
79
+ });
80
+ }
81
+ else if (name === 'Skill') {
82
+ // Track loaded skills
83
+ const input = block.input;
84
+ if (input?.skill && typeof input.skill === 'string') {
85
+ skills.add(input.skill);
86
+ }
87
+ }
88
+ else if (TODO_WRITE_NAME.test(name)) {
89
+ // Track todos
90
+ const input = block.input;
91
+ const todos = input?.todos;
92
+ if (Array.isArray(todos)) {
93
+ const total = todos.length;
94
+ const completed = todos.filter((t) => t.status === 'completed').length;
95
+ todoResult = { completed, total };
96
+ }
97
+ }
98
+ else {
99
+ // Regular tool — extract file target for Read/Edit/Write
100
+ const input = block.input;
101
+ let target;
102
+ if (input?.file_path && typeof input.file_path === 'string') {
103
+ target = path.basename(input.file_path);
104
+ }
105
+ // Extract description: prefer input.description, fallback to first 4 words of command (Bash)
106
+ let description;
107
+ if (typeof input?.description === 'string') {
108
+ description = input.description;
109
+ }
110
+ else if (name === 'Bash' && typeof input?.command === 'string') {
111
+ description = input.command.split(/\s+/).slice(0, 4).join(' ');
112
+ }
113
+ tools.set(id, { name, status: 'running', target, description });
114
+ }
115
+ }
116
+ else if (blockType === 'tool_result') {
117
+ const toolUseId = block.tool_use_id;
118
+ const toolEntry = tools.get(toolUseId);
119
+ if (toolEntry) {
120
+ toolEntry.status = 'completed';
121
+ }
122
+ const agentEntry = agents.get(toolUseId);
123
+ if (agentEntry) {
124
+ agentEntry.status = 'completed';
125
+ }
126
+ }
127
+ }
128
+ return todoResult;
129
+ }
130
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/cli/hud/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C,uBAAuB;AACvB,MAAM,eAAe,GAAG,cAAc,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,cAAsB;IAEtB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhD,MAAM,KAAK,GAAG,IAAI,GAAG,EAGlB,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,EAGnB,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;gBAE1D,8DAA8D;gBAC9D,uDAAuD;gBACvD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,KAAK,CAAC,KAAK,EAAE,CAAC;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC9D,IAAI,UAAU,EAAE,CAAC;oBACf,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC;oBACtC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnC,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE;YACvD,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD,SAAS,YAAY,CACnB,KAA8B,EAC9B,KAA4G,EAC5G,MAGC,EACD,MAAmB;IAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAErB,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,IAAI,UAAU,GAAsB,IAAI,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAc,CAAC;QAEvC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAc,CAAC;YAClC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAY,CAAC;YAE9B,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,cAAc;gBACd,MAAM,KAAK,GAAG,KAAK,CAAC,KAA4C,CAAC;gBACjE,MAAM,SAAS,GAAI,KAAK,EAAE,aAAwB,IAAI,OAAO,CAAC;gBAC9D,MAAM,SAAS,GAAG,OAAO,KAAK,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzF,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;oBACb,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,KAAK,EAAE,KAA2B;oBACzC,MAAM,EAAE,SAAS;oBACjB,WAAW,EAAE,SAAS;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,sBAAsB;gBACtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAA4C,CAAC;gBACjE,IAAI,KAAK,EAAE,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACpD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;iBAAM,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,cAAc;gBACd,MAAM,KAAK,GAAG,KAAK,CAAC,KAA4C,CAAC;gBACjE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC;gBAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;oBAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAC5B,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CACzD,CAAC,MAAM,CAAC;oBACT,UAAU,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACpC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,yDAAyD;gBACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAA4C,CAAC;gBACjE,IAAI,MAA0B,CAAC;gBAC/B,IAAI,KAAK,EAAE,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC5D,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBACD,6FAA6F;gBAC7F,IAAI,WAA+B,CAAC;gBACpC,IAAI,OAAO,KAAK,EAAE,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC3C,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;gBAClC,CAAC;qBAAM,IAAI,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACjE,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjE,CAAC;gBACD,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;aAAM,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAqB,CAAC;YAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvC,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,GAAG,WAAW,CAAC;YACjC,CAAC;YACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,MAAM,GAAG,WAAW,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * StdinData — the JSON that Claude Code pipes to statusLine commands.
3
+ */
4
+ export interface StdinData {
5
+ model?: {
6
+ display_name?: string;
7
+ id?: string;
8
+ };
9
+ cwd?: string;
10
+ context_window?: {
11
+ context_window_size?: number;
12
+ current_usage?: {
13
+ input_tokens?: number;
14
+ output_tokens?: number;
15
+ };
16
+ used_percentage?: number;
17
+ };
18
+ cost?: {
19
+ total_cost_usd?: number;
20
+ };
21
+ session_id?: string;
22
+ transcript_path?: string;
23
+ }
24
+ /**
25
+ * Component IDs — the 14 HUD components.
26
+ */
27
+ export type ComponentId = 'directory' | 'gitBranch' | 'gitAheadBehind' | 'diffStats' | 'model' | 'contextUsage' | 'versionBadge' | 'sessionDuration' | 'usageQuota' | 'todoProgress' | 'configCounts' | 'sessionCost' | 'releaseInfo' | 'worktreeCount';
28
+ /**
29
+ * HUD config persisted to ~/.devflow/hud.json.
30
+ */
31
+ export interface HudConfig {
32
+ enabled: boolean;
33
+ detail: boolean;
34
+ }
35
+ /**
36
+ * Component render result.
37
+ */
38
+ export interface ComponentResult {
39
+ text: string;
40
+ raw: string;
41
+ }
42
+ /**
43
+ * Component function signature.
44
+ */
45
+ export type ComponentFn = (ctx: GatherContext) => Promise<ComponentResult | null>;
46
+ /**
47
+ * Git status data gathered from the working directory.
48
+ */
49
+ export interface GitStatus {
50
+ branch: string;
51
+ dirty: boolean;
52
+ staged: boolean;
53
+ ahead: number;
54
+ behind: number;
55
+ filesChanged: number;
56
+ additions: number;
57
+ deletions: number;
58
+ lastTag: string | null;
59
+ commitsSinceTag: number;
60
+ worktreeCount: number;
61
+ }
62
+ /**
63
+ * Transcript data parsed from session JSONL.
64
+ */
65
+ export interface TranscriptData {
66
+ tools: Array<{
67
+ name: string;
68
+ status: 'running' | 'completed';
69
+ target?: string;
70
+ description?: string;
71
+ }>;
72
+ agents: Array<{
73
+ name: string;
74
+ model?: string;
75
+ status: 'running' | 'completed';
76
+ description?: string;
77
+ }>;
78
+ todos: {
79
+ completed: number;
80
+ total: number;
81
+ };
82
+ skills: string[];
83
+ }
84
+ /**
85
+ * Usage API data.
86
+ */
87
+ export interface UsageData {
88
+ fiveHourPercent: number | null;
89
+ sevenDayPercent: number | null;
90
+ }
91
+ /**
92
+ * Config counts data for the configCounts component.
93
+ */
94
+ export interface ConfigCountsData {
95
+ claudeMdFiles: number;
96
+ rules: number;
97
+ mcpServers: number;
98
+ hooks: number;
99
+ }
100
+ /**
101
+ * Gather context passed to all component render functions.
102
+ */
103
+ export interface GatherContext {
104
+ stdin: StdinData;
105
+ git: GitStatus | null;
106
+ transcript: TranscriptData | null;
107
+ usage: UsageData | null;
108
+ configCounts: ConfigCountsData | null;
109
+ config: HudConfig & {
110
+ components: ComponentId[];
111
+ };
112
+ devflowDir: string;
113
+ sessionStartTime: number | null;
114
+ terminalWidth: number;
115
+ }
116
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/hud/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/hud/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { UsageData } from './types.js';
2
+ /**
3
+ * Fetch usage quota data from the Anthropic API.
4
+ * Uses caching with backoff for rate limiting. Returns null on failure.
5
+ */
6
+ export declare function fetchUsageData(): Promise<UsageData | null>;
7
+ //# sourceMappingURL=usage-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-api.d.ts","sourceRoot":"","sources":["../../src/cli/hud/usage-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqB5C;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiFhE"}
@@ -0,0 +1,84 @@
1
+ import * as fs from 'node:fs';
2
+ import { readCache, writeCache, readCacheStale } from './cache.js';
3
+ import { getCredentials } from './credentials.js';
4
+ const USAGE_CACHE_KEY = 'usage';
5
+ const USAGE_CACHE_TTL = 5 * 60 * 1000; // 5 minutes
6
+ const USAGE_FAIL_TTL = 15 * 1000; // 15 seconds
7
+ const API_TIMEOUT = 1_500; // Must fit within 2s overall HUD timeout
8
+ const BACKOFF_CACHE_KEY = 'usage-backoff';
9
+ const DEBUG = !!process.env.DEVFLOW_HUD_DEBUG;
10
+ function debugLog(msg, data) {
11
+ if (!DEBUG)
12
+ return;
13
+ const entry = { ts: new Date().toISOString(), source: 'usage-api', msg, ...data };
14
+ fs.appendFileSync('/tmp/hud-debug.log', JSON.stringify(entry) + '\n');
15
+ }
16
+ /**
17
+ * Fetch usage quota data from the Anthropic API.
18
+ * Uses caching with backoff for rate limiting. Returns null on failure.
19
+ */
20
+ export async function fetchUsageData() {
21
+ // Check backoff
22
+ const backoff = readCache(BACKOFF_CACHE_KEY);
23
+ if (backoff && Date.now() < backoff.retryAfter) {
24
+ debugLog('skipped: backoff active', { retryAfter: backoff.retryAfter });
25
+ return readCacheStale(USAGE_CACHE_KEY);
26
+ }
27
+ // Check cache
28
+ const cached = readCache(USAGE_CACHE_KEY);
29
+ if (cached)
30
+ return cached;
31
+ const creds = await getCredentials();
32
+ if (!creds) {
33
+ debugLog('no OAuth credentials found');
34
+ return null;
35
+ }
36
+ const token = creds.accessToken;
37
+ try {
38
+ const controller = new AbortController();
39
+ const timeout = setTimeout(() => controller.abort(), API_TIMEOUT);
40
+ debugLog('fetching usage', { timeout: API_TIMEOUT });
41
+ const response = await fetch('https://api.anthropic.com/api/oauth/usage', {
42
+ headers: {
43
+ Authorization: `Bearer ${token}`,
44
+ 'Content-Type': 'application/json',
45
+ 'anthropic-beta': 'oauth-2025-04-20',
46
+ },
47
+ signal: controller.signal,
48
+ });
49
+ clearTimeout(timeout);
50
+ if (response.status === 429) {
51
+ const retryAfter = parseInt(response.headers.get('Retry-After') || '60', 10);
52
+ const delay = Math.min(retryAfter * 1000, 5 * 60 * 1000);
53
+ writeCache(BACKOFF_CACHE_KEY, { retryAfter: Date.now() + delay, delay }, delay);
54
+ debugLog('rate limited (429)', { retryAfter, delay });
55
+ return readCacheStale(USAGE_CACHE_KEY);
56
+ }
57
+ if (!response.ok) {
58
+ debugLog('non-200 response', { status: response.status, statusText: response.statusText });
59
+ writeCache(USAGE_CACHE_KEY, null, USAGE_FAIL_TTL);
60
+ return readCacheStale(USAGE_CACHE_KEY);
61
+ }
62
+ const body = (await response.json());
63
+ const fiveHour = body.five_hour;
64
+ const sevenDay = body.seven_day;
65
+ const data = {
66
+ fiveHourPercent: typeof fiveHour?.utilization === 'number'
67
+ ? Math.round(Math.max(0, Math.min(100, fiveHour.utilization)))
68
+ : null,
69
+ sevenDayPercent: typeof sevenDay?.utilization === 'number'
70
+ ? Math.round(Math.max(0, Math.min(100, sevenDay.utilization)))
71
+ : null,
72
+ };
73
+ debugLog('usage fetched', { fiveHour: data.fiveHourPercent, sevenDay: data.sevenDayPercent });
74
+ writeCache(USAGE_CACHE_KEY, data, USAGE_CACHE_TTL);
75
+ return data;
76
+ }
77
+ catch (err) {
78
+ const message = err instanceof Error ? err.message : String(err);
79
+ debugLog('fetch failed', { error: message });
80
+ writeCache(USAGE_CACHE_KEY, null, USAGE_FAIL_TTL);
81
+ return readCacheStale(USAGE_CACHE_KEY);
82
+ }
83
+ }
84
+ //# sourceMappingURL=usage-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-api.js","sourceRoot":"","sources":["../../src/cli/hud/usage-api.ts"],"names":[],"mappings":"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"}
package/scripts/hud.sh ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ # DevFlow HUD — configurable TypeScript status line
3
+ # Receives JSON via stdin from Claude Code, outputs ANSI-formatted HUD
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ exec node "${SCRIPT_DIR}/hud/index.js"