molecule-core/org-templates/molecule-dev
rabbitblood 24a882ccc9 feat(org-templates): Phase 3 — !include directive + split org.yaml into team files
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>
2026-04-16 07:49:56 +00:00
..
backend-engineer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
community-manager feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
competitive-intelligence feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
content-marketer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
dev-lead feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
devops-engineer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
devrel-engineer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
documentation-specialist feat(org-templates): Phase 1 — externalize prompt bodies to sibling files (#389) 2026-04-16 00:32:09 -07:00
frontend-engineer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
market-analyst feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
marketing-lead feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
pm feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
product-marketing-manager feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
qa-engineer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
research-lead feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
security-auditor feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
seo-growth-analyst feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
social-media-brand feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
teams feat(org-templates): Phase 3 — !include directive + split org.yaml into team files 2026-04-16 07:49:56 +00:00
technical-researcher feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
triage-operator feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
uiux-designer feat(org-templates): Phase 2 — bulk migrate 20 roles to file-ref prompts (#395) 2026-04-16 00:47:32 -07:00
.env.example initial commit — Molecule AI platform 2026-04-13 11:55:37 -07:00
org.yaml feat(org-templates): Phase 3 — !include directive + split org.yaml into team files 2026-04-16 07:49:56 +00:00