aiblueprint-cli 1.4.81 → 1.4.83

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 (90) hide show
  1. package/README.md +25 -18
  2. package/agents-config/claude-config/scripts/statusline/data/.gitignore +8 -0
  3. package/agents-config/claude-config/scripts/statusline/data/.gitkeep +0 -0
  4. package/agents-config/claude-config/scripts/statusline/defaults.json +10 -10
  5. package/agents-config/claude-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  6. package/agents-config/claude-config/scripts/statusline/src/index.ts +100 -9
  7. package/agents-config/claude-config/scripts/statusline/src/lib/config.ts +28 -2
  8. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  9. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  10. package/agents-config/claude-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  11. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  12. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  13. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  14. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  15. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  16. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  17. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  18. package/agents-config/claude-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  19. package/agents-config/claude-config/scripts/statusline/src/lib/presets.ts +13 -13
  20. package/agents-config/claude-config/scripts/statusline/statusline.config.free.json +4 -1
  21. package/agents-config/claude-config/scripts/statusline/statusline.config.json +44 -23
  22. package/agents-config/scripts/statusline/data/.gitignore +8 -0
  23. package/agents-config/scripts/statusline/data/.gitkeep +0 -0
  24. package/agents-config/scripts/statusline/defaults.json +10 -10
  25. package/agents-config/scripts/statusline/src/commands/interactive-config.ts +118 -6
  26. package/agents-config/scripts/statusline/src/index.ts +100 -9
  27. package/agents-config/scripts/statusline/src/lib/config.ts +28 -2
  28. package/agents-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  29. package/agents-config/scripts/statusline/src/lib/features/limits/index.ts +164 -0
  30. package/agents-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  31. package/agents-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  32. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  33. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  34. package/agents-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  35. package/agents-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  36. package/agents-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  37. package/agents-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +163 -0
  38. package/agents-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  39. package/agents-config/scripts/statusline/src/lib/presets.ts +13 -13
  40. package/agents-config/scripts/statusline/statusline.config.free.json +4 -1
  41. package/agents-config/scripts/statusline/statusline.config.json +44 -23
  42. package/agents-config/skills/{agents-managers → agents-manager}/SKILL.md +1 -1
  43. package/agents-config/skills/{agents-managers → agents-manager}/references/writing-agent-prompts.md +1 -1
  44. package/agents-config/skills/apex/SKILL.md +61 -0
  45. package/agents-config/skills/appstore-connect/SKILL.md +2 -2
  46. package/agents-config/skills/{appstore-connect-setup/SKILL.md → appstore-connect/references/setup.md} +3 -6
  47. package/agents-config/skills/environments-manager/SKILL.md +6 -6
  48. package/agents-config/skills/environments-manager/examples/{claude/commands/dev.md → skills/dev/SKILL.md} +2 -1
  49. package/agents-config/skills/environments-manager/examples/{claude/commands/lint.md → skills/lint/SKILL.md} +2 -1
  50. package/agents-config/skills/environments-manager/examples/{claude/commands/test.md → skills/test/SKILL.md} +2 -1
  51. package/agents-config/skills/environments-manager/examples/{claude/commands/typecheck.md → skills/typecheck/SKILL.md} +2 -1
  52. package/agents-config/skills/environments-manager/references/claude.md +13 -9
  53. package/agents-config/skills/environments-manager/references/cursor.md +2 -2
  54. package/agents-config/skills/ios-testflight/SKILL.md +2 -2
  55. package/agents-config/{commands/prompts/prompt.md → skills/prompt/SKILL.md} +5 -0
  56. package/agents-config/{commands/prompts/tools.md → skills/tools/SKILL.md} +1 -0
  57. package/agents-config/skills/ultrathink/SKILL.md +1 -1
  58. package/agents-config/skills/use-style/SKILL.md +7 -4
  59. package/agents-config/skills/use-style/examples/luma.html +221 -0
  60. package/agents-config/skills/use-style/examples/testspirite.html +340 -0
  61. package/agents-config/skills/use-style/styles/ios-app.md +350 -0
  62. package/agents-config/skills/use-style/styles/luma.md +422 -0
  63. package/agents-config/skills/use-style/styles/new-york-times.md +1 -1
  64. package/agents-config/skills/use-style/styles/split-auth.md +2 -2
  65. package/agents-config/skills/use-style/styles/testspirite.md +397 -0
  66. package/dist/cli.js +56 -118
  67. package/package.json +1 -1
  68. package/agents-config/claude-config/scripts/.claude/commands/fix-on-my-computer.md +0 -87
  69. package/agents-config/commands/prompts/create-vitejs-app.md +0 -272
  70. package/agents-config/commands/prompts/nextjs-add-prisma-db.md +0 -136
  71. package/agents-config/commands/prompts/nextjs-setup-better-auth.md +0 -173
  72. package/agents-config/commands/prompts/nextjs-setup-project.md +0 -200
  73. package/agents-config/commands/prompts/saas-challenge-idea.md +0 -135
  74. package/agents-config/commands/prompts/saas-create-architecture.md +0 -242
  75. package/agents-config/commands/prompts/saas-create-headline.md +0 -132
  76. package/agents-config/commands/prompts/saas-create-landing-copywritting.md +0 -267
  77. package/agents-config/commands/prompts/saas-create-legals-docs.md +0 -176
  78. package/agents-config/commands/prompts/saas-create-logos.md +0 -240
  79. package/agents-config/commands/prompts/saas-create-prd.md +0 -195
  80. package/agents-config/commands/prompts/saas-create-tasks.md +0 -240
  81. package/agents-config/commands/prompts/saas-define-pricing.md +0 -293
  82. package/agents-config/commands/prompts/saas-find-domain-name.md +0 -190
  83. package/agents-config/commands/prompts/saas-implement-landing-page.md +0 -257
  84. package/agents-config/commands/prompts/setup-tmux.md +0 -160
  85. /package/agents-config/skills/{agents-managers → agents-manager}/references/agents.md +0 -0
  86. /package/agents-config/skills/{agents-managers → agents-manager}/references/context-management.md +0 -0
  87. /package/agents-config/skills/{agents-managers → agents-manager}/references/debugging-agents.md +0 -0
  88. /package/agents-config/skills/{agents-managers → agents-manager}/references/error-handling-and-recovery.md +0 -0
  89. /package/agents-config/skills/{agents-managers → agents-manager}/references/evaluation-and-testing.md +0 -0
  90. /package/agents-config/skills/{agents-managers → agents-manager}/references/orchestration-patterns.md +0 -0
