Skip to main content

Monorepo Structure

How the JobJitsu repository is laid out as one calm Career OS codebase.

Parent: OVERVIEW.md · Boundaries: PACKAGE_BOUNDARIES.md


Goals​

  • One repo for desktop app, domain packages, plugins, and docs.
  • Clear ownership so privacy and egress cannot “leak” across fuzzy folders.
  • Horizon 4 extensibility without forking the product into shouty micro-repos.

Top-level layout​

jobjitsu/
├── app/ # Desktop shell — UI host, IPC, privacy chrome
├── packages/ # Core libraries & domain packages (the OS spine)
├── plugins/ # First-party plugins (agent skills, adapters)
├── examples/ # Sample plugins, fixtures, local demos (no production secrets)
├── assets/ # Brand assets (logo variants, icons)
├── docs/
│ ├── architecture/ # This folder
│ ├── brand/
│ └── product/
├── .cursor/rules/ # Engineering constitution
└── README.md

Workspace roles​

PathRoleMay perform egress?
app/Desktop host + renderer; wires packages; shows Agent · On-device chromeOnly via packages/send APIs
packages/*Domain and infrastructure librariesOnly packages/send (and explicitly documented egress adapters it owns)
plugins/Optional, user-enabled capabilitiesOnly through granted capabilities — never raw network by default
examples/Teaching & fixturesNo real career data; no production credentials
docs/Vision, brand, architectureN/A
assets/Static brandN/A

packages/ intended map​

Names are architectural; foundation spine is implemented first.

Foundation spine​

PackageResponsibility
sharedResult/AppError, branded IDs, pipeline stage vocabulary
eventsEvent contracts + local in-memory bus
loggerLogger contracts + console/memory sinks (no network)
configApp settings + memory store (approval/theme defaults)
coreKernel: re-exports, ErrorReporter, service registry
sdkPublic plugin SDK barrel (no AI runtime)
testingTest helpers for the spine

Domain & shell​

PackageResponsibility
storageOn-device persistence adapters (profiles, blobs, indexes)
identityProfile & résumé source of truth
preferencesFit rules façade (settings live in config)
aiLocal LLM adapters, context assembly, prompt roles
agentPreparative orchestration; pause/resume; never owns send
discoveryRole search/curation interfaces + built-in adapters
applicationsDraft, tailor, version, track applications
queueHolding & review before egress
sendOutbound boundary — apply/submit/mail egress
followupsNudge domain & reminder intents
timelineWhat happened; what left vs stayed
mailboxInbound email intelligence (opt-in OAuth, classify, match) — never send
plugin-sdkManifests, capabilities, sandbox contracts for plugins
extension-sdkHost contribution points (UI, discovery, send channels)
uiShared Jj* components, tokens, a11y primitives

app/ layout (logical)​

app/
├── host/ # Main/native process: storage, scheduler, AI runtime, plugin loader, egress
├── ui/ # Renderer: views for Applications, Queue, Follow-ups, Preferences, Agent, Logs
├── preload|bridge/# Narrow IPC surface — no ambient Node/fs in UI
└── resources/ # App icons, tray, entitlements notes

UI navigates by product nouns: Applications, Follow-ups, Preferences, Agent — not internal package names.


plugins/ layout (logical)​

plugins/
├── official/ # First-party, shipped disabled or enabled by preference
└── README.md # How to enable, inspect, and revoke

Community plugins live outside or as git submodules later; the host loads by manifest + user enablement, not by ambient install.


Dependency direction (monorepo law)​

app → packages/* → shared / events / logger / config / core
plugins → sdk / plugin-sdk / extension-sdk (not into app internals)
ui package ← app may use; domain packages must not depend on app
  • Foundation order: shared → events → logger → config → core → sdk → testing
  • Domain packages do not import app/.
  • agent does not import send directly; it emits intents / queue transitions.
  • send may read queue + applications; it alone performs network egress for career payloads.
  • ai has no network except optional user-configured remote model endpoints (never default).
  • sdk must not pull in AI runtime until an explicit later epic.

Versioning & releases​

  • App releases version the desktop product.
  • Packages may stay private workspace packages until Horizon 4 public SDK publish.
  • Plugin manifests declare engines.jobjitsu compatibility — no silent break of privacy contracts.

What does not belong in the monorepo​

  • A multi-tenant cloud API that stores résumés by default.
  • Employer ranking / surveillance services.
  • Marketing sites that claim guaranteed offers (docs stay honest).