aiblueprint-cli 1.4.59 → 1.4.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -36
- package/agents-config/agents/action.md +1 -1
- package/agents-config/agents/explore-codebase.md +53 -53
- package/agents-config/agents/explore-docs.md +50 -69
- package/agents-config/agents/websearch.md +36 -40
- package/agents-config/claude-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
- package/agents-config/claude-config/scripts/CLAUDE.md +10 -4
- package/agents-config/claude-config/scripts/bun.lockb +0 -0
- package/agents-config/claude-config/scripts/package.json +22 -30
- package/agents-config/claude-config/scripts/statusline/CLAUDE.md +37 -155
- package/agents-config/claude-config/scripts/statusline/README.md +18 -94
- package/agents-config/claude-config/scripts/statusline/defaults.json +13 -10
- package/agents-config/claude-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -4
- package/agents-config/claude-config/scripts/statusline/fixtures/test-input.json +4 -4
- package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +403 -0
- package/agents-config/claude-config/scripts/statusline/src/index.ts +33 -82
- package/agents-config/claude-config/scripts/statusline/src/lib/config-types.ts +7 -1
- package/agents-config/claude-config/scripts/statusline/src/lib/formatters.ts +40 -0
- package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
- package/agents-config/claude-config/scripts/statusline/src/lib/render-pure.ts +24 -5
- package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +79 -0
- package/agents-config/claude-config/scripts/statusline/statusline.config.json +77 -77
- package/agents-config/commands/prompts/create-vitejs-app.md +272 -0
- package/agents-config/commands/prompts/nextjs-add-prisma-db.md +136 -0
- package/agents-config/commands/prompts/nextjs-setup-better-auth.md +173 -0
- package/agents-config/commands/prompts/nextjs-setup-project.md +200 -0
- package/agents-config/commands/prompts/prompt.md +55 -0
- package/agents-config/commands/prompts/saas-challenge-idea.md +135 -0
- package/agents-config/commands/prompts/saas-create-architecture.md +242 -0
- package/agents-config/commands/prompts/saas-create-headline.md +132 -0
- package/agents-config/commands/prompts/saas-create-landing-copywritting.md +267 -0
- package/agents-config/commands/prompts/saas-create-legals-docs.md +176 -0
- package/agents-config/commands/prompts/saas-create-logos.md +240 -0
- package/agents-config/commands/prompts/saas-create-prd.md +195 -0
- package/agents-config/commands/prompts/saas-create-tasks.md +240 -0
- package/agents-config/commands/prompts/saas-define-pricing.md +293 -0
- package/agents-config/commands/prompts/saas-find-domain-name.md +190 -0
- package/agents-config/commands/prompts/saas-implement-landing-page.md +257 -0
- package/agents-config/commands/prompts/setup-tmux.md +160 -0
- package/agents-config/commands/prompts/tools.md +148 -0
- package/agents-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
- package/agents-config/scripts/CLAUDE.md +37 -0
- package/agents-config/scripts/biome.json +37 -0
- package/agents-config/scripts/bun.lockb +0 -0
- package/agents-config/scripts/package.json +24 -0
- package/agents-config/scripts/statusline/CLAUDE.md +87 -0
- package/agents-config/scripts/statusline/README.md +117 -0
- package/agents-config/scripts/statusline/__tests__/context.test.ts +229 -0
- package/agents-config/scripts/statusline/__tests__/formatters.test.ts +108 -0
- package/agents-config/scripts/statusline/__tests__/statusline.test.ts +309 -0
- package/agents-config/scripts/statusline/defaults.json +82 -0
- package/agents-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -0
- package/agents-config/scripts/statusline/fixtures/test-input.json +35 -0
- package/agents-config/scripts/statusline/src/commands/interactive-config.ts +403 -0
- package/agents-config/scripts/statusline/src/index.ts +141 -0
- package/agents-config/scripts/statusline/src/lib/config-types.ts +110 -0
- package/agents-config/scripts/statusline/src/lib/config.ts +21 -0
- package/agents-config/scripts/statusline/src/lib/context.ts +103 -0
- package/agents-config/scripts/statusline/src/lib/formatters.ts +426 -0
- package/agents-config/scripts/statusline/src/lib/git.ts +100 -0
- package/agents-config/scripts/statusline/src/lib/menu-factories.ts +224 -0
- package/agents-config/scripts/statusline/src/lib/presets.ts +177 -0
- package/agents-config/scripts/statusline/src/lib/render-pure.ts +516 -0
- package/agents-config/scripts/statusline/src/lib/types.ts +36 -0
- package/agents-config/scripts/statusline/src/lib/utils.ts +15 -0
- package/agents-config/scripts/statusline/statusline.config.free.json +79 -0
- package/agents-config/scripts/statusline/statusline.config.json +79 -0
- package/agents-config/scripts/statusline/test-with-fixtures.ts +37 -0
- package/agents-config/scripts/statusline/test.ts +20 -0
- package/agents-config/scripts/statusline/tsconfig.json +27 -0
- package/agents-config/scripts/tsconfig.json +27 -0
- package/agents-config/skills/{subagent-creator → agents-managers}/SKILL.md +47 -47
- package/agents-config/skills/{subagent-creator/references/subagents.md → agents-managers/references/agents.md} +45 -45
- package/agents-config/skills/{subagent-creator → agents-managers}/references/context-management.md +20 -20
- package/agents-config/skills/{subagent-creator → agents-managers}/references/debugging-agents.md +27 -27
- package/agents-config/skills/{subagent-creator → agents-managers}/references/error-handling-and-recovery.md +19 -19
- package/agents-config/skills/{subagent-creator → agents-managers}/references/evaluation-and-testing.md +29 -29
- package/agents-config/skills/{subagent-creator → agents-managers}/references/orchestration-patterns.md +5 -5
- package/agents-config/skills/{subagent-creator/references/writing-subagent-prompts.md → agents-managers/references/writing-agent-prompts.md} +23 -23
- package/agents-config/skills/codex-environment/SKILL.md +2 -0
- package/agents-config/skills/commit/SKILL.md +2 -0
- package/agents-config/skills/create-pr/SKILL.md +2 -0
- package/agents-config/skills/environments-manager/SKILL.md +271 -0
- package/agents-config/skills/environments-manager/examples/claude/.worktreeinclude +3 -0
- package/agents-config/skills/environments-manager/examples/claude/commands/dev.md +5 -0
- package/agents-config/skills/environments-manager/examples/claude/commands/lint.md +5 -0
- package/agents-config/skills/environments-manager/examples/claude/commands/test.md +5 -0
- package/agents-config/skills/environments-manager/examples/claude/commands/typecheck.md +5 -0
- package/agents-config/skills/environments-manager/examples/claude/settings.json +24 -0
- package/agents-config/skills/environments-manager/examples/codex/environments/environment.toml +29 -0
- package/agents-config/skills/environments-manager/examples/cursor/worktrees.json +3 -0
- package/agents-config/skills/environments-manager/examples/scripts/claude-worktree-create.sh +96 -0
- package/agents-config/skills/environments-manager/examples/scripts/claude-worktree-remove.sh +66 -0
- package/agents-config/skills/environments-manager/examples/scripts/dev.sh +15 -0
- package/agents-config/skills/environments-manager/examples/scripts/worktree-down.sh +22 -0
- package/agents-config/skills/environments-manager/examples/scripts/worktree-up.sh +50 -0
- package/agents-config/skills/environments-manager/references/claude.md +156 -0
- package/agents-config/skills/environments-manager/references/codex.md +97 -0
- package/agents-config/skills/environments-manager/references/cursor.md +88 -0
- package/agents-config/skills/fix-pr-comments/SKILL.md +2 -0
- package/agents-config/skills/grill-me/SKILL.md +10 -0
- package/agents-config/skills/merge/SKILL.md +2 -0
- package/agents-config/skills/rules-manager/SKILL.md +191 -0
- package/agents-config/skills/rules-manager/references/agents-vs-claude.md +66 -0
- package/agents-config/skills/rules-manager/references/examples.md +117 -0
- package/agents-config/skills/skill-manager/SKILL.md +83 -0
- package/agents-config/skills/skill-manager/references/claude-code.md +81 -0
- package/agents-config/skills/skill-manager/references/codex.md +288 -0
- package/agents-config/skills/skill-manager/references/cursor.md +125 -0
- package/agents-config/skills/ultrathink/SKILL.md +2 -0
- package/package.json +1 -1
- package/agents-config/claude-config/scripts/statusline/data/.gitignore +0 -8
- package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
- package/agents-config/claude-config/scripts/statusline/docs/ARCHITECTURE.md +0 -166
- package/agents-config/claude-config/scripts/statusline/src/tests/spend-v2.test.ts +0 -306
- package/agents-config/skills/apex/SKILL.md +0 -261
- package/agents-config/skills/apex/scripts/setup-templates.sh +0 -100
- package/agents-config/skills/apex/scripts/update-progress.sh +0 -80
- package/agents-config/skills/apex/steps/step-00-init.md +0 -267
- package/agents-config/skills/apex/steps/step-00b-branch.md +0 -126
- package/agents-config/skills/apex/steps/step-00b-economy.md +0 -244
- package/agents-config/skills/apex/steps/step-00b-interactive.md +0 -153
- package/agents-config/skills/apex/steps/step-01-analyze.md +0 -361
- package/agents-config/skills/apex/steps/step-02-plan.md +0 -264
- package/agents-config/skills/apex/steps/step-03-execute.md +0 -239
- package/agents-config/skills/apex/steps/step-04-validate.md +0 -251
- package/agents-config/skills/apex/templates/00-context.md +0 -43
- package/agents-config/skills/apex/templates/01-analyze.md +0 -10
- package/agents-config/skills/apex/templates/02-plan.md +0 -10
- package/agents-config/skills/apex/templates/03-execute.md +0 -10
- package/agents-config/skills/apex/templates/04-validate.md +0 -10
- package/agents-config/skills/apex/templates/README.md +0 -176
- package/agents-config/skills/apex/templates/step-complete.md +0 -7
- package/agents-config/skills/claude-memory/SKILL.md +0 -293
- package/agents-config/skills/claude-memory/references/comprehensive-example.md +0 -175
- package/agents-config/skills/claude-memory/references/optimize-guide.md +0 -300
- package/agents-config/skills/claude-memory/references/project-patterns.md +0 -334
- package/agents-config/skills/claude-memory/references/prompting-techniques.md +0 -411
- package/agents-config/skills/claude-memory/references/rules-directory-guide.md +0 -298
- package/agents-config/skills/claude-memory/references/section-templates.md +0 -347
- package/agents-config/skills/fix-errors/SKILL.md +0 -61
- package/agents-config/skills/fix-grammar/SKILL.md +0 -59
- package/agents-config/skills/ralph-loop/SKILL.md +0 -117
- package/agents-config/skills/ralph-loop/scripts/setup.sh +0 -278
- package/agents-config/skills/ralph-loop/steps/step-00-init.md +0 -215
- package/agents-config/skills/ralph-loop/steps/step-01-interactive-prd.md +0 -366
- package/agents-config/skills/ralph-loop/steps/step-02-create-stories.md +0 -273
- package/agents-config/skills/ralph-loop/steps/step-03-finish.md +0 -245
- package/agents-config/skills/skill-creator/LICENSE.txt +0 -202
- package/agents-config/skills/skill-creator/SKILL.md +0 -421
- package/agents-config/skills/skill-creator/package.json +0 -5
- package/agents-config/skills/skill-creator/references/output-patterns.md +0 -82
- package/agents-config/skills/skill-creator/references/progressive-disclosure-patterns.md +0 -374
- package/agents-config/skills/skill-creator/references/prompting-integration.md +0 -363
- package/agents-config/skills/skill-creator/references/real-world-examples.md +0 -513
- package/agents-config/skills/skill-creator/references/script-patterns.md +0 -385
- package/agents-config/skills/skill-creator/references/workflows.md +0 -28
- package/agents-config/skills/skill-creator/references/xml-tag-guide.md +0 -606
- package/agents-config/skills/skill-creator/scripts/init-skill.ts +0 -214
- package/agents-config/skills/skill-creator/scripts/package-skill.ts +0 -146
- package/agents-config/skills/skill-creator/scripts/validate.ts +0 -138
- package/agents-config/skills/workflow-apex-free/SKILL.md +0 -261
- package/agents-config/skills/workflow-apex-free/scripts/setup-templates.sh +0 -100
- package/agents-config/skills/workflow-apex-free/scripts/update-progress.sh +0 -80
- package/agents-config/skills/workflow-apex-free/steps/step-00-init.md +0 -267
- package/agents-config/skills/workflow-apex-free/steps/step-00b-branch.md +0 -126
- package/agents-config/skills/workflow-apex-free/steps/step-00b-economy.md +0 -244
- package/agents-config/skills/workflow-apex-free/steps/step-00b-interactive.md +0 -153
- package/agents-config/skills/workflow-apex-free/steps/step-01-analyze.md +0 -361
- package/agents-config/skills/workflow-apex-free/steps/step-02-plan.md +0 -264
- package/agents-config/skills/workflow-apex-free/steps/step-03-execute.md +0 -239
- package/agents-config/skills/workflow-apex-free/steps/step-04-validate.md +0 -251
- package/agents-config/skills/workflow-apex-free/templates/00-context.md +0 -43
- package/agents-config/skills/workflow-apex-free/templates/01-analyze.md +0 -10
- package/agents-config/skills/workflow-apex-free/templates/02-plan.md +0 -10
- package/agents-config/skills/workflow-apex-free/templates/03-execute.md +0 -10
- package/agents-config/skills/workflow-apex-free/templates/04-validate.md +0 -10
- package/agents-config/skills/workflow-apex-free/templates/README.md +0 -176
- package/agents-config/skills/workflow-apex-free/templates/step-complete.md +0 -7
|
@@ -1,306 +0,0 @@
|
|
|
1
|
-
import { Database } from "bun:sqlite";
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
3
|
-
import { existsSync, rmSync } from "node:fs";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
const TEST_DB_PATH = join(import.meta.dir, "..", "..", "data", "test.db");
|
|
7
|
-
|
|
8
|
-
describe("SQLite Delta Tracking", () => {
|
|
9
|
-
let db: Database;
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
if (existsSync(TEST_DB_PATH)) {
|
|
13
|
-
rmSync(TEST_DB_PATH);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
db = new Database(TEST_DB_PATH);
|
|
17
|
-
|
|
18
|
-
db.run(`
|
|
19
|
-
CREATE TABLE sessions (
|
|
20
|
-
session_id TEXT PRIMARY KEY,
|
|
21
|
-
total_cost REAL NOT NULL DEFAULT 0,
|
|
22
|
-
cwd TEXT NOT NULL,
|
|
23
|
-
date TEXT NOT NULL,
|
|
24
|
-
duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
25
|
-
lines_added INTEGER NOT NULL DEFAULT 0,
|
|
26
|
-
lines_removed INTEGER NOT NULL DEFAULT 0,
|
|
27
|
-
last_resets_at TEXT
|
|
28
|
-
)
|
|
29
|
-
`);
|
|
30
|
-
|
|
31
|
-
db.run(`
|
|
32
|
-
CREATE TABLE session_period_tracking (
|
|
33
|
-
session_id TEXT NOT NULL,
|
|
34
|
-
period_id TEXT NOT NULL,
|
|
35
|
-
counted_cost REAL NOT NULL DEFAULT 0,
|
|
36
|
-
last_session_cost REAL NOT NULL DEFAULT 0,
|
|
37
|
-
PRIMARY KEY (session_id, period_id)
|
|
38
|
-
)
|
|
39
|
-
`);
|
|
40
|
-
|
|
41
|
-
db.run(`
|
|
42
|
-
CREATE TABLE periods (
|
|
43
|
-
period_id TEXT PRIMARY KEY,
|
|
44
|
-
total_cost REAL NOT NULL DEFAULT 0,
|
|
45
|
-
utilization INTEGER NOT NULL DEFAULT 0,
|
|
46
|
-
date TEXT NOT NULL
|
|
47
|
-
)
|
|
48
|
-
`);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
afterEach(() => {
|
|
52
|
-
db.close();
|
|
53
|
-
if (existsSync(TEST_DB_PATH)) {
|
|
54
|
-
rmSync(TEST_DB_PATH);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test("New session: full cost added to period", () => {
|
|
59
|
-
const sessionId = "session-1";
|
|
60
|
-
const periodId = "2025-12-09T10:00:00.000Z";
|
|
61
|
-
const sessionCost = 10.0;
|
|
62
|
-
|
|
63
|
-
db.run(
|
|
64
|
-
"INSERT INTO sessions (session_id, total_cost, cwd, date, last_resets_at) VALUES (?, ?, ?, ?, ?)",
|
|
65
|
-
[sessionId, sessionCost, "/test", "2025-12-09", periodId],
|
|
66
|
-
);
|
|
67
|
-
|
|
68
|
-
db.run(
|
|
69
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
70
|
-
[sessionId, periodId, sessionCost, sessionCost],
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
db.run(
|
|
74
|
-
"INSERT INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
75
|
-
[periodId, sessionCost, 0, "2025-12-09"],
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
const period = db
|
|
79
|
-
.query<{ total_cost: number }, [string]>(
|
|
80
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
81
|
-
)
|
|
82
|
-
.get(periodId);
|
|
83
|
-
|
|
84
|
-
expect(period?.total_cost).toBe(10.0);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("Continued session: only delta added to period", () => {
|
|
88
|
-
const sessionId = "session-1";
|
|
89
|
-
const periodId = "2025-12-09T10:00:00.000Z";
|
|
90
|
-
|
|
91
|
-
db.run(
|
|
92
|
-
"INSERT INTO sessions (session_id, total_cost, cwd, date, last_resets_at) VALUES (?, ?, ?, ?, ?)",
|
|
93
|
-
[sessionId, 10.0, "/test", "2025-12-09", periodId],
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
db.run(
|
|
97
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
98
|
-
[sessionId, periodId, 10.0, 10.0],
|
|
99
|
-
);
|
|
100
|
-
|
|
101
|
-
db.run(
|
|
102
|
-
"INSERT INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
103
|
-
[periodId, 10.0, 0, "2025-12-09"],
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const newSessionCost = 24.0;
|
|
107
|
-
const delta = newSessionCost - 10.0;
|
|
108
|
-
|
|
109
|
-
db.run("UPDATE sessions SET total_cost = ? WHERE session_id = ?", [
|
|
110
|
-
newSessionCost,
|
|
111
|
-
sessionId,
|
|
112
|
-
]);
|
|
113
|
-
|
|
114
|
-
const tracking = db
|
|
115
|
-
.query<
|
|
116
|
-
{ counted_cost: number; last_session_cost: number },
|
|
117
|
-
[string, string]
|
|
118
|
-
>(
|
|
119
|
-
"SELECT counted_cost, last_session_cost FROM session_period_tracking WHERE session_id = ? AND period_id = ?",
|
|
120
|
-
)
|
|
121
|
-
.get(sessionId, periodId);
|
|
122
|
-
|
|
123
|
-
const newCountedCost = (tracking?.counted_cost ?? 0) + delta;
|
|
124
|
-
|
|
125
|
-
db.run(
|
|
126
|
-
"UPDATE session_period_tracking SET counted_cost = ?, last_session_cost = ? WHERE session_id = ? AND period_id = ?",
|
|
127
|
-
[newCountedCost, newSessionCost, sessionId, periodId],
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
db.run(
|
|
131
|
-
"UPDATE periods SET total_cost = total_cost + ? WHERE period_id = ?",
|
|
132
|
-
[delta, periodId],
|
|
133
|
-
);
|
|
134
|
-
|
|
135
|
-
const period = db
|
|
136
|
-
.query<{ total_cost: number }, [string]>(
|
|
137
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
138
|
-
)
|
|
139
|
-
.get(periodId);
|
|
140
|
-
const updatedTracking = db
|
|
141
|
-
.query<{ counted_cost: number }, [string, string]>(
|
|
142
|
-
"SELECT counted_cost FROM session_period_tracking WHERE session_id = ? AND period_id = ?",
|
|
143
|
-
)
|
|
144
|
-
.get(sessionId, periodId);
|
|
145
|
-
|
|
146
|
-
expect(period?.total_cost).toBe(24.0);
|
|
147
|
-
expect(updatedTracking?.counted_cost).toBe(24.0);
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
test("Session spanning periods: only new delta in new period", () => {
|
|
151
|
-
const sessionId = "session-1";
|
|
152
|
-
const periodA = "2025-12-09T05:00:00.000Z";
|
|
153
|
-
const periodB = "2025-12-09T10:00:00.000Z";
|
|
154
|
-
|
|
155
|
-
db.run(
|
|
156
|
-
"INSERT INTO sessions (session_id, total_cost, cwd, date, last_resets_at) VALUES (?, ?, ?, ?, ?)",
|
|
157
|
-
[sessionId, 10.0, "/test", "2025-12-09", periodA],
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
db.run(
|
|
161
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
162
|
-
[sessionId, periodA, 10.0, 10.0],
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
db.run(
|
|
166
|
-
"INSERT INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
167
|
-
[periodA, 10.0, 0, "2025-12-09"],
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
const newSessionCost = 24.0;
|
|
171
|
-
const session = db
|
|
172
|
-
.query<{ total_cost: number }, [string]>(
|
|
173
|
-
"SELECT total_cost FROM sessions WHERE session_id = ?",
|
|
174
|
-
)
|
|
175
|
-
.get(sessionId);
|
|
176
|
-
const delta = newSessionCost - (session?.total_cost ?? 0);
|
|
177
|
-
|
|
178
|
-
db.run(
|
|
179
|
-
"UPDATE sessions SET total_cost = ?, last_resets_at = ? WHERE session_id = ?",
|
|
180
|
-
[newSessionCost, periodB, sessionId],
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
db.run(
|
|
184
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
185
|
-
[sessionId, periodB, delta, newSessionCost],
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
db.run(
|
|
189
|
-
"INSERT OR IGNORE INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
190
|
-
[periodB, 0, 0, "2025-12-09"],
|
|
191
|
-
);
|
|
192
|
-
db.run(
|
|
193
|
-
"UPDATE periods SET total_cost = total_cost + ? WHERE period_id = ?",
|
|
194
|
-
[delta, periodB],
|
|
195
|
-
);
|
|
196
|
-
|
|
197
|
-
const periodACost = db
|
|
198
|
-
.query<{ total_cost: number }, [string]>(
|
|
199
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
200
|
-
)
|
|
201
|
-
.get(periodA);
|
|
202
|
-
const periodBCost = db
|
|
203
|
-
.query<{ total_cost: number }, [string]>(
|
|
204
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
205
|
-
)
|
|
206
|
-
.get(periodB);
|
|
207
|
-
const trackingA = db
|
|
208
|
-
.query<{ counted_cost: number }, [string, string]>(
|
|
209
|
-
"SELECT counted_cost FROM session_period_tracking WHERE session_id = ? AND period_id = ?",
|
|
210
|
-
)
|
|
211
|
-
.get(sessionId, periodA);
|
|
212
|
-
const trackingB = db
|
|
213
|
-
.query<{ counted_cost: number }, [string, string]>(
|
|
214
|
-
"SELECT counted_cost FROM session_period_tracking WHERE session_id = ? AND period_id = ?",
|
|
215
|
-
)
|
|
216
|
-
.get(sessionId, periodB);
|
|
217
|
-
|
|
218
|
-
expect(periodACost?.total_cost).toBe(10.0);
|
|
219
|
-
expect(periodBCost?.total_cost).toBe(14.0);
|
|
220
|
-
expect(trackingA?.counted_cost).toBe(10.0);
|
|
221
|
-
expect(trackingB?.counted_cost).toBe(14.0);
|
|
222
|
-
|
|
223
|
-
expect(
|
|
224
|
-
(periodACost?.total_cost ?? 0) + (periodBCost?.total_cost ?? 0),
|
|
225
|
-
).toBe(24.0);
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
test("Multiple sessions in same period: costs sum correctly", () => {
|
|
229
|
-
const periodId = "2025-12-09T10:00:00.000Z";
|
|
230
|
-
|
|
231
|
-
db.run(
|
|
232
|
-
"INSERT INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
233
|
-
[periodId, 0, 0, "2025-12-09"],
|
|
234
|
-
);
|
|
235
|
-
|
|
236
|
-
const sessions = [
|
|
237
|
-
{ id: "session-1", cost: 10.0 },
|
|
238
|
-
{ id: "session-2", cost: 15.0 },
|
|
239
|
-
{ id: "session-3", cost: 8.0 },
|
|
240
|
-
];
|
|
241
|
-
|
|
242
|
-
for (const session of sessions) {
|
|
243
|
-
db.run(
|
|
244
|
-
"INSERT INTO sessions (session_id, total_cost, cwd, date, last_resets_at) VALUES (?, ?, ?, ?, ?)",
|
|
245
|
-
[session.id, session.cost, "/test", "2025-12-09", periodId],
|
|
246
|
-
);
|
|
247
|
-
|
|
248
|
-
db.run(
|
|
249
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
250
|
-
[session.id, periodId, session.cost, session.cost],
|
|
251
|
-
);
|
|
252
|
-
|
|
253
|
-
db.run(
|
|
254
|
-
"UPDATE periods SET total_cost = total_cost + ? WHERE period_id = ?",
|
|
255
|
-
[session.cost, periodId],
|
|
256
|
-
);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const period = db
|
|
260
|
-
.query<{ total_cost: number }, [string]>(
|
|
261
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
262
|
-
)
|
|
263
|
-
.get(periodId);
|
|
264
|
-
|
|
265
|
-
expect(period?.total_cost).toBe(33.0);
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
test("No double counting: continuing old session after restart", () => {
|
|
269
|
-
const sessionId = "session-1";
|
|
270
|
-
const periodId = "2025-12-09T10:00:00.000Z";
|
|
271
|
-
|
|
272
|
-
db.run(
|
|
273
|
-
"INSERT INTO sessions (session_id, total_cost, cwd, date, last_resets_at) VALUES (?, ?, ?, ?, ?)",
|
|
274
|
-
[sessionId, 10.0, "/test", "2025-12-09", periodId],
|
|
275
|
-
);
|
|
276
|
-
|
|
277
|
-
db.run(
|
|
278
|
-
"INSERT INTO session_period_tracking (session_id, period_id, counted_cost, last_session_cost) VALUES (?, ?, ?, ?)",
|
|
279
|
-
[sessionId, periodId, 10.0, 10.0],
|
|
280
|
-
);
|
|
281
|
-
|
|
282
|
-
db.run(
|
|
283
|
-
"INSERT INTO periods (period_id, total_cost, utilization, date) VALUES (?, ?, ?, ?)",
|
|
284
|
-
[periodId, 10.0, 0, "2025-12-09"],
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
const tracking = db
|
|
288
|
-
.query<{ last_session_cost: number }, [string, string]>(
|
|
289
|
-
"SELECT last_session_cost FROM session_period_tracking WHERE session_id = ? AND period_id = ?",
|
|
290
|
-
)
|
|
291
|
-
.get(sessionId, periodId);
|
|
292
|
-
|
|
293
|
-
const currentSessionCost = 10.0;
|
|
294
|
-
const delta = currentSessionCost - (tracking?.last_session_cost ?? 0);
|
|
295
|
-
|
|
296
|
-
expect(delta).toBe(0);
|
|
297
|
-
|
|
298
|
-
const period = db
|
|
299
|
-
.query<{ total_cost: number }, [string]>(
|
|
300
|
-
"SELECT total_cost FROM periods WHERE period_id = ?",
|
|
301
|
-
)
|
|
302
|
-
.get(periodId);
|
|
303
|
-
|
|
304
|
-
expect(period?.total_cost).toBe(10.0);
|
|
305
|
-
});
|
|
306
|
-
});
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: apex
|
|
3
|
-
description: Systematic implementation using APEX methodology (Analyze-Plan-Execute-Validate) with parallel agents and self-validation. Use when implementing features, fixing bugs, or making code changes that benefit from structured workflow.
|
|
4
|
-
argument-hint: "[-a] [-s] [-e] [-b] [-i] [-r <task-id>] <task description>"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<objective>
|
|
8
|
-
Execute systematic implementation workflows using the APEX methodology. This skill uses progressive step loading to minimize context usage and supports saving outputs for review and resumption.
|
|
9
|
-
</objective>
|
|
10
|
-
|
|
11
|
-
<quick_start>
|
|
12
|
-
**Basic usage:**
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
/apex add authentication middleware
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
**Recommended workflow (autonomous with save):**
|
|
19
|
-
|
|
20
|
-
```bash
|
|
21
|
-
/apex -a -s implement user registration
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
**Flags:**
|
|
25
|
-
|
|
26
|
-
- `-a` (auto): Skip confirmations
|
|
27
|
-
- `-s` (save): Save outputs to `.claude/output/apex/`
|
|
28
|
-
- `-e` (economy): No subagents, save tokens
|
|
29
|
-
|
|
30
|
-
See `<parameters>` for complete flag list.
|
|
31
|
-
</quick_start>
|
|
32
|
-
|
|
33
|
-
<parameters>
|
|
34
|
-
|
|
35
|
-
<flags>
|
|
36
|
-
**Enable flags (turn ON):**
|
|
37
|
-
| Short | Long | Description |
|
|
38
|
-
|-------|------|-------------|
|
|
39
|
-
| `-a` | `--auto` | Autonomous mode: skip confirmations, auto-approve plans |
|
|
40
|
-
| `-s` | `--save` | Save mode: output each step to `.claude/output/apex/` |
|
|
41
|
-
| `-e` | `--economy` | Economy mode: no subagents, save tokens (for limited plans) |
|
|
42
|
-
| `-r` | `--resume` | Resume mode: continue from a previous task |
|
|
43
|
-
| `-b` | `--branch` | Branch mode: verify not on main, create branch if needed |
|
|
44
|
-
| `-i` | `--interactive` | Interactive mode: configure flags via AskUserQuestion |
|
|
45
|
-
|
|
46
|
-
**Disable flags (turn OFF):**
|
|
47
|
-
| Short | Long | Description |
|
|
48
|
-
|-------|------|-------------|
|
|
49
|
-
| `-A` | `--no-auto` | Disable auto mode |
|
|
50
|
-
| `-S` | `--no-save` | Disable save mode |
|
|
51
|
-
| `-E` | `--no-economy` | Disable economy mode |
|
|
52
|
-
| `-B` | `--no-branch` | Disable branch mode |
|
|
53
|
-
</flags>
|
|
54
|
-
|
|
55
|
-
<examples>
|
|
56
|
-
```bash
|
|
57
|
-
# Basic
|
|
58
|
-
/apex add auth middleware
|
|
59
|
-
|
|
60
|
-
# Autonomous (skip confirmations)
|
|
61
|
-
/apex -a add auth middleware
|
|
62
|
-
|
|
63
|
-
# Save outputs
|
|
64
|
-
/apex -a -s add auth middleware
|
|
65
|
-
|
|
66
|
-
# Resume previous task
|
|
67
|
-
/apex -r 01-auth-middleware
|
|
68
|
-
/apex -r 01 # Partial match
|
|
69
|
-
|
|
70
|
-
# Economy mode (save tokens)
|
|
71
|
-
/apex -e add auth middleware
|
|
72
|
-
|
|
73
|
-
# Interactive flag config
|
|
74
|
-
/apex -i add auth middleware
|
|
75
|
-
|
|
76
|
-
# Disable flags (uppercase)
|
|
77
|
-
/apex -A add auth middleware # Disable auto
|
|
78
|
-
```
|
|
79
|
-
</examples>
|
|
80
|
-
|
|
81
|
-
<parsing_rules>
|
|
82
|
-
**Flag parsing:**
|
|
83
|
-
|
|
84
|
-
1. Defaults loaded from `steps/step-00-init.md` `<defaults>` section
|
|
85
|
-
2. Command-line flags override defaults (enable with lowercase `-x`, disable with uppercase `-X`)
|
|
86
|
-
3. Flags removed from input, remainder becomes `{task_description}`
|
|
87
|
-
4. Task ID generated as `NN-kebab-case-description`
|
|
88
|
-
|
|
89
|
-
For detailed parsing algorithm, see `steps/step-00-init.md`.
|
|
90
|
-
</parsing_rules>
|
|
91
|
-
|
|
92
|
-
</parameters>
|
|
93
|
-
|
|
94
|
-
<output_structure>
|
|
95
|
-
**When `{save_mode}` = true:**
|
|
96
|
-
|
|
97
|
-
All outputs saved to PROJECT directory (where Claude Code is running):
|
|
98
|
-
```
|
|
99
|
-
.claude/output/apex/{task-id}/
|
|
100
|
-
├── 00-context.md # Params, user request, timestamp
|
|
101
|
-
├── 01-analyze.md # Analysis findings
|
|
102
|
-
├── 02-plan.md # Implementation plan
|
|
103
|
-
├── 03-execute.md # Execution log
|
|
104
|
-
└── 04-validate.md # Validation results
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
**00-context.md structure:**
|
|
108
|
-
```markdown
|
|
109
|
-
# APEX Task: {task_id}
|
|
110
|
-
|
|
111
|
-
**Created:** {timestamp}
|
|
112
|
-
**Task:** {task_description}
|
|
113
|
-
|
|
114
|
-
## Flags
|
|
115
|
-
- Auto mode: {auto_mode}
|
|
116
|
-
- Save mode: {save_mode}
|
|
117
|
-
- Economy mode: {economy_mode}
|
|
118
|
-
|
|
119
|
-
## User Request
|
|
120
|
-
{original user input}
|
|
121
|
-
|
|
122
|
-
## Acceptance Criteria
|
|
123
|
-
- [ ] AC1: {inferred criterion}
|
|
124
|
-
- [ ] AC2: {inferred criterion}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
</output_structure>
|
|
128
|
-
|
|
129
|
-
<resume_workflow>
|
|
130
|
-
**Resume mode (`-r {task-id}`):**
|
|
131
|
-
|
|
132
|
-
When provided, step-00 will:
|
|
133
|
-
|
|
134
|
-
1. Locate the task folder in `.claude/output/apex/`
|
|
135
|
-
2. Restore state from `00-context.md`
|
|
136
|
-
3. Find the last completed step
|
|
137
|
-
4. Continue from the next step
|
|
138
|
-
|
|
139
|
-
Supports partial matching (e.g., `-r 01` finds `01-add-auth-middleware`).
|
|
140
|
-
|
|
141
|
-
For implementation details, see `steps/step-00-init.md`.
|
|
142
|
-
</resume_workflow>
|
|
143
|
-
|
|
144
|
-
<workflow>
|
|
145
|
-
**Standard flow:**
|
|
146
|
-
1. Parse flags and task description
|
|
147
|
-
2. If `-r`: Execute resume workflow
|
|
148
|
-
3. If `-s`: Create output folder and 00-context.md
|
|
149
|
-
4. Load step-01-analyze.md → gather context
|
|
150
|
-
5. Load step-02-plan.md → create strategy
|
|
151
|
-
6. Load step-03-execute.md → implement
|
|
152
|
-
7. Load step-04-validate.md → verify and complete
|
|
153
|
-
</workflow>
|
|
154
|
-
|
|
155
|
-
<state_variables>
|
|
156
|
-
**Persist throughout all steps:**
|
|
157
|
-
|
|
158
|
-
| Variable | Type | Description |
|
|
159
|
-
| ----------------------- | ------- | ------------------------------------------------------ |
|
|
160
|
-
| `{task_description}` | string | What to implement (flags removed) |
|
|
161
|
-
| `{feature_name}` | string | Kebab-case name without number (e.g., `add-auth-middleware`) |
|
|
162
|
-
| `{task_id}` | string | Full identifier with number (e.g., `01-add-auth-middleware`) |
|
|
163
|
-
| `{acceptance_criteria}` | list | Success criteria (inferred or explicit) |
|
|
164
|
-
| `{auto_mode}` | boolean | Skip confirmations, use recommended options |
|
|
165
|
-
| `{save_mode}` | boolean | Save outputs to .claude/output/apex/ |
|
|
166
|
-
| `{economy_mode}` | boolean | No subagents, direct tool usage only |
|
|
167
|
-
| `{branch_mode}` | boolean | Verify not on main, create branch if needed |
|
|
168
|
-
| `{interactive_mode}` | boolean | Configure flags interactively |
|
|
169
|
-
| `{resume_task}` | string | Task ID to resume (if -r provided) |
|
|
170
|
-
| `{output_dir}` | string | Full path to output directory |
|
|
171
|
-
| `{branch_name}` | string | Created branch name (if branch_mode) |
|
|
172
|
-
|
|
173
|
-
</state_variables>
|
|
174
|
-
|
|
175
|
-
<entry_point>
|
|
176
|
-
|
|
177
|
-
**FIRST ACTION:** Load `steps/step-00-init.md`
|
|
178
|
-
|
|
179
|
-
Step 00 handles:
|
|
180
|
-
|
|
181
|
-
- Flag parsing (-a, -x, -s, -r, --test)
|
|
182
|
-
- Resume mode detection and task lookup
|
|
183
|
-
- Output folder creation (if save_mode)
|
|
184
|
-
- 00-context.md creation (if save_mode)
|
|
185
|
-
- State variable initialization
|
|
186
|
-
|
|
187
|
-
After initialization, step-00 loads step-01-analyze.md.
|
|
188
|
-
|
|
189
|
-
</entry_point>
|
|
190
|
-
|
|
191
|
-
<step_files>
|
|
192
|
-
**Progressive loading - only load current step:**
|
|
193
|
-
|
|
194
|
-
| Step | File | Purpose |
|
|
195
|
-
| ---- | ---------------------------- | ---------------------------------------------------- |
|
|
196
|
-
| 00 | `steps/step-00-init.md` | Parse flags, create output folder, initialize state |
|
|
197
|
-
| 01 | `steps/step-01-analyze.md` | Smart context gathering with 1-10 parallel agents based on complexity |
|
|
198
|
-
| 02 | `steps/step-02-plan.md` | File-by-file implementation strategy |
|
|
199
|
-
| 03 | `steps/step-03-execute.md` | Todo-driven implementation |
|
|
200
|
-
| 04 | `steps/step-04-validate.md` | Self-check, validation, and workflow completion |
|
|
201
|
-
|
|
202
|
-
</step_files>
|
|
203
|
-
|
|
204
|
-
<execution_rules>
|
|
205
|
-
|
|
206
|
-
- **Load one step at a time** - Only load the current step file
|
|
207
|
-
- **ULTRA THINK** before major decisions
|
|
208
|
-
- **Persist state variables** across all steps
|
|
209
|
-
- **Follow next_step directive** at end of each step
|
|
210
|
-
- **Save outputs** if `{save_mode}` = true (append to step file)
|
|
211
|
-
- **Use parallel agents** for independent exploration tasks
|
|
212
|
-
|
|
213
|
-
## 🧠 Smart Agent Strategy in Analyze Phase
|
|
214
|
-
|
|
215
|
-
The analyze phase (step-01) uses **adaptive agent launching** (unless economy_mode):
|
|
216
|
-
|
|
217
|
-
**Available agents:**
|
|
218
|
-
- `explore-codebase` - Find existing patterns, files, utilities
|
|
219
|
-
- `explore-docs` - Research library docs (use when unfamiliar with API)
|
|
220
|
-
- `websearch` - Find approaches, best practices, gotchas
|
|
221
|
-
|
|
222
|
-
**Launch 1-10 agents based on task complexity:**
|
|
223
|
-
|
|
224
|
-
| Complexity | Agents | When |
|
|
225
|
-
|------------|--------|------|
|
|
226
|
-
| Simple | 1-2 | Bug fix, small tweak |
|
|
227
|
-
| Medium | 2-4 | New feature in familiar stack |
|
|
228
|
-
| Complex | 4-7 | Unfamiliar libraries, integrations |
|
|
229
|
-
| Major | 6-10 | Multiple systems, many unknowns |
|
|
230
|
-
|
|
231
|
-
**BE SMART:** Analyze what you actually need before launching. Don't over-launch for simple tasks, don't under-launch for complex ones.
|
|
232
|
-
|
|
233
|
-
</execution_rules>
|
|
234
|
-
|
|
235
|
-
<save_output_pattern>
|
|
236
|
-
**When `{save_mode}` = true:**
|
|
237
|
-
|
|
238
|
-
Step-00 runs `scripts/setup-templates.sh` to initialize all output files from `templates/` directory.
|
|
239
|
-
|
|
240
|
-
**Each step then:**
|
|
241
|
-
|
|
242
|
-
1. Run `scripts/update-progress.sh {task_id} {step_num} {step_name} "in_progress"`
|
|
243
|
-
2. Append findings/outputs to the pre-created step file
|
|
244
|
-
3. Run `scripts/update-progress.sh {task_id} {step_num} {step_name} "complete"`
|
|
245
|
-
|
|
246
|
-
**Template system benefits:**
|
|
247
|
-
|
|
248
|
-
- Reduces token usage by ~75% (1,350 tokens saved per workflow)
|
|
249
|
-
- Templates in `templates/` directory (not inline in steps)
|
|
250
|
-
- Scripts handle progress tracking automatically
|
|
251
|
-
- See `templates/README.md` for details
|
|
252
|
-
|
|
253
|
-
</save_output_pattern>
|
|
254
|
-
|
|
255
|
-
<success_criteria>
|
|
256
|
-
|
|
257
|
-
- Each step loaded progressively
|
|
258
|
-
- All validation checks passing
|
|
259
|
-
- Outputs saved if `{save_mode}` enabled
|
|
260
|
-
- Clear completion summary provided
|
|
261
|
-
</success_criteria>
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# APEX Template Setup Script
|
|
3
|
-
# Creates output directory structure and initializes template files
|
|
4
|
-
#
|
|
5
|
-
# Usage: setup-templates.sh "feature-name" [other args...]
|
|
6
|
-
# The script auto-generates the task ID with the next available number.
|
|
7
|
-
|
|
8
|
-
set -e
|
|
9
|
-
|
|
10
|
-
# Arguments - first arg is now just the feature name (kebab-case)
|
|
11
|
-
FEATURE_NAME="$1"
|
|
12
|
-
TASK_DESCRIPTION="$2"
|
|
13
|
-
AUTO_MODE="${3:-false}"
|
|
14
|
-
SAVE_MODE="${4:-false}"
|
|
15
|
-
ECONOMY_MODE="${5:-false}"
|
|
16
|
-
BRANCH_MODE="${6:-false}"
|
|
17
|
-
INTERACTIVE_MODE="${7:-false}"
|
|
18
|
-
BRANCH_NAME="${8:-}"
|
|
19
|
-
ORIGINAL_INPUT="${9:-}"
|
|
20
|
-
|
|
21
|
-
# Validate required arguments
|
|
22
|
-
if [[ -z "$FEATURE_NAME" ]]; then
|
|
23
|
-
echo "Error: FEATURE_NAME is required"
|
|
24
|
-
exit 1
|
|
25
|
-
fi
|
|
26
|
-
|
|
27
|
-
if [[ -z "$TASK_DESCRIPTION" ]]; then
|
|
28
|
-
echo "Error: TASK_DESCRIPTION is required"
|
|
29
|
-
exit 1
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
# Get current timestamp
|
|
33
|
-
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
34
|
-
|
|
35
|
-
# Use current working directory as project root
|
|
36
|
-
PROJECT_ROOT=$(pwd)
|
|
37
|
-
APEX_OUTPUT_DIR="${PROJECT_ROOT}/.claude/output/apex"
|
|
38
|
-
|
|
39
|
-
# Create apex output directory if it doesn't exist
|
|
40
|
-
mkdir -p "$APEX_OUTPUT_DIR"
|
|
41
|
-
|
|
42
|
-
# Find the next available number
|
|
43
|
-
NEXT_NUM=1
|
|
44
|
-
if [[ -d "$APEX_OUTPUT_DIR" ]]; then
|
|
45
|
-
# Find highest existing number prefix
|
|
46
|
-
HIGHEST=$(ls -1 "$APEX_OUTPUT_DIR" 2>/dev/null | grep -oE '^[0-9]+' | sort -n | tail -1)
|
|
47
|
-
if [[ -n "$HIGHEST" ]]; then
|
|
48
|
-
# Force base-10 interpretation (leading zeros would be treated as octal)
|
|
49
|
-
NEXT_NUM=$((10#$HIGHEST + 1))
|
|
50
|
-
fi
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
# Format with leading zeros (2 digits)
|
|
54
|
-
TASK_NUM=$(printf "%02d" "$NEXT_NUM")
|
|
55
|
-
|
|
56
|
-
# Build full task ID
|
|
57
|
-
TASK_ID="${TASK_NUM}-${FEATURE_NAME}"
|
|
58
|
-
|
|
59
|
-
OUTPUT_DIR="${APEX_OUTPUT_DIR}/${TASK_ID}"
|
|
60
|
-
|
|
61
|
-
# Get skill directory
|
|
62
|
-
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
63
|
-
TEMPLATE_DIR="${SKILL_DIR}/templates"
|
|
64
|
-
|
|
65
|
-
# Create output directory
|
|
66
|
-
mkdir -p "$OUTPUT_DIR"
|
|
67
|
-
|
|
68
|
-
# Function to replace template variables
|
|
69
|
-
render_template() {
|
|
70
|
-
local template_file="$1"
|
|
71
|
-
local output_file="$2"
|
|
72
|
-
|
|
73
|
-
# Read template and replace variables
|
|
74
|
-
sed -e "s|{{task_id}}|${TASK_ID}|g" \
|
|
75
|
-
-e "s|{{task_description}}|${TASK_DESCRIPTION}|g" \
|
|
76
|
-
-e "s|{{timestamp}}|${TIMESTAMP}|g" \
|
|
77
|
-
-e "s|{{auto_mode}}|${AUTO_MODE}|g" \
|
|
78
|
-
-e "s|{{save_mode}}|${SAVE_MODE}|g" \
|
|
79
|
-
-e "s|{{economy_mode}}|${ECONOMY_MODE}|g" \
|
|
80
|
-
-e "s|{{branch_mode}}|${BRANCH_MODE}|g" \
|
|
81
|
-
-e "s|{{interactive_mode}}|${INTERACTIVE_MODE}|g" \
|
|
82
|
-
-e "s|{{branch_name}}|${BRANCH_NAME}|g" \
|
|
83
|
-
-e "s|{{original_input}}|${ORIGINAL_INPUT}|g" \
|
|
84
|
-
"$template_file" > "$output_file"
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
# Initialize 00-context.md
|
|
88
|
-
render_template "${TEMPLATE_DIR}/00-context.md" "${OUTPUT_DIR}/00-context.md"
|
|
89
|
-
|
|
90
|
-
# Initialize other step files (only headers, content appended during execution)
|
|
91
|
-
render_template "${TEMPLATE_DIR}/01-analyze.md" "${OUTPUT_DIR}/01-analyze.md"
|
|
92
|
-
render_template "${TEMPLATE_DIR}/02-plan.md" "${OUTPUT_DIR}/02-plan.md"
|
|
93
|
-
render_template "${TEMPLATE_DIR}/03-execute.md" "${OUTPUT_DIR}/03-execute.md"
|
|
94
|
-
render_template "${TEMPLATE_DIR}/04-validate.md" "${OUTPUT_DIR}/04-validate.md"
|
|
95
|
-
|
|
96
|
-
# Output the generated task_id for capture by caller
|
|
97
|
-
echo "TASK_ID=${TASK_ID}"
|
|
98
|
-
echo "OUTPUT_DIR=${OUTPUT_DIR}"
|
|
99
|
-
echo "✓ APEX templates initialized: ${OUTPUT_DIR}"
|
|
100
|
-
exit 0
|