compact-agent 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +394 -0
  2. package/bin/anycode.js +2 -0
  3. package/bin/crowcoder.js +19 -0
  4. package/bin/ecc-hooks.cjs +138 -0
  5. package/dist/agents.d.ts +17 -0
  6. package/dist/agents.js +1603 -0
  7. package/dist/agents.js.map +1 -0
  8. package/dist/api.d.ts +16 -0
  9. package/dist/api.js +115 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/autonomous-loops.d.ts +108 -0
  12. package/dist/autonomous-loops.js +526 -0
  13. package/dist/autonomous-loops.js.map +1 -0
  14. package/dist/codemaps.d.ts +53 -0
  15. package/dist/codemaps.js +325 -0
  16. package/dist/codemaps.js.map +1 -0
  17. package/dist/compaction.d.ts +30 -0
  18. package/dist/compaction.js +125 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/content-engine.d.ts +97 -0
  24. package/dist/content-engine.js +721 -0
  25. package/dist/content-engine.js.map +1 -0
  26. package/dist/cost-tracker.d.ts +49 -0
  27. package/dist/cost-tracker.js +150 -0
  28. package/dist/cost-tracker.js.map +1 -0
  29. package/dist/counter-button.d.ts +35 -0
  30. package/dist/counter-button.js +48 -0
  31. package/dist/counter-button.js.map +1 -0
  32. package/dist/counter.d.ts +21 -0
  33. package/dist/counter.js +31 -0
  34. package/dist/counter.js.map +1 -0
  35. package/dist/coverage.d.ts +23 -0
  36. package/dist/coverage.js +215 -0
  37. package/dist/coverage.js.map +1 -0
  38. package/dist/docs-sync.d.ts +23 -0
  39. package/dist/docs-sync.js +266 -0
  40. package/dist/docs-sync.js.map +1 -0
  41. package/dist/ecc.d.ts +41 -0
  42. package/dist/ecc.js +644 -0
  43. package/dist/ecc.js.map +1 -0
  44. package/dist/evaluation.d.ts +24 -0
  45. package/dist/evaluation.js +412 -0
  46. package/dist/evaluation.js.map +1 -0
  47. package/dist/export.d.ts +22 -0
  48. package/dist/export.js +109 -0
  49. package/dist/export.js.map +1 -0
  50. package/dist/git-workflow.d.ts +22 -0
  51. package/dist/git-workflow.js +197 -0
  52. package/dist/git-workflow.js.map +1 -0
  53. package/dist/hook-controls.d.ts +34 -0
  54. package/dist/hook-controls.js +90 -0
  55. package/dist/hook-controls.js.map +1 -0
  56. package/dist/hooks.d.ts +30 -0
  57. package/dist/hooks.js +130 -0
  58. package/dist/hooks.js.map +1 -0
  59. package/dist/html-parser.d.ts +18 -0
  60. package/dist/html-parser.js +101 -0
  61. package/dist/html-parser.js.map +1 -0
  62. package/dist/index.d.ts +12 -0
  63. package/dist/index.js +1230 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/learning.d.ts +35 -0
  66. package/dist/learning.js +238 -0
  67. package/dist/learning.js.map +1 -0
  68. package/dist/login.d.ts +37 -0
  69. package/dist/login.js +191 -0
  70. package/dist/login.js.map +1 -0
  71. package/dist/memory.d.ts +39 -0
  72. package/dist/memory.js +183 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/model-router.d.ts +23 -0
  75. package/dist/model-router.js +145 -0
  76. package/dist/model-router.js.map +1 -0
  77. package/dist/modes.d.ts +17 -0
  78. package/dist/modes.js +217 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/orchestration.d.ts +37 -0
  81. package/dist/orchestration.js +139 -0
  82. package/dist/orchestration.js.map +1 -0
  83. package/dist/package-detect.d.ts +36 -0
  84. package/dist/package-detect.js +529 -0
  85. package/dist/package-detect.js.map +1 -0
  86. package/dist/permissions.d.ts +25 -0
  87. package/dist/permissions.js +50 -0
  88. package/dist/permissions.js.map +1 -0
  89. package/dist/pm2-manager.d.ts +40 -0
  90. package/dist/pm2-manager.js +127 -0
  91. package/dist/pm2-manager.js.map +1 -0
  92. package/dist/query.d.ts +15 -0
  93. package/dist/query.js +278 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/refactor.d.ts +22 -0
  96. package/dist/refactor.js +226 -0
  97. package/dist/refactor.js.map +1 -0
  98. package/dist/retry.d.ts +20 -0
  99. package/dist/retry.js +88 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/rules.d.ts +34 -0
  102. package/dist/rules.js +942 -0
  103. package/dist/rules.js.map +1 -0
  104. package/dist/schema.d.ts +23 -0
  105. package/dist/schema.js +12 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/search-first.d.ts +17 -0
  108. package/dist/search-first.js +301 -0
  109. package/dist/search-first.js.map +1 -0
  110. package/dist/security.d.ts +10 -0
  111. package/dist/security.js +145 -0
  112. package/dist/security.js.map +1 -0
  113. package/dist/sessions.d.ts +21 -0
  114. package/dist/sessions.js +112 -0
  115. package/dist/sessions.js.map +1 -0
  116. package/dist/skill-create.d.ts +38 -0
  117. package/dist/skill-create.js +389 -0
  118. package/dist/skill-create.js.map +1 -0
  119. package/dist/skills.d.ts +34 -0
  120. package/dist/skills.js +161 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/strategic-compaction.d.ts +24 -0
  123. package/dist/strategic-compaction.js +144 -0
  124. package/dist/strategic-compaction.js.map +1 -0
  125. package/dist/system-prompt.d.ts +3 -0
  126. package/dist/system-prompt.js +101 -0
  127. package/dist/system-prompt.js.map +1 -0
  128. package/dist/theme.d.ts +60 -0
  129. package/dist/theme.js +220 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/tools/bash.d.ts +2 -0
  132. package/dist/tools/bash.js +49 -0
  133. package/dist/tools/bash.js.map +1 -0
  134. package/dist/tools/edit.d.ts +2 -0
  135. package/dist/tools/edit.js +76 -0
  136. package/dist/tools/edit.js.map +1 -0
  137. package/dist/tools/glob.d.ts +2 -0
  138. package/dist/tools/glob.js +54 -0
  139. package/dist/tools/glob.js.map +1 -0
  140. package/dist/tools/grep.d.ts +2 -0
  141. package/dist/tools/grep.js +64 -0
  142. package/dist/tools/grep.js.map +1 -0
  143. package/dist/tools/index.d.ts +5 -0
  144. package/dist/tools/index.js +27 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/dist/tools/list-dir.d.ts +2 -0
  147. package/dist/tools/list-dir.js +51 -0
  148. package/dist/tools/list-dir.js.map +1 -0
  149. package/dist/tools/read.d.ts +2 -0
  150. package/dist/tools/read.js +56 -0
  151. package/dist/tools/read.js.map +1 -0
  152. package/dist/tools/types.d.ts +45 -0
  153. package/dist/tools/types.js +2 -0
  154. package/dist/tools/types.js.map +1 -0
  155. package/dist/tools/web-fetch.d.ts +2 -0
  156. package/dist/tools/web-fetch.js +41 -0
  157. package/dist/tools/web-fetch.js.map +1 -0
  158. package/dist/tools/web-search.d.ts +27 -0
  159. package/dist/tools/web-search.js +139 -0
  160. package/dist/tools/web-search.js.map +1 -0
  161. package/dist/tools/write.d.ts +2 -0
  162. package/dist/tools/write.js +36 -0
  163. package/dist/tools/write.js.map +1 -0
  164. package/dist/types.d.ts +28 -0
  165. package/dist/types.js +57 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/users.d.ts +51 -0
  168. package/dist/users.js +193 -0
  169. package/dist/users.js.map +1 -0
  170. package/dist/verification.d.ts +73 -0
  171. package/dist/verification.js +269 -0
  172. package/dist/verification.js.map +1 -0
  173. package/dist/walkthrough.d.ts +10 -0
  174. package/dist/walkthrough.js +121 -0
  175. package/dist/walkthrough.js.map +1 -0
  176. package/package.json +58 -0
  177. package/resources/ecc/agents/architect.json +16 -0
  178. package/resources/ecc/agents/architect.md +212 -0
  179. package/resources/ecc/agents/build-error-resolver.json +17 -0
  180. package/resources/ecc/agents/build-error-resolver.md +116 -0
  181. package/resources/ecc/agents/chief-of-staff.json +17 -0
  182. package/resources/ecc/agents/chief-of-staff.md +153 -0
  183. package/resources/ecc/agents/code-reviewer.json +16 -0
  184. package/resources/ecc/agents/code-reviewer.md +238 -0
  185. package/resources/ecc/agents/database-reviewer.json +16 -0
  186. package/resources/ecc/agents/database-reviewer.md +92 -0
  187. package/resources/ecc/agents/doc-updater.json +16 -0
  188. package/resources/ecc/agents/doc-updater.md +108 -0
  189. package/resources/ecc/agents/e2e-runner.json +17 -0
  190. package/resources/ecc/agents/e2e-runner.md +109 -0
  191. package/resources/ecc/agents/go-build-resolver.json +17 -0
  192. package/resources/ecc/agents/go-build-resolver.md +96 -0
  193. package/resources/ecc/agents/go-reviewer.json +16 -0
  194. package/resources/ecc/agents/go-reviewer.md +77 -0
  195. package/resources/ecc/agents/harness-optimizer.json +15 -0
  196. package/resources/ecc/agents/harness-optimizer.md +34 -0
  197. package/resources/ecc/agents/loop-operator.json +16 -0
  198. package/resources/ecc/agents/loop-operator.md +36 -0
  199. package/resources/ecc/agents/planner.json +15 -0
  200. package/resources/ecc/agents/planner.md +212 -0
  201. package/resources/ecc/agents/python-reviewer.json +16 -0
  202. package/resources/ecc/agents/python-reviewer.md +99 -0
  203. package/resources/ecc/agents/refactor-cleaner.json +17 -0
  204. package/resources/ecc/agents/refactor-cleaner.md +87 -0
  205. package/resources/ecc/agents/security-reviewer.json +16 -0
  206. package/resources/ecc/agents/security-reviewer.md +109 -0
  207. package/resources/ecc/agents/tdd-guide.json +17 -0
  208. package/resources/ecc/agents/tdd-guide.md +93 -0
  209. package/resources/ecc/commands/add-language-rules.md +39 -0
  210. package/resources/ecc/commands/database-migration.md +36 -0
  211. package/resources/ecc/commands/feature-development.md +38 -0
  212. package/resources/ecc/prompts/build-fix.prompt.md +47 -0
  213. package/resources/ecc/prompts/code-review.prompt.md +56 -0
  214. package/resources/ecc/prompts/plan.prompt.md +52 -0
  215. package/resources/ecc/prompts/refactor.prompt.md +50 -0
  216. package/resources/ecc/prompts/security-review.prompt.md +70 -0
  217. package/resources/ecc/prompts/tdd.prompt.md +47 -0
  218. package/resources/ecc/rules/common-agents.md +53 -0
  219. package/resources/ecc/rules/common-coding-style.md +52 -0
  220. package/resources/ecc/rules/common-development-workflow.md +33 -0
  221. package/resources/ecc/rules/common-git-workflow.md +28 -0
  222. package/resources/ecc/rules/common-hooks.md +34 -0
  223. package/resources/ecc/rules/common-patterns.md +35 -0
  224. package/resources/ecc/rules/common-performance.md +59 -0
  225. package/resources/ecc/rules/common-security.md +33 -0
  226. package/resources/ecc/rules/common-testing.md +33 -0
  227. package/resources/ecc/rules/golang-coding-style.md +31 -0
  228. package/resources/ecc/rules/golang-hooks.md +16 -0
  229. package/resources/ecc/rules/golang-patterns.md +44 -0
  230. package/resources/ecc/rules/golang-security.md +33 -0
  231. package/resources/ecc/rules/golang-testing.md +30 -0
  232. package/resources/ecc/rules/kotlin-coding-style.md +39 -0
  233. package/resources/ecc/rules/kotlin-hooks.md +16 -0
  234. package/resources/ecc/rules/kotlin-patterns.md +50 -0
  235. package/resources/ecc/rules/kotlin-security.md +58 -0
  236. package/resources/ecc/rules/kotlin-testing.md +38 -0
  237. package/resources/ecc/rules/php-coding-style.md +25 -0
  238. package/resources/ecc/rules/php-hooks.md +21 -0
  239. package/resources/ecc/rules/php-patterns.md +23 -0
  240. package/resources/ecc/rules/php-security.md +24 -0
  241. package/resources/ecc/rules/php-testing.md +26 -0
  242. package/resources/ecc/rules/python-coding-style.md +42 -0
  243. package/resources/ecc/rules/python-hooks.md +19 -0
  244. package/resources/ecc/rules/python-patterns.md +39 -0
  245. package/resources/ecc/rules/python-security.md +30 -0
  246. package/resources/ecc/rules/python-testing.md +38 -0
  247. package/resources/ecc/rules/swift-coding-style.md +47 -0
  248. package/resources/ecc/rules/swift-hooks.md +20 -0
  249. package/resources/ecc/rules/swift-patterns.md +66 -0
  250. package/resources/ecc/rules/swift-security.md +33 -0
  251. package/resources/ecc/rules/swift-testing.md +45 -0
  252. package/resources/ecc/rules/typescript-coding-style.md +63 -0
  253. package/resources/ecc/rules/typescript-hooks.md +20 -0
  254. package/resources/ecc/rules/typescript-patterns.md +50 -0
  255. package/resources/ecc/rules/typescript-security.md +26 -0
  256. package/resources/ecc/rules/typescript-testing.md +16 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
  258. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
  260. package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
  261. package/resources/ecc/skills/api-design/SKILL.md +522 -0
  262. package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
  263. package/resources/ecc/skills/article-writing/SKILL.md +78 -0
  264. package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
  265. package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
  266. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
  267. package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
  268. package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
  269. package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  270. package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
  271. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
  272. package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
  273. package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
  274. package/resources/ecc/skills/content-engine/SKILL.md +130 -0
  275. package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
  276. package/resources/ecc/skills/crosspost/SKILL.md +110 -0
  277. package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
  278. package/resources/ecc/skills/deep-research/SKILL.md +154 -0
  279. package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
  280. package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
  281. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
  282. package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
  283. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
  284. package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
  285. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
  286. package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
  287. package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
  288. package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
  289. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
  290. package/resources/ecc/skills/exa-search/SKILL.md +169 -0
  291. package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
  292. package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
  293. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
  294. package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
  295. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
  296. package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
  297. package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  298. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
  299. package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
  300. package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
  301. package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
  302. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
  303. package/resources/ecc/skills/market-research/SKILL.md +74 -0
  304. package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
  305. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
  306. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  307. package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
  308. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
  309. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
  310. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  311. package/resources/ecc/skills/product-capability/SKILL.md +140 -0
  312. package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
  313. package/resources/ecc/skills/security-review/SKILL.md +494 -0
  314. package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
  315. package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
  316. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
  317. package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
  318. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
  319. package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
  320. package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
  321. package/resources/ecc/skills/video-editing/SKILL.md +307 -0
  322. package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
  323. package/resources/ecc/skills/x-api/SKILL.md +229 -0
  324. package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