@@ -0,0 +1,178 @@
1
+ import type { HookInput } from "../../types";
2
+ import { normalizeResetsAt } from "../../utils";
3
+ import {
4
+ addToPeriodCost,
5
+ getAllSessions,
6
+ getPeriodCost,
7
+ getProjectMaxCost,
8
+ getSession,
9
+ getSessionsByDate,
10
+ getSessionTotalCounted,
11
+ getTodaySessionsTotal,
12
+ getTracking,
13
+ updateProjectMaxCost,
14
+ upsertSession,
15
+ upsertTracking,
16
+ } from "./database";
17
+ import { appendPayloadLogWithContext } from "./payload-logger";
18
+ import type { SpendSessionV2 } from "./types";
19
+
20
+ export async function saveSessionV2(
21
+ input: HookInput,
22
+ currentResetsAt?: string,
23
+ ): Promise<void> {
24
+ if (
25
+ !input.session_id ||
26
+ input.cost.total_cost_usd === 0 ||
27
+ input.cost.total_cost_usd === null
28
+ ) {
29
+ return;
30
+ }
31
+
32
+ const sessionId = input.session_id;
33
+ const newTotalCost = input.cost.total_cost_usd; // Cumulative from Claude Code
34
+ const today = new Date().toISOString().split("T")[0];
35
+ const normalizedPeriodId = currentResetsAt
36
+ ? normalizeResetsAt(currentResetsAt)
37
+ : null;
38
+
39
+ // Get TODAY's session entry for this specific session
40
+ const existingTodaySession = getSession(sessionId, today);
41
+
42
+ // Get project max cost (for detecting /clear continuation)
43
+ const projectMaxCost = getProjectMaxCost(input.cwd, today);
44
+
45
+ // Get session's own cumulative count
46
+ const sessionCumulativeCounted = getSessionTotalCounted(sessionId);
47
+
48
+ // SMART DETECTION for various scenarios
49
+ let deltaCost: number;
50
+
51
+ const isNewSession = sessionCumulativeCounted === 0;
52
+ const isClearContinuation = isNewSession && newTotalCost > projectMaxCost;
53
+
54
+ if (isNewSession && !isClearContinuation) {
55
+ // First time seeing this session - don't count pre-existing cost
56
+ deltaCost = 0;
57
+ } else if (isClearContinuation) {
58
+ // /clear created new session but costs accumulated from before
59
+ deltaCost = newTotalCost - projectMaxCost;
60
+ } else {
61
+ // Normal case: use session-level tracking
62
+ deltaCost = Math.max(0, newTotalCost - sessionCumulativeCounted);
63
+ }
64
+
65
+ // Log with full context for debugging
66
+ appendPayloadLogWithContext(
67
+ input,
68
+ existingTodaySession?.total_cost ?? 0,
69
+ sessionCumulativeCounted,
70
+ deltaCost,
71
+ isNewSession,
72
+ isClearContinuation,
73
+ false, // billing reset detection removed
74
+ projectMaxCost,
75
+ );
76
+
77
+ // Always update project max if we surpass it
78
+ if (newTotalCost > projectMaxCost) {
79
+ updateProjectMaxCost(input.cwd, today, newTotalCost);
80
+ }
81
+
82
+ // Today's cost for THIS session = previous + delta
83
+ const todayCost = (existingTodaySession?.total_cost ?? 0) + deltaCost;
84
+
85
+ // Track cumulative for this session
86
+ // For new sessions, start from current cost (not from 0 + delta)
87
+ const newCumulativeCounted =
88
+ isNewSession && !isClearContinuation
89
+ ? newTotalCost
90
+ : sessionCumulativeCounted + deltaCost;
91
+
92
+ upsertSession({
93
+ session_id: sessionId,
94
+ total_cost: todayCost,
95
+ cwd: input.cwd,
96
+ date: today,
97
+ duration_ms: input.cost.total_duration_ms,
98
+ lines_added: input.cost.total_lines_added,
99
+ lines_removed: input.cost.total_lines_removed,
100
+ last_resets_at: normalizedPeriodId,
101
+ cumulative_counted: newCumulativeCounted,
102
+ });
103
+
104
+ if (!normalizedPeriodId) {
105
+ return;
106
+ }
107
+
108
+ if (deltaCost > 0) {
109
+ const tracking = getTracking(sessionId, normalizedPeriodId);
110
+
111
+ upsertTracking({
112
+ session_id: sessionId,
113
+ period_id: normalizedPeriodId,
114
+ counted_cost: (tracking?.counted_cost ?? 0) + deltaCost,
115
+ last_session_cost: newTotalCost,
116
+ });
117
+
118
+ addToPeriodCost(normalizedPeriodId, deltaCost);
119
+ } else {
120
+ const tracking = getTracking(sessionId, normalizedPeriodId);
121
+ if (!tracking) {
122
+ upsertTracking({
123
+ session_id: sessionId,
124
+ period_id: normalizedPeriodId,
125
+ counted_cost: 0,
126
+ last_session_cost: newTotalCost,
127
+ });
128
+ }
129
+ }
130
+ }
131
+
132
+ export function getCurrentPeriodCostV2(periodId: string): number {
133
+ return getPeriodCost(periodId);
134
+ }
135
+
136
+ export function getTodayCostV2(): number {
137
+ return getTodaySessionsTotal();
138
+ }
139
+
140
+ export function getMonthStart(): Date {
141
+ const today = new Date();
142
+ return new Date(today.getFullYear(), today.getMonth(), 1);
143
+ }
144
+
145
+ export function getAllSessionsV2(): SpendSessionV2[] {
146
+ return getAllSessions().map((row) => ({
147
+ session_id: row.session_id,
148
+ total_cost: row.total_cost,
149
+ cwd: row.cwd,
150
+ date: row.date,
151
+ duration_ms: row.duration_ms,
152
+ lines_added: row.lines_added,
153
+ lines_removed: row.lines_removed,
154
+ last_resets_at: row.last_resets_at,
155
+ cumulative_counted: row.cumulative_counted,
156
+ }));
157
+ }
158
+
159
+ export function getSessionsByDateV2(date: string): SpendSessionV2[] {
160
+ return getSessionsByDate(date).map((row) => ({
161
+ session_id: row.session_id,
162
+ total_cost: row.total_cost,
163
+ cwd: row.cwd,
164
+ date: row.date,
165
+ duration_ms: row.duration_ms,
166
+ lines_added: row.lines_added,
167
+ lines_removed: row.lines_removed,
168
+ last_resets_at: row.last_resets_at,
169
+ cumulative_counted: row.cumulative_counted,
170
+ }));
171
+ }
172
+
173
+ export function calculateTotalCost(sessions: SpendSessionV2[]): number {
174
+ return sessions.reduce((sum, session) => sum + session.total_cost, 0);
175
+ }
176
+
177
+ export { getPeriodCost } from "./database";
178
+ export type { SpendSessionV2 } from "./types";
@@ -0,0 +1,163 @@
1
+ import {
2
+ appendFileSync,
3
+ existsSync,
4
+ mkdirSync,
5
+ readFileSync,
6
+ writeFileSync,
7
+ } from "node:fs";
8
+ import { join } from "node:path";
9
+ import type { HookInput } from "../../types";
10
+
11
+ const DATA_DIR = join(import.meta.dir, "..", "..", "..", "..", "data");
12
+ const PAYLOADS_FILE = join(DATA_DIR, "payloads.jsonl");
13
+ const MAX_ENTRIES = 10000;
14
+
15
+ // Enable payload logging with: STATUSLINE_DEBUG=1
16
+ const DEBUG_ENABLED = process.env.STATUSLINE_DEBUG === "1";
17
+
18
+ export interface PayloadLogEntry {
19
+ event_id: string;
20
+ timestamp: string;
21
+ session_id: string;
22
+ cwd: string;
23
+ total_cost_usd: number;
24
+ total_duration_ms: number;
25
+ lines_added: number;
26
+ lines_removed: number;
27
+ model_id: string;
28
+ transcript_path: string;
29
+ context?: {
30
+ existing_session_cost?: number;
31
+ session_cumulative_counted?: number;
32
+ delta_cost?: number;
33
+ is_new_session?: boolean;
34
+ is_clear_continuation?: boolean;
35
+ is_billing_reset?: boolean;
36
+ project_max_cost?: number;
37
+ };
38
+ }
39
+
40
+ function generateEventId(): string {
41
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
42
+ }
43
+
44
+ export function appendPayloadLog(
45
+ input: HookInput,
46
+ context?: PayloadLogEntry["context"],
47
+ ): void {
48
+ if (!DEBUG_ENABLED) {
49
+ return;
50
+ }
51
+
52
+ if (!existsSync(DATA_DIR)) {
53
+ mkdirSync(DATA_DIR, { recursive: true });
54
+ }
55
+
56
+ const entry: PayloadLogEntry = {
57
+ event_id: generateEventId(),
58
+ timestamp: new Date().toISOString(),
59
+ session_id: input.session_id,
60
+ cwd: input.cwd,
61
+ total_cost_usd: input.cost.total_cost_usd,
62
+ total_duration_ms: input.cost.total_duration_ms,
63
+ lines_added: input.cost.total_lines_added,
64
+ lines_removed: input.cost.total_lines_removed,
65
+ model_id: input.model.id,
66
+ transcript_path: input.transcript_path,
67
+ ...(context && { context }),
68
+ };
69
+
70
+ const line = JSON.stringify(entry) + "\n";
71
+ appendFileSync(PAYLOADS_FILE, line);
72
+ }
73
+
74
+ export function appendPayloadLogWithContext(
75
+ input: HookInput,
76
+ existingSessionCost: number,
77
+ sessionCumulativeCounted: number,
78
+ deltaCost: number,
79
+ isNewSession: boolean,
80
+ isClearContinuation: boolean,
81
+ isBillingReset: boolean,
82
+ projectMaxCost: number,
83
+ ): void {
84
+ appendPayloadLog(input, {
85
+ existing_session_cost: existingSessionCost,
86
+ session_cumulative_counted: sessionCumulativeCounted,
87
+ delta_cost: deltaCost,
88
+ is_new_session: isNewSession,
89
+ is_clear_continuation: isClearContinuation,
90
+ is_billing_reset: isBillingReset,
91
+ project_max_cost: projectMaxCost,
92
+ });
93
+ }
94
+
95
+ export function readPayloadLogs(): PayloadLogEntry[] {
96
+ if (!existsSync(PAYLOADS_FILE)) {
97
+ return [];
98
+ }
99
+
100
+ const content = readFileSync(PAYLOADS_FILE, "utf-8");
101
+ const lines = content.trim().split("\n").filter(Boolean);
102
+
103
+ return lines.map((line) => JSON.parse(line) as PayloadLogEntry);
104
+ }
105
+
106
+ export function rotatePayloadLogs(): void {
107
+ const entries = readPayloadLogs();
108
+
109
+ if (entries.length <= MAX_ENTRIES) {
110
+ return;
111
+ }
112
+
113
+ const toKeep = entries.slice(-MAX_ENTRIES);
114
+ const content = toKeep.map((e) => JSON.stringify(e)).join("\n") + "\n";
115
+ writeFileSync(PAYLOADS_FILE, content);
116
+ }
117
+
118
+ export function getPayloadsGroupedBySession(): Map<string, PayloadLogEntry[]> {
119
+ const entries = readPayloadLogs();
120
+ const grouped = new Map<string, PayloadLogEntry[]>();
121
+
122
+ for (const entry of entries) {
123
+ const existing = grouped.get(entry.session_id) || [];
124
+ existing.push(entry);
125
+ grouped.set(entry.session_id, existing);
126
+ }
127
+
128
+ return grouped;
129
+ }
130
+
131
+ export function getTodayPayloads(): PayloadLogEntry[] {
132
+ const today = new Date().toISOString().split("T")[0];
133
+ const entries = readPayloadLogs();
134
+
135
+ return entries.filter((e) => e.timestamp.startsWith(today));
136
+ }
137
+
138
+ export function getTodayRealCost(): number {
139
+ const todayEntries = getTodayPayloads();
140
+ if (todayEntries.length === 0) return 0;
141
+
142
+ // Group by session
143
+ const sessions = new Map<string, PayloadLogEntry[]>();
144
+ for (const entry of todayEntries) {
145
+ const existing = sessions.get(entry.session_id) || [];
146
+ existing.push(entry);
147
+ sessions.set(entry.session_id, existing);
148
+ }
149
+
150
+ // Calculate real delta per session (last_cost - first_cost)
151
+ let totalRealCost = 0;
152
+ for (const [, entries] of sessions) {
153
+ const sorted = entries.sort(
154
+ (a, b) =>
155
+ new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),
156
+ );
157
+ const realDelta =
158
+ sorted[sorted.length - 1].total_cost_usd - sorted[0].total_cost_usd;
159
+ totalRealCost += Math.max(0, realDelta);
160
+ }
161
+
162
+ return totalRealCost;
163
+ }
@@ -0,0 +1,37 @@
1
+ export interface SessionRow {
2
+ session_id: string;
3
+ total_cost: number;
4
+ cwd: string;
5
+ date: string;
6
+ duration_ms: number;
7
+ lines_added: number;
8
+ lines_removed: number;
9
+ last_resets_at: string | null;
10
+ cumulative_counted: number;
11
+ }
12
+
13
+ export interface PeriodRow {
14
+ period_id: string;
15
+ total_cost: number;
16
+ utilization: number;
17
+ date: string;
18
+ }
19
+
20
+ export interface TrackingRow {
21
+ session_id: string;
22
+ period_id: string;
23
+ counted_cost: number;
24
+ last_session_cost: number;
25
+ }
26
+
27
+ export interface SpendSessionV2 {
28
+ session_id: string;
29
+ total_cost: number;
30
+ cwd: string;
31
+ date: string;
32
+ duration_ms: number;
33
+ lines_added: number;
34
+ lines_removed: number;
35
+ last_resets_at: string | null;
36
+ cumulative_counted: number;
37
+ }
@@ -21,7 +21,7 @@ const minimalConfig: StatuslineConfig = {
21
21
  },
