Sprint 2 closed: Local Project Intelligence

Sprint 2 is closed.

The goal was to build the first local prototype that can read a project and produce structured project understanding. The scanner package, CLI commands, and an upgraded handshake now turn repository layout into a ProjectIndex and a CEM snapshot — not just directory names.


What Sprint 2 delivered

Every item on the roadmap is checked off:

  • Project indexing modelProjectIndex in packages/scanner
  • CLI prototypemeronq scan and meronq info (apps/cli)
  • Repository scanning — apps, packages, docs flags, ADRs, blog posts
  • Package manager detection — pnpm, npm, yarn
  • Structure summary — human-readable one-liner per project
  • Local notes — scan output saved to .meronq/local/project-index.json

Local MCP is now v1.11.0 with a new project_scan tool and project_index in handshake.


New package: @meronq/scanner

The scanner is the bridge between the filesystem and CEM:

Module Role
scanProject() Walk repo → ProjectIndex
indexToCemSnapshot() ProjectIndex + git log → CEM entities, relations, evidence
saveProjectIndex() / loadProjectIndex() Persist under .meronq/local/
resolveProjectRoot() MERONQ_PATH, cwd, or pnpm-workspace.yaml discovery

Example summary from a real scan:

meronq: pnpm monorepo=true · 4 app(s), 2 package(s) · 8 ADR(s), 3 blog post(s)

Handshake now builds CEM from this index — project entity includes packageManager, monorepo, and scannedAt; ADR entities carry Accepted / Proposed status parsed from markdown.


CLI: scan and info

pnpm --filter meronq-cli build
node apps/cli/dist/index.js scan
node apps/cli/dist/index.js info --json

scan writes .meronq/local/project-index.json. info prints the summary (or full JSON with --json). Both accept --path for scanning other repos.


Handshake before and after

Sprint 1: handshake listed workspace members and stitched a CEM snapshot from ad-hoc file reads.

Sprint 2: handshake calls scanProject() and returns:

  • project_index — full structured index
  • cem — built via indexToCemSnapshot()
  • adrs — with correct status from ADR files
scanProject(root)
  └── ProjectIndex
        ├── apps / packages / docs / adrs
        └── indexToCemSnapshot()
              ├── entities (project, components, adrs, commits)
              ├── relations (contains)
              └── evidence (adr files, commits)

This is still a read-only snapshot from disk — not persistent memory. Sprint 3 adds SQLite.


Bug fix: ADR status on Windows

ADR files use CRLF line endings on Windows. The first status regex failed silently and every ADR showed Unknown. We normalize newlines before parsing and added tests that assert real Accepted/Proposed values from the repo.


Sprint 3 — Memory Engine v0

Sprint 3 goal: persist CEM entities, relations, and evidence locally.

Planned work:

  • Choose SQLite schema
  • Store entities, relations, evidence
  • Store access and reinforcement events
  • Generate handshake from memory instead of only live scans

The scanner becomes a writer into memory; handshake becomes a reader from memory with optional refresh.


Follow along

Sprint 0 gave us a durable repository. Sprint 1 gave us a shared language. Sprint 2 connects that language to real projects. Sprint 3 makes it stick.

← Back to blog