@k0t0vich/meta-agents-template 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +127 -0
  2. package/agents.md +141 -0
  3. package/bin/meta-agents.js +7 -0
  4. package/package.json +35 -0
  5. package/src/cli.mjs +266 -0
  6. package/src/init.mjs +197 -0
  7. package/src/sync.mjs +46 -0
  8. package/template/.meta-agents/config/roles.yaml +21 -0
  9. package/template/.meta-agents/config/system.yaml +48 -0
  10. package/template/.meta-agents/config/trackers.yaml +16 -0
  11. package/template/.meta-agents/prompts/agile-manager.md +3 -0
  12. package/template/.meta-agents/prompts/architect.md +3 -0
  13. package/template/.meta-agents/prompts/clarifier.md +3 -0
  14. package/template/.meta-agents/prompts/decomposer.md +3 -0
  15. package/template/.meta-agents/prompts/reviewer-judge.md +3 -0
  16. package/template/.meta-agents/prompts/verifier-designer.md +3 -0
  17. package/template/.meta-agents/scripts/generate-prd-step.mjs +1 -0
  18. package/template/.meta-agents/scripts/init.mjs +1 -0
  19. package/template/.meta-agents/scripts/sync-status.mjs +1 -0
  20. package/template/.meta-agents/scripts/tracker/custom.mjs +4 -0
  21. package/template/.meta-agents/scripts/tracker/github.mjs +4 -0
  22. package/template/.meta-agents/scripts/tracker/local.mjs +4 -0
  23. package/template/.meta-agents/scripts/tracker/mcp.mjs +4 -0
  24. package/template/.meta-agents/templates/agent-work-contract.md +12 -0
  25. package/template/.meta-agents/templates/evidence-pack.md +9 -0
  26. package/template/.meta-agents/templates/prd-step.md +15 -0
  27. package/template/.meta-agents/templates/sprint-template.md +12 -0
  28. package/template/.meta-agents/templates/task-template.md +26 -0
  29. package/template/.meta-agents/templates/verification-plan.md +15 -0
  30. package/template/README.md +23 -0
  31. package/template/agents.md +141 -0
  32. package/template/package.json +8 -0
  33. package/template/tasks/backlog.md +4 -0
  34. package/template/tasks/sprint-1.md +12 -0
  35. package/template/tasks/task-status-log.md +3 -0
  36. package/template/tracker-command-template.md +138 -0
  37. package/tracker-command-template.md +138 -0
