-
Notifications
You must be signed in to change notification settings - Fork 0
Contributing
PRs welcome. Repo: https://github.com/mtecnic/clusterspace. Issues at https://github.com/mtecnic/clusterspace/issues.
git clone https://github.com/mtecnic/clusterspace.git
cd clusterspace
npm install
npm run rebuild # native modules
npm run dev # Vite + Electron, watches src/See Installation for prerequisites and OS-specific build toolchain notes.
- Default branch:
main. PRs targetmain. - No develop branch —
mainis the release line. - Feature branches typically named
feat/<short-description>orfix/<short-description>. - Squash-merge is fine; merge commits are fine; rebase-merge is fine. Maintainer chooses based on the change size.
-
TypeScript for everything in
src/. Strict mode is on. - 2-space indent, no semicolons-required (we use them most places but the linter is forgiving).
- No emojis in code or commits unless the user is explicitly using them.
- Match the surrounding style — when in doubt, look at adjacent files.
- No comments that just describe what the code does — well-named identifiers do that. Comments should explain why something non-obvious is there (a workaround, an invariant, a hidden constraint).
Pre-PR checks:
npx tsc --noEmit # must be clean (unused-import warnings ok)
npm run build # must succeed(There's no full test suite yet — roadmap item. Manual testing is expected.)
Follow the conventional-commits-ish format the repo already uses:
feat(area): short imperative summary
Longer body explaining what and why.
Co-Authored-By: ... (if pair-coding)
Common prefixes: feat, fix, docs, refactor, chore, wiki.
Look at git log --oneline for examples — there are many.
| Open an issue when | Open a PR when |
|---|---|
| You found a bug but don't have a fix | You have a fix |
| You want a feature but aren't sure of the design | You have a working impl + happy to discuss |
| The change touches the architecture or app contract | You're adding/modifying a tool, persona, etc. |
| You're not sure if it's wanted | You're confident it's an improvement |
| If you're adding… | Look at |
|---|---|
| A new AI tool |
Tool-Registry · AI-Tools-Reference · src/main/ai-tools/
|
| A new IPC channel |
IPC-Channels-Reference · src/shared/types.ts · src/preload/index.ts
|
| A new dialog or UI surface | src/renderer/components/ |
| A keyboard shortcut | src/renderer/hooks/useKeyboardShortcuts.ts |
| A new electron-store file |
src/main/<your-area>-store.ts (look at existing stores for the pattern) |
| Goal runner behavior |
Goal-Runner-Internals · src/main/goal-runner.ts
|
| Personas / skills / task templates |
resources/defaults/ (also user can override via [[Settings-and-Configuration |
There's no test suite (yet). Manual smoke checks before PR:
-
npx tsc --noEmit— clean -
npm run build— succeeds -
npm run dev— app launches, panes work - Exercise the area you changed:
- For AI tools: open chat panel, ask the AI to use the tool
- For IPC: open DevTools, check the renderer-side
window.electronAPI.<name>(...)call works - For UI: click around, verify no console errors
-
npm run dist— only if your change touches packaging (electron-builder.yml,package.jsonscripts, native modules)
Do
- Use
electron-storefor any new persistent state — match the pattern of existing stores - Add new shared types to
src/shared/types.ts, not in main- or renderer-specific files - Use
safeStoragefor any secret material (API keys, passwords, tokens) - Use the registry pattern for new AI tools — don't hardcode a giant switch
- Pass
BrowserWindowand stores into constructors; don't reach for globals
Don't
- Don't import from
src/main/in renderer code (use IPC) - Don't import from
src/renderer/in main code - Don't introduce new direct
ipcRenderer.invokecalls in renderer — go through the preload bridge - Don't add
console.logs without a reason — remove debug logs before merging - Don't add files for "future use" — YAGNI
PRs that add user-facing features should also:
- Update the Home navigation if the feature is large
- Add a new wiki page (or update existing) for the feature — see how existing pages are structured
- Update the Changelog entry
- Update the Keyboard-Shortcuts table if applicable
Don't worry about updating every page that mentions the feature — links auto-resolve as the wiki grows.
If you're a maintainer:
- Be welcoming. New contributors deserve patience.
- Code review focuses on: correctness, architecture fit, code style, not nitpicks about taste.
- Ship small. Big PRs are hard to review; suggest splitting when reasonable.
- Don't block on perfection. "Good enough to ship, iterate later" beats "stuck in review."
| Issue | Why it's good for first-time |
|---|---|
| Adding light theme | Self-contained, visible result, no architectural risk |
| Adding new persona / skill / task template defaults | No code change needed beyond a markdown file |
| Adding wiki content | The wiki is its own repo; PR there |
Migrating remaining IPC channels off string literals into IPC_CHANNELS
|
Mechanical, type-safe wins |
Authoring a new plugin tool in <userData>/.../config/tools/
|
Doesn't even need a fork |
See the Roadmap for more.
- Architecture-Overview — codebase structure
- IPC-Channels-Reference — adding new channels
- Tool-Registry — adding new tools
- Installation — getting set up
ClusterSpace · Issues · Releases · MIT License · Edit any page via the Edit button (top right of the wiki).
- Workspaces-and-Layout
- Terminal-Panes
- Per-Pane-Tabs
- SSH-and-tmux
- Browser-Panes
- Saved-Logins
- Command-Palette
- Broadcast-Mode
- Settings-and-Configuration
- AI-Overview
- AI-Providers
- AI-Chat-Panel
- AI-Tools-Reference
- Personas
- Skills
- Task-Templates
- Agent-Orchestration
- Fleet-Dashboard
- Goal-Runner-Overview
- Starting-a-Goal
- Success-Criteria
- Goal-Policy-and-Risk-Levels
- Critic-and-Replan
- Vision-Verification
- Goal-Dashboard