codeloop 0.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 (73) hide show
  1. package/dist/commands/configure.d.ts +2 -0
  2. package/dist/commands/configure.d.ts.map +1 -0
  3. package/dist/commands/configure.js +97 -0
  4. package/dist/commands/configure.js.map +1 -0
  5. package/dist/commands/init.d.ts +2 -0
  6. package/dist/commands/init.d.ts.map +1 -0
  7. package/dist/commands/init.js +241 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/commands/login.d.ts +2 -0
  10. package/dist/commands/login.d.ts.map +1 -0
  11. package/dist/commands/login.js +60 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/signup.d.ts +2 -0
  14. package/dist/commands/signup.d.ts.map +1 -0
  15. package/dist/commands/signup.js +62 -0
  16. package/dist/commands/signup.js.map +1 -0
  17. package/dist/commands/status.d.ts +2 -0
  18. package/dist/commands/status.d.ts.map +1 -0
  19. package/dist/commands/status.js +82 -0
  20. package/dist/commands/status.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +35 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/templates/claude-agents.d.ts +5 -0
  26. package/dist/templates/claude-agents.d.ts.map +1 -0
  27. package/dist/templates/claude-agents.js +59 -0
  28. package/dist/templates/claude-agents.js.map +1 -0
  29. package/dist/templates/claude-prompts.d.ts +4 -0
  30. package/dist/templates/claude-prompts.d.ts.map +1 -0
  31. package/dist/templates/claude-prompts.js +41 -0
  32. package/dist/templates/claude-prompts.js.map +1 -0
  33. package/dist/templates/config.d.ts +2 -0
  34. package/dist/templates/config.d.ts.map +1 -0
  35. package/dist/templates/config.js +32 -0
  36. package/dist/templates/config.js.map +1 -0
  37. package/dist/templates/cursor-rules.d.ts +7 -0
  38. package/dist/templates/cursor-rules.d.ts.map +1 -0
  39. package/dist/templates/cursor-rules.js +179 -0
  40. package/dist/templates/cursor-rules.js.map +1 -0
  41. package/dist/templates/cursor-skills.d.ts +5 -0
  42. package/dist/templates/cursor-skills.d.ts.map +1 -0
  43. package/dist/templates/cursor-skills.js +157 -0
  44. package/dist/templates/cursor-skills.js.map +1 -0
  45. package/dist/templates/mcp-config.d.ts +23 -0
  46. package/dist/templates/mcp-config.d.ts.map +1 -0
  47. package/dist/templates/mcp-config.js +23 -0
  48. package/dist/templates/mcp-config.js.map +1 -0
  49. package/dist/templates/specs.d.ts +4 -0
  50. package/dist/templates/specs.d.ts.map +1 -0
  51. package/dist/templates/specs.js +68 -0
  52. package/dist/templates/specs.js.map +1 -0
  53. package/dist/utils/api-client.d.ts +64 -0
  54. package/dist/utils/api-client.d.ts.map +1 -0
  55. package/dist/utils/api-client.js +66 -0
  56. package/dist/utils/api-client.js.map +1 -0
  57. package/dist/utils/detect-project.d.ts +6 -0
  58. package/dist/utils/detect-project.d.ts.map +1 -0
  59. package/dist/utils/detect-project.js +51 -0
  60. package/dist/utils/detect-project.js.map +1 -0
  61. package/dist/utils/file-writer.d.ts +3 -0
  62. package/dist/utils/file-writer.d.ts.map +1 -0
  63. package/dist/utils/file-writer.js +19 -0
  64. package/dist/utils/file-writer.js.map +1 -0
  65. package/dist/utils/key-storage.d.ts +5 -0
  66. package/dist/utils/key-storage.d.ts.map +1 -0
  67. package/dist/utils/key-storage.js +93 -0
  68. package/dist/utils/key-storage.js.map +1 -0
  69. package/dist/utils/ui.d.ts +7 -0
  70. package/dist/utils/ui.d.ts.map +1 -0
  71. package/dist/utils/ui.js +24 -0
  72. package/dist/utils/ui.js.map +1 -0
  73. package/package.json +43 -0