package/README.md ADDED
@@ -0,0 +1,127 @@
1
+ # Meta Agents Template (RU)
2
+
3
+ Готовый шаблон системы агентной разработки, который устанавливается как npm-пакет и разворачивает процесс verification-first.
4
+
5
+ ## Что получает пользователь после установки
6
+ - единый агентный процесс (`clarify -> PRD -> verify -> execute -> accept`);
7
+ - роли агентов и правила оркестрации;
8
+ - шаблоны PRD, контрактов, верификации и evidence;
9
+ - командный протокол работы с задачами и спринтами;
10
+ - выбор backend-трекера (`github`, `mcp`, `local`, `custom`).
11
+
12
+ ## Установка
13
+ ```bash
14
+ npm i -D @k0t0vich/meta-agents-template
15
+ npx meta-agents init my-project
16
+ ```
17
+
18
+ или
19
+
20
+ ```bash
21
+ npm i -D git+https://github.com/k0t0vich/meta-agents-template.git
22
+ npx meta-agents init my-project
23
+ ```
24
+
25
+ ## Диалог при `init`
26
+ Во время инициализации система задаёт обязательные вопросы:
27
+ 1. Как настраивать Git: `github`, `local` или `skip`.
28
+ 2. Нужно ли сразу создать GitHub-репозиторий.
29
+ 3. Какой трекер использовать по умолчанию: `github`, `mcp`, `local`, `custom`.
30
+
31
+ Это позволяет сразу зафиксировать рабочую модель проекта без ручной донастройки.
32
+
33
+ ## Структура проекта после `init`
34
+ ```text
35
+ my-project/
36
+ package.json
37
+ README.md
38
+ agents.md
39
+ tracker-command-template.md
40
+ .meta-agents/
41
+ config/
42
+ system.yaml
43
+ roles.yaml
44
+ trackers.yaml
45
+ templates/
46
+ prd-step.md
47
+ agent-work-contract.md
48
+ verification-plan.md
49
+ evidence-pack.md
50
+ sprint-template.md
51
+ task-template.md
52
+ prompts/
53
+ clarifier.md
54
+ architect.md
55
+ verifier-designer.md
56
+ decomposer.md
57
+ reviewer-judge.md
58
+ agile-manager.md
59
+ scripts/
60
+ init.mjs
61
+ sync-status.mjs
62
+ generate-prd-step.mjs
63
+ tracker/
64
+ local.mjs
65
+ github.mjs
66
+ mcp.mjs
67
+ custom.mjs
68
+ tasks/
69
+ backlog.md
70
+ sprint-1.md
71
+ task-status-log.md
72
+ ```
73
+
74
+ ## Канонические команды
75
+ 1. `CREATE_TASK`
76
+ 2. `SET_STATUS`
77
+ 3. `COMMIT_BY_NAME`
78
+ 4. `ASSIGN_SPRINT`
79
+
80
+ ## Жёсткие критерии приёмки
81
+ Задача принимается только если одновременно выполнены все условия:
82
+ 1. PRD-блоки заполнены полностью: `Описание`, `Проверяемость`, `Что сделано`.
83
+ 2. Перед задачей выведен префикс `Agent Auto-Select` + `Task Agent`.
84
+ 3. Пройдены все обязательные `strict` проверки.
85
+ 4. `statistical` метрики соответствуют порогам.
86
+ 5. Пройдены обязательные `human` approvals.
87
+ 6. Собран полный evidence-пакет.
88
+ 7. Синхронизированы `task/status/sprint` в трекере.
89
+
90
+ Если хотя бы один пункт не выполнен, задача не принимается.
91
+
92
+ ## Правило диалога пользователя
93
+ Коммиты и закрытие задач выполняются только по явному подтверждению пользователя в текущем диалоге:
94
+ - `COMMIT_BY_NAME` — только после подтверждения пользователя;
95
+ - перевод задачи в `DONE` — только после подтверждения пользователя;
96
+ - без подтверждения максимум статуса: `READY`.
97
+
98
+ ## Публикация через Trusted Publishing (рекомендуется)
99
+ В репозитории настроен workflow:
100
+ - [.github/workflows/publish.yml](./.github/workflows/publish.yml)
101
+ - Подробный регламент публикации: [PUBLISHING.md](./PUBLISHING.md)
102
+
103
+ Он публикует пакет по тегу `v*` или вручную через `workflow_dispatch` и использует OIDC (`id-token: write`) вместо long-lived npm токена.
104
+
105
+ Что нужно сделать в npm UI (один раз):
106
+ 1. Открой `npmjs.com -> Packages -> @k0t0vich/meta-agents-template -> Settings -> Trusted publishing`.
107
+ 2. Добавь trusted publisher типа `GitHub Actions` с полями:
108
+ - Organization/User: `k0t0vich`
109
+ - Repository: `meta-agents-template`
110
+ - Workflow filename: `publish.yml`
111
+ 3. Сохрани настройки.
112
+
113
+ Как выпускать релиз:
114
+ ```bash
115
+ git tag v0.1.1
116
+ git push origin v0.1.1
117
+ ```
118
+
119
+ После этого GitHub Actions выполнит `npm publish --access public` автоматически.
120
+
121
+ Примечание:
122
+ - если Trusted Publisher ещё не настроен, публикация из workflow не пройдет;
123
+ - для максимальной безопасности после включения trusted publishing рекомендуется запретить publish через токены в настройках пакета.
124
+
125
+ ## Основные документы шаблона
126
+ - [agents.md](./agents.md)
127
+ - [tracker-command-template.md](./tracker-command-template.md)
package/agents.md ADDED
@@ -0,0 +1,141 @@
1
+ # agents.md
2
+
3
+ ## 1) Назначение системы
4
+ Система работает как мета-оркестрация разработки: сначала формализуем задачу и проверяемость, потом делаем реализацию.
5
+
6
+ Базовый поток:
7
+ `clarify -> PRD step -> verification design -> decomposition -> execution -> evidence -> acceptance`
8
+
9
+ Главный принцип:
10
+ `acceptance-first` и `verification-first`.
11
+
12
+ ## 2) Обязательный PRD на каждом шаге
13
+ Каждый этап (уточнение, архитектура, декомпозиция, реализация, ревью) обязан иметь PRD-запись в строгом порядке:
14
+
15
+ 1. `Описание`.
16
+ 2. `Проверяемость`.
17
+ 3. `Что сделано`.
18
+
19
+ Правило запуска этапа:
20
+ - если не заполнены `Описание` и `Проверяемость`, этап не стартует.
21
+
22
+ ## 3) Роли агентов
23
+ - `Chief of Staff Agent`: оркестрация цепочки, приоритеты, блокеры, эскалации.
24
+ - `Agile Manager Agent`: операции по задачам/спринтам/статусам/коммитам через трекер.
25
+ - `Product Manager Agent`: формулирует PRD и критерии приёмки.
26
+ - `Solution Architect Agent`: проектирует архитектуру и контракты компонентов.
27
+ - `Verifier Designer Agent`: проектирует модель валидации и evidence-план.
28
+ - `Decomposer Agent`: режет систему на проверяемые компоненты.
29
+ - `Engineering Agent`: реализация по контракту.
30
+ - `QA Agent`: проверка выполнения критериев и качество тестового покрытия.
31
+ - `Reviewer/Judge Agent`: независимая приёмка по заранее согласованным правилам.
32
+ - `Documentation Agent`: поддержка и синхронизация артефактов.
33
+
34
+ ## 4) Жёсткий Auto-Select и показ имени агента
35
+ Автовыбор агента обязателен перед каждой задачей и перед каждой командой (`CREATE_TASK`, `SET_STATUS`, `COMMIT_BY_NAME`, `ASSIGN_SPRINT`).
36
+
37
+ Обязательный префикс:
38
+ ```text
39
+ [Agent Auto-Select]
40
+ Selected: <agent role>
41
+ Reason: <short reason>
42
+
43
+ [Task Agent]
44
+ Name: <agent role>
45
+ ```
46
+
47
+ Правило исполнения:
48
+ - если префикс не выведен, задача/команда не выполняется;
49
+ - если пользователь явно указал роль, она используется, но блок `Task Agent` обязателен.
50
+
51
+ ## 5) Единица работы: Verified Component
52
+ Каждый компонент обязан иметь:
53
+ - цель;
54
+ - входы/выходы;
55
+ - ограничения и инварианты;
56
+ - критерии приёмки;
57
+ - стратегию проверки;
58
+ - required evidence;
59
+ - владельца компонента;
60
+ - ссылку на PRD-этап.
61
+
62
+ ## 6) Типы валидации
63
+ - `strict`: схемы, типы, правила, инварианты, policy, state transitions.
64
+ - `statistical`: benchmark/метрики/judge score/пороговые значения.
65
+ - `human`: review/approval в рискованных и неоднозначных точках.
66
+
67
+ ## 7) AgentWorkContract
68
+ Перед передачей задачи Executor-агенту фиксируется контракт:
69
+ - scope;
70
+ - допустимая свобода решений;
71
+ - required outputs;
72
+ - required evidence;
73
+ - acceptance criteria;
74
+ - failure/escalation правила;
75
+ - трекерная привязка (`task_id`, `tracker_provider`, `sprint`).
76
+
77
+ Без контракта делегирование запрещено.
78
+
79
+ ## 8) TrackerGateway
80
+ Трекер выделяется в отдельный адаптерный слой, независимый от ролей агентов.
81
+
82
+ `TrackerGateway` поддерживает провайдеры:
83
+ - `local`;
84
+ - `github`;
85
+ - `mcp` (alias `mpc`);
86
+ - `custom`.
87
+
88
+ Режим по умолчанию для командной работы: `github` (или другой внешний трекер). `local` используется как fallback.
89
+
90
+ ## 9) Канонические команды
91
+ Все рабочие операции проходят через `Agile Manager Agent` + `TrackerGateway`.
92
+ Операционные шаблоны команд: [tracker-command-template.md](./tracker-command-template.md).
93
+
94
+ 1. `CREATE_TASK`
95
+ 2. `SET_STATUS`
96
+ 3. `COMMIT_BY_NAME`
97
+ 4. `ASSIGN_SPRINT`
98
+
99
+ ## 10) Коммиты и закрытие задач: только по подтверждению пользователя
100
+ Запрещено выполнять автоматически:
101
+ - `COMMIT_BY_NAME`;
102
+ - перевод задачи в `DONE`.
103
+
104
+ Обязательное правило:
105
+ - `COMMIT_BY_NAME` выполняется только после явного подтверждения пользователя в текущем диалоге;
106
+ - `SET_STATUS -> DONE` выполняется только после явного подтверждения пользователя в текущем диалоге;
107
+ - без подтверждения пользователя максимум допустимого статуса: `READY`.
108
+
109
+ ## 11) Жёсткие критерии приёмки (все обязательны)
110
+ Задача принимается только если одновременно выполнены все условия:
111
+ 1. Заполнены все PRD-блоки этапа: `Описание`, `Проверяемость`, `Что сделано`.
112
+ 2. Выполнен обязательный префикс `Agent Auto-Select` + `Task Agent`.
113
+ 3. Пройдены все обязательные `strict` проверки.
114
+ 4. `statistical` метрики не ниже зафиксированных порогов.
115
+ 5. Пройдены обязательные `human` approvals.
116
+ 6. Собран полный evidence-пакет (артефакты, логи, ссылки на проверки).
117
+ 7. Синхронизированы `task/status/sprint` в трекере.
118
+ 8. Если был коммит, есть явное подтверждение пользователя на коммит.
119
+ 9. Если задача закрыта в `DONE`, есть явное подтверждение пользователя на закрытие.
120
+
121
+ Если хотя бы один критерий не выполнен, задача не принимается.
122
+
123
+ ## 12) Verification-first gate
124
+ Реализация не начинается, пока не определены:
125
+ - acceptance criteria;
126
+ - метрики и пороги;
127
+ - инварианты и ограничения;
128
+ - процедуры проверки;
129
+ - зоны неопределённости и правила эскалации;
130
+ - способ фиксации в трекере.
131
+
132
+ ## 13) Реакция на провал проверки
133
+ Допустимые сценарии:
134
+ - `retry` с корректировками;
135
+ - пересмотр архитектуры;
136
+ - уточнение критериев;
137
+ - эскалация пользователю/founder;
138
+ - возврат статуса задачи в `IN_PROGRESS` или `BLOCKED`.
139
+
140
+ ## 14) Главный инвариант
141
+ Нельзя делегировать работу и нельзя закрывать задачу без формализованных критериев приёмки, PRD-блока `Проверяемость` и требуемых доказательств в трекере.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { main } from "../src/cli.mjs";
3
+
4
+ main(process.argv.slice(2)).catch((error) => {
5
+ console.error(`meta-agents: ${error.message}`);
6
+ process.exitCode = 1;
7
+ });
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@k0t0vich/meta-agents-template",
3
+ "version": "0.1.0",
4
+ "description": "Template system for verification-first agentic development",
5
+ "type": "module",
6
+ "bin": {
7
+ "meta-agents": "bin/meta-agents.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node bin/meta-agents.js --help"
11
+ },
12
+ "files": [
13
+ "README.md",
14
+ "agents.md",
15
+ "tracker-command-template.md",
16
+ "bin",
17
+ "src",
18
+ "template"
19
+ ],
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/k0t0vich/meta-agents-template.git"
23
+ },
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "keywords": [
28
+ "agents",
29
+ "template",
30
+ "workflow",
31
+ "prd",
32
+ "verification"
33
+ ],
34
+ "license": "MIT"
35
+ }
package/src/cli.mjs ADDED
@@ -0,0 +1,266 @@
1
+ import path from "node:path";
2
+ import process from "node:process";
3
+ import readline from "node:readline/promises";
4
+ import { fileURLToPath } from "node:url";
5
+ import { initProject } from "./init.mjs";
6
+ import { syncTemplate } from "./sync.mjs";
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+ const templateRoot = path.resolve(__dirname, "..", "template");
11
+
12
+ function parseOptions(args) {
13
+ const options = {
14
+ force: false,
15
+ tracker: "github",
16
+ trackerProvided: false,
17
+ help: false,
18
+ yes: false,
19
+ };
20
+ const positional = [];
21
+
22
+ for (let i = 0; i < args.length; i += 1) {
23
+ const arg = args[i];
24
+ if (arg === "--help" || arg === "-h") {
25
+ options.help = true;
26
+ continue;
27
+ }
28
+ if (arg === "--force") {
29
+ options.force = true;
30
+ continue;
31
+ }
32
+ if (arg === "--yes") {
33
+ options.yes = true;
34
+ continue;
35
+ }
36
+ if (arg === "--tracker") {
37
+ const value = args[i + 1];
38
+ if (!value) {
39
+ throw new Error("missing value for --tracker");
40
+ }
41
+ options.tracker = value;
42
+ options.trackerProvided = true;
43
+ i += 1;
44
+ continue;
45
+ }
46
+ positional.push(arg);
47
+ }
48
+
49
+ return { options, positional };
50
+ }
51
+
52
+ function printHelp() {
53
+ const lines = [
54
+ "meta-agents CLI",
55
+ "",
56
+ "Usage:",
57
+ " meta-agents init [project-dir] [--tracker github|mcp|local|custom] [--force] [--yes]",
58
+ " meta-agents sync [project-dir] [--force]",
59
+ " meta-agents upgrade [project-dir] [--force]",
60
+ " meta-agents --help",
61
+ "",
62
+ "Commands:",
63
+ " init Initialize a project from template",
64
+ " sync Update managed template files in an existing project",
65
+ " upgrade Alias for sync",
66
+ "",
67
+ "Init dialog:",
68
+ " By default, 'init' asks about Git mode and tracker provider.",
69
+ " Use --yes to skip dialog and use defaults/flags.",
70
+ ];
71
+ console.log(lines.join("\n"));
72
+ }
73
+
74
+ function normalizeTracker(raw) {
75
+ if (raw === "mpc") {
76
+ return "mcp";
77
+ }
78
+ return raw;
79
+ }
80
+
81
+ function ensureTrackerSupported(tracker) {
82
+ const allowed = new Set(["github", "mcp", "local", "custom"]);
83
+ if (!allowed.has(tracker)) {
84
+ throw new Error(`unsupported tracker '${tracker}'. Allowed: github, mcp, local, custom`);
85
+ }
86
+ }
87
+
88
+ function ensureGitModeSupported(mode) {
89
+ const allowed = new Set(["github", "local", "skip"]);
90
+ if (!allowed.has(mode)) {
91
+ throw new Error(`unsupported git mode '${mode}'. Allowed: github, local, skip`);
92
+ }
93
+ }
94
+
95
+ function normalizeVisibility(raw) {
96
+ const value = raw.trim().toLowerCase();
97
+ if (value === "public" || value === "private") {
98
+ return value;
99
+ }
100
+ throw new Error("visibility must be 'public' or 'private'");
101
+ }
102
+
103
+ function parseYesNo(value, defaultValue) {
104
+ const normalized = value.trim().toLowerCase();
105
+ if (!normalized) {
106
+ return defaultValue;
107
+ }
108
+ if (["y", "yes", "да", "д"].includes(normalized)) {
109
+ return true;
110
+ }
111
+ if (["n", "no", "нет", "н"].includes(normalized)) {
112
+ return false;
113
+ }
114
+ throw new Error("answer must be yes or no");
115
+ }
116
+
117
+ function defaultTrackerForGitMode(mode) {
118
+ if (mode === "github") {
119
+ return "github";
120
+ }
121
+ if (mode === "local") {
122
+ return "local";
123
+ }
124
+ return "github";
125
+ }
126
+
127
+ async function askWithDefault(rl, label, defaultValue) {
128
+ const answer = await rl.question(`${label} [${defaultValue}]: `);
129
+ return answer.trim() || defaultValue;
130
+ }
131
+
132
+ async function runInitDialog({ target, trackerDefault }) {
133
+ const projectName = path.basename(path.resolve(process.cwd(), target));
134
+ const rl = readline.createInterface({
135
+ input: process.stdin,
136
+ output: process.stdout,
137
+ });
138
+
139
+ try {
140
+ console.log("");
141
+ console.log("Настройка init: Git + трекер");
142
+ console.log("Выбери режим Git и провайдера трекера для проекта.");
143
+ console.log("");
144
+
145
+ const gitModeRaw = await askWithDefault(
146
+ rl,
147
+ "Режим Git (github/local/skip)",
148
+ "github",
149
+ );
150
+ const gitMode = gitModeRaw.toLowerCase();
151
+ ensureGitModeSupported(gitMode);
152
+
153
+ const trackerRaw = await askWithDefault(
154
+ rl,
155
+ "Провайдер трекера (github/mcp/local/custom)",
156
+ trackerDefault || defaultTrackerForGitMode(gitMode),
157
+ );
158
+ const tracker = normalizeTracker(trackerRaw.toLowerCase());
159
+ ensureTrackerSupported(tracker);
160
+
161
+ let createGithubRepo = false;
162
+ let githubRepo = "";
163
+ let githubVisibility = "private";
164
+
165
+ if (gitMode === "github") {
166
+ const createRepoRaw = await askWithDefault(
167
+ rl,
168
+ "Создать GitHub-репозиторий сейчас? (yes/no)",
169
+ "yes",
170
+ );
171
+ createGithubRepo = parseYesNo(createRepoRaw, true);
172
+
173
+ if (createGithubRepo) {
174
+ githubRepo = await askWithDefault(
175
+ rl,
176
+ "GitHub-репозиторий (name или owner/name)",
177
+ projectName,
178
+ );
179
+ githubVisibility = normalizeVisibility(
180
+ await askWithDefault(rl, "Видимость репозитория (private/public)", "private"),
181
+ );
182
+ }
183
+ }
184
+
185
+ return {
186
+ tracker,
187
+ gitSetup: {
188
+ mode: gitMode,
189
+ createGithubRepo,
190
+ githubRepo,
191
+ githubVisibility,
192
+ },
193
+ };
194
+ } finally {
195
+ rl.close();
196
+ }
197
+ }
198
+
199
+ export async function main(argv) {
200
+ const [command = "--help", ...rest] = argv;
201
+ const { options, positional } = parseOptions(rest);
202
+
203
+ if (command === "--help" || command === "-h" || options.help) {
204
+ printHelp();
205
+ return;
206
+ }
207
+
208
+ if (command === "init") {
209
+ const target = positional[0] ?? ".";
210
+ let tracker = normalizeTracker(options.tracker);
211
+ ensureTrackerSupported(tracker);
212
+
213
+ let gitSetup = {
214
+ mode: tracker === "github" ? "github" : "local",
215
+ createGithubRepo: false,
216
+ githubRepo: "",
217
+ githubVisibility: "private",
218
+ };
219
+
220
+ if (!options.yes && process.stdin.isTTY && process.stdout.isTTY) {
221
+ const dialogResult = await runInitDialog({
222
+ target,
223
+ trackerDefault: options.trackerProvided ? tracker : "",
224
+ });
225
+ tracker = dialogResult.tracker;
226
+ gitSetup = dialogResult.gitSetup;
227
+ }
228
+
229
+ const result = await initProject({
230
+ cwd: process.cwd(),
231
+ templateRoot,
232
+ target,
233
+ tracker,
234
+ force: options.force,
235
+ gitSetup,
236
+ });
237
+
238
+ console.log(`Initialized meta-agents project at: ${result.targetDir}`);
239
+ console.log(`Default tracker: ${tracker}`);
240
+ console.log(`Git mode: ${result.git.mode}`);
241
+ if (result.git.actions.length > 0) {
242
+ console.log(`Git actions: ${result.git.actions.join("; ")}`);
243
+ }
244
+ if (result.git.warnings.length > 0) {
245
+ console.log(`Git warnings: ${result.git.warnings.join(" | ")}`);
246
+ }
247
+ return;
248
+ }
249
+
250
+ if (command === "sync" || command === "upgrade") {
251
+ const target = positional[0] ?? ".";
252
+ const result = await syncTemplate({
253
+ cwd: process.cwd(),
254
+ templateRoot,
255
+ target,
256
+ force: options.force,
257
+ });
258
+
259
+ console.log(`Synced template-managed files at: ${result.targetDir}`);
260
+ console.log(`Updated files: ${result.updated.join(", ") || "none"}`);
261
+ console.log(`Skipped files: ${result.skipped.join(", ") || "none"}`);
262
+ return;
263
+ }
264
+
265
+ throw new Error(`unknown command '${command}'. Run 'meta-agents --help'`);
266
+ }