package/dist/users.js ADDED
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Users table — persistent user management.
3
+ * Stores user data in ~/.crowcoder/users.json
4
+ *
5
+ * Each user has a unique ID, display name, and metadata.
6
+ * Users can be activated/deactivated, and the active user's context
7
+ * is injected into the system prompt so the LLM knows who it's working with.
8
+ */
9
+ import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { randomUUID } from 'node:crypto';
12
+ import { getConfigDir } from './config.js';
13
+ import { createEmptyUsersTable } from './schema.js';
14
+ const USERS_FILE = join(getConfigDir(), 'users.json');
15
+ function defaultUsersData() {
16
+ return createEmptyUsersTable();
17
+ }
18
+ function loadUsers() {
19
+ if (!existsSync(USERS_FILE)) {
20
+ return defaultUsersData();
21
+ }
22
+ try {
23
+ const raw = readFileSync(USERS_FILE, 'utf-8');
24
+ return JSON.parse(raw);
25
+ }
26
+ catch {
27
+ return defaultUsersData();
28
+ }
29
+ }
30
+ function saveUsers(data) {
31
+ mkdirSync(getConfigDir(), { recursive: true });
32
+ writeFileSync(USERS_FILE, JSON.stringify(data, null, 2), 'utf-8');
33
+ }
34
+ /**
35
+ * Create a new user. Returns the created User.
36
+ */
37
+ export function createUser(name, email, role) {
38
+ const data = loadUsers();
39
+ const user = {
40
+ id: randomUUID(),
41
+ name,
42
+ email,
43
+ role,
44
+ active: false,
45
+ createdAt: new Date().toISOString(),
46
+ updatedAt: new Date().toISOString(),
47
+ metadata: {},
48
+ };
49
+ data.users.push(user);
50
+ saveUsers(data);
51
+ return user;
52
+ }
53
+ /**
54
+ * List all users.
55
+ */
56
+ export function listUsers() {
57
+ return loadUsers().users;
58
+ }
59
+ /**
60
+ * Get a user by ID.
61
+ */
62
+ export function getUser(id) {
63
+ const data = loadUsers();
64
+ return data.users.find((u) => u.id === id) || null;
65
+ }
66
+ /**
67
+ * Get a user by email address.
68
+ */
69
+ export function getUserByEmail(email) {
70
+ const data = loadUsers();
71
+ return data.users.find((u) => u.email?.toLowerCase() === email.toLowerCase()) || null;
72
+ }
73
+ /**
74
+ * Get the currently active user.
75
+ */
76
+ export function getActiveUser() {
77
+ const data = loadUsers();
78
+ if (!data.activeUserId)
79
+ return null;
80
+ return getUser(data.activeUserId);
81
+ }
82
+ /**
83
+ * Update a user's fields. Returns the updated User or null if not found.
84
+ */
85
+ export function updateUser(id, updates) {
86
+ const data = loadUsers();
87
+ const idx = data.users.findIndex((u) => u.id === id);
88
+ if (idx === -1)
89
+ return null;
90
+ const user = data.users[idx];
91
+ if (updates.name !== undefined)
92
+ user.name = updates.name;
93
+ if (updates.email !== undefined)
94
+ user.email = updates.email;
95
+ if (updates.role !== undefined)
96
+ user.role = updates.role;
97
+ if (updates.active !== undefined)
98
+ user.active = updates.active;
99
+ if (updates.metadata !== undefined)
100
+ user.metadata = { ...user.metadata, ...updates.metadata };
101
+ user.updatedAt = new Date().toISOString();
102
+ // If activating this user, deactivate all others
103
+ if (updates.active === true) {
104
+ data.activeUserId = id;
105
+ for (let i = 0; i < data.users.length; i++) {
106
+ if (i !== idx) {
107
+ data.users[i].active = false;
108
+ }
109
+ }
110
+ }
111
+ else if (updates.active === false && data.activeUserId === id) {
112
+ data.activeUserId = null;
113
+ }
114
+ data.users[idx] = user;
115
+ saveUsers(data);
116
+ return user;
117
+ }
118
+ /**
119
+ * Delete a user by ID. Returns true if deleted, false if not found.
120
+ */
121
+ export function deleteUser(id) {
122
+ const data = loadUsers();
123
+ const idx = data.users.findIndex((u) => u.id === id);
124
+ if (idx === -1)
125
+ return false;
126
+ if (data.activeUserId === id) {
127
+ data.activeUserId = null;
128
+ }
129
+ data.users.splice(idx, 1);
130
+ saveUsers(data);
131
+ return true;
132
+ }
133
+ /**
134
+ * Set the active user by ID. Returns the activated User or null if not found.
135
+ */
136
+ export function setActiveUser(id) {
137
+ const user = getUser(id);
138
+ if (!user)
139
+ return null;
140
+ return updateUser(id, { active: true });
141
+ }
142
+ /**
143
+ * Set user metadata key/value pair.
144
+ */
145
+ export function setUserMetadata(id, key, value) {
146
+ const user = getUser(id);
147
+ if (!user)
148
+ return null;
149
+ return updateUser(id, { metadata: { ...user.metadata, [key]: value } });
150
+ }
151
+ /**
152
+ * Get a metadata value for a user.
153
+ */
154
+ export function getUserMetadata(id, key) {
155
+ const user = getUser(id);
156
+ return user?.metadata[key];
157
+ }
158
+ /**
159
+ * Print a formatted user list to stdout.
160
+ */
161
+ export function printUserList() {
162
+ const { users, activeUserId } = loadUsers();
163
+ if (users.length === 0) {
164
+ console.log(' No users defined yet.');
165
+ return;
166
+ }
167
+ for (const u of users) {
168
+ const marker = u.id === activeUserId ? ' ◀ active' : '';
169
+ const status = u.active ? '' : ' (inactive)';
170
+ const email = u.email ? ` <${u.email}>` : '';
171
+ const role = u.role ? ` [${u.role}]` : '';
172
+ console.log(` ${u.id.slice(0, 8)} ${u.name}${email}${role}${status}${marker}`);
173
+ }
174
+ }
175
+ /**
176
+ * Build a context string about the active user for the system prompt.
177
+ */
178
+ export function buildUserContext() {
179
+ const user = getActiveUser();
180
+ if (!user)
181
+ return '';
182
+ const lines = [`# Active User: ${user.name}`];
183
+ if (user.email)
184
+ lines.push(`# Email: ${user.email}`);
185
+ if (user.role)
186
+ lines.push(`# Role: ${user.role}`);
187
+ const customKeys = Object.keys(user.metadata).filter((k) => !['name', 'email', 'role'].includes(k));
188
+ for (const k of customKeys) {
189
+ lines.push(`# ${k}: ${user.metadata[k]}`);
190
+ }
191
+ return lines.join('\n');
192
+ }
193
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../src/users.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAiC,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAKnF,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AAEtD,SAAS,gBAAgB;IACvB,OAAO,qBAAqB,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAe;IAChC,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAc,EAAE,IAAa;IACpE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,IAAI,GAAS;QACjB,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,EAAE;KACb,CAAC;IACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,SAAS,EAAE,CAAC,KAAK,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU,EAAE,OAA+E;IACpH,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/D,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9F,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE1C,iDAAiD;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7B,IAAI,IAAI,CAAC,YAAY,KAAK,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC1B,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,GAAW,EAAE,KAAa;IACpE,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU,EAAE,GAAW;IACrD,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAC7C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,KAAK,GAAG,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Verification loop engine and checkpoint system
3
+ * - Verification loop (/verify): Runs tests, analyzes failures, fixes code, repeats
4
+ * - Checkpoint system (/checkpoint): Saves/restores git state
5
+ */
6
+ export interface Checkpoint {
7
+ id: string;
8
+ sessionId: string;
9
+ label?: string;
10
+ headSha: string;
11
+ isDirty: boolean;
12
+ dirtyFiles: string[];
13
+ timestamp: string;
14
+ cwd: string;
15
+ }
16
+ export interface VerificationConfig {
17
+ maxIterations: number;
18
+ timeoutMs: number;
19
+ verbose: boolean;
20
+ }
21
+ declare function ensureCheckpointsDir(): void;
22
+ declare function checkpointPath(sessionId: string, checkpointId: string): string;
23
+ declare function generateCheckpointId(): string;
24
+ declare function getGitHeadSha(cwd: string): string;
25
+ declare function getGitDirtyFiles(cwd: string): string[];
26
+ declare function isGitDirty(cwd: string): boolean;
27
+ /**
28
+ * Save current git state as a checkpoint
29
+ * @param sessionId - Unique session identifier
30
+ * @param cwd - Working directory to checkpoint
31
+ * @param label - Optional label for the checkpoint
32
+ * @returns Checkpoint metadata
33
+ */
34
+ export declare function saveCheckpoint(sessionId: string, cwd: string, label?: string): Checkpoint;
35
+ /**
36
+ * List all checkpoints for a session
37
+ * @param sessionId - Session identifier
38
+ * @returns Array of checkpoint metadata
39
+ */
40
+ export declare function listCheckpoints(sessionId: string): Checkpoint[];
41
+ /**
42
+ * Restore a checkpoint (returns instructions for restoration)
43
+ * @param sessionId - Session identifier
44
+ * @param checkpointId - Checkpoint identifier
45
+ * @returns Instructions string for restoring the checkpoint
46
+ */
47
+ export declare function restoreCheckpoint(sessionId: string, checkpointId: string): string;
48
+ /**
49
+ * Auto-detect the test command for the current project
50
+ * @param cwd - Working directory
51
+ * @returns Test command string
52
+ */
53
+ export declare function autoDetectTestCommand(cwd: string): string;
54
+ /**
55
+ * Build a detailed verification loop prompt
56
+ * @param cwd - Working directory
57
+ * @param command - Optional test command (auto-detected if not provided)
58
+ * @returns Detailed prompt string
59
+ */
60
+ export declare function buildVerifyPrompt(cwd: string, command?: string): string;
61
+ /**
62
+ * Run a verification loop (for CLI reference/testing)
63
+ * @param cwd - Working directory
64
+ * @param command - Test command
65
+ * @param config - Verification configuration
66
+ * @returns Verification result
67
+ */
68
+ export declare function runVerificationLoop(cwd: string, command: string, config?: VerificationConfig): Promise<{
69
+ success: boolean;
70
+ iterations: number;
71
+ errors: string[];
72
+ }>;
73
+ export { getGitHeadSha, getGitDirtyFiles, isGitDirty, generateCheckpointId, checkpointPath, ensureCheckpointsDir, };
@@ -0,0 +1,269 @@
1
+ /**
2
+ * Verification loop engine and checkpoint system
3
+ * - Verification loop (/verify): Runs tests, analyzes failures, fixes code, repeats
4
+ * - Checkpoint system (/checkpoint): Saves/restores git state
5
+ */
6
+ import { execSync } from 'node:child_process';
7
+ import { readFileSync, writeFileSync, readdirSync, mkdirSync, existsSync } from 'node:fs';
8
+ import { join } from 'node:path';
9
+ import chalk from 'chalk';
10
+ import { getConfigDir } from './config.js';
11
+ // ── Checkpoint System ──────────────────────────────────
12
+ const CHECKPOINTS_DIR = join(getConfigDir(), 'checkpoints');
13
+ function ensureCheckpointsDir() {
14
+ mkdirSync(CHECKPOINTS_DIR, { recursive: true });
15
+ }
16
+ function checkpointPath(sessionId, checkpointId) {
17
+ return join(CHECKPOINTS_DIR, `${sessionId}__${checkpointId}.json`);
18
+ }
19
+ function generateCheckpointId() {
20
+ const ts = Date.now().toString(36);
21
+ const rand = Math.random().toString(36).slice(2, 8);
22
+ return `${ts}-${rand}`;
23
+ }
24
+ function getGitHeadSha(cwd) {
25
+ try {
26
+ return execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim();
27
+ }
28
+ catch {
29
+ throw new Error('Not a git repository');
30
+ }
31
+ }
32
+ function getGitDirtyFiles(cwd) {
33
+ try {
34
+ const output = execSync('git status --porcelain', { cwd, encoding: 'utf-8' }).trim();
35
+ return output ? output.split('\n').map((line) => line.slice(3)) : [];
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ }
41
+ function isGitDirty(cwd) {
42
+ try {
43
+ const output = execSync('git status --porcelain', { cwd, encoding: 'utf-8' }).trim();
44
+ return output.length > 0;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Save current git state as a checkpoint
52
+ * @param sessionId - Unique session identifier
53
+ * @param cwd - Working directory to checkpoint
54
+ * @param label - Optional label for the checkpoint
55
+ * @returns Checkpoint metadata
56
+ */
57
+ export function saveCheckpoint(sessionId, cwd, label) {
58
+ ensureCheckpointsDir();
59
+ const checkpointId = generateCheckpointId();
60
+ const headSha = getGitHeadSha(cwd);
61
+ const isDirty = isGitDirty(cwd);
62
+ const dirtyFiles = getGitDirtyFiles(cwd);
63
+ const checkpoint = {
64
+ id: checkpointId,
65
+ sessionId,
66
+ label,
67
+ headSha,
68
+ isDirty,
69
+ dirtyFiles,
70
+ timestamp: new Date().toISOString(),
71
+ cwd,
72
+ };
73
+ const path = checkpointPath(sessionId, checkpointId);
74
+ writeFileSync(path, JSON.stringify(checkpoint, null, 2), 'utf-8');
75
+ return checkpoint;
76
+ }
77
+ /**
78
+ * List all checkpoints for a session
79
+ * @param sessionId - Session identifier
80
+ * @returns Array of checkpoint metadata
81
+ */
82
+ export function listCheckpoints(sessionId) {
83
+ ensureCheckpointsDir();
84
+ const files = readdirSync(CHECKPOINTS_DIR).filter((f) => f.startsWith(`${sessionId}__`) && f.endsWith('.json'));
85
+ const checkpoints = [];
86
+ for (const file of files) {
87
+ try {
88
+ const raw = readFileSync(join(CHECKPOINTS_DIR, file), 'utf-8');
89
+ checkpoints.push(JSON.parse(raw));
90
+ }
91
+ catch {
92
+ // skip corrupt files
93
+ }
94
+ }
95
+ return checkpoints.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
96
+ }
97
+ /**
98
+ * Restore a checkpoint (returns instructions for restoration)
99
+ * @param sessionId - Session identifier
100
+ * @param checkpointId - Checkpoint identifier
101
+ * @returns Instructions string for restoring the checkpoint
102
+ */
103
+ export function restoreCheckpoint(sessionId, checkpointId) {
104
+ ensureCheckpointsDir();
105
+ const path = checkpointPath(sessionId, checkpointId);
106
+ if (!existsSync(path)) {
107
+ throw new Error(`Checkpoint not found: ${checkpointId}`);
108
+ }
109
+ const checkpoint = JSON.parse(readFileSync(path, 'utf-8'));
110
+ // Build restoration instructions
111
+ const instructions = [];
112
+ instructions.push(`${chalk.bold('Checkpoint Restoration Instructions')}:`);
113
+ instructions.push('');
114
+ instructions.push(`Label: ${checkpoint.label || '(unlabeled)'}`);
115
+ instructions.push(`Timestamp: ${checkpoint.timestamp}`);
116
+ instructions.push(`HEAD SHA: ${checkpoint.headSha}`);
117
+ instructions.push('');
118
+ instructions.push('To restore this checkpoint, run:');
119
+ instructions.push('');
120
+ instructions.push(` cd "${checkpoint.cwd}"`);
121
+ instructions.push(` git checkout ${checkpoint.headSha}`);
122
+ if (checkpoint.isDirty) {
123
+ instructions.push('');
124
+ instructions.push('Note: This checkpoint had uncommitted changes:');
125
+ for (const file of checkpoint.dirtyFiles) {
126
+ instructions.push(` - ${file}`);
127
+ }
128
+ instructions.push('');
129
+ instructions.push('You may want to preserve them:');
130
+ instructions.push(' git stash');
131
+ instructions.push(' git checkout <your-branch>');
132
+ instructions.push(' git stash pop');
133
+ }
134
+ return instructions.join('\n');
135
+ }
136
+ // ── Verification Loop ──────────────────────────────────
137
+ /**
138
+ * Auto-detect the test command for the current project
139
+ * @param cwd - Working directory
140
+ * @returns Test command string
141
+ */
142
+ export function autoDetectTestCommand(cwd) {
143
+ const checks = [
144
+ { file: 'package.json', cmd: 'npm test' },
145
+ { file: 'pyproject.toml', cmd: 'pytest' },
146
+ { file: 'setup.py', cmd: 'pytest' },
147
+ { file: 'Cargo.toml', cmd: 'cargo test' },
148
+ { file: 'go.mod', cmd: 'go test ./...' },
149
+ { file: 'Gemfile', cmd: 'bundle exec rake test' },
150
+ { file: 'pom.xml', cmd: 'mvn test' },
151
+ { file: 'build.gradle', cmd: 'gradle test' },
152
+ ];
153
+ for (const { file, cmd } of checks) {
154
+ if (existsSync(join(cwd, file))) {
155
+ return cmd;
156
+ }
157
+ }
158
+ return 'npm test'; // default fallback
159
+ }
160
+ /**
161
+ * Build a detailed verification loop prompt
162
+ * @param cwd - Working directory
163
+ * @param command - Optional test command (auto-detected if not provided)
164
+ * @returns Detailed prompt string
165
+ */
166
+ export function buildVerifyPrompt(cwd, command) {
167
+ const testCmd = command || autoDetectTestCommand(cwd);
168
+ const prompt = `You are now in verification mode. Your goal is to run tests, analyze failures, fix the code, and repeat until all tests pass.
169
+
170
+ ${chalk.bold('Verification Loop Process:')}
171
+
172
+ 1. ${chalk.cyan('Run the test command')}
173
+ Execute: ${chalk.yellow(testCmd)}
174
+ Capture all output, stderr, and exit codes
175
+
176
+ 2. ${chalk.cyan('Analyze the output')}
177
+ Look for:
178
+ - Failed test names and error messages
179
+ - Stack traces and assertion failures
180
+ - Missing imports or undefined references
181
+ - Type errors (if applicable)
182
+ - Any other compilation/runtime errors
183
+
184
+ 3. ${chalk.cyan('Fix the failing code')}
185
+ Based on the errors:
186
+ - Identify the root cause
187
+ - Modify the minimal necessary code to fix the issue
188
+ - Do NOT refactor unrelated code
189
+ - Ensure fixes are targeted and precise
190
+
191
+ 4. ${chalk.cyan('Re-run the test command')}
192
+ Execute: ${chalk.yellow(testCmd)}
193
+ Verify the fix resolved the issue
194
+
195
+ 5. ${chalk.cyan('Repeat until success')}
196
+ Continue the loop until either:
197
+ - All tests pass (SUCCESS)
198
+ - You've made 5 iterations (STOP - escalate)
199
+
200
+ ${chalk.bold('Important Guidelines:')}
201
+ - ${chalk.dim('Work in:')} ${cwd}
202
+ - ${chalk.dim('Run tests with:')} ${testCmd}
203
+ - ${chalk.dim('Max iterations:')} 5 (safety limit)
204
+ - ${chalk.dim('Be systematic:')} Fix one issue at a time
205
+ - ${chalk.dim('Show progress:')} Report iteration count and current status
206
+ - ${chalk.dim('Be explicit:')} Show the exact commands you run and their output
207
+ - ${chalk.dim('Stop if stuck:')} If you can't make progress after 5 iterations, explain what you've tried and ask for help
208
+
209
+ ${chalk.bold('Output Format:')}
210
+ For each iteration, clearly indicate:
211
+ - Iteration number (e.g., "Iteration 1/5")
212
+ - Test command being run
213
+ - Output/errors found
214
+ - Root cause analysis
215
+ - Fix applied
216
+ - Result of re-run
217
+
218
+ When complete, provide a summary of:
219
+ - Total iterations taken
220
+ - Issues fixed
221
+ - Final test status (PASS/FAIL)
222
+ - Any remaining concerns
223
+ `;
224
+ return prompt;
225
+ }
226
+ /**
227
+ * Run a verification loop (for CLI reference/testing)
228
+ * @param cwd - Working directory
229
+ * @param command - Test command
230
+ * @param config - Verification configuration
231
+ * @returns Verification result
232
+ */
233
+ export async function runVerificationLoop(cwd, command, config = { maxIterations: 5, timeoutMs: 30000, verbose: false }) {
234
+ const errors = [];
235
+ let iterations = 0;
236
+ for (iterations = 1; iterations <= config.maxIterations; iterations++) {
237
+ if (config.verbose) {
238
+ console.log(`\n${chalk.blue(`Iteration ${iterations}/${config.maxIterations}`)}`);
239
+ }
240
+ try {
241
+ const output = execSync(command, {
242
+ cwd,
243
+ encoding: 'utf-8',
244
+ stdio: 'pipe',
245
+ timeout: config.timeoutMs,
246
+ });
247
+ if (config.verbose) {
248
+ console.log(chalk.green('All tests passed!'));
249
+ }
250
+ return { success: true, iterations, errors: [] };
251
+ }
252
+ catch (err) {
253
+ const errorOutput = err instanceof Error ? err.message : String(err);
254
+ errors.push(errorOutput);
255
+ if (config.verbose) {
256
+ console.log(chalk.red('Test failed'));
257
+ console.log(chalk.dim(errorOutput.slice(0, 200) + '...'));
258
+ }
259
+ }
260
+ }
261
+ return {
262
+ success: false,
263
+ iterations: config.maxIterations,
264
+ errors,
265
+ };
266
+ }
267
+ // ── Exports ────────────────────────────────────────────
268
+ export { getGitHeadSha, getGitDirtyFiles, isGitDirty, generateCheckpointId, checkpointPath, ensureCheckpointsDir, };
269
+ //# sourceMappingURL=verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.js","sourceRoot":"","sources":["../src/verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Walkthrough prompt — agent-led tour of Crowcoder.
3
+ *
4
+ * Invoked via `/walkthrough` (or `/tour` / `/guide`). Returns a prompt that
5
+ * puts the assistant into Onboarding Guide mode for the rest of the session
6
+ * (until the user runs `/clear` or switches modes). The guide leads the user
7
+ * through the canonical command surface — no duplicates, no ECC-vs-built-in
8
+ * choices to make.
9
+ */
10
+ export declare function buildWalkthroughPrompt(): string;