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.
- package/CHANGELOG.md +45 -0
- package/README.md +31 -0
- package/dist/cli.js +3 -1
- package/dist/commands/hud.d.ts +22 -0
- package/dist/commands/hud.js +180 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +114 -5
- package/dist/commands/list.js +1 -0
- package/dist/commands/uninstall.js +9 -16
- package/dist/hud/cache.d.ts +14 -0
- package/dist/hud/cache.js +54 -0
- package/dist/hud/colors.d.ts +23 -0
- package/dist/hud/colors.js +62 -0
- package/dist/hud/components/config-counts.d.ts +8 -0
- package/dist/hud/components/config-counts.js +91 -0
- package/dist/hud/components/context-usage.d.ts +8 -0
- package/dist/hud/components/context-usage.js +49 -0
- package/dist/hud/components/diff-stats.d.ts +3 -0
- package/dist/hud/components/diff-stats.js +36 -0
- package/dist/hud/components/directory.d.ts +3 -0
- package/dist/hud/components/directory.js +10 -0
- package/dist/hud/components/git-ahead-behind.d.ts +3 -0
- package/dist/hud/components/git-ahead-behind.js +16 -0
- package/dist/hud/components/git-branch.d.ts +3 -0
- package/dist/hud/components/git-branch.js +14 -0
- package/dist/hud/components/model.d.ts +3 -0
- package/dist/hud/components/model.js +21 -0
- package/dist/hud/components/release-info.d.ts +3 -0
- package/dist/hud/components/release-info.js +9 -0
- package/dist/hud/components/session-cost.d.ts +3 -0
- package/dist/hud/components/session-cost.js +9 -0
- package/dist/hud/components/session-duration.d.ts +3 -0
- package/dist/hud/components/session-duration.js +18 -0
- package/dist/hud/components/todo-progress.d.ts +3 -0
- package/dist/hud/components/todo-progress.js +11 -0
- package/dist/hud/components/usage-quota.d.ts +3 -0
- package/dist/hud/components/usage-quota.js +45 -0
- package/dist/hud/components/version-badge.d.ts +3 -0
- package/dist/hud/components/version-badge.js +80 -0
- package/dist/hud/components/worktree-count.d.ts +3 -0
- package/dist/hud/components/worktree-count.js +8 -0
- package/dist/hud/config.d.ts +10 -0
- package/dist/hud/config.js +55 -0
- package/dist/hud/credentials.d.ts +17 -0
- package/dist/hud/credentials.js +99 -0
- package/dist/hud/git.d.ts +7 -0
- package/dist/hud/git.js +153 -0
- package/dist/hud/index.d.ts +2 -0
- package/dist/hud/index.js +81 -0
- package/dist/hud/render.d.ts +7 -0
- package/dist/hud/render.js +111 -0
- package/dist/hud/stdin.d.ts +6 -0
- package/dist/hud/stdin.js +25 -0
- package/dist/hud/transcript.d.ts +7 -0
- package/dist/hud/transcript.js +130 -0
- package/dist/hud/types.d.ts +116 -0
- package/dist/hud/types.js +2 -0
- package/dist/hud/usage-api.d.ts +7 -0
- package/dist/hud/usage-api.js +84 -0
- package/dist/utils/manifest.d.ts +1 -0
- package/package.json +5 -2
- package/plugins/devflow-accessibility/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-ambient/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-ambient/agents/scrutinizer.md +6 -4
- package/plugins/devflow-ambient/agents/shepherd.md +26 -12
- package/plugins/devflow-ambient/agents/simplifier.md +24 -15
- package/plugins/devflow-ambient/agents/skimmer.md +71 -21
- package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-code-review/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-core-skills/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-debug/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-frontend-design/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-go/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-implement/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-implement/agents/scrutinizer.md +6 -4
- package/plugins/devflow-implement/agents/shepherd.md +26 -12
- package/plugins/devflow-implement/agents/simplifier.md +24 -15
- package/plugins/devflow-implement/agents/skimmer.md +71 -21
- package/plugins/devflow-implement/commands/implement-teams.md +1 -1
- package/plugins/devflow-implement/commands/implement.md +1 -1
- package/plugins/devflow-implement/skills/self-review/references/stub-detection.md +135 -0
- package/plugins/devflow-java/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-python/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-react/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-resolve/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-resolve/agents/simplifier.md +24 -15
- package/plugins/devflow-rust/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-self-review/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-self-review/agents/scrutinizer.md +6 -4
- package/plugins/devflow-self-review/agents/simplifier.md +24 -15
- package/plugins/devflow-self-review/skills/self-review/references/stub-detection.md +135 -0
- package/plugins/devflow-specify/.claude-plugin/plugin.json +1 -1
- package/plugins/devflow-specify/agents/skimmer.md +71 -21
- package/plugins/devflow-specify/commands/specify-teams.md +1 -1
- package/plugins/devflow-specify/commands/specify.md +1 -1
- package/plugins/devflow-typescript/.claude-plugin/plugin.json +1 -1
- package/scripts/hud/cache.d.ts +14 -0
- package/scripts/hud/cache.d.ts.map +1 -0
- package/scripts/hud/cache.js +54 -0
- package/scripts/hud/cache.js.map +1 -0
- package/scripts/hud/colors.d.ts +23 -0
- package/scripts/hud/colors.d.ts.map +1 -0
- package/scripts/hud/colors.js +62 -0
- package/scripts/hud/colors.js.map +1 -0
- package/scripts/hud/components/config-counts.d.ts +8 -0
- package/scripts/hud/components/config-counts.d.ts.map +1 -0
- package/scripts/hud/components/config-counts.js +91 -0
- package/scripts/hud/components/config-counts.js.map +1 -0
- package/scripts/hud/components/context-usage.d.ts +8 -0
- package/scripts/hud/components/context-usage.d.ts.map +1 -0
- package/scripts/hud/components/context-usage.js +49 -0
- package/scripts/hud/components/context-usage.js.map +1 -0
- package/scripts/hud/components/diff-stats.d.ts +3 -0
- package/scripts/hud/components/diff-stats.d.ts.map +1 -0
- package/scripts/hud/components/diff-stats.js +36 -0
- package/scripts/hud/components/diff-stats.js.map +1 -0
- package/scripts/hud/components/directory.d.ts +3 -0
- package/scripts/hud/components/directory.d.ts.map +1 -0
- package/scripts/hud/components/directory.js +10 -0
- package/scripts/hud/components/directory.js.map +1 -0
- package/scripts/hud/components/git-ahead-behind.d.ts +3 -0
- package/scripts/hud/components/git-ahead-behind.d.ts.map +1 -0
- package/scripts/hud/components/git-ahead-behind.js +16 -0
- package/scripts/hud/components/git-ahead-behind.js.map +1 -0
- package/scripts/hud/components/git-branch.d.ts +3 -0
- package/scripts/hud/components/git-branch.d.ts.map +1 -0
- package/scripts/hud/components/git-branch.js +14 -0
- package/scripts/hud/components/git-branch.js.map +1 -0
- package/scripts/hud/components/model.d.ts +3 -0
- package/scripts/hud/components/model.d.ts.map +1 -0
- package/scripts/hud/components/model.js +21 -0
- package/scripts/hud/components/model.js.map +1 -0
- package/scripts/hud/components/release-info.d.ts +3 -0
- package/scripts/hud/components/release-info.d.ts.map +1 -0
- package/scripts/hud/components/release-info.js +9 -0
- package/scripts/hud/components/release-info.js.map +1 -0
- package/scripts/hud/components/session-cost.d.ts +3 -0
- package/scripts/hud/components/session-cost.d.ts.map +1 -0
- package/scripts/hud/components/session-cost.js +9 -0
- package/scripts/hud/components/session-cost.js.map +1 -0
- package/scripts/hud/components/session-duration.d.ts +3 -0
- package/scripts/hud/components/session-duration.d.ts.map +1 -0
- package/scripts/hud/components/session-duration.js +18 -0
- package/scripts/hud/components/session-duration.js.map +1 -0
- package/scripts/hud/components/todo-progress.d.ts +3 -0
- package/scripts/hud/components/todo-progress.d.ts.map +1 -0
- package/scripts/hud/components/todo-progress.js +11 -0
- package/scripts/hud/components/todo-progress.js.map +1 -0
- package/scripts/hud/components/usage-quota.d.ts +3 -0
- package/scripts/hud/components/usage-quota.d.ts.map +1 -0
- package/scripts/hud/components/usage-quota.js +45 -0
- package/scripts/hud/components/usage-quota.js.map +1 -0
- package/scripts/hud/components/version-badge.d.ts +3 -0
- package/scripts/hud/components/version-badge.d.ts.map +1 -0
- package/scripts/hud/components/version-badge.js +80 -0
- package/scripts/hud/components/version-badge.js.map +1 -0
- package/scripts/hud/components/worktree-count.d.ts +3 -0
- package/scripts/hud/components/worktree-count.d.ts.map +1 -0
- package/scripts/hud/components/worktree-count.js +8 -0
- package/scripts/hud/components/worktree-count.js.map +1 -0
- package/scripts/hud/config.d.ts +10 -0
- package/scripts/hud/config.d.ts.map +1 -0
- package/scripts/hud/config.js +55 -0
- package/scripts/hud/config.js.map +1 -0
- package/scripts/hud/credentials.d.ts +17 -0
- package/scripts/hud/credentials.d.ts.map +1 -0
- package/scripts/hud/credentials.js +99 -0
- package/scripts/hud/credentials.js.map +1 -0
- package/scripts/hud/git.d.ts +7 -0
- package/scripts/hud/git.d.ts.map +1 -0
- package/scripts/hud/git.js +153 -0
- package/scripts/hud/git.js.map +1 -0
- package/scripts/hud/index.d.ts +2 -0
- package/scripts/hud/index.d.ts.map +1 -0
- package/scripts/hud/index.js +81 -0
- package/scripts/hud/index.js.map +1 -0
- package/scripts/hud/render.d.ts +7 -0
- package/scripts/hud/render.d.ts.map +1 -0
- package/scripts/hud/render.js +111 -0
- package/scripts/hud/render.js.map +1 -0
- package/scripts/hud/stdin.d.ts +6 -0
- package/scripts/hud/stdin.d.ts.map +1 -0
- package/scripts/hud/stdin.js +25 -0
- package/scripts/hud/stdin.js.map +1 -0
- package/scripts/hud/transcript.d.ts +7 -0
- package/scripts/hud/transcript.d.ts.map +1 -0
- package/scripts/hud/transcript.js +130 -0
- package/scripts/hud/transcript.js.map +1 -0
- package/scripts/hud/types.d.ts +116 -0
- package/scripts/hud/types.d.ts.map +1 -0
- package/scripts/hud/types.js +2 -0
- package/scripts/hud/types.js.map +1 -0
- package/scripts/hud/usage-api.d.ts +7 -0
- package/scripts/hud/usage-api.d.ts.map +1 -0
- package/scripts/hud/usage-api.js +84 -0
- package/scripts/hud/usage-api.js.map +1 -0
- package/scripts/hud.sh +5 -0
- package/shared/agents/scrutinizer.md +6 -4
- package/shared/agents/shepherd.md +26 -12
- package/shared/agents/simplifier.md +24 -15
- package/shared/agents/skimmer.md +71 -21
- package/shared/skills/self-review/references/stub-detection.md +135 -0
- package/src/templates/settings.json +1 -1
|
@@ -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,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,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,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
|
package/dist/utils/manifest.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devflow-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"description": "Agentic Development Toolkit for Claude Code - Enhance AI-assisted development with intelligent commands and workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,15 +12,18 @@
|
|
|
12
12
|
"plugins/",
|
|
13
13
|
"shared/",
|
|
14
14
|
"scripts/hooks/",
|
|
15
|
+
"scripts/hud.sh",
|
|
16
|
+
"scripts/hud/",
|
|
15
17
|
"src/templates/",
|
|
16
18
|
"README.md",
|
|
17
19
|
"LICENSE",
|
|
18
20
|
"CHANGELOG.md"
|
|
19
21
|
],
|
|
20
22
|
"scripts": {
|
|
21
|
-
"build": "npm run build:cli && npm run build:plugins",
|
|
23
|
+
"build": "npm run build:cli && npm run build:plugins && npm run build:hud",
|
|
22
24
|
"build:cli": "tsc",
|
|
23
25
|
"build:plugins": "npx tsx scripts/build-plugins.ts",
|
|
26
|
+
"build:hud": "node scripts/build-hud.js",
|
|
24
27
|
"dev": "tsc --watch",
|
|
25
28
|
"cli": "node dist/cli.js",
|
|
26
29
|
"prepublishOnly": "npm run build",
|
|
@@ -21,13 +21,15 @@ You receive from orchestrator:
|
|
|
21
21
|
|
|
22
22
|
2. **Evaluate P0 pillars** (Design, Functionality, Security): These MUST pass. Fix all issues found.
|
|
23
23
|
|
|
24
|
-
3. **
|
|
24
|
+
3. **Detect stubs and wiring gaps**: Check for placeholder implementations that compile but don't deliver real functionality. See `references/stub-detection.md` for patterns. Flag as P0-Functionality issues.
|
|
25
25
|
|
|
26
|
-
4. **Evaluate
|
|
26
|
+
4. **Evaluate P1 pillars** (Complexity, Error Handling, Tests): These SHOULD pass. Fix all issues found.
|
|
27
27
|
|
|
28
|
-
5. **
|
|
28
|
+
5. **Evaluate P2 pillars** (Naming, Consistency, Documentation): Report as suggestions. Fix if straightforward.
|
|
29
29
|
|
|
30
|
-
6. **
|
|
30
|
+
6. **Commit fixes**: If any changes were made, create a commit with message "fix: address self-review issues".
|
|
31
|
+
|
|
32
|
+
7. **Report status**: Return structured report with pillar evaluations and changes made.
|
|
31
33
|
|
|
32
34
|
## Principles
|
|
33
35
|
|
|
@@ -21,9 +21,19 @@ You receive from orchestrator:
|
|
|
21
21
|
|
|
22
22
|
1. **Understand intent**: Read ORIGINAL_REQUEST and EXECUTION_PLAN to understand what was requested
|
|
23
23
|
2. **Review implementation**: Read FILES_CHANGED to understand what was built
|
|
24
|
-
3. **
|
|
25
|
-
4. **Check
|
|
26
|
-
|
|
24
|
+
3. **Goal-backward verification**: Start from the user's observable goals. For each goal: trace backward through the implementation — is it wired into the running app → does it contain substantive logic → does the file/function exist? Report any goal failing at any depth.
|
|
25
|
+
4. **Check artifact depth**: Classify each deliverable using this scale:
|
|
26
|
+
|
|
27
|
+
| Depth | Meaning | Example |
|
|
28
|
+
|-------|---------|---------|
|
|
29
|
+
| Exists | File/function created | Route file exists |
|
|
30
|
+
| Substantive | Contains real logic | Route has validation + DB call |
|
|
31
|
+
| Wired | Connected to running app | Route registered, imported, reachable |
|
|
32
|
+
|
|
33
|
+
Flag anything at "Exists" without reaching "Wired" as `incomplete`.
|
|
34
|
+
5. **Check completeness**: Verify all plan steps implemented, all acceptance criteria met
|
|
35
|
+
6. **Check scope**: Identify out-of-scope additions not justified by design improvements
|
|
36
|
+
7. **Report misalignments**: Document issues with sufficient detail for Coder to fix
|
|
27
37
|
|
|
28
38
|
## Principles
|
|
29
39
|
|
|
@@ -51,6 +61,11 @@ Return structured alignment status:
|
|
|
51
61
|
- Implementation solves: {1-sentence summary}
|
|
52
62
|
- Alignment: aligned | drifted
|
|
53
63
|
|
|
64
|
+
### Artifact Depth
|
|
65
|
+
| Deliverable | Exists | Substantive | Wired | Status |
|
|
66
|
+
|-------------|--------|-------------|-------|--------|
|
|
67
|
+
| {feature} | Y/N | Y/N | Y/N | complete/incomplete/stub |
|
|
68
|
+
|
|
54
69
|
### Misalignments Found (if MISALIGNED)
|
|
55
70
|
|
|
56
71
|
| Type | Description | Files | Suggested Fix |
|
|
@@ -59,20 +74,17 @@ Return structured alignment status:
|
|
|
59
74
|
| scope_creep | {what's out of scope} | {file paths} | {remove or justify} |
|
|
60
75
|
| incomplete | {what's partially done} | {file paths} | {what remains} |
|
|
61
76
|
| intent_drift | {how intent drifted} | {file paths} | {how to realign} |
|
|
77
|
+
| stub | {placeholder, not real logic} | {file paths} | {what real implementation needs} |
|
|
62
78
|
|
|
63
79
|
### Scope Check
|
|
64
80
|
- Out-of-scope additions: {list or "None"}
|
|
65
81
|
- Justification: {if additions found, are they justified design improvements?}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Misalignment Types
|
|
69
82
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
|
74
|
-
|
|
75
|
-
| `intent_drift` | Implementation solves different problem | "Built password reset instead of login flow" |
|
|
83
|
+
### Re-verification (if applicable)
|
|
84
|
+
| Previously Failed | Status | Notes |
|
|
85
|
+
|-------------------|--------|-------|
|
|
86
|
+
| {item} | RESOLVED/STILL_FAILING | {details} |
|
|
87
|
+
```
|
|
76
88
|
|
|
77
89
|
## Boundaries
|
|
78
90
|
|
|
@@ -81,12 +93,14 @@ Return structured alignment status:
|
|
|
81
93
|
- Out-of-scope additions not justified by design
|
|
82
94
|
- Partial implementations
|
|
83
95
|
- Intent drift
|
|
96
|
+
- Stubs or placeholders passing as real implementations
|
|
84
97
|
|
|
85
98
|
**Report as ALIGNED:**
|
|
86
99
|
- All plan steps implemented
|
|
87
100
|
- All acceptance criteria met
|
|
88
101
|
- No unjustified scope additions
|
|
89
102
|
- Implementation matches original intent
|
|
103
|
+
- All deliverables reach "Wired" depth
|
|
90
104
|
|
|
91
105
|
**Never:**
|
|
92
106
|
- Modify code or create commits
|
|
@@ -30,31 +30,39 @@ Analyze recently modified code and apply refinements that:
|
|
|
30
30
|
- Use proper error handling patterns (avoid try/catch when possible)
|
|
31
31
|
- Maintain consistent naming conventions
|
|
32
32
|
|
|
33
|
-
3. **
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
33
|
+
3. **Remove Slop**: Detect and remove these categories:
|
|
34
|
+
|
|
35
|
+
| Category | Pattern |
|
|
36
|
+
|----------|---------|
|
|
37
|
+
| Language-behavior tests | Tests verifying built-in language features work as documented |
|
|
38
|
+
| Redundant type checks | Runtime checks for types TypeScript already enforces |
|
|
39
|
+
| Over-defensive handling | try/catch around code that cannot throw |
|
|
40
|
+
| Debug remnants | console.log, debugger, alert() left behind |
|
|
41
|
+
| Commented-out code | Dead code preserved in comments |
|
|
42
|
+
| Unused imports | Imports not referenced anywhere in file |
|
|
43
|
+
| Verbose names | Unnecessarily long names (`currentUserDataObject` → `user`) |
|
|
44
|
+
| Unnecessary intermediates | Variables used once, immediately after assignment |
|
|
45
|
+
|
|
46
|
+
4. **Enhance Clarity**: Simplify code structure by:
|
|
47
|
+
|
|
48
|
+
- Reducing unnecessary nesting (early returns, guard clauses)
|
|
38
49
|
- Consolidating related logic
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
- Choose clarity over brevity - explicit code is often better than overly compact code
|
|
50
|
+
- Avoiding nested ternary operators — prefer switch or if/else
|
|
51
|
+
- Choosing clarity over brevity — explicit code beats compact code
|
|
42
52
|
|
|
43
|
-
|
|
53
|
+
5. **Maintain Balance**: Avoid over-simplification that could:
|
|
44
54
|
|
|
45
|
-
- Reduce code clarity or maintainability
|
|
46
55
|
- Create overly clever solutions that are hard to understand
|
|
47
56
|
- Combine too many concerns into single functions or components
|
|
48
57
|
- Remove helpful abstractions that improve code organization
|
|
49
|
-
- Prioritize "fewer lines" over readability (e.g., nested ternaries, dense one-liners)
|
|
50
58
|
- Make the code harder to debug or extend
|
|
51
59
|
|
|
52
|
-
|
|
60
|
+
6. **Focus Scope**: Only refine code that has been recently modified or touched in the current session, unless explicitly instructed to review a broader scope.
|
|
53
61
|
|
|
54
62
|
Your refinement process:
|
|
55
63
|
|
|
56
64
|
1. Identify the recently modified code sections
|
|
57
|
-
2. Analyze for
|
|
65
|
+
2. Analyze for slop categories and clarity improvements
|
|
58
66
|
3. Apply project-specific best practices and coding standards
|
|
59
67
|
4. Ensure all functionality remains unchanged
|
|
60
68
|
5. Verify the refined code is simpler and more maintainable
|
|
@@ -87,7 +95,8 @@ Return structured completion status:
|
|
|
87
95
|
- Files outside the recently modified scope (unless instructed)
|
|
88
96
|
|
|
89
97
|
**Handle autonomously:**
|
|
90
|
-
-
|
|
98
|
+
- Slop removal (all 8 categories)
|
|
99
|
+
- Naming improvements, nesting reduction
|
|
91
100
|
- Import sorting and organization
|
|
92
101
|
- Redundant abstraction elimination
|
|
93
|
-
- Comment cleanup (remove obvious, keep non-obvious)
|
|
102
|
+
- Comment cleanup (remove obvious, keep non-obvious)
|