feat(manifest): restructure factory.yaml with core/modules schema + manifest-driven bootstrap

factory.yaml: new schema (schema_version 1, factory_version 0.3.0)
- core.components[] with id/source/version/type/install/health_check
- versions from bundled lib/: projects-meta-mcp 2.25.0, wiki-graph 0.3.1, interns-mcp 0.3.3
- modules[]: tasks, wiki, workshop, admin — each with creates[] describing
  gitea_repo / local_clone / claude_md_snippet / setup_skill actions
- removed hardcoded git_host/git_org (those belong in ~/.config/factory/home.toml per design)

bootstrap.ps1: add Read-FactoryManifest + manifest-driven MCP build loop
- indent-aware YAML parser prevents health_check.type from clobbering component.type
- MCP build loop now reads from manifest instead of hardcoded server names
- reports factory version at startup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 13:34:09 +03:00
parent 45bb4e07ee
commit 0710baae29
2 changed files with 211 additions and 151 deletions

View File

@@ -1,141 +1,139 @@
# factory.yaml — L1 manifest
# Variables: {gitea}, {projects_dir}, {factory}, {home}
# Substitution happens at runtime from ~/.config/factory/home.toml
# factory.yaml — manifest компонентов factory
#
# Runtime variables (expanded from ~/.config/factory/home.toml):
# {git_host} — e.g. https://git.kzntsv.site
# {git_org} — e.g. OpeItcLoc03
# {projects_dir} — e.g. C:\Users\alice\projects
# {factory} — {projects_dir}\.factory
# {home} — user home dir (~)
version: "0.2.0"
schema_version: "1"
factory_version: "0.3.0"
# Git host configuration (overrides {gitea} default)
git_host: "https://git.kzntsv.site"
git_org: "OpeItcLoc03"
# ── Core (always installed) ──────────────────────────────────────────────────
#
# Everything in core ships inside the factory repo:
# lib/ — MCP servers (built locally on install)
# skills/ — skill files (copied to ~/.claude/skills/)
#
# bootstrap.ps1 reads this list to drive the build loop.
# Components to install/update
components:
# === Core infrastructure ===
core:
components:
- name: dot-common
display_name: ".common shared libs"
source:
type: git
url: "{git_host}/{git_org}/common"
branch: master
target: "{projects_dir}/.common"
health_check:
type: file_exists
path: "{target}/scripts/claude-switch.ps1"
clients: [claude-code, copilot-cli, gemini-cli]
- id: projects-meta-mcp
display_name: "Projects-meta MCP server"
source: lib/projects-meta-mcp
version: "2.25.0"
type: typescript
install:
run:
- npm install --silent
- npm run build
health_check:
type: mcp_tool
tool: mcp__projects-meta__meta_status
- name: projects-meta-mcp
display_name: "Projects-meta MCP server"
# Subdirectory of .common repo — no standalone git source
target: "{projects_dir}/.common/lib/projects-meta-mcp"
deps: [dot-common]
setup_skill: setup-projects-meta
health_check:
type: mcp_tool
tool: mcp__projects-meta__meta_status
clients: [claude-code, copilot-cli]
- id: wiki-graph
display_name: "Wiki-graph MCP server"
source: lib/wiki-graph
version: "0.3.1"
type: typescript
install:
run:
- npm install --silent
- npm run build
health_check:
type: mcp_tool
tool: mcp__wiki-graph__stats
- name: interns-mcp
display_name: "Interns MCP server"
# Subdirectory of .common repo — no standalone git source
target: "{projects_dir}/.common/lib/interns-mcp"
deps: [dot-common]
setup_skill: setup-interns
health_check:
type: mcp_tool
tool: mcp__interns__bulk_text_read
clients: [claude-code, copilot-cli]
- id: interns-mcp
display_name: "Interns MCP server"
source: lib/interns-mcp
version: "0.3.3"
type: python
install:
venv: .venv
pip: "-e ."
health_check:
type: mcp_tool
tool: mcp__interns__bulk_text_read
# === Knowledge ===
- id: skills
display_name: "Claude skills"
source: skills
version: "bundled"
type: skills
install:
copy_to: "{home}/.claude/skills/"
health_check:
type: directory_exists
path: "{home}/.claude/skills"
- name: dot-wiki
display_name: "Shared project wiki"
source:
type: git
url: "{git_host}/{git_org}/projects-wiki"
branch: main
target: "{projects_dir}/.wiki"
deps: [projects-meta-mcp]
setup_skill: setup-wiki
health_check:
type: file_exists
path: "{target}/CLAUDE.md"
clients: [claude-code, copilot-cli, gemini-cli]
# ── Modules (selected at install time) ──────────────────────────────────────
#
# Each module is optional. bootstrap.ps1 asks the user which to install.
# creates[] describes what bootstrap creates on the user's machine/Gitea.
#
# create types:
# local_dir — create a local directory
# gitea_repo — create a repo on the user's Gitea via API
# local_clone — git clone a repo locally
# claude_md_snippet — append a trigger line to CLAUDE.md
# setup_skill — run a setup-* skill post-install
- name: dot-tasks
display_name: "Local task board"
target: "{projects_dir}/.tasks"
deps: [dot-wiki]
setup_skill: setup-tasks
health_check:
type: file_exists
path: "{target}/STATUS.md"
clients: [claude-code, copilot-cli, gemini-cli]
modules:
# === Tooling ===
- name: claude-skills
display_name: "Claude skills collection"
source:
type: git
url: "{git_host}/{git_org}/claude-skills"
branch: master
target: "{projects_dir}/claude-skills"
deps: [dot-common]
post_install:
shell: pwsh
script: "{target}/scripts/install.ps1"
shell_alt: bash
script_alt: "{target}/scripts/install.sh"
health_check:
type: directory_exists
path: "{home}/.claude/skills"
clients: [claude-code]
# === Fixtures (optional) ===
- name: dot-organization
display_name: "Organization roster & personas"
source:
type: git
url: "{git_host}/{git_org}/.organization"
branch: master
target: "{projects_dir}/.organization"
- id: tasks
optional: true
health_check:
type: file_exists
path: "{target}/roster.md"
clients: [claude-code, copilot-cli, gemini-cli]
description: "Task management — projects-meta board + per-project .tasks/"
creates:
- type: local_dir
path: "{projects_dir}/.tasks"
- type: claude_md_snippet
content: "use task management system"
- type: setup_skill
skill: setup-tasks
- name: dot-templates
display_name: "Project templates"
source:
type: git
url: "{git_host}/{git_org}/.templates"
branch: master
target: "{projects_dir}/.templates"
- id: wiki
optional: true
health_check:
type: file_exists
path: "{target}/project/.gitkeep"
clients: [claude-code, copilot-cli, gemini-cli]
description: "Shared knowledge wiki — linked plaintext, no RAG"
creates:
- type: gitea_repo
name: "projects-wiki"
visibility: private
description: "Shared project wiki"
init: true
- type: local_clone
repo: "{git_host}/{git_org}/projects-wiki"
path: "{projects_dir}/.wiki"
- type: claude_md_snippet
content: "use project wiki"
- type: setup_skill
skill: setup-wiki
- name: dot-meeting-room
display_name: "Meeting room / brainstorm archive"
source:
type: git
url: "{git_host}/{git_org}/.meeting-room"
branch: master
target: "{projects_dir}/.meeting-room"
- id: workshop
optional: true
health_check:
type: file_exists
path: "{target}/.brainstorm/.gitkeep"
clients: [claude-code, copilot-cli, gemini-cli]
description: "Boss-zone — design work, brainstorms, archived decisions"
creates:
- type: gitea_repo
name: ".workshop"
visibility: private
description: "Design workspace and brainstorm archive"
init: true
- type: local_clone
repo: "{git_host}/{git_org}/.workshop"
path: "{projects_dir}/.workshop"
# Health check types:
# file_exists: checks if file exists at {path}
# directory_exists: checks if directory exists at {path}
# mcp_tool: checks if MCP tool is available (via ~/.claude.json)
# command: runs command and checks exit code 0
# custom: runs custom health check script
- id: admin
optional: true
description: "Ops zone — infrastructure administration and runbooks"
creates:
- type: gitea_repo
name: ".admin"
visibility: private
description: "Infrastructure ops and admin notes"
init: true
- type: local_clone
repo: "{git_host}/{git_org}/.admin"
path: "{projects_dir}/.admin"