@@ -0,0 +1,2 @@
1
+ export declare function configureCommand(): Promise<void>;
2
+ //# sourceMappingURL=configure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"AAOA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoGtD"}
@@ -0,0 +1,97 @@
1
+ import { existsSync, readFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { select, checkbox, input, confirm } from "@inquirer/prompts";
4
+ import { writeFileSafe } from "../utils/file-writer.js";
5
+ import { createDefaultConfig } from "../templates/config.js";
6
+ import { printBox, printSuccess, printInfo } from "../utils/ui.js";
7
+ export async function configureCommand() {
8
+ const cwd = process.cwd();
9
+ const configPath = join(cwd, ".codeloop", "config.json");
10
+ printBox("CodeLoop — Configure");
11
+ let config;
12
+ if (existsSync(configPath)) {
13
+ try {
14
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
15
+ printInfo("Editing existing configuration\n");
16
+ }
17
+ catch {
18
+ config = createDefaultConfig();
19
+ printInfo("Config file was invalid — starting fresh\n");
20
+ }
21
+ }
22
+ else {
23
+ config = createDefaultConfig();
24
+ printInfo("No config found — creating new configuration\n");
25
+ }
26
+ const platforms = await checkbox({
27
+ message: "Target platforms:",
28
+ choices: [
29
+ {
30
+ name: "Auto-detect",
31
+ value: "auto",
32
+ checked: config.platforms?.includes("auto"),
33
+ },
34
+ {
35
+ name: "Flutter",
36
+ value: "flutter",
37
+ checked: config.platforms?.includes("flutter"),
38
+ },
39
+ {
40
+ name: "Web",
41
+ value: "web",
42
+ checked: config.platforms?.includes("web"),
43
+ },
44
+ {
45
+ name: "Mobile (native)",
46
+ value: "mobile",
47
+ checked: config.platforms?.includes("mobile"),
48
+ },
49
+ ],
50
+ });
51
+ config.platforms = platforms.length > 0 ? platforms : ["auto"];
52
+ const visionModel = await select({
53
+ message: "Vision model for screenshots:",
54
+ choices: [
55
+ { name: "Auto (best available)", value: "auto" },
56
+ { name: "Claude (Anthropic)", value: "claude" },
57
+ { name: "GPT-4o (OpenAI)", value: "gpt4o" },
58
+ { name: "Gemini (Google)", value: "gemini" },
59
+ ],
60
+ default: config.vision_model || "auto",
61
+ });
62
+ config.vision_model = visionModel;
63
+ const autoVerify = await confirm({
64
+ message: "Auto-verify when AI marks a task complete?",
65
+ default: config.auto_verify_on_complete ?? true,
66
+ });
67
+ config.auto_verify_on_complete = autoVerify;
68
+ const autoGate = await confirm({
69
+ message: "Auto-run gate check after verification?",
70
+ default: config.auto_gate_check ?? true,
71
+ });
72
+ config.auto_gate_check = autoGate;
73
+ const evidence = config.evidence || {};
74
+ const captureScreenshots = await confirm({
75
+ message: "Capture screenshots during verification?",
76
+ default: evidence.capture_screenshots ?? true,
77
+ });
78
+ evidence.capture_screenshots = captureScreenshots;
79
+ const captureTraces = await confirm({
80
+ message: "Capture test traces?",
81
+ default: evidence.capture_traces ?? true,
82
+ });
83
+ evidence.capture_traces = captureTraces;
84
+ config.evidence = evidence;
85
+ const maxIterations = await input({
86
+ message: "Max loop iterations before escalation:",
87
+ default: String(config.max_loop_iterations || 10),
88
+ validate: (v) => /^\d+$/.test(v) && parseInt(v) > 0
89
+ ? true
90
+ : "Enter a positive number",
91
+ });
92
+ config.max_loop_iterations = parseInt(maxIterations);
93
+ await writeFileSafe(configPath, JSON.stringify(config, null, 2) + "\n", true);
94
+ console.log("");
95
+ printSuccess("Configuration saved to .codeloop/config.json\n");
96
+ }
97
+ //# sourceMappingURL=configure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../../src/commands/configure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAkBA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAmHjD"}
@@ -0,0 +1,241 @@
1
+ import { existsSync, readFileSync, writeFileSync } from "fs";
2
+ import { join } from "path";
3
+ import { input, select } from "@inquirer/prompts";
4
+ import chalk from "chalk";
5
+ import { findApiKey, promptSaveLocation } from "../utils/key-storage.js";
6
+ import { writeFileSafe, ensureDir } from "../utils/file-writer.js";
7
+ import { detectProject } from "../utils/detect-project.js";
8
+ import { signup, login, createKey, ApiError } from "../utils/api-client.js";
9
+ import { printBox, printSuccess, printWarning, printInfo, printApiKey, printError } from "../utils/ui.js";
10
+ import { CORE_MDC, LOOP_MDC, RECOMMENDATIONS_MDC, FLUTTER_MDC, WEB_MDC, MOBILE_MDC } from "../templates/cursor-rules.js";
11
+ import { CODELOOP_LOOP_MD, CODELOOP_QA_MD, CODELOOP_ADVISOR_MD, CLAUDE_MD } from "../templates/claude-agents.js";
12
+ import { CURSOR_MCP_CONFIG, CLAUDE_MCP_CONFIG } from "../templates/mcp-config.js";
13
+ import { SKILL_LOOP, SKILL_VERIFY, SKILL_VISUAL_REVIEW, SKILL_RECOMMEND } from "../templates/cursor-skills.js";
14
+ import { createDefaultConfig } from "../templates/config.js";
15
+ import { SPEC_TEMPLATE, ACCEPTANCE_TEMPLATE, UX_CHECKLIST_TEMPLATE } from "../templates/specs.js";
16
+ import { PROMPT_LOOP, PROMPT_VERIFY, PROMPT_REVIEW } from "../templates/claude-prompts.js";
17
+ import { password as passwordPrompt } from "@inquirer/prompts";
18
+ export async function initCommand() {
19
+ const cwd = process.cwd();
20
+ printBox("CodeLoop — Initialize Project");
21
+ // 1. Check for existing API key
22
+ let apiKey = findApiKey(cwd);
23
+ if (!apiKey) {
24
+ printWarning("No API key found\n");
25
+ const action = await select({
26
+ message: "How would you like to get an API key?",
27
+ choices: [
28
+ { name: "Sign up for a new account", value: "signup" },
29
+ { name: "Log in to existing account", value: "login" },
30
+ { name: "Enter API key manually", value: "manual" },
31
+ { name: "Skip (configure later)", value: "skip" },
32
+ ],
33
+ });
34
+ if (action === "signup") {
35
+ apiKey = await handleInlineSignup();
36
+ }
37
+ else if (action === "login") {
38
+ apiKey = await handleInlineLogin();
39
+ }
40
+ else if (action === "manual") {
41
+ const key = await input({
42
+ message: "Paste your API key:",
43
+ validate: (v) => v.startsWith("cl_") ? true : 'API key should start with "cl_"',
44
+ });
45
+ apiKey = key.trim();
46
+ }
47
+ // skip leaves apiKey as null
48
+ }
49
+ else {
50
+ printSuccess(`Found API key: ${apiKey.slice(0, 12)}...`);
51
+ }
52
+ // 2. Detect project type
53
+ const project = detectProject(cwd);
54
+ if (project.type !== "unknown") {
55
+ printInfo(`Detected: ${project.type} project (${project.frameworks.join(", ")})`);
56
+ }
57
+ else {
58
+ printInfo("Project type: could not auto-detect (using defaults)");
59
+ }
60
+ console.log("");
61
+ // 3. Create .codeloop/config.json
62
+ const config = createDefaultConfig(apiKey || "", project.type !== "unknown" ? [project.type] : ["auto"]);
63
+ const configPath = join(cwd, ".codeloop", "config.json");
64
+ await writeFileSafe(configPath, JSON.stringify(config, null, 2) + "\n", true);
65
+ printSuccess(".codeloop/config.json");
66
+ // 4. Create artifacts directory
67
+ ensureDir(join(cwd, "artifacts"));
68
+ printSuccess("artifacts/");
69
+ // 5. Create spec/acceptance/ux-checklist templates
70
+ const docsCreated = [];
71
+ if (await writeFileSafe(join(cwd, "docs", "specs", "_template.md"), SPEC_TEMPLATE)) {
72
+ docsCreated.push("docs/specs/_template.md");
73
+ }
74
+ if (await writeFileSafe(join(cwd, "docs", "acceptance", "_template.md"), ACCEPTANCE_TEMPLATE)) {
75
+ docsCreated.push("docs/acceptance/_template.md");
76
+ }
77
+ if (await writeFileSafe(join(cwd, "docs", "ux-checklists", "_template.md"), UX_CHECKLIST_TEMPLATE)) {
78
+ docsCreated.push("docs/ux-checklists/_template.md");
79
+ }
80
+ for (const p of docsCreated) {
81
+ printSuccess(p);
82
+ }
83
+ // 6. Cursor integration
84
+ setupCursorIntegration(cwd, apiKey, project.type);
85
+ // 7. Claude Code integration
86
+ setupClaudeIntegration(cwd, apiKey);
87
+ // 8. Update .gitignore
88
+ updateGitignore(cwd);
89
+ // 9. Summary
90
+ console.log("\n" + chalk.bold(" CodeLoop initialized!\n"));
91
+ if (apiKey) {
92
+ printSuccess("API key configured");
93
+ }
94
+ else {
95
+ printWarning("No API key set — run: npx codeloop login or npx codeloop signup");
96
+ }
97
+ printInfo("Read the docs: https://codeloop.tech/docs/setup");
98
+ printInfo("Run your AI agent and CodeLoop will handle verification automatically\n");
99
+ }
100
+ function setupCursorIntegration(cwd, _apiKey, projectType) {
101
+ const mcpPath = join(cwd, ".cursor", "mcp.json");
102
+ const mcpConfig = JSON.parse(JSON.stringify(CURSOR_MCP_CONFIG));
103
+ writeFileSafe(mcpPath, JSON.stringify(mcpConfig, null, 2) + "\n", true);
104
+ printSuccess(".cursor/mcp.json");
105
+ const rulesDir = join(cwd, ".cursor", "rules");
106
+ ensureDir(rulesDir);
107
+ let ruleCount = 3;
108
+ writeFileSafe(join(rulesDir, "core.mdc"), CORE_MDC);
109
+ writeFileSafe(join(rulesDir, "loop.mdc"), LOOP_MDC);
110
+ writeFileSafe(join(rulesDir, "recommendations.mdc"), RECOMMENDATIONS_MDC);
111
+ if (projectType === "flutter") {
112
+ writeFileSafe(join(rulesDir, "flutter.mdc"), FLUTTER_MDC);
113
+ ruleCount++;
114
+ }
115
+ else if (projectType === "web") {
116
+ writeFileSafe(join(rulesDir, "web.mdc"), WEB_MDC);
117
+ ruleCount++;
118
+ }
119
+ else if (projectType === "mobile") {
120
+ writeFileSafe(join(rulesDir, "mobile.mdc"), MOBILE_MDC);
121
+ ruleCount++;
122
+ }
123
+ printSuccess(`.cursor/rules/ (${ruleCount} rule files)`);
124
+ const skillsDir = join(cwd, ".cursor", "skills");
125
+ ensureDir(skillsDir);
126
+ ensureDir(join(skillsDir, "codeloop-loop"));
127
+ writeFileSafe(join(skillsDir, "codeloop-loop", "SKILL.md"), SKILL_LOOP);
128
+ ensureDir(join(skillsDir, "codeloop-verify"));
129
+ writeFileSafe(join(skillsDir, "codeloop-verify", "SKILL.md"), SKILL_VERIFY);
130
+ ensureDir(join(skillsDir, "codeloop-visual-review"));
131
+ writeFileSafe(join(skillsDir, "codeloop-visual-review", "SKILL.md"), SKILL_VISUAL_REVIEW);
132
+ ensureDir(join(skillsDir, "codeloop-recommend"));
133
+ writeFileSafe(join(skillsDir, "codeloop-recommend", "SKILL.md"), SKILL_RECOMMEND);
134
+ printSuccess(".cursor/skills/ (4 skill files)");
135
+ }
136
+ function setupClaudeIntegration(cwd, _apiKey) {
137
+ const settingsPath = join(cwd, ".claude", "settings.local.json");
138
+ const claudeConfig = JSON.parse(JSON.stringify(CLAUDE_MCP_CONFIG));
139
+ writeFileSafe(settingsPath, JSON.stringify(claudeConfig, null, 2) + "\n", true);
140
+ printSuccess(".claude/settings.local.json");
141
+ const agentsDir = join(cwd, ".claude", "agents");
142
+ ensureDir(agentsDir);
143
+ writeFileSafe(join(agentsDir, "codeloop-loop.md"), CODELOOP_LOOP_MD);
144
+ writeFileSafe(join(agentsDir, "codeloop-qa.md"), CODELOOP_QA_MD);
145
+ writeFileSafe(join(agentsDir, "codeloop-advisor.md"), CODELOOP_ADVISOR_MD);
146
+ printSuccess(".claude/agents/ (3 agent files)");
147
+ writeFileSafe(join(cwd, "CLAUDE.md"), CLAUDE_MD);
148
+ printSuccess("CLAUDE.md");
149
+ const promptsDir = join(cwd, ".claude", "prompts");
150
+ ensureDir(promptsDir);
151
+ writeFileSafe(join(promptsDir, "codeloop-loop.md"), PROMPT_LOOP);
152
+ writeFileSafe(join(promptsDir, "codeloop-verify.md"), PROMPT_VERIFY);
153
+ writeFileSafe(join(promptsDir, "codeloop-review.md"), PROMPT_REVIEW);
154
+ printSuccess(".claude/prompts/ (3 prompt templates)");
155
+ }
156
+ function updateGitignore(cwd) {
157
+ const gitignorePath = join(cwd, ".gitignore");
158
+ const entriesToAdd = [".codeloop/config.json", "artifacts/", ".env", ".env.*", "!.env.example"];
159
+ let content = "";
160
+ if (existsSync(gitignorePath)) {
161
+ content = readFileSync(gitignorePath, "utf-8");
162
+ }
163
+ const newEntries = [];
164
+ for (const entry of entriesToAdd) {
165
+ if (!content.includes(entry)) {
166
+ newEntries.push(entry);
167
+ }
168
+ }
169
+ if (newEntries.length > 0) {
170
+ const addition = (content.endsWith("\n") ? "" : "\n") +
171
+ "\n# CodeLoop\n" +
172
+ newEntries.join("\n") +
173
+ "\n";
174
+ writeFileSync(gitignorePath, content + addition, "utf-8");
175
+ printSuccess(".gitignore updated");
176
+ }
177
+ }
178
+ async function handleInlineSignup() {
179
+ try {
180
+ const name = await input({
181
+ message: "Your name:",
182
+ validate: (v) => (v.trim().length >= 1 ? true : "Name is required"),
183
+ });
184
+ const email = await input({
185
+ message: "Email address:",
186
+ validate: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? true : "Enter a valid email",
187
+ });
188
+ const pw = await passwordPrompt({
189
+ message: "Password (min 8 characters):",
190
+ mask: "•",
191
+ validate: (v) => v.length >= 8 ? true : "Password must be at least 8 characters",
192
+ });
193
+ const confirmPw = await passwordPrompt({
194
+ message: "Confirm password:",
195
+ mask: "•",
196
+ });
197
+ if (pw !== confirmPw) {
198
+ printError("Passwords do not match");
199
+ return null;
200
+ }
201
+ const result = await signup(email, pw, name.trim());
202
+ printApiKey(result.api_key);
203
+ await promptSaveLocation(result.api_key);
204
+ printSuccess("Account created — 14-day free trial activated\n");
205
+ return result.api_key;
206
+ }
207
+ catch (err) {
208
+ if (err instanceof ApiError) {
209
+ printError(err.message);
210
+ }
211
+ else {
212
+ printError("Signup failed");
213
+ }
214
+ return null;
215
+ }
216
+ }
217
+ async function handleInlineLogin() {
218
+ try {
219
+ const email = await input({
220
+ message: "Email address:",
221
+ validate: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? true : "Enter a valid email",
222
+ });
223
+ const pw = await passwordPrompt({ message: "Password:", mask: "•" });
224
+ const result = await login(email, pw);
225
+ const keyResult = await createKey(result.token);
226
+ printApiKey(keyResult.api_key);
227
+ await promptSaveLocation(keyResult.api_key);
228
+ printSuccess("Logged in — new API key generated\n");
229
+ return keyResult.api_key;
230
+ }
231
+ catch (err) {
232
+ if (err instanceof ApiError) {
233
+ printError(err.message);
234
+ }
235
+ else {
236
+ printError("Login failed");
237
+ }
238
+ return null;
239
+ }
240
+ }
241
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA4DlD"}
@@ -0,0 +1,60 @@
1
+ import { input, password, confirm } from "@inquirer/prompts";
2
+ import ora from "ora";
3
+ import { login, createKey, ApiError } from "../utils/api-client.js";
4
+ import { promptSaveLocation } from "../utils/key-storage.js";
5
+ import { printBox, printSuccess, printError, printApiKey } from "../utils/ui.js";
6
+ export async function loginCommand() {
7
+ printBox("CodeLoop — Log In");
8
+ const email = await input({
9
+ message: "Email address:",
10
+ validate: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? true : "Enter a valid email",
11
+ });
12
+ const pw = await password({
13
+ message: "Password:",
14
+ mask: "•",
15
+ });
16
+ const spinner = ora("Logging in...").start();
17
+ try {
18
+ const result = await login(email, pw);
19
+ spinner.succeed(`Logged in as ${result.user.email}`);
20
+ const generateKey = await confirm({
21
+ message: "Generate a new API key for this project?",
22
+ default: true,
23
+ });
24
+ if (generateKey) {
25
+ const keySpinner = ora("Generating API key...").start();
26
+ try {
27
+ const keyResult = await createKey(result.token);
28
+ keySpinner.succeed("API key generated!");
29
+ printApiKey(keyResult.api_key);
30
+ await promptSaveLocation(keyResult.api_key);
31
+ console.log("\n Next steps:");
32
+ printSuccess("Run npx codeloop init to set up your project\n");
33
+ }
34
+ catch (keyErr) {
35
+ keySpinner.fail("Could not generate API key");
36
+ if (keyErr instanceof ApiError) {
37
+ printError(keyErr.message);
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ console.log("\n Use your existing API key, or generate one at https://codeloop.tech/dashboard\n");
43
+ }
44
+ }
45
+ catch (err) {
46
+ spinner.fail("Login failed");
47
+ if (err instanceof ApiError) {
48
+ if (err.status === 401) {
49
+ printError("Invalid email or password");
50
+ }
51
+ else {
52
+ printError(err.message);
53
+ }
54
+ }
55
+ else {
56
+ printError("Unexpected error. Please try again.");
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC;QACxB,OAAO,EAAE,gBAAgB;QACzB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACd,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;KACtE,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC;QACxB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,GAAG;KACV,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,OAAO,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAErD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC;YAChC,OAAO,EAAE,0CAA0C;YACnD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChD,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBAEzC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAC/B,MAAM,kBAAkB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE5C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,YAAY,CAAC,kDAAkD,CAAC,CAAC;YACnE,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,UAAU,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC9C,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;oBAC/B,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,qFAAqF,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE7B,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,UAAU,CAAC,2BAA2B,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,qCAAqC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function signupCommand(): Promise<void>;
2
+ //# sourceMappingURL=signup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.d.ts","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAgEnD"}
@@ -0,0 +1,62 @@
1
+ import { input, password } from "@inquirer/prompts";
2
+ import ora from "ora";
3
+ import { signup, ApiError } from "../utils/api-client.js";
4
+ import { promptSaveLocation } from "../utils/key-storage.js";
5
+ import { printBox, printSuccess, printError, printApiKey } from "../utils/ui.js";
6
+ export async function signupCommand() {
7
+ printBox("CodeLoop — Create Account");
8
+ const name = await input({
9
+ message: "Your name:",
10
+ validate: (v) => (v.trim().length >= 1 ? true : "Name is required"),
11
+ });
12
+ const email = await input({
13
+ message: "Email address:",
14
+ validate: (v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v) ? true : "Enter a valid email",
15
+ });
16
+ const pw = await password({
17
+ message: "Password (min 8 characters):",
18
+ mask: "•",
19
+ validate: (v) => v.length >= 8 ? true : "Password must be at least 8 characters",
20
+ });
21
+ const pwConfirm = await password({
22
+ message: "Confirm password:",
23
+ mask: "•",
24
+ validate: (v) => (v === pw ? true : "Passwords do not match"),
25
+ });
26
+ // Extra safety check
27
+ if (pw !== pwConfirm) {
28
+ printError("Passwords do not match");
29
+ return;
30
+ }
31
+ const spinner = ora("Creating your account...").start();
32
+ try {
33
+ const result = await signup(email, pw, name.trim());
34
+ spinner.succeed("Account created!");
35
+ printApiKey(result.api_key);
36
+ printSuccess("14-day free trial activated");
37
+ console.log("");
38
+ await promptSaveLocation(result.api_key);
39
+ console.log("\n Next steps:");
40
+ printSuccess("Run npx codeloop init to set up your project");
41
+ printSuccess("Visit https://codeloop.tech/dashboard for your dashboard\n");
42
+ }
43
+ catch (err) {
44
+ spinner.fail("Signup failed");
45
+ if (err instanceof ApiError) {
46
+ if (err.status === 409) {
47
+ printError("An account with this email already exists");
48
+ console.log(" Try: npx codeloop login\n");
49
+ }
50
+ else if (err.status === 400) {
51
+ printError(err.message);
52
+ }
53
+ else {
54
+ printError(err.message);
55
+ }
56
+ }
57
+ else {
58
+ printError("Unexpected error. Please try again.");
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=signup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup.js","sourceRoot":"","sources":["../../src/commands/signup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmGnD"}
@@ -0,0 +1,82 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { findApiKey } from "../utils/key-storage.js";
4
+ import { validateApiKey, ApiError } from "../utils/api-client.js";
5
+ import { printBox, printSuccess, printError, printWarning, printInfo } from "../utils/ui.js";
6
+ export async function statusCommand() {
7
+ printBox("CodeLoop — Status");
8
+ const apiKey = findApiKey();
9
+ if (!apiKey) {
10
+ printError("No API key found\n");
11
+ console.log(" Set up your API key:");
12
+ console.log(" npx codeloop signup Create a new account");
13
+ console.log(" npx codeloop login Log in to existing account");
14
+ console.log(' export CODELOOP_API_KEY="cl_live_..." Set manually\n');
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ printInfo(`API key: ${apiKey.slice(0, 12)}...${apiKey.slice(-4)}`);
19
+ if (apiKey.startsWith("cl_test_")) {
20
+ printWarning("Test key — no backend validation needed");
21
+ printSuccess("Plan: test (unlimited local usage)\n");
22
+ return;
23
+ }
24
+ const spinner = ora("Validating API key...").start();
25
+ try {
26
+ const validation = await validateApiKey(apiKey);
27
+ spinner.stop();
28
+ if (validation.valid) {
29
+ printSuccess(`Status: ${chalk.green("active")}`);
30
+ }
31
+ else {
32
+ printError(`Status: ${chalk.red(validation.status)}`);
33
+ }
34
+ printInfo(`Plan: ${chalk.bold(validation.plan)}`);
35
+ if (validation.expires_at) {
36
+ const expiresAt = new Date(validation.expires_at);
37
+ const now = new Date();
38
+ const daysLeft = Math.max(0, Math.ceil((expiresAt.getTime() - now.getTime()) / (1000 * 60 * 60 * 24)));
39
+ if (validation.plan === "trial") {
40
+ printInfo(`Trial expires: ${expiresAt.toLocaleDateString()} (${daysLeft} days left)`);
41
+ }
42
+ else {
43
+ printInfo(`Billing period ends: ${expiresAt.toLocaleDateString()}`);
44
+ }
45
+ }
46
+ if (validation.usage) {
47
+ console.log("");
48
+ printInfo("Usage this period:");
49
+ for (const [category, data] of Object.entries(validation.usage)) {
50
+ const label = category.replace(/_/g, " ");
51
+ const limitStr = data.limit === -1 ? "∞" : String(data.limit);
52
+ const pct = data.limit > 0
53
+ ? Math.round((data.used / data.limit) * 100)
54
+ : 0;
55
+ const color = pct > 80 ? chalk.red : pct > 50 ? chalk.yellow : chalk.green;
56
+ console.log(` ${label}: ${color(`${data.used}/${limitStr}`)}`);
57
+ }
58
+ }
59
+ if (validation.message) {
60
+ console.log("");
61
+ printWarning(validation.message);
62
+ }
63
+ console.log("");
64
+ }
65
+ catch (err) {
66
+ spinner.fail("Validation failed");
67
+ if (err instanceof ApiError) {
68
+ if (err.status === 401) {
69
+ printError("API key is invalid or revoked");
70
+ console.log(" Generate a new key at https://codeloop.tech/dashboard\n");
71
+ }
72
+ else {
73
+ printError(err.message);
74
+ }
75
+ }
76
+ else {
77
+ printError("Could not reach CodeLoop servers\n");
78
+ }
79
+ process.exitCode = 1;
80
+ }
81
+ }
82
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}