AugmentClaude

Architecture Guide

Determine correct file placement and structure for your project.

Installation

  1. Make sure Claude is on your device and in your terminal.

    Skills load from ~/.claude/skills/ when Claude Code starts up — so you need it on your machine first. If you don't have it yet, install it once with the command below, then run claude in any terminal to verify.

    One-time setup
    npm i -g @anthropic-ai/claude-code

    Already have it? Skip ahead.

  2. Paste into Claude Code or into your terminal.

    This copies the whole skill folder into ~/.claude/skills/architecture-iofficeai/ — the SKILL.md plus any scripts, reference docs, or templates the skill ships with. Safe default: works for every skill.

    Faster alternative (instruction-only skills)

    Skips the clone and grabs only the SKILL.md file. Don't use this if the skill ships Python scripts, reference markdowns, or asset templates — they won't be downloaded and the skill will fail when it tries to load them.

    Quick install (SKILL.md only)
    Sign up to copy
  3. Restart Claude Code.

    Quit and reopen Claude Code (or any other agent that loads from ~/.claude/skills/). New skills are picked up on startup.

  4. Just ask Claude.

    Skills auto-activate when your request matches the skill's description — no slash command needed. Trigger phrases live in the skill's own frontmatter; you can read them in the “What this skill does” section above.

Prefer to read the source first? Open on GitHub.

When Claude uses it

Project architecture and file structure conventions for all process types. Use when: (1) Creating new files or modules, (2) Deciding where code should go, (3) Converting single-file components to directories, (4) Reviewing code for structure compliance, (5) Adding new bridges, services, agents, or workers.

What this skill does

Architecture Skill

Determine correct file placement and structure for an Electron multi-process project.

Detailed References


Decision Tree — Where Does New Code Go?

Is it UI (React components, hooks, pages)?
  └── YES → packages/desktop/src/renderer/              → see references/renderer.md

Is it an IPC handler responding to renderer calls?
  └── YES → packages/desktop/src/process/bridge/        → see references/process.md

Is it business logic running in the main process?
  └── YES → packages/desktop/src/process/services/      → see references/process.md

Is it an AI platform connection (API client, message protocol)?
  └── YES → packages/desktop/src/process/agent/<platform>/

Is it a background task that runs in a worker thread?
  └── YES → packages/desktop/src/process/worker/

Is it used by BOTH main and renderer processes?
  └── YES → packages/desktop/src/common/

Is it an HTTP/WebSocket endpoint?
  └── YES → packages/desktop/src/process/webserver/

Is it a plugin/extension resolver or loader?
  └── YES → packages/desktop/src/process/extensions/

Is it a messaging channel (Lark, DingTalk, Telegram)?
  └── YES → packages/desktop/src/process/channels/

Process Boundary Rules

Hard rules — violating them causes runtime crashes.

ProcessCan useCannot use
Main (packages/desktop/src/process/)Node.js, Electron main APIs, fs, path, child_processDOM APIs (document, window, React)
Renderer (packages/desktop/src/renderer/)DOM APIs, React, browser APIsNode.js APIs (fs, path), Electron main APIs
Worker (packages/desktop/src/process/worker/)Node.js APIsDOM APIs, Electron APIs
Preload (packages/desktop/src/preload/)contextBridge, ipcRendererDOM manipulation, Node.js fs

Cross-process communication:

  • Main ↔ Renderer: IPC via packages/desktop/src/preload/ + packages/desktop/src/process/bridge/*.ts
  • Main ↔ Worker: fork protocol via packages/desktop/src/process/worker/WorkerProtocol.ts
// NEVER in renderer
import { something } from '@process/services/foo'; // crashes at runtime

// Use IPC instead
const result = await window.api.someMethod(); // goes through preload

Naming Conventions

Directories

ScopeConventionReason
Renderer component/module dirsPascalCaseReact convention — dir name = component name
Everything elselowercaseNode.js convention
Categorical dirs (everywhere)lowercasecomponents/, hooks/, utils/, services/
Platform dirs (everywhere)lowercaseacp/, codex/, gemini/ — cross-process consistency

Quick test: "Inside packages/desktop/src/renderer/ AND represents a specific component/feature (not a category)?" → PascalCase. Otherwise → lowercase.

Files

ContentConventionExamples
React components, classesPascalCaseSettingsModal.tsx, CronService.ts
HookscamelCase with use prefixuseTheme.ts, useCronJobs.ts
Utilities, helperscamelCaseformatDate.ts, cronUtils.ts
Entry pointsindex.ts / index.tsxRequired for directory-based modules
Config, types, constantscamelCasetypes.ts, constants.ts
Styleskebab-case or Name.module.csschat-layout.css

Structural Rules

  1. Directory size limit: Max 10 direct children. Split into subdirectories by responsibility when approaching.
  2. No single-file directories: Merge into parent or related directory.
  3. Single file vs directory: If a component needs a private sub-component or hook, convert to a directory with index.tsx.
  4. Page-private first: Start code in pages/<PageName>/. Promote to shared only when a second consumer appears.

Test File Mapping

Tests mirror source files in tests/ subdirectories:

SourceTest
packages/desktop/src/process/services/CronService.tstests/unit/cronService.test.ts
packages/desktop/src/renderer/hooks/ui/useAutoScroll.tstests/unit/useAutoScroll.dom.test.ts
packages/desktop/src/process/extensions/ExtensionLoader.tstests/unit/extensions/extensionLoader.test.ts

When tests/unit/ exceeds 10 direct children, group into subdirectories matching source structure.


Quick Checklist

  • Code is in the correct process directory (no cross-process imports)
  • Renderer code does not use Node.js APIs
  • Main process code does not use DOM APIs
  • New IPC channels are bridged through preload.ts
  • Renderer component/module dirs use PascalCase; categorical dirs use lowercase
  • Platform dirs use lowercase everywhere
  • Directory-based modules have index.tsx / index.ts entry point
  • Page-private code is under pages/<PageName>/, not in shared dirs
  • No single-file directories
  • No directory exceeds 10 direct children
  • New source files are auto-included in coverage — verify they are not accidentally excluded in vitest.config.tscoverage.exclude
  • New services separate pure logic from IO

Related skills