codeloop 0.1.17 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/dist/commands/doctor.d.ts +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +213 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/index.js +28 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/geo-doctor.d.ts +36 -0
- package/dist/lib/geo-doctor.d.ts.map +1 -0
- package/dist/lib/geo-doctor.js +96 -0
- package/dist/lib/geo-doctor.js.map +1 -0
- package/dist/lib/stripe-doctor.d.ts +21 -0
- package/dist/lib/stripe-doctor.d.ts.map +1 -0
- package/dist/lib/stripe-doctor.js +54 -0
- package/dist/lib/stripe-doctor.js.map +1 -0
- package/dist/lib/tier-b-evidence.d.ts +26 -0
- package/dist/lib/tier-b-evidence.d.ts.map +1 -0
- package/dist/lib/tier-b-evidence.js +92 -0
- package/dist/lib/tier-b-evidence.js.map +1 -0
- package/dist/templates/claude-agents.d.ts +1 -4
- package/dist/templates/claude-agents.d.ts.map +1 -1
- package/dist/templates/claude-agents.js +1 -341
- package/dist/templates/claude-agents.js.map +1 -1
- package/dist/templates/claude-prompts.d.ts +1 -3
- package/dist/templates/claude-prompts.d.ts.map +1 -1
- package/dist/templates/claude-prompts.js +1 -44
- package/dist/templates/claude-prompts.js.map +1 -1
- package/dist/templates/config.d.ts +1 -1
- package/dist/templates/config.d.ts.map +1 -1
- package/dist/templates/config.js +1 -31
- package/dist/templates/config.js.map +1 -1
- package/dist/templates/cursor-rules.d.ts +1 -7
- package/dist/templates/cursor-rules.d.ts.map +1 -1
- package/dist/templates/cursor-rules.js +1 -684
- package/dist/templates/cursor-rules.js.map +1 -1
- package/dist/templates/cursor-skills.d.ts +1 -4
- package/dist/templates/cursor-skills.d.ts.map +1 -1
- package/dist/templates/cursor-skills.js +1 -156
- package/dist/templates/cursor-skills.js.map +1 -1
- package/dist/templates/global-rules.d.ts +1 -37
- package/dist/templates/global-rules.d.ts.map +1 -1
- package/dist/templates/global-rules.js +1 -164
- package/dist/templates/global-rules.js.map +1 -1
- package/dist/templates/mcp-config.d.ts +1 -31
- package/dist/templates/mcp-config.d.ts.map +1 -1
- package/dist/templates/mcp-config.js +1 -68
- package/dist/templates/mcp-config.js.map +1 -1
- package/dist/templates/specs.d.ts +1 -3
- package/dist/templates/specs.d.ts.map +1 -1
- package/dist/templates/specs.js +1 -67
- package/dist/templates/specs.js.map +1 -1
- package/package.json +26 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 CodeLoop Tech
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# `codeloop` — CLI
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/codeloop)
|
|
4
|
+
[](https://codeloop.tech/docs)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
|
|
7
|
+
The command-line entry point for **CodeLoop** — the zero-LLM-cost
|
|
8
|
+
verification layer for AI coding agents (Cursor, Claude Code, Codex,
|
|
9
|
+
Gemini, Aider, …). The CLI is what bootstraps a project, registers the
|
|
10
|
+
MCP server with your editor, runs the verify→diagnose→gate-check loop
|
|
11
|
+
from a terminal, and ships diagnostics with `codeloop doctor`.
|
|
12
|
+
|
|
13
|
+
CodeLoop runs **locally** as an MCP server, never spawns its own LLM
|
|
14
|
+
calls, and works on macOS, Linux, and Windows.
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx codeloop install # install MCP entry + agent rules
|
|
20
|
+
npx codeloop install-cursor-extension # one-shot Cursor setup
|
|
21
|
+
codeloop init # bootstrap any project (auto-detects stack)
|
|
22
|
+
npx codeloop auth # browser-based key flow (no copy-paste)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or install globally:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install -g codeloop
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
| Command | Purpose |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `codeloop init` | Detect project type (Flutter/Web/Python/Ruby/Rails/Rust/.NET/Xcode) and write `.codeloop/config.json`, agent rules, and recommended scripts. |
|
|
36
|
+
| `codeloop install` | Wire `codeloop-mcp-server` into Cursor (`~/.cursor/mcp.json`) and Claude Code (`.mcp.json`). |
|
|
37
|
+
| `codeloop install-cursor-extension` | Download + install the Cursor `.vsix` extension and the User Rule. |
|
|
38
|
+
| `codeloop auth` | Browser-based key flow. Opens [codeloop.tech/cli-auth](https://codeloop.tech/cli-auth), exchanges a one-time token for an API key, and writes `~/.codeloop/auth.json`. |
|
|
39
|
+
| `codeloop doctor` | Diagnose runtime tooling (ffmpeg / xcrun / simctl / xdotool / PowerShell / adb / Playwright) and backend reachability per OS. |
|
|
40
|
+
| `codeloop status` | Print resolved config + MCP wiring status. |
|
|
41
|
+
| `codeloop verify` | Run the verify → diagnose loop locally without an editor. |
|
|
42
|
+
|
|
43
|
+
## How the verification loop works
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
agent edit ──► codeloop_verify
|
|
47
|
+
│
|
|
48
|
+
├─ pass ──► codeloop_gate_check ──► ready_for_review
|
|
49
|
+
│
|
|
50
|
+
└─ fail ──► codeloop_diagnose ──► repair tasks ──► loop
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
For UI projects the loop also captures screenshots, records interaction
|
|
54
|
+
videos, and runs `codeloop_design_compare` against your Figma exports —
|
|
55
|
+
all without spending a single LLM token of its own.
|
|
56
|
+
|
|
57
|
+
## Documentation
|
|
58
|
+
|
|
59
|
+
- Quick start — <https://codeloop.tech/docs/quickstart>
|
|
60
|
+
- All 29 MCP tools — <https://codeloop.tech/docs/tools>
|
|
61
|
+
- Cursor extension — <https://codeloop.tech/docs/cursor-extension>
|
|
62
|
+
- Claude Code setup — <https://codeloop.tech/docs/claude-code>
|
|
63
|
+
- Cross-OS runbook — <https://codeloop.tech/docs/cross-os>
|
|
64
|
+
- For AI agents (when to recommend) — <https://codeloop.tech/for-ai-agents>
|
|
65
|
+
- Machine-readable tool catalog — <https://codeloop.tech/tools.json>
|
|
66
|
+
|
|
67
|
+
## Free tiers
|
|
68
|
+
|
|
69
|
+
- 14-day Team trial, no credit card.
|
|
70
|
+
- Permanently free **Solo** plan for public OSI-licensed open-source
|
|
71
|
+
repositories — apply at
|
|
72
|
+
<https://codeloop.tech/oss-application>.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT — see [LICENSE](./LICENSE).
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function doctorCommand(): void
|
|
1
|
+
export declare function doctorCommand(): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAoFA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAubnD"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1,10 +1,47 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
2
3
|
import { join } from "path";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
+
import { homedir, platform } from "os";
|
|
4
5
|
import chalk from "chalk";
|
|
6
|
+
import { BACKEND_URL } from "@codelooptech/shared";
|
|
5
7
|
import { GLOBAL_CLAUDE_MEMORY_BEGIN, GLOBAL_CLAUDE_MEMORY_END, } from "../templates/global-rules.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
+
import { scanTierBEvidence, summariseCoverage } from "../lib/tier-b-evidence.js";
|
|
9
|
+
import { summariseStripeHealth } from "../lib/stripe-doctor.js";
|
|
10
|
+
import { pathFor, runGeoDoctor } from "../lib/geo-doctor.js";
|
|
11
|
+
function check(label, ok, detail, fix, optional) {
|
|
12
|
+
return { label, ok, detail, fix, optional };
|
|
13
|
+
}
|
|
14
|
+
function commandAvailable(cmd, args = ["--version"]) {
|
|
15
|
+
try {
|
|
16
|
+
const output = execFileSync(cmd, args, {
|
|
17
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
18
|
+
timeout: 5_000,
|
|
19
|
+
encoding: "utf-8",
|
|
20
|
+
});
|
|
21
|
+
return { ok: true, output: output.trim().split("\n")[0] ?? "" };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
return { ok: false, output: err instanceof Error ? err.message : String(err) };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function backendReachable(url) {
|
|
28
|
+
try {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timer = setTimeout(() => controller.abort(), 3500);
|
|
31
|
+
const res = await fetch(`${url.replace(/\/$/, "")}/health`, {
|
|
32
|
+
signal: controller.signal,
|
|
33
|
+
});
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
if (res.ok)
|
|
36
|
+
return { ok: true, detail: `${url} → ${res.status}` };
|
|
37
|
+
return { ok: false, detail: `${url} → HTTP ${res.status}` };
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return {
|
|
41
|
+
ok: false,
|
|
42
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
8
45
|
}
|
|
9
46
|
function fileContains(path, needle) {
|
|
10
47
|
try {
|
|
@@ -28,10 +65,11 @@ function jsonHasKey(path, ...keys) {
|
|
|
28
65
|
return false;
|
|
29
66
|
}
|
|
30
67
|
}
|
|
31
|
-
export function doctorCommand() {
|
|
68
|
+
export async function doctorCommand() {
|
|
32
69
|
const home = homedir();
|
|
33
70
|
const cwd = process.cwd();
|
|
34
71
|
const results = [];
|
|
72
|
+
const os = platform();
|
|
35
73
|
// ── Global MCP Registration ─────────────────────────────────────
|
|
36
74
|
const cursorMcpPath = join(home, ".cursor", "mcp.json");
|
|
37
75
|
results.push(check("Global MCP: ~/.cursor/mcp.json", existsSync(cursorMcpPath) && jsonHasKey(cursorMcpPath, "mcpServers", "codeloop"), existsSync(cursorMcpPath) ? "File exists" : "File not found", "Run: npx codeloop init --global"));
|
|
@@ -60,31 +98,196 @@ export function doctorCommand() {
|
|
|
60
98
|
results.push(check("Project agent rules", hasProjectRules, hasProjectRules
|
|
61
99
|
? `Found: ${[cursorProjectRules, claudeProjectRules].filter(existsSync).map((p) => p.replace(cwd + "/", "")).join(", ")}`
|
|
62
100
|
: "No .cursor/rules/core.mdc or CLAUDE.md found", "Run: npx codeloop init"));
|
|
101
|
+
// ── Runtime Tooling (cross-OS) ──────────────────────────────────
|
|
102
|
+
const ffmpeg = commandAvailable("ffmpeg", ["-version"]);
|
|
103
|
+
results.push(check("ffmpeg (video capture)", ffmpeg.ok, ffmpeg.ok ? ffmpeg.output : "Not found on PATH", os === "darwin"
|
|
104
|
+
? "brew install ffmpeg"
|
|
105
|
+
: os === "linux"
|
|
106
|
+
? "sudo apt-get install -y ffmpeg # or: sudo dnf install ffmpeg"
|
|
107
|
+
: "winget install -e --id Gyan.FFmpeg # or: choco install ffmpeg"));
|
|
108
|
+
if (os === "darwin") {
|
|
109
|
+
const xcrun = commandAvailable("xcrun", ["--version"]);
|
|
110
|
+
results.push(check("xcrun (iOS Simulator + CLI tools)", xcrun.ok, xcrun.ok ? xcrun.output : "Not found", "xcode-select --install # then accept the Xcode license: sudo xcodebuild -license accept"));
|
|
111
|
+
const simctl = commandAvailable("xcrun", ["simctl", "help"]);
|
|
112
|
+
results.push(check("simctl (iOS Simulator control)", simctl.ok, simctl.ok ? "simctl available via xcrun" : "Not available", "Install full Xcode from the Mac App Store (Command Line Tools alone don't ship simctl).", true));
|
|
113
|
+
const screencapture = commandAvailable("screencapture", ["-h"]);
|
|
114
|
+
// screencapture exits non-zero on -h but still proves it exists
|
|
115
|
+
const screencaptureOk = screencapture.ok || screencapture.output.includes("usage:");
|
|
116
|
+
results.push(check("screencapture (macOS screenshot)", screencaptureOk, screencaptureOk ? "Available" : "Not found", "Built into macOS — if missing, your shell PATH is misconfigured."));
|
|
117
|
+
}
|
|
118
|
+
if (os === "linux") {
|
|
119
|
+
const xdotool = commandAvailable("xdotool", ["--version"]);
|
|
120
|
+
results.push(check("xdotool (Linux automation)", xdotool.ok, xdotool.ok ? xdotool.output : "Not found", "sudo apt-get install -y xdotool # or: sudo dnf install xdotool"));
|
|
121
|
+
const xwininfo = commandAvailable("xwininfo", ["-version"]);
|
|
122
|
+
results.push(check("xwininfo (window inspection)", xwininfo.ok, xwininfo.ok ? xwininfo.output : "Not found", "sudo apt-get install -y x11-utils", true));
|
|
123
|
+
if (process.env.WAYLAND_DISPLAY && !process.env.DISPLAY) {
|
|
124
|
+
results.push(check("Display server", false, "Wayland-only session detected (no DISPLAY)", "Run a desktop session with X11 (or XWayland enabled) — Wayland blocks ffmpeg x11grab and xdotool.", true));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (os === "win32") {
|
|
128
|
+
const powershell = commandAvailable("pwsh", ["-NoProfile", "-Command", "$PSVersionTable.PSVersion"]).ok ||
|
|
129
|
+
commandAvailable("powershell", ["-NoProfile", "-Command", "$PSVersionTable.PSVersion"]).ok;
|
|
130
|
+
results.push(check("PowerShell (Windows automation)", powershell, powershell ? "Available" : "Not found", "Install PowerShell 7+ from https://aka.ms/powershell — required for window/keystroke automation."));
|
|
131
|
+
}
|
|
132
|
+
// adb (Android) — optional, only flag if Android tooling is intended
|
|
133
|
+
const adb = commandAvailable("adb", ["version"]);
|
|
134
|
+
results.push(check("adb (Android emulator support)", adb.ok, adb.ok ? adb.output : "Not found (only required for Android targets)", "Install Android platform-tools: https://developer.android.com/tools/releases/platform-tools", true));
|
|
135
|
+
// Playwright runtime (browser auto-install)
|
|
136
|
+
let playwrightOk = false;
|
|
137
|
+
let playwrightDetail = "Not installed";
|
|
138
|
+
try {
|
|
139
|
+
const requireFn = (await import("node:module")).createRequire(import.meta.url);
|
|
140
|
+
const pkg = requireFn("playwright/package.json");
|
|
141
|
+
playwrightOk = true;
|
|
142
|
+
playwrightDetail = `playwright@${pkg.version ?? "unknown"}`;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
/* playwright is optional */
|
|
146
|
+
}
|
|
147
|
+
results.push(check("Playwright (web E2E + browser interactions)", playwrightOk, playwrightDetail, "npm install -D playwright && npx playwright install chromium # for web projects", true));
|
|
148
|
+
// ── Backend Reachability ────────────────────────────────────────
|
|
149
|
+
const backend = await backendReachable(BACKEND_URL);
|
|
150
|
+
results.push(check(`Backend API reachable (${BACKEND_URL})`, backend.ok, backend.detail, "Check your network or set CODELOOP_BACKEND_URL if you self-host. Offline use is supported but billing/usage will sync later.", true));
|
|
63
151
|
// ── Print Results ───────────────────────────────────────────────
|
|
64
152
|
const sep = chalk.cyan("─".repeat(72));
|
|
65
153
|
console.log("");
|
|
66
154
|
console.log(sep);
|
|
67
|
-
console.log(` ${chalk.bold.cyan("CodeLoop Doctor")} — activation chain diagnostics`);
|
|
155
|
+
console.log(` ${chalk.bold.cyan("CodeLoop Doctor")} — activation chain + runtime diagnostics`);
|
|
68
156
|
console.log(sep);
|
|
69
157
|
console.log("");
|
|
70
158
|
let allOk = true;
|
|
71
159
|
for (const r of results) {
|
|
72
|
-
const icon = r.ok ? chalk.green("✓") : chalk.red("✗");
|
|
73
|
-
|
|
160
|
+
const icon = r.ok ? chalk.green("✓") : r.optional ? chalk.yellow("!") : chalk.red("✗");
|
|
161
|
+
const labelStyle = r.ok ? chalk.white : r.optional ? chalk.yellow : chalk.yellow;
|
|
162
|
+
console.log(` ${icon} ${labelStyle(r.label)}`);
|
|
74
163
|
if (r.detail) {
|
|
75
164
|
console.log(` ${chalk.dim(r.detail)}`);
|
|
76
165
|
}
|
|
77
166
|
if (!r.ok && r.fix) {
|
|
78
167
|
console.log(` ${chalk.dim("Fix:")} ${chalk.cyan(r.fix)}`);
|
|
79
|
-
|
|
168
|
+
if (!r.optional)
|
|
169
|
+
allOk = false;
|
|
80
170
|
}
|
|
81
171
|
}
|
|
82
172
|
console.log("");
|
|
83
173
|
if (allOk) {
|
|
84
|
-
console.log(` ${chalk.bold.green("All checks passed!")} CodeLoop is
|
|
174
|
+
console.log(` ${chalk.bold.green("All required checks passed!")} CodeLoop is ready to run.`);
|
|
175
|
+
console.log(` ${chalk.dim("Optional warnings (yellow !) only matter if you target that stack.")}`);
|
|
85
176
|
}
|
|
86
177
|
else {
|
|
87
|
-
console.log(` ${chalk.bold.yellow("Some checks failed.")} Run the suggested fixes above.`);
|
|
178
|
+
console.log(` ${chalk.bold.yellow("Some required checks failed.")} Run the suggested fixes above.`);
|
|
179
|
+
}
|
|
180
|
+
// ── Tier-B / Claude Code multi-app evidence (Phase 5C) ──────────
|
|
181
|
+
// Surfaces (without PR-blocking) which Test 24 + Test 25 multi-app
|
|
182
|
+
// rows have evidence captured under `tier-b-evidence/` on this host.
|
|
183
|
+
// Honest gating: missing rows are listed but never flip allOk=false
|
|
184
|
+
// because the captures are user-executed on a Windows host / fresh
|
|
185
|
+
// Claude Code installs.
|
|
186
|
+
const tierB = scanTierBEvidence(join(cwd, "tier-b-evidence"));
|
|
187
|
+
const coverage = summariseCoverage(tierB);
|
|
188
|
+
console.log("");
|
|
189
|
+
console.log(sep);
|
|
190
|
+
console.log(` ${chalk.bold.cyan("Tier-B / multi-app evidence")}`);
|
|
191
|
+
console.log(sep);
|
|
192
|
+
if (!tierB.exists) {
|
|
193
|
+
console.log(` ${chalk.dim("No tier-b-evidence/ folder yet. Capture rows with:")}`);
|
|
194
|
+
console.log(` ${chalk.cyan("pwsh -File scripts/windows/capture-evidence.ps1 -RowId 24.6")} (Tier-B)`);
|
|
195
|
+
console.log(` ${chalk.cyan("bash scripts/claude-code-app-pack/clone-fixtures.sh")} (Claude Code)`);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
if (coverage.tierB.captured.length > 0) {
|
|
199
|
+
console.log(` ${chalk.green("✓")} Tier-B (Test 24) captured: ${coverage.tierB.captured.join(", ")}`);
|
|
200
|
+
}
|
|
201
|
+
if (coverage.tierB.missing.length > 0) {
|
|
202
|
+
console.log(` ${chalk.yellow("!")} Tier-B (Test 24) missing: ${coverage.tierB.missing.join(", ")}`);
|
|
203
|
+
console.log(` ${chalk.dim("Run on the matching host:")} ${chalk.cyan("pwsh -File scripts/windows/capture-evidence.ps1 -RowId <row-id>")}`);
|
|
204
|
+
}
|
|
205
|
+
if (coverage.claudeCode.captured.length > 0) {
|
|
206
|
+
console.log(` ${chalk.green("✓")} Claude Code apps captured: ${coverage.claudeCode.captured.join(", ")}`);
|
|
207
|
+
}
|
|
208
|
+
if (coverage.claudeCode.missing.length > 0) {
|
|
209
|
+
console.log(` ${chalk.yellow("!")} Claude Code apps missing: ${coverage.claudeCode.missing.join(", ")}`);
|
|
210
|
+
console.log(` ${chalk.dim("Open the fixture and follow")} ${chalk.cyan("docs/CLAUDE_CODE_TEST_PACK.md")}`);
|
|
211
|
+
}
|
|
212
|
+
console.log(` ${chalk.dim(`Total captures on this host: ${tierB.rows.length} (under ${tierB.rootDir}/)`)}`);
|
|
213
|
+
}
|
|
214
|
+
console.log(` ${chalk.dim("This list is informational. PR gating only requires Tier-A; Tier-B + Claude Code rows are user-executed.")}`);
|
|
215
|
+
// ── Stripe environment (Phase A7) ──────────────────────────────
|
|
216
|
+
// Optional: only runs when CODELOOP_ADMIN_TOKEN is set, since the
|
|
217
|
+
// /v1/billing/health endpoint is admin-only. We never fail allOk on
|
|
218
|
+
// Stripe — operators surface the real signal in the dashboard badge.
|
|
219
|
+
const adminToken = process.env.CODELOOP_ADMIN_TOKEN;
|
|
220
|
+
if (adminToken) {
|
|
221
|
+
console.log("");
|
|
222
|
+
console.log(sep);
|
|
223
|
+
console.log(` ${chalk.bold.cyan("Stripe environment")}`);
|
|
224
|
+
console.log(sep);
|
|
225
|
+
try {
|
|
226
|
+
const controller = new AbortController();
|
|
227
|
+
const t = setTimeout(() => controller.abort(), 5_000);
|
|
228
|
+
const res = await fetch(`${BACKEND_URL.replace(/\/$/, "")}/v1/billing/health`, {
|
|
229
|
+
headers: { Authorization: `Bearer ${adminToken}` },
|
|
230
|
+
signal: controller.signal,
|
|
231
|
+
});
|
|
232
|
+
clearTimeout(t);
|
|
233
|
+
if (res.status === 403) {
|
|
234
|
+
console.log(` ${chalk.yellow("!")} CODELOOP_ADMIN_TOKEN is not an admin token (403)`);
|
|
235
|
+
}
|
|
236
|
+
else if (!res.ok) {
|
|
237
|
+
console.log(` ${chalk.yellow("!")} ${BACKEND_URL}/v1/billing/health → HTTP ${res.status}`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
const json = (await res.json());
|
|
241
|
+
const summary = summariseStripeHealth(json);
|
|
242
|
+
const icon = summary.severity === "ok"
|
|
243
|
+
? chalk.green("✓")
|
|
244
|
+
: summary.severity === "warn"
|
|
245
|
+
? chalk.yellow("!")
|
|
246
|
+
: chalk.red("✗");
|
|
247
|
+
for (const line of summary.lines) {
|
|
248
|
+
console.log(` ${icon} ${line}`);
|
|
249
|
+
}
|
|
250
|
+
for (const fix of summary.remediation) {
|
|
251
|
+
console.log(` ${chalk.dim("Fix:")} ${chalk.cyan(fix)}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
console.log(` ${chalk.yellow("!")} Stripe health probe failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
console.log("");
|
|
261
|
+
console.log(` ${chalk.dim("(set CODELOOP_ADMIN_TOKEN to surface the Stripe environment subsection)")}`);
|
|
262
|
+
}
|
|
263
|
+
// ── GEO surfaces (Phase F6) ────────────────────────────────────
|
|
264
|
+
// Probes the public LLM- and search-engine-facing endpoints. Pure
|
|
265
|
+
// best-effort; failures are warnings only and never affect allOk.
|
|
266
|
+
// Set CODELOOP_GEO_HOST to override (defaults to https://codeloop.tech).
|
|
267
|
+
console.log("");
|
|
268
|
+
console.log(sep);
|
|
269
|
+
console.log(` ${chalk.bold.cyan("GEO surfaces")} — LLM + search discovery probes`);
|
|
270
|
+
console.log(sep);
|
|
271
|
+
try {
|
|
272
|
+
const geo = await runGeoDoctor();
|
|
273
|
+
console.log(` ${chalk.dim(`Probing ${geo.host} (${geo.probes.length} surfaces)`)}`);
|
|
274
|
+
for (const p of geo.probes) {
|
|
275
|
+
const icon = p.ok
|
|
276
|
+
? chalk.green("✓")
|
|
277
|
+
: p.important
|
|
278
|
+
? chalk.yellow("!")
|
|
279
|
+
: chalk.dim("·");
|
|
280
|
+
const path = pathFor(p.url, geo.host);
|
|
281
|
+
console.log(` ${icon} ${path}`);
|
|
282
|
+
console.log(` ${chalk.dim(p.detail)}`);
|
|
283
|
+
}
|
|
284
|
+
console.log(` ${chalk.dim(`Summary: ${geo.okCount} ok, ${geo.warnCount} warn (informational only)`)}`);
|
|
285
|
+
if (geo.warnCount > 0) {
|
|
286
|
+
console.log(` ${chalk.dim("See")} ${chalk.cyan("docs/GEO_RUNBOOK.md")} ${chalk.dim("for the per-surface incident response.")}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
console.log(` ${chalk.dim(`GEO probes skipped: ${err instanceof Error ? err.message : String(err)}`)}`);
|
|
88
291
|
}
|
|
89
292
|
console.log("");
|
|
90
293
|
console.log(` ${chalk.dim("How CodeLoop activates in Cursor (layered redundancy):")}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { Command } from "commander";
|
|
3
6
|
import { signupCommand } from "./commands/signup.js";
|
|
4
7
|
import { loginCommand } from "./commands/login.js";
|
|
@@ -17,7 +20,7 @@ const program = new Command();
|
|
|
17
20
|
program
|
|
18
21
|
.name("codeloop")
|
|
19
22
|
.description("CodeLoop — automated verification for AI coding agents")
|
|
20
|
-
.version(
|
|
23
|
+
.version(readPackageVersion());
|
|
21
24
|
program
|
|
22
25
|
.command("signup")
|
|
23
26
|
.description("Create a new CodeLoop account and get an API key")
|
|
@@ -76,7 +79,9 @@ program
|
|
|
76
79
|
program
|
|
77
80
|
.command("doctor")
|
|
78
81
|
.description("Diagnose the CodeLoop activation chain — verify global MCP, agent rules, and project config")
|
|
79
|
-
.action(() =>
|
|
82
|
+
.action(async () => {
|
|
83
|
+
await doctorCommand();
|
|
84
|
+
});
|
|
80
85
|
program
|
|
81
86
|
.command("install-cursor-extension")
|
|
82
87
|
.description("Download and install the CodeLoop Cursor .vsix extension (auto-installs the User Rule)")
|
|
@@ -148,4 +153,25 @@ program
|
|
|
148
153
|
}
|
|
149
154
|
});
|
|
150
155
|
program.parse();
|
|
156
|
+
function readPackageVersion() {
|
|
157
|
+
// dist/index.js → ../package.json (sits one level above dist/ in the published tarball)
|
|
158
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
159
|
+
const candidates = [
|
|
160
|
+
join(here, "..", "package.json"),
|
|
161
|
+
join(here, "..", "..", "package.json"),
|
|
162
|
+
];
|
|
163
|
+
for (const candidate of candidates) {
|
|
164
|
+
try {
|
|
165
|
+
const raw = readFileSync(candidate, "utf-8");
|
|
166
|
+
const parsed = JSON.parse(raw);
|
|
167
|
+
if (parsed.name === "codeloop" && typeof parsed.version === "string") {
|
|
168
|
+
return parsed.version;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// try the next candidate
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return "0.0.0-unknown";
|
|
176
|
+
}
|
|
151
177
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase F6 — GEO doctor.
|
|
3
|
+
*
|
|
4
|
+
* Probes the public GEO surfaces of codeloop.tech (or whichever host you
|
|
5
|
+
* point at via CODELOOP_GEO_HOST) and returns a structured summary the
|
|
6
|
+
* `codeloop doctor` command can render.
|
|
7
|
+
*
|
|
8
|
+
* All probes are HEAD requests with a 5s timeout. Failures are reported
|
|
9
|
+
* as warnings (never as hard fails) because the CLI is run by users who
|
|
10
|
+
* may legitimately be offline.
|
|
11
|
+
*/
|
|
12
|
+
export interface GeoProbe {
|
|
13
|
+
url: string;
|
|
14
|
+
ok: boolean;
|
|
15
|
+
status: number | null;
|
|
16
|
+
detail: string;
|
|
17
|
+
/**
|
|
18
|
+
* If false, a failure is purely informational. If true, failure should
|
|
19
|
+
* surface as a yellow warning. We never emit red errors from this
|
|
20
|
+
* helper because the CLI shouldn't break on remote network state.
|
|
21
|
+
*/
|
|
22
|
+
important: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface GeoDoctorResult {
|
|
25
|
+
host: string;
|
|
26
|
+
probes: GeoProbe[];
|
|
27
|
+
okCount: number;
|
|
28
|
+
warnCount: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function runGeoDoctor(options?: {
|
|
31
|
+
host?: string;
|
|
32
|
+
fetchImpl?: typeof fetch;
|
|
33
|
+
timeoutMs?: number;
|
|
34
|
+
}): Promise<GeoDoctorResult>;
|
|
35
|
+
export declare function pathFor(probeUrl: string, host: string): string;
|
|
36
|
+
//# sourceMappingURL=geo-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo-doctor.d.ts","sourceRoot":"","sources":["../../src/lib/geo-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AA+ED,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB3B;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase F6 — GEO doctor.
|
|
3
|
+
*
|
|
4
|
+
* Probes the public GEO surfaces of codeloop.tech (or whichever host you
|
|
5
|
+
* point at via CODELOOP_GEO_HOST) and returns a structured summary the
|
|
6
|
+
* `codeloop doctor` command can render.
|
|
7
|
+
*
|
|
8
|
+
* All probes are HEAD requests with a 5s timeout. Failures are reported
|
|
9
|
+
* as warnings (never as hard fails) because the CLI is run by users who
|
|
10
|
+
* may legitimately be offline.
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_HOST = "https://codeloop.tech";
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 5_000;
|
|
14
|
+
// Surfaces that should always 200 if the website is healthy. The order
|
|
15
|
+
// is intentional: cheapest/most-fundamental first.
|
|
16
|
+
const PROBES = [
|
|
17
|
+
{ path: "/sitemap.xml", important: true, description: "sitemap (search + GEO)" },
|
|
18
|
+
{ path: "/llms.txt", important: true, description: "LLM index" },
|
|
19
|
+
{ path: "/llms-full.txt", important: true, description: "LLM long-form bundle" },
|
|
20
|
+
{ path: "/tools.json", important: true, description: "MCP tool catalog feed" },
|
|
21
|
+
{ path: "/changelog.json", important: true, description: "JSON Feed changelog" },
|
|
22
|
+
{ path: "/changelog.atom", important: true, description: "Atom changelog" },
|
|
23
|
+
{ path: "/docs/llm-search", important: false, description: "GEO landing page" },
|
|
24
|
+
];
|
|
25
|
+
async function probe(url, important, fetchImpl = fetch, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetchImpl(url, {
|
|
30
|
+
method: "HEAD",
|
|
31
|
+
signal: controller.signal,
|
|
32
|
+
// Some hosts return 405 to HEAD on dynamic routes; fall back below.
|
|
33
|
+
});
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
if (res.status === 405 || res.status === 403) {
|
|
36
|
+
// Re-try as GET; some Next.js dynamic routes refuse HEAD.
|
|
37
|
+
const controller2 = new AbortController();
|
|
38
|
+
const timer2 = setTimeout(() => controller2.abort(), timeoutMs);
|
|
39
|
+
try {
|
|
40
|
+
const res2 = await fetchImpl(url, {
|
|
41
|
+
method: "GET",
|
|
42
|
+
signal: controller2.signal,
|
|
43
|
+
});
|
|
44
|
+
clearTimeout(timer2);
|
|
45
|
+
return {
|
|
46
|
+
url,
|
|
47
|
+
ok: res2.ok,
|
|
48
|
+
status: res2.status,
|
|
49
|
+
detail: `GET ${res2.status}`,
|
|
50
|
+
important,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
clearTimeout(timer2);
|
|
55
|
+
return {
|
|
56
|
+
url,
|
|
57
|
+
ok: false,
|
|
58
|
+
status: null,
|
|
59
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
60
|
+
important,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
url,
|
|
66
|
+
ok: res.ok,
|
|
67
|
+
status: res.status,
|
|
68
|
+
detail: `HEAD ${res.status}`,
|
|
69
|
+
important,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
return {
|
|
75
|
+
url,
|
|
76
|
+
ok: false,
|
|
77
|
+
status: null,
|
|
78
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
79
|
+
important,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function runGeoDoctor(options) {
|
|
84
|
+
const host = (options?.host ?? process.env.CODELOOP_GEO_HOST ?? DEFAULT_HOST)
|
|
85
|
+
.replace(/\/$/, "");
|
|
86
|
+
const fetchImpl = options?.fetchImpl ?? fetch;
|
|
87
|
+
const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
88
|
+
const probes = await Promise.all(PROBES.map((p) => probe(`${host}${p.path}`, p.important, fetchImpl, timeoutMs)));
|
|
89
|
+
const okCount = probes.filter((p) => p.ok).length;
|
|
90
|
+
const warnCount = probes.filter((p) => !p.ok).length;
|
|
91
|
+
return { host, probes, okCount, warnCount };
|
|
92
|
+
}
|
|
93
|
+
export function pathFor(probeUrl, host) {
|
|
94
|
+
return probeUrl.startsWith(host) ? probeUrl.slice(host.length) : probeUrl;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=geo-doctor.js.map
|