22
22
  session: {
23
23
  infoSeparator: null,
24
- cost: { enabled: false, format: "decimal1" },
24
+ cost: { enabled: true, format: "decimal1" },
25
25
  duration: { enabled: false },
26
26
  tokens: { enabled: false, showMax: false, showDecimals: false },
27
27
  percentage: {
@@ -37,7 +37,7 @@ const minimalConfig: StatuslineConfig = {
37
37
  },
38
38
  },
39
39
  limits: {
40
- enabled: false,
40
+ enabled: true,
41
41
  showTimeLeft: false,
42
42
  showPacingDelta: false,
43
43
  cost: { enabled: false, format: "decimal1" },
@@ -93,7 +93,7 @@ const fullConfig: StatuslineConfig = {
93
93
  },
94
94
  session: {
95
95
  infoSeparator: null,
96
- cost: { enabled: false, format: "decimal2" },
96
+ cost: { enabled: true, format: "decimal2" },
97
97
  duration: { enabled: true },
98
98
  tokens: { enabled: true, showMax: true, showDecimals: true },
99
99
  percentage: {
@@ -109,10 +109,10 @@ const fullConfig: StatuslineConfig = {
109
109
  },
110
110
  },
111
111
  limits: {
112
- enabled: false,
113
- showTimeLeft: false,
114
- showPacingDelta: false,
115
- cost: { enabled: false, format: "decimal1" },
112
+ enabled: true,
113
+ showTimeLeft: true,
114
+ showPacingDelta: true,
115
+ cost: { enabled: true, format: "decimal1" },
116
116
  percentage: {
117
117
  enabled: true,
118
118
  showValue: true,
@@ -126,10 +126,10 @@ const fullConfig: StatuslineConfig = {
126
126
  },
127
127
  },
128
128
  weeklyUsage: {
129
- enabled: false,
130
- showTimeLeft: false,
131
- showPacingDelta: false,
132
- cost: { enabled: false, format: "decimal1" },
129
+ enabled: true,
130
+ showTimeLeft: true,
131
+ showPacingDelta: true,
132
+ cost: { enabled: true, format: "decimal1" },
133
133
  percentage: {
134
134
  enabled: true,
135
135
  showValue: true,
@@ -143,7 +143,7 @@ const fullConfig: StatuslineConfig = {
143
143
  },
144
144
  },
145
145
  dailySpend: {
146
- cost: { enabled: false, format: "decimal1" },
146
+ cost: { enabled: true, format: "decimal1" },
147
147
  },
148
148
  context: {
149
149
  ...defaultConfig.context,
@@ -153,7 +153,7 @@ const fullConfig: StatuslineConfig = {
153
153
  export const PRESETS: Preset[] = [
154
154
  {
155
155
  name: "Minimal",
156
- description: "Essential info only: percentage and branch",
156
+ description: "Essential info only: cost, percentage, branch",
157
157
  config: minimalConfig,
158
158
  },
159
159
  {
@@ -17,7 +17,7 @@
17
17
  "separator": "•",
18
18
  "session": {
19
19
  "infoSeparator": null,
20
- "cost": { "enabled": false, "format": "decimal1" },
20
+ "cost": { "enabled": true, "format": "decimal1" },
21
21
  "duration": { "enabled": true },
22
22
  "tokens": { "enabled": true, "showMax": false, "showDecimals": false },
23
23
  "percentage": {
@@ -75,5 +75,8 @@
75
75
  },
76
76
  "dailySpend": {
77
77
  "cost": { "enabled": false, "format": "decimal1" }
78
+ },
79
+ "thinking": {
80
+ "showDisabledWarning": true
78
81
  }
79
82
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "features": {
3
- "usageLimits": false,
4
- "spendTracking": false
3
+ "usageLimits": true,
4
+ "spendTracking": true
5
5
  },
6
6
  "oneLine": true,
7
7
  "showSonnetModel": false,
@@ -11,22 +11,31 @@
11
11
  "showBranch": true,
12
12
  "showDirtyIndicator": true,
13
13
  "showChanges": false,
14
- "showStaged": true,
14
+ "showStaged": false,
15
15
  "showUnstaged": true
16
16
  },
17
17
  "separator": "•",
18
18
  "session": {
19
19
  "infoSeparator": null,
20
- "cost": { "enabled": false, "format": "decimal1" },
21
- "duration": { "enabled": true },
22
- "tokens": { "enabled": true, "showMax": false, "showDecimals": false },
20
+ "cost": {
21
+ "enabled": true,
22
+ "format": "decimal1"
23
+ },
24
+ "duration": {
25
+ "enabled": false
26
+ },
27
+ "tokens": {
28
+ "enabled": false,
29
+ "showMax": false,
30
+ "showDecimals": false
31
+ },
23
32
  "percentage": {
24
33
  "enabled": true,
25
34
  "showValue": true,
26
35
  "progressBar": {
27
36
  "enabled": true,
28
- "length": 10,
29
- "style": "braille",
37
+ "length": 5,
38
+ "style": "filled",
30
39
  "color": "progressive",
31
40
  "background": "none"
32
41
  }
@@ -41,29 +50,35 @@
41
50
  },
42
51
  "limits": {
43
52
  "enabled": false,
44
- "showTimeLeft": false,
45
- "showPacingDelta": false,
46
- "cost": { "enabled": false, "format": "decimal1" },
53
+ "showTimeLeft": true,
54
+ "showPacingDelta": true,
55
+ "cost": {
56
+ "enabled": true,
57
+ "format": "decimal1"
58
+ },
47
59
  "percentage": {
48
- "enabled": false,
49
- "showValue": false,
60
+ "enabled": true,
61
+ "showValue": true,
50
62
  "progressBar": {
51
- "enabled": false,
52
- "length": 10,
53
- "style": "braille",
63
+ "enabled": true,
64
+ "length": 5,
65
+ "style": "filled",
54
66
  "color": "progressive",
55
67
  "background": "none"
56
68
  }
57
69
  }
58
70
  },
59
71
  "weeklyUsage": {
60
- "enabled": false,
61
- "showTimeLeft": false,
62
- "showPacingDelta": false,
63
- "cost": { "enabled": false, "format": "decimal1" },
64
- "percentage": {
72
+ "enabled": true,
73
+ "showTimeLeft": true,
74
+ "showPacingDelta": true,
75
+ "cost": {
65
76
  "enabled": false,
66
- "showValue": false,
77
+ "format": "decimal1"
78
+ },
79
+ "percentage": {
80
+ "enabled": true,
81
+ "showValue": true,
67
82
  "progressBar": {
68
83
  "enabled": false,
69
84
  "length": 10,
@@ -74,6 +89,12 @@
74
89
  }
75
90
  },
76
91
  "dailySpend": {
77
- "cost": { "enabled": false, "format": "decimal1" }
92
+ "cost": {
93
+ "enabled": false,
94
+ "format": "decimal1"
95
+ }
96
+ },
97
+ "thinking": {
98
+ "showDisabledWarning": true
78
99
  }
79
100
  }
@@ -179,7 +179,7 @@ Tailor instructions to the specific task domain. Don't create generic "helper" a
179
179
  </system_prompt_guidelines>
180
180
 
181
181
  <agent_xml_structure>
182
- Agent.md files are system prompts consumed only by Claude. Like skills and slash commands, they should use pure XML structure for optimal parsing and token efficiency.
182
+ Agent.md files are system prompts consumed only by Claude. Like skills, they should use pure XML structure for optimal parsing and token efficiency.
183
183
 
184
184
  <recommended_tags>
185
185
  Common tags for agent structure:
@@ -1,7 +1,7 @@
1
1
  <key_insight>
2
2
  Agent prompts should be task-specific, not generic. They define a specialized role with clear focus areas, workflows, and constraints.
3
3
 
4
- **Critical**: Agent.md files use pure XML structure (no markdown headings). Like skills and slash commands, this improves parsing and token efficiency.
4
+ **Critical**: Agent.md files use pure XML structure (no markdown headings). Like skills, this improves parsing and token efficiency.
5
5
  </key_insight>
6
6
 
7
7
  <xml_structure_rule>
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: apex
3
+ description: Structured implementation using the APEX method (Analyze → Plan → Execute → eXamine). Use when implementing a feature or fixing a bug that benefits from a clear, deliberate workflow instead of jumping straight to code.
4
+ argument-hint: "[-x] <task-description>"
5
+ ---
6
+
7
+ # APEX
8
+
9
+ Implement `$ARGUMENTS` with a deliberate, four-phase workflow. Think before each phase.
10
+
11
+ Add `-x` to the request for an extra adversarial review pass after validation.
12
+
13
+ ## A — Analyze
14
+
15
+ Gather just enough context to act with confidence:
16
+
17
+ - Use `Glob`/`Grep` to find the files and patterns you'll touch
18
+ - Read the closest existing example and follow its conventions
19
+ - Restate the task as 2-4 concrete acceptance criteria
20
+ - Note open questions; ask only if a wrong assumption would be costly
21
+
22
+ ## P — Plan
23
+
24
+ Write a short, file-by-file plan before editing:
25
+
26
+ - List each file to create or change and what changes in it
27
+ - Pick the simplest approach that satisfies the criteria
28
+ - Order the steps so the code stays runnable along the way
29
+
30
+ ## E — Execute
31
+
32
+ Implement the plan:
33
+
34
+ - Match the surrounding code's naming, structure, and idioms
35
+ - Stay strictly in scope — no "while I'm here" refactors
36
+ - Comments only where intent is genuinely non-obvious
37
+ - Run the formatter if the project has one
38
+
39
+ ## X — eXamine
40
+
41
+ Validate, then optionally review:
42
+
43
+ 1. **Validate**: run `lint`, `typecheck`, and relevant tests. Fix only what you broke; re-run until clean.
44
+ 2. **Review** (only if `-x`): re-read the diff as a skeptic — check for bugs, security holes, missed edge cases, and overcomplication. Fix what you find.
45
+
46
+ ## Output
47
+
48
+ ```
49
+ ## APEX complete
50
+
51
+ **Task:** {what was implemented}
52
+ **Criteria:** {✓ per acceptance criterion}
53
+ **Files changed:** {list}
54
+ **Validation:** ✓ lint ✓ typecheck ✓ tests
55
+ ```
56
+
57
+ ## Rules
58
+
59
+ - One step at a time — finish each phase before the next
60
+ - Stay in scope; ship the smallest change that meets the criteria
61
+ - If blocked after 2 attempts, report the blocker and stop
@@ -8,7 +8,7 @@ description: Interact with App Store Connect via the asc CLI - apps, builds, Tes
8
8
  Read, manage, and ship any of the user's App Store apps through the **`asc`** CLI (App Store Connect CLI by Rork). `asc` covers nearly the entire ASC surface; reach for the raw API only for the rare gap.
9
9
 
10
10
  <auth>
11
- `asc` is already authenticated on this machine (a default keychain profile). Verify before doing real work:
11
+ `asc` is usually already authenticated on this machine (a default keychain profile). Verify before doing real work:
12
12
 
13
13
  ```bash
14
14
  asc auth status # shows stored credential profiles + which is default
@@ -17,7 +17,7 @@ asc doctor # diagnose auth/config issues
17
17
  ```
18
18
 
19
19
  - Multiple accounts/teams: `asc --profile <name> <command>` selects a profile.
20
- - A NEW account with no stored key: run the `appstore-connect-setup` skill (locates the `.p8`, key id, and issuer id, then `asc auth login`). Never print or commit `.p8` keys, key ids, or issuer ids.
20
+ - **Not authenticated / no working credential / a NEW account with no stored key:** read [references/setup.md](references/setup.md) and follow it — a battle-tested workflow to locate the `.p8`, key id, and issuer id, then `asc auth login`. Never print or commit `.p8` keys, key ids, or issuer ids.
21
21
  </auth>
22
22
 
23
23
  <how_to_drive>