Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added dashboard-hero.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 24 additions & 7 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@
<div class="hero-copy">
<div class="hero-eyebrow">
<span class="dot"></span>
Evidence-backed software cartography · v0.12.11
Works with Pi, Claude Code, Cursor, and Codex · v0.12.11
</div>
<h1>Understand existing software. <em>Plan what comes next.</em></h1>
<h1>Understand an unfamiliar codebase. <em>Get a spec you can rebuild from.</em></h1>
<p class="hero-sub">
CodeCartographer turns “explain this repo” into a staged, evidence-backed investigation—then
combines explicitly confirmed specifications with a new product vision to create a traceable
implementation plan.
CodeCartographer turns a repository into layered architecture, behavioral contracts, defect
findings, and a language-agnostic reimplementation spec — with each phase validated before the
next one runs, so nothing is built on a hallucinated finding.
</p>
<div class="hero-actions">
<a href="docs.html" class="btn btn-primary">Start with the docs</a>
Expand Down Expand Up @@ -83,6 +83,23 @@ <h1>Understand existing software. <em>Plan what comes next.</em></h1>
</div>
</section>

<!-- =================== Dashboard ================== -->
<section class="section">
<div class="container">
<div class="overline">The dashboard</div>
<h2>Every run writes a self-contained report.</h2>
<p class="section-sub">
A single HTML file in <code>.codecarto/dashboard.html</code> — no JavaScript, no external assets, no
network calls. Phase status, per-phase token and tool-use telemetry, open questions, and blockers,
rendered straight from the workspace on disk.
</p>
<figure class="dashboard-figure">
<img src="dashboard-hero.png" width="1280" height="900" loading="lazy" decoding="async"
alt="CodeCartographer dashboard: a mid-run pipeline with the architecture and mechanical defect-scan phases complete, contracts in progress, and per-phase token and tool-use telemetry.">
</figure>
</div>
</section>

<!-- =================== What it is ================ -->
<section class="section">
<div class="container">
Expand Down Expand Up @@ -240,11 +257,11 @@ <h2>Works anywhere an LLM can read and write files.</h2>
<div class="grid-3">
<div class="card">
<h3 style="font-size:18px">Pi extension</h3>
<p>Install the package and use <code>/codecarto-init</code>, <code>/codecarto-next</code>, <code>/codecarto-status</code>, and more. Phase sub-agents run in parallel widgets with live token tracking.</p>
<p>Install the package and use <code>/codecarto-init</code>, <code>/codecarto-next</code>, <code>/codecarto-status</code>, <code>/codecarto-vision</code>, <code>/codecarto-switch-pipeline</code>, and more — 15 commands in all. Phase sub-agents run in parallel widgets with live token tracking.</p>
</div>
<div class="card">
<h3 style="font-size:18px">MCP server</h3>
<p>18 tools for workflow control and library operations. Wire them into Claude Code, Claude Desktop, or any MCP-compatible host. The host owns phase sessions and compaction; CodeCartographer supplies byte-identical prompts and validation.</p>
<p>18 tools for workflow control and library operations. Wire them into Claude Code, Claude Desktop, or any MCP-compatible host. The host owns phase sessions and compaction; CodeCartographer supplies byte-identical prompts and validation. <a href="https://github.com/HuginnIndustries/CodeCartographer/blob/main/docs/mcp-quickstart.md">Copy-paste setup for Claude Code, Cursor, Codex, and opencode →</a></p>
</div>
<div class="card">
<h3 style="font-size:18px">Drop-in template</h3>
Expand Down
18 changes: 18 additions & 0 deletions site.css
Original file line number Diff line number Diff line change
Expand Up @@ -928,3 +928,21 @@ pre.code-block {
gap: 12px;
}
}

/* Dashboard screenshot figure (index.html). Scales down on narrow viewports
without letting the page scroll sideways. */
.dashboard-figure {
margin: 32px 0 0;
background: var(--color-surface);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
padding: 12px;
overflow: hidden;
}

.dashboard-figure img {
display: block;
width: 100%;
height: auto;
border-radius: calc(var(--radius-md) - 6px);
}
24 changes: 23 additions & 1 deletion tests/upstream-consistency.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,29 @@ test("every public version label matches the authoritative package version", asy
assert.match(footer, new RegExp(`v${pkg.version.replaceAll(".", "\\.")}`), `${name} footer must show v${pkg.version}`);
}
const index = await read(join(SITE_ROOT, "index.html"));
assert.match(index, new RegExp(`Evidence-backed software cartography · v${pkg.version.replaceAll(".", "\\.")}`));
assert.match(index, new RegExp(`· v${pkg.version.replaceAll(".", "\\.")}`), "index.html hero eyebrow must carry the current version");
});

test("Pi extension copy names commands the upstream extension actually registers", async () => {
const ext = await read(join(UPSTREAM_ROOT, "extensions", "codecarto", "index.ts"));
const registered = new Set(
[...ext.matchAll(/registerCommand\("([a-z-]+)"/g)].map((match) => match[1]),
);
assert.ok(registered.size > 0, "expected to discover Pi commands from upstream index.ts");

// Any /codecarto-* command the site advertises must exist upstream. This is
// the check that was missing when the site quietly dropped commands that the
// extension does register.
for (const name of await htmlFiles()) {
const html = await read(join(SITE_ROOT, name));
const cited = [...html.matchAll(/\/(codecarto-[a-z-]+)/g)].map((match) => match[1]);
for (const command of new Set(cited)) {
assert.ok(registered.has(command), `${name} cites /${command}, which the upstream extension does not register`);
}
}

const index = await read(join(SITE_ROOT, "index.html"));
assert.match(index, new RegExp(`${registered.size} commands`), "index.html must state the current Pi command count");
});

test("MCP documentation names every tool registered by the upstream server", async () => {
Expand Down