System shape and fixed technical decisions. Do not substitute choices marked Decided.
| Layer | Choice | Rationale |
|---|---|---|
| Repo | Single monorepo, MIT | One contribution surface |
| Monorepo tooling | pnpm workspaces | Lightweight; no Nx/Turbo at this scale |
| CLI | TypeScript, Node 20+ | Frictionless npx; pairs with Claude Code |
| CLI commands | commander |
Mature, minimal |
| CLI prompts | @clack/prompts |
Friendly visual prompts for less terminal-fluent PMs |
| Skills | Plain markdown (SKILL.md) |
Portable, contributable, agent-agnostic |
| Knowledge graph store | JSON file + generated graph.md |
No DB; inspectable, diffable, git-friendly |
| Site | Astro + content collections + MDX + Tailwind | Static; content-heavy ed-tech is a content problem |
| Site search | Pagefind | Static, no backend |
| Workflow Library feed | Astro content collection + RSS | "Latest" = newest-first sort; no live backend |
| Hosting | Netlify (site) · npm (CLI) | Standard distribution |
| CI | GitHub Actions | Lint, typecheck, build, test, schema-validate |
No web app. No hosted compute. No backend. No accounts. Tooling is fully local; the site is fully static.
Skills come in two tiers. The distinction is load-bearing — Claude Code must not blur it.
Single-shot utilities. Input: something the PM pastes (a spec, a goal, a transcript). Output: a reasoning scaffold. No corpus, no graph, no state, no CLI required. A PM copies the SKILL.md into .claude/skills/ and uses it immediately. Standalone skills span all five wedges. Built in Phase 1.
A stateful, multi-step, corpus-backed system. Skills operate on a shared sources/ corpus and a graph/graph.json knowledge graph. This is the only deep system, and it is Discovery-only. Built in Phase 3.
Why the split exists: it lets the project have wedge breadth (Tier A) without faking a deep system per wedge (which would be shallow and generic). See VISION-AND-PRINCIPLES.md principle 4.
mogkit/
├─ README.md CONTRIBUTING.md LICENSE
├─ pnpm-workspace.yaml package.json
├─ .github/workflows/ci.yml
│
├─ docs/ # the six context documents
│
├─ skills/
│ ├─ SKILL-SPEC.md
│ ├─ _example/SKILL.md
│ ├─ standalone/ # Tier A
│ │ ├─ metrics-tree/SKILL.md
│ │ ├─ spec-stress-test/SKILL.md
│ │ ├─ narrative-review/SKILL.md
│ │ ├─ tradeoff-frame/SKILL.md
│ │ ├─ stakeholder-map/SKILL.md
│ │ ├─ launch-readiness/SKILL.md
│ │ └─ interview-coach/SKILL.md
│ └─ discovery/ # Tier B
│ ├─ graphify/SKILL.md
│ ├─ discovery-query/SKILL.md
│ ├─ assumption-audit/SKILL.md
│ ├─ prd-interrogate/SKILL.md
│ ├─ interview-guide/SKILL.md
│ └─ synthesis-map/SKILL.md
│
├─ cli/
│ ├─ package.json # published as `mogkit`
│ ├─ src/
│ │ ├─ index.ts
│ │ ├─ commands/ { init, add, status, skills, doctor }.ts
│ │ ├─ lib/ { workspace, corpus, health, skills-registry }.ts
│ │ └─ templates/ { CLAUDE.md, gitignore }
│ └─ test/
│
├─ engine/
│ ├─ graph-schema.json
│ └─ sample-corpus/
│
└─ site/
├─ astro.config.mjs
├─ src/
│ ├─ content/
│ │ ├─ wedges/ # one MDX per wedge (5)
│ │ ├─ workflows/ # the Workflow Library
│ │ └─ material/ # curated external resources
│ ├─ pages/ { index, setup, wedges/[slug], workflows/[slug], workflows/index }.astro
│ └─ components/
└─ public/
my-workspace/
├─ .git/
├─ CLAUDE.md # encodes the principles; orients every Claude Code session
├─ .gitignore
├─ .claude/skills/ # installed skills
├─ sources/ # raw research; versioned; grows over time
├─ graph/ # graph.json + graph.md (generated by graphify)
└─ knowledge/ # outputs of the interrogation skills
mogkit init [dir] Scaffold a workspace; git init; install Discovery skills
mogkit add Interactive: ingest files into sources/, tag by type
mogkit status Corpus health report — count, type spread, rating, gaps
mogkit skills list List available skills + install state
mogkit skills add <n> Install a skill into .claude/skills/
mogkit doctor Verify Claude Code + skills setup; plain-language fixes
The CLI does no LLM work. After init, the PM opens Claude Code in the workspace and runs skills.
graph/graph.json, validated by engine/graph-schema.json.
{
"meta": {
"generated": "ISO-8601",
"sourceCount": 6,
"sourceTypes": ["interview", "ticket", "prd"],
"health": "thin"
},
"nodes": [
{
"id": "pain-001",
"type": "Pain",
"label": "Onboarding takes >2 weeks for new validators",
"provenance": [
{ "source": "sources/interview-03.md", "quote": "...", "loc": "L42" }
]
}
],
"edges": [
{
"from": "segment-001",
"to": "pain-001",
"type": "experiences",
"provenance": [{ "source": "sources/interview-03.md", "quote": "...", "loc": "L44" }]
}
]
}Node types: Person, Segment, Pain, Need (JTBD), Feature, Competitor, Insight, Assumption, Quote, Outcome.
Edge types: experiences, requests, blocks, contradicts, supports, belongs-to, competes-with, evidences, assumes.
Rules
- Every node and edge carries a non-empty
provenancearray — exceptAssumptionnodes, whose empty provenance is the point and must be explicit. healthis derived:thin(< 8 sources or a single source type),developing,rich. Skills gate confidence on this value.
Three Astro content collections, each with a typed schema:
wedges/— five MDX files, one per PM wedge. Fields:title,slug,order,summary,problem,skills(slugs),material(refs). Evergreen craft education.workflows/— the Workflow Library. Schema and authoring rules inWORKFLOW-FEED-SPEC.md. Newest-first; RSS-backed.material/— curated external resources (Torres, Cagan, Lenny, named operators). Fields:title,url,author,wedge,why(one line on why it's worth the PM's time). Curated paths, never link dumps.