Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
3519a85
Add baseline regression harness (MOO-67 Commit 1)
OwenTanzer Jul 21, 2026
5b241bc
Add Vite build tooling and server entry point (MOO-67 Commit 2)
OwenTanzer Jul 21, 2026
9b98dcb
Extract analyzer into src/analyzer.js as the canonical module (MOO-67…
OwenTanzer Jul 21, 2026
0edd545
Narrow engines to the real require(esm) minimum (fixup for Commit 3)
OwenTanzer Jul 21, 2026
aca5c14
Record file:// removal as a decided tradeoff, update README accordingly
OwenTanzer Jul 21, 2026
6995e7e
Add browser UI smoke suite (MOO-67 Commit 4A)
OwenTanzer Jul 21, 2026
5590bfb
Isolate the repository graph renderer (MOO-67 Commit 4B)
OwenTanzer Jul 21, 2026
47b4b7d
Extract bounded selection/panel state (MOO-67 Commit 4C)
OwenTanzer Jul 21, 2026
f70fe9d
Extract minimal route persistence (MOO-67 Commit 4D)
OwenTanzer Jul 21, 2026
2eed7df
Add generic node-select/node-activate interaction seam (MOO-67 Commit…
OwenTanzer Jul 21, 2026
cb79d87
Add the Railway service and workspace skeleton (MOO-67 Commit 5)
OwenTanzer Jul 21, 2026
8da49be
Fix GitHub.scan's missing dependencies (fixup for Commit 3)
OwenTanzer Jul 21, 2026
50ead81
Add authentication and repository-request controls (MOO-67 Commit 6)
OwenTanzer Jul 21, 2026
77850e4
Deploy the authenticated Railway preview shell (MOO-67 Commit 7)
OwenTanzer Jul 21, 2026
8b90699
Allow the wildcard "*" in ALLOWED_OWNERS to permit any repo owner
OwenTanzer Jul 21, 2026
f0a68aa
Address PR review: byte limits, symlink containment, shared body reader
OwenTanzer Jul 21, 2026
796b198
Add CI workflow running the test suite (PR review follow-up)
OwenTanzer Jul 21, 2026
f9b8a01
Fix GitHub code scanning (CodeQL) findings on PR #1
OwenTanzer Jul 21, 2026
8ef50d0
Merge pull request #1 from OwenTanzer/otmooper12/moo-67-modularize-co…
OwenTanzer Jul 21, 2026
64e7358
Define the canonical source coordinate (MOO-68 Commit 1)
OwenTanzer Jul 21, 2026
ef8c0c2
Define revision and request context (MOO-68 Commit 2)
OwenTanzer Jul 21, 2026
2fe6467
Define versioned GraphIR (MOO-68 Commit 3)
OwenTanzer Jul 21, 2026
5c2ac19
Define analyzer adapter and error contracts (MOO-68 Commit 4)
OwenTanzer Jul 21, 2026
e94ebc7
Define navigation and selection events (MOO-68 Commit 5)
OwenTanzer Jul 21, 2026
8d00b2d
Define cache identity and provenance display (MOO-68 Commit 6)
OwenTanzer Jul 21, 2026
800e382
Add contract fixtures and developer documentation (MOO-68 Commit 7)
OwenTanzer Jul 21, 2026
be3d6a5
Make the shared graph-ir barrel runtime-neutral, tighten coordinate v…
OwenTanzer Jul 21, 2026
3b69239
Track the resolved fork source repository in AnalysisContext (PR review)
OwenTanzer Jul 21, 2026
a516456
Enforce coordinate/context consistency in GraphIR (PR review)
OwenTanzer Jul 21, 2026
7f6716b
Require sourceOwner/sourceRepo as a pair (PR review)
OwenTanzer Jul 21, 2026
103a1ba
Carry node.origin into the navigation contract (PR review)
OwenTanzer Jul 21, 2026
4c4f1a1
Merge pull request #2 from OwenTanzer/otmooper12/moo-68-define-the-sh…
OwenTanzer Jul 21, 2026
a3123d4
Normalize existing repository analysis into GraphIR (MOO-69 Commit 1)
OwenTanzer Jul 21, 2026
eb64798
Create the repository GraphIR service endpoint (MOO-69 Commit 2)
OwenTanzer Jul 21, 2026
f07699a
Render repository GraphIR through the modular renderer (MOO-69 Commit 3)
OwenTanzer Jul 21, 2026
bd020ec
Wire shared selection and double-click drill-down (MOO-69 Commit 4)
OwenTanzer Jul 21, 2026
f55305b
Extend PR/branch context through repository interactions (MOO-69 Comm…
OwenTanzer Jul 21, 2026
260aa68
Add repository-layer diagnostics and telemetry (MOO-69 Commit 6)
OwenTanzer Jul 21, 2026
89e75be
Document current density behavior and defer judgment to the Garrison …
OwenTanzer Jul 21, 2026
13d0917
Pin browser analysis to a resolved SHA, guard against stale async sta…
OwenTanzer Jul 21, 2026
f4e3fe5
Merge pull request #3 from OwenTanzer/otmooper12/moo-69-adapt-the-rep…
OwenTanzer Jul 22, 2026
67003e1
Add the canonical Python symbol index (MOO-70 Commit 1)
OwenTanzer Jul 22, 2026
d020499
Add the pyan3 subprocess adapter (MOO-70 Commit 2)
OwenTanzer Jul 22, 2026
a8229ea
Add and isolate DOT parsing (MOO-70 Commit 3)
OwenTanzer Jul 22, 2026
9654108
Join pyan3 nodes to canonical tree-sitter symbols (MOO-70 Commit 4)
OwenTanzer Jul 22, 2026
1996789
Convert the joined file graph into GraphIR (MOO-70 Commit 5)
OwenTanzer Jul 22, 2026
7770c4f
Implement adaptive depth policy (MOO-70 Commit 6)
OwenTanzer Jul 22, 2026
0f9a771
Fix pyanSymbolJoin ambiguous handling for same-name redefinitions
OwenTanzer Jul 22, 2026
358adff
Add the file-layer service endpoint (MOO-70 Commit 7)
OwenTanzer Jul 22, 2026
c5e2508
Render the file layer and connect navigation (MOO-70 Commit 8)
OwenTanzer Jul 22, 2026
26fa79b
Add diagnostics, resilience, and handoff notes (MOO-70 Commit 9)
OwenTanzer Jul 22, 2026
744b996
Address PR #4 review feedback (join correctness, resilience, limits)
OwenTanzer Jul 22, 2026
b176fad
Address PR #4 review round 2 (auth init, PR identity, tree truncation)
OwenTanzer Jul 22, 2026
2143cee
Fix forked-PR revision pinning (PR #4 review round 3)
OwenTanzer Jul 22, 2026
6accb11
Merge pull request #4 from OwenTanzer/otmooper12/moo-70-integrate-the…
OwenTanzer Jul 22, 2026
d949240
Force Railpack to detect Node as the provider, not Python
OwenTanzer Jul 22, 2026
e63f373
Install pyan3 into a repo-local venv so it survives Railway's build
OwenTanzer Jul 22, 2026
2788612
Confirm pyan3 production install fix against a live deployment
OwenTanzer Jul 22, 2026
300cf27
MOO-71 Commit 4: pin and vendor @codevisualizer/core via preinstall
OwenTanzer Jul 22, 2026
c0724ec
MOO-71 Commit 5: function-analysis service adapter
OwenTanzer Jul 22, 2026
3493590
MOO-71 Commit 6: adapt FlowchartIR into shared GraphIR
OwenTanzer Jul 22, 2026
688fa11
Fix CI: exclude .vendor/ from the architecture-diagram test's own walk
OwenTanzer Jul 22, 2026
c9b3b47
Address PR review: bootstrap on build too, verify final checkout state
OwenTanzer Jul 22, 2026
1c32960
Address PR review: reset+clean the vendored working tree, not just HEAD
OwenTanzer Jul 22, 2026
6c77832
Merge pull request #5 from OwenTanzer/otmooper12/moo-71-commit-4-depe…
OwenTanzer Jul 22, 2026
f361f62
Bump @codevisualizer/core pin to CodeVisualizer 974d907
OwenTanzer Jul 25, 2026
4a7cebc
MOO-71 Commit 7: render the function layer
OwenTanzer Jul 25, 2026
d20c49f
MOO-71 Commit 8: connect file-to-function navigation and history
OwenTanzer Jul 25, 2026
4edaff6
MOO-71 Commit 10: distinguish parse failures from analyzer bugs
OwenTanzer Jul 25, 2026
25f67e8
CI: run workflows on every pull request, not only those targeting main
OwenTanzer Jul 25, 2026
c07e465
Merge pull request #6 from OwenTanzer/otmooper12/moo-71-commit-7-rend…
OwenTanzer Jul 26, 2026
7d16866
Address PR #8 review: scope parse-error classification to the target …
claude Jul 26, 2026
b2b359b
Fix stale docs: classification uses target-local errorRanges, not fil…
claude Jul 26, 2026
739ab61
Merge pull request #8: MOO-71 Commit 10 distinguish parse failures fr…
OwenTanzer Jul 26, 2026
1100ea3
MOO-72 Commit 1A: migrate repository analysis onto the server, preser…
claude Jul 26, 2026
1262ee7
MOO-72 Commit 1A review response: parser capability, file-count limit…
claude Jul 26, 2026
e900e5c
MOO-72 Commit 1A review response (round 2): fix acorn ordering, add P…
claude Jul 27, 2026
24c9585
MOO-72 Commit 1A review response (round 3): capability identity, Pyth…
claude Jul 27, 2026
3f5389d
Fix stale test-count in docs/baseline.md's startup command table
claude Jul 27, 2026
659eff7
Merge pull request #9 from OwenTanzer/moo-72/commit-1a-repository-ser…
OwenTanzer Jul 27, 2026
4401039
MOO-72 smoke-test fixes: 422 ref errorMap + Vite dev proxy
OwenTanzer Jul 27, 2026
bb7865f
MOO-72 Commit 2: centralized cross-layer graph caching
claude Jul 27, 2026
c0545f3
MOO-72 Commit 2 review response: rebuild excludePatterns per-request …
OwenTanzer Jul 28, 2026
9e527be
Merge pull request #10 from OwenTanzer/moo-72/commit-2-centralized-cache
OwenTanzer Jul 28, 2026
1067cfd
MOO-72 Commit 3: structured logs and metrics
OwenTanzer Jul 28, 2026
9c194e3
MOO-72 Commit 3 review response: resultState on log lines, cacheStatu…
OwenTanzer Jul 28, 2026
a28af81
MOO-72 Commit 3 review response: prefer exitCode over exit(1) after f…
OwenTanzer Jul 28, 2026
6f6e1be
Merge pull request #11 from OwenTanzer/moo-72/commit-3-structured-log…
OwenTanzer Jul 28, 2026
add1efd
MOO-72 Commit 1B: unified analysis-session orchestrator
OwenTanzer Jul 28, 2026
fc37ffd
MOO-72 Commit 1B review response: mid-body-read cancellation, request…
OwenTanzer Jul 28, 2026
0abe8ef
Merge pull request #12 from OwenTanzer/moo-72/commit-1b-session-orche…
OwenTanzer Jul 28, 2026
b472e1f
Fix stale server-token steps in function-layer-smoke.mjs
OwenTanzer Jul 28, 2026
82ddd10
Merge pull request #13 from OwenTanzer/fix/function-layer-smoke-serve…
OwenTanzer Jul 28, 2026
f55b71d
MOO-72 Commit 4: layer-specific failure isolation and retry behavior
OwenTanzer Jul 28, 2026
e665dd1
Address PR #14 review: Retry-After enforcement, boundary key granular…
OwenTanzer Jul 29, 2026
370bb7a
Address PR #14 follow-up: server rate limiter now emits Retry-After
OwenTanzer Jul 29, 2026
c81d5c5
Merge pull request #14 from OwenTanzer/moo72-commit4-failure-isolatio…
OwenTanzer Jul 29, 2026
d7295e1
MOO-72 Commit 5: dependency and runtime health checks
OwenTanzer Jul 29, 2026
b4a23fa
Address PR #15 review: reject non-Python-3 runtimes in pythonRuntime …
OwenTanzer Jul 29, 2026
6f2bb6a
Merge pull request #15 from OwenTanzer/moo72-commit5-dependency-healt…
OwenTanzer Jul 29, 2026
14d112f
MOO-72 Commit 6: harden secure temporary workspaces and artifact life…
OwenTanzer Jul 29, 2026
d139325
Address PR #16 review: ownership-marker gate was a no-op, fix Linux C…
OwenTanzer Jul 29, 2026
2f2bd92
Address PR #16 review round 2: unknown-provenance instance dirs must …
OwenTanzer Jul 29, 2026
dd07abb
Merge pull request #16 from OwenTanzer/moo72-commit6-workspace-hardening
OwenTanzer Jul 29, 2026
05b6caa
MOO-72 Commit 7: end-to-end construction smoke tests
OwenTanzer Jul 29, 2026
a662953
Pin psf/requests fixture to an immutable commit SHA in e2e smoke test
OwenTanzer Jul 29, 2026
7ecf855
Merge pull request #17 from OwenTanzer/moo72-commit7-e2e-smoke-tests
OwenTanzer Jul 29, 2026
04295fb
MOO-72 Commit 8: production hardening (feature flags, concurrency lim…
OwenTanzer Jul 30, 2026
d8c2189
Address PR #18 review: honor top-level retryable, TTL capabilities ca…
OwenTanzer Jul 30, 2026
7719075
Merge pull request #18 from OwenTanzer/moo72-commit8-production-harde…
OwenTanzer Jul 30, 2026
173adba
MOO-72 Commit 9: finalize operational documentation and Garrison handoff
OwenTanzer Jul 30, 2026
9535c69
Merge pull request #19 from OwenTanzer/moo72-commit9-docs-garrison-ha…
OwenTanzer Aug 1, 2026
8798938
MOO-86: move ownership/blame and file-preview-fallback server-side
OwenTanzer Aug 1, 2026
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
3 changes: 2 additions & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ name: CodeQL
on:
push:
branches: ["main"]
# MOO-71: no base filter, matching test.yml -- a stacked PR should get the
# same security analysis as one targeting main, not none.
pull_request:
branches: ["main"]

jobs:
analyze:
Expand Down
66 changes: 66 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
name: Test

on:
push:
branches: ["main"]
# MOO-71: no base filter. This previously only ran for PRs targeting `main`,
# so a stacked PR (one opened against another in-review branch, which is how
# this project sequences dependent commits -- see MOO-71 Stage 1 and Stage 4)
# reported no checks at all and had to be verified by hand. Running on every
# pull request costs nothing here and means a stacked PR is verified before
# it is rebased onto main rather than after.
pull_request:

jobs:
test:
name: Build and test
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22.23.1"
cache: "npm"

- name: Install dependencies
run: npm ci

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install pyan3
run: pip install pyan3==2.6.2

- name: Production build
run: npm run build

- name: Run test suite
run: node --test tests/*.test.mjs

# MOO-72 Commit 7: structural end-to-end smoke tests, run against the
# real built app + real server process + real (public-repo-read-only)
# GitHub API calls -- "a clean environment can execute the full
# pipeline" is satisfied by these running here, on a fresh Actions
# runner, not just asserted locally. Uses the Actions-provided
# automatic token (no new secret to configure) -- sufficient for the
# public-repo reads both scripts make, including on a pull_request
# run from a fork. Deliberately does NOT run function-layer-smoke.mjs
# here -- that one is Playwright/browser-driven, needs a real GitHub
# PAT (not just API-read access) and the server's own AUTH_TOKEN via
# a separate-terminal flow, and belongs to MOO-71's visual-smoke path,
# not this structural-smoke commit.
- name: Run server smoke test
run: node tests/server-smoke.mjs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Run e2e construction smoke test
run: node tests/e2e-construction-smoke.mjs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ build/
.next/
target/
__pycache__/
.venv-pyan3/
.vendor/

# Temp, coverage, and cache files
*.log
Expand Down Expand Up @@ -36,3 +38,10 @@ Thumbs.db
*_old.*
*_copy.*
*.swp

# Regenerated on every tests/function-layer-smoke.mjs run (MOO-71 Commit 8)
docs/img/smoke-*.png

# Regenerated by scripts/generate-build-info.mjs on every `npm run build` --
# a build artifact, not source (MOO-72 Commit 8)
/build-info.json
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
44 changes: 30 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,25 @@ Just visit [CodeFlow](https://codeflow-five.vercel.app/) and paste any GitHub UR
### Option 2: Self-Host
```bash
# Clone the repo
git clone https://github.com/braedonsaunders/codeflow.git
git clone https://github.com/OwenTanzer/codeflow.git
cd codeflow

# That's it! Just open index.html in your browser
open index.html
# Install dev tooling and start a local server
npm install
npm run dev
```

No build process. No npm install. It is a single `index.html` app that loads pinned browser dependencies from CDNs.
Then open the URL Vite prints (defaults to `http://localhost:5173`).

Opening `index.html` directly from disk (`file://`, no server) is **not
supported** — the app's analyzer code is loaded as an ES module
(`src/analyzer.js`), and browsers block ES module imports under the
`file://` origin's CORS restrictions. This was an intentional tradeoff made
while modularizing the codebase for a future server-hosted deployment with
server-held credentials (see `docs/baseline.md`); a zero-install, double-click
local file was judged not worth preserving against that direction. A local
HTTP server is required either way — `npm run dev` for development, or
`npm run build && npm start` to run the production build locally.

### Option 3: Analyze Local Files
You can now analyze code directly from your local machine without uploading to GitHub:
Expand Down Expand Up @@ -308,15 +320,17 @@ For larger repositories or team usage, we recommend using GitHub App authenticat
│ │ │
│ ┌────────▼────────┐ │
│ │ React App │ │
│ │ (Single File) │ │
│ └─────────────────┘ │
└─────────────────────────────────────────────────┘
```

**Zero build dependencies to install.** Everything runs from pinned CDNs:
- React 18
- D3.js 7
- Babel (for JSX)
The analyzer (`Parser`, `buildAnalysisData`, the `GitHub` API client, and
related logic) lives in `src/analyzer.js`, imported as an ES module by both
`index.html` and the Node-side tooling (`card/`, tests) — one implementation,
not a duplicated copy. React, D3, and Babel still load from pinned CDNs at
runtime; `npm install` only brings in local dev tooling (Vite for
building/serving, Playwright for headless browser verification), not
application dependencies.

---

Expand All @@ -325,16 +339,18 @@ For larger repositories or team usage, we recommend using GitHub App authenticat
We love contributions! Here's how:

1. Fork the repo
2. Make your changes to `index.html`
3. Test locally (just open in browser)
2. Make your changes to `index.html` (app shell/UI) or `src/analyzer.js` (analyzer logic)
3. Test locally: `npm install && npm run dev`, then open the printed URL
4. Submit a PR

If you're editing the markdown / wiki-link parser, Node.js unit tests live under `tests/` and run with no dependencies:
Node.js unit tests live under `tests/` run them with:

```bash
node --test tests/
node --test tests/*.test.mjs
```

(`node --test tests/` without the glob won't discover this repo's flat `tests/*.test.mjs` layout.)

`tests/verify-brain-vault.mjs` is an optional end-to-end script that always verifies the bundled fixtures and will also scan a real local vault when you explicitly set `BRAIN_VAULT=/path/to/vault`.

### Ideas for Contributions
Expand All @@ -352,7 +368,7 @@ node --test tests/
> CodeFlow runs entirely in your browser. It calls the GitHub API directly from your browser and processes everything client-side.

**Q: Is my code safe?**
> Yes. Your code is fetched directly from GitHub to your browser. Nothing is sent to any server we control. Check the source — it's one file!
> Yes. Your code is fetched directly from GitHub to your browser. Nothing is sent to any server we control. The source is open — check it yourself.

**Q: Can I use it offline?**
> Yes. With the local file analysis feature, you can analyze code from your computer without any internet connection. Click the "Open Folder" button and select your files. All processing happens entirely in your browser.
Expand Down
1 change: 1 addition & 0 deletions card/.npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
engine-strict=true
82 changes: 26 additions & 56 deletions card/lib/analyzer.js
Original file line number Diff line number Diff line change
@@ -1,67 +1,37 @@
// Extract the codeflow analyzer block from index.html and run it in a Node vm
// context. Mirrors what tests/codeflow-golden.test.mjs does — the analyzer is
// the single source of truth, lives in one file, never drifts.
// Load the codeflow analyzer module. src/analyzer.js is the single source of
// truth (see docs/baseline.md) — this used to VM-extract a marker-delimited
// block from index.html's inline script; since MOO-67 Commit 3 the analyzer
// is a real ES module and Node 22.12+'s synchronous `require(esm)` support
// loads it directly, same as tests/*.test.mjs do via `import`.

'use strict';

const fs = require('fs');
const path = require('path');
const vm = require('vm');

const START_MARKER = '// ===== CODEFLOW_ANALYZER_START =====';
const END_MARKER = '// ===== CODEFLOW_ANALYZER_END =====';
const METRICS_START = '// ===== CODEFLOW_METRICS_START =====';
const METRICS_END = '// ===== CODEFLOW_METRICS_END =====';

function sliceBlock(html, startMarker, endMarker, label) {
const start = html.indexOf(startMarker);
const end = html.indexOf(endMarker, start);
if (start < 0 || end < 0) {
throw new Error(
'Could not locate ' + label + ' block. Expected ' + startMarker + ' / ' + endMarker + '.'
);
}
return html.slice(start, end);
}

function loadAnalyzer(htmlPath) {
const html = fs.readFileSync(htmlPath, 'utf8');
const analyzerSource = sliceBlock(html, START_MARKER, END_MARKER, 'analyzer');
const metricsSource = sliceBlock(html, METRICS_START, METRICS_END, 'metrics');

const context = {
console,
TreeSitter: undefined,
Babel: undefined,
acorn: undefined,
getSecurityScanContent(file) {
return file && file.content ? file.content : '';
},
isSanitizedPreviewRenderer() {
return false;
},
};
vm.createContext(context, {
codeGeneration: {
strings: false,
wasm: false,
},
});
const exposeExports =
'\nthis.Parser = Parser;' +
'\nthis.buildAnalysisData = buildAnalysisData;' +
'\nthis.calcBlast = calcBlast;' +
'\nthis.calcHealth = calcHealth;';
const script = new vm.Script(analyzerSource + '\n' + metricsSource + exposeExports, {
filename: 'codeflow-analyzer.js',
});
script.runInContext(context, { timeout: 1000 });
// htmlPath is index.html's location (see locateIndexHtml below); the
// analyzer module is always its sibling src/analyzer.js — resolving
// relative to htmlPath (not the consuming repo) preserves the security
// property tests/card-analyzer-security.test.mjs guards: the action
// always loads its own analyzer, never one from the repo being analyzed.
const analyzerPath = path.resolve(path.dirname(htmlPath), 'src', 'analyzer.js');

// Parser's methods reference these as ambient globals when actually
// invoked (not at module-evaluation time) — stub them to `undefined` so a
// reference doesn't throw, mirroring the browser's real CDN-provided
// globals and tests/*.test.mjs's equivalent setup.
if (!('TreeSitter' in globalThis)) globalThis.TreeSitter = undefined;
if (!('Babel' in globalThis)) globalThis.Babel = undefined;
if (!('acorn' in globalThis)) globalThis.acorn = undefined;

const analyzerModule = require(analyzerPath);

return {
Parser: context.Parser,
buildAnalysisData: context.buildAnalysisData,
calcBlast: context.calcBlast,
calcHealth: context.calcHealth,
Parser: analyzerModule.Parser,
buildAnalysisData: analyzerModule.buildAnalysisData,
calcBlast: analyzerModule.calcBlast,
calcHealth: analyzerModule.calcHealth,
};
}

Expand All @@ -74,4 +44,4 @@ function locateIndexHtml(actionDir) {
);
}

module.exports = { loadAnalyzer, locateIndexHtml, START_MARKER, END_MARKER };
module.exports = { loadAnalyzer, locateIndexHtml };
8 changes: 8 additions & 0 deletions card/lib/collect.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,14 @@ async function buildAnalyzed(repoRoot, Parser, excludePatterns) {
layer,
churn: 0,
isCode: actualIsCode,
// MOO-72 Commit 1A review (round 2): carry forward the real parser
// path Parser.extract actually took (set only for the JS/TS/acorn
// branch, where success/failure is a runtime decision, not a static
// file-extension fact) -- leaves buildAnalysisData's later
// `f.parserProvenance||Parser.getParserProvenance(...)` fallback as
// a genuine best-effort guess only for files where nothing upstream
// observed what actually ran.
parserProvenance: functions.provenance,
});
if (actualIsCode) {
for (const fn of functions) {
Expand Down
2 changes: 1 addition & 1 deletion card/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"main": "index.js",
"type": "commonjs",
"engines": {
"node": ">=20"
"node": "^20.19.0 || >=22.12.0"
},
"scripts": {
"dry-run": "node index.js"
Expand Down
5 changes: 5 additions & 0 deletions codevisualizer-core.lock.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"repository": "https://github.com/OwenTanzer/CodeVisualizer.git",
"commit": "974d907a5490aa96fb8e84b6723d15bc5455c658",
"workspacePackage": "packages/core"
}
Loading