Part 3 of 4 in the scalability refactor. Adds YAML `!include` support to the org importer and splits molecule-dev/org.yaml (676 lines post- Phase 2) into 6 team / role files; top-level org.yaml drops to 114 lines of pure scaffolding. ## Platform changes New `platform/internal/handlers/org_include.go`: - `resolveYAMLIncludes(data, baseDir)` — pre-processes a YAML document, expanding any scalar tagged `!include <path>` with the parsed content of the referenced file. - Path resolution via `resolveInsideRoot` so a crafted `!include ../../etc/passwd` can't escape the org template directory (same defense the existing `files_dir` copy uses). - Nested includes supported: each included file carries its own search root (its directory), so `teams/pm.yaml` with `!include research.yaml` resolves to `teams/research.yaml` — matching the convention of C-include / Sass @import / most package systems. - Cycle detection via visited-set keyed on absolute path; belt-and- braces `maxIncludeDepth = 16` cap in case symlinks or path normalization defeats the set. - Inline-template mode (POST /org/import with raw JSON body, no `dir`) errors cleanly when a file ref is used — can't resolve without a base. Wired into both `ListTemplates` (so /org/templates shows an accurate workspace count after the split) and `Import` (expansion happens before unmarshal into OrgTemplate). ## Template changes molecule-dev/org.yaml now contains only: - name + description - defaults (runtime, plugins, category_routing, initial_prompt text) - `workspaces: [!include teams/pm.yaml, !include teams/marketing.yaml]` New files: - `teams/pm.yaml` — PM top-level, children are !include refs - `teams/research.yaml` — Research Lead + Market Analyst + Technical Researcher + Competitive Intelligence (inline children) - `teams/dev.yaml` — Dev Lead + FE/BE/DevOps/Security/QA/UIUX (inline) - `teams/marketing.yaml` — Marketing Lead + DevRel/PMM/Content/ Community/SEO/Social (inline) - `teams/documentation-specialist.yaml` — leaf - `teams/triage-operator.yaml` — leaf ## File-size impact | State | org.yaml lines | total config size | |---|---:|---:| | Before (main) | 1801 | 108 KB | | After Phase 1 (#389) | 1687 | 101 KB | | After Phase 2 (#390) | 676 | 35 KB | | After this PR | **114** | **4 KB** (org.yaml only) | With the 6 team files (total ~570 lines of structural yaml), every file is now under 230 lines and individually readable without scrolling past a single team's boundaries. ## Tests `platform/internal/handlers/org_include_test.go` — 9 cases: - Flat include (single file, single workspace) - Nested include (file → file → file) - Traversal rejection (`../secret.yaml`, `../../secret.yaml`) - Cycle detection (a↔b) - Empty path error - Missing file error - Inline-template error (baseDir empty) - No-op when YAML has no includes (safety: we always run the preprocessor) - **Integration**: load the real `org-templates/molecule-dev/org.yaml`, resolve includes, unmarshal into OrgTemplate, verify PM + Marketing Lead are top-level and PM has ≥4 children after expansion. All 9 pass + existing `TestResolvePromptRef` + `TestOrgYAML` suites stay green. ## Ownership implication Each team file can now be owned + reviewed independently. When the marketing team adds a 7th role, the diff is in `teams/marketing.yaml` alone — no merge conflicts against PM or research changes in the same review window. Same for the eventual engineer team, security team, etc. ## What's next - **Phase 4 (queued):** per-workspace atomization. Each role gets `<role>/workspace.yaml`; team files shrink to a list of !include refs. Terminal step in the scalability arc — at that point adding a new role is one new file under `org-templates/molecule-dev/<role>/` plus one line in the team's manifest. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
115 lines
6.1 KiB
YAML
115 lines
6.1 KiB
YAML
# Molecule AI Dev Team — PM + Research + Dev
|
|
name: Molecule AI Dev Team
|
|
description: AI agent company for building Molecule AI
|
|
|
|
defaults:
|
|
runtime: claude-code
|
|
tier: 2
|
|
required_env:
|
|
- CLAUDE_CODE_OAUTH_TOKEN
|
|
# Default plugin set applied to every workspace. Per-workspace `plugins:`
|
|
# UNIONs with this set (#71). Use just the additions; prefix `!` (or `-`)
|
|
# to opt a default OUT for one workspace if needed.
|
|
#
|
|
# Coding / guardrail essentials:
|
|
# - ecc: "Everything Claude Code" guardrails + coding skills
|
|
# - molecule-dev: Molecule AI codebase conventions, past bugs, review-loop
|
|
# - superpowers: systematic-debugging, TDD, planning, verification-before-completion
|
|
#
|
|
# Safety hooks (PreToolUse/PostToolUse/UserPromptSubmit) — universal:
|
|
# - molecule-careful-bash: refuse destructive shell (rm -rf, push --force main, DROP TABLE)
|
|
# - molecule-prompt-watchdog: inject warnings on destructive user prompts
|
|
# - molecule-audit-trail: append every Edit/Write to .claude/audit.jsonl
|
|
#
|
|
# Operational memory — keeps agents consistent across sessions/cron ticks:
|
|
# - molecule-session-context: auto-load cron learnings + PR/issue counts on SessionStart
|
|
# - molecule-skill-cron-learnings: per-tick learning JSONL format (pairs with session-context)
|
|
#
|
|
# Docs hygiene:
|
|
# - molecule-skill-update-docs: keep architecture / README / edit-history aligned with code
|
|
plugins:
|
|
- ecc
|
|
- molecule-dev
|
|
- superpowers
|
|
- molecule-careful-bash
|
|
- molecule-prompt-watchdog
|
|
- molecule-audit-trail
|
|
- molecule-session-context
|
|
- molecule-skill-cron-learnings
|
|
- molecule-skill-update-docs
|
|
|
|
# Audit-summary routing — generic per-template mapping (issue #51).
|
|
# Auditors (Security Auditor, UIUX Designer, QA Engineer) send A2A messages
|
|
# with metadata.audit_summary.category set. The receiver (PM) reads this
|
|
# table from its own /configs/config.yaml and delegates to each listed role.
|
|
# Each org template owns its own mapping — role names are NOT hardcoded in
|
|
# prompts, so adding/renaming roles is a config-only change.
|
|
category_routing:
|
|
security: [Backend Engineer, DevOps Engineer]
|
|
ui: [Frontend Engineer]
|
|
ux: [Frontend Engineer]
|
|
infra: [DevOps Engineer]
|
|
qa: [QA Engineer]
|
|
performance: [Backend Engineer]
|
|
docs: [Documentation Specialist]
|
|
mixed: [Dev Lead]
|
|
# Evolution-cron categories (#93): these four are fired by hourly
|
|
# self-review schedules (Research Lead, Technical Researcher, Dev Lead,
|
|
# DevOps Engineer). Routing them to the same role that generated them
|
|
# is a safe default — it converts the summary into a delegation back
|
|
# to the author so they act on their own findings. Override per-org
|
|
# if you want a different fan-out.
|
|
research: [Research Lead]
|
|
plugins: [Technical Researcher]
|
|
template: [Dev Lead]
|
|
channels: [DevOps Engineer]
|
|
# Marketing team categories (2026-04-16). Peer sub-tree under CEO —
|
|
# reports via Marketing Lead for coordination + cross-functional
|
|
# delegations into the dev team (DevRel → Backend Engineer for code
|
|
# samples, PMM → Competitive Intelligence for eco-watch diffs).
|
|
content: [Content Marketer]
|
|
positioning: [Product Marketing Manager]
|
|
community: [Community Manager]
|
|
growth: [SEO Growth Analyst]
|
|
social: [Social Media Brand]
|
|
devrel: [DevRel Engineer]
|
|
|
|
# workspace_dir: not set by default — each agent gets an isolated Docker volume
|
|
# Set per-workspace to bind-mount a host directory as /workspace
|
|
|
|
# Idle-loop reflection pattern (#205). When idle_prompt is non-empty, the
|
|
# workspace self-sends this prompt every idle_interval_seconds while its
|
|
# heartbeat.active_tasks == 0. Pattern from Hermes/Letta. Cost collapses to
|
|
# event-driven (no LLM call unless there's actually nothing to do). Off by
|
|
# default to avoid surprising token burn — set per-workspace to enable.
|
|
# Keep idle prompts local (no A2A sends): same rule as initial_prompt.
|
|
idle_prompt: ""
|
|
idle_interval_seconds: 600 # 10 min — ignored when idle_prompt is empty
|
|
|
|
# initial_prompt runs once on first boot (not on restart).
|
|
# ${GITHUB_REPO} is a container env var from .env secrets.
|
|
# IMPORTANT: Do NOT send A2A messages in initial_prompt — other agents may not
|
|
# be ready yet. Keep it local: clone, read, memorize. Wait for tasks.
|
|
initial_prompt: |
|
|
You just started. Set up your environment silently — do NOT contact other agents yet.
|
|
1. Clone the repo (authenticated when GITHUB_TOKEN is available, anonymous otherwise).
|
|
When a token is present, use it in-URL ONLY for the clone, then immediately scrub
|
|
the remote URL so the token is never persisted to /workspace/repo/.git/config:
|
|
if [ -n "$GITHUB_TOKEN" ]; then
|
|
git clone "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPO}.git" /workspace/repo 2>/dev/null \
|
|
&& (cd /workspace/repo && git remote set-url origin "https://github.com/${GITHUB_REPO}.git") \
|
|
|| (cd /workspace/repo && git pull)
|
|
else
|
|
git clone "https://github.com/${GITHUB_REPO}.git" /workspace/repo 2>/dev/null || (cd /workspace/repo && git pull)
|
|
fi
|
|
2. Set up git hooks: cd /workspace/repo && git config core.hooksPath .githooks
|
|
3. Read /workspace/repo/CLAUDE.md to understand the project
|
|
4. Read your system prompt at /configs/system-prompt.md to understand your role
|
|
5. Save key conventions to memory so you recall them on every future task:
|
|
Use commit_memory to save: "CONVENTIONS: (1) Every canvas .tsx using hooks needs 'use client' as first line — run the grep check before committing. (2) Dark zinc theme only — never white/light. (3) Zustand selectors must not create new objects. (4) Always run npm test + npm run build before reporting done. (5) Use delegate_task to ask peers questions directly — don't guess API shapes. (6) Pre-commit hook at .githooks/pre-commit enforces these — commits will be rejected if violated."
|
|
6. You are now ready. Wait for tasks from your parent — do not initiate contact.
|
|
|
|
workspaces:
|
|
- !include teams/pm.yaml
|
|
- !include teams/marketing.yaml
|