@k0t0vich/meta-agents-template 0.1.5 → 0.1.7
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.
- package/CHANGELOG.md +17 -0
- package/README.md +47 -49
- package/agents.md +4 -4
- package/package.json +1 -1
- package/src/cli.mjs +49 -1
- package/src/init.mjs +262 -30
- package/template/.meta-agents/config/system.yaml +2 -7
- package/template/.meta-agents/prompts/agile-manager.md +3 -3
- package/template/.meta-agents/prompts/status-agent.md +1 -1
- package/template/.meta-agents/scripts/task-branch-router.mjs +2 -2
- package/template/.meta-agents/scripts/verify-commit-link.mjs +2 -3
- package/template/README.md +4 -4
- package/template/agents.md +4 -4
- package/template/tasks/task-status-log.md +1 -1
- package/template/tracker-command-template.md +17 -17
- package/tracker-command-template.md +18 -18
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this package are documented in this file.
|
|
4
4
|
|
|
5
|
+
## 0.1.7 - 2026-03-20
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- Switched `meta-agents init` to non-destructive bootstrap: root now gets only `.meta-agents/config/*`, while automation rules are consumed from `node_modules/@k0t0vich/meta-agents-template`.
|
|
9
|
+
- Prevented accidental overwrite of existing project `agents.md`: init now appends/updates only a managed links block instead of replacing full content.
|
|
10
|
+
- Reworked package setup in existing projects: `package.json` is merged (not replaced), preserving existing scripts while adding `meta:*` commands and `devDependencies` entry.
|
|
11
|
+
- Added runtime package self-install during init when package files are not present locally (safe `npx` path).
|
|
12
|
+
- Updated public README with robust one-line onboarding for npm URL/package-name prompts and new post-init layout.
|
|
13
|
+
- Updated local post-publish smoke to validate the new config-only root flow.
|
|
14
|
+
|
|
15
|
+
## 0.1.6 - 2026-03-20
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- Switched governance/process docs to a single canonical task reference: GitHub `#issue`.
|
|
19
|
+
- Removed mixed prefixed task-id examples (`GOV-*`, `REL-*`, `DOC-*`, `DEV-*`) from workflow commands and policy text.
|
|
20
|
+
- Synchronized current project and template agent artifacts for canonical `#issue` usage (`agents.md`, `tracker-command-template.md`, prompts, branch-router warning, commit-link validation, release docs examples).
|
|
21
|
+
|
|
5
22
|
## 0.1.5 - 2026-03-20
|
|
6
23
|
|
|
7
24
|
### Changed
|
package/README.md
CHANGED
|
@@ -9,17 +9,46 @@
|
|
|
9
9
|
- командный протокол работы с задачами и спринтами;
|
|
10
10
|
- выбор backend-трекера (`github`, `mcp`, `local`, `custom`).
|
|
11
11
|
|
|
12
|
-
## Установка
|
|
12
|
+
## Установка (надёжно из любой папки)
|
|
13
|
+
Если целевая папка пустая или в ней нет `package.json`, сначала зафиксируй локальный npm-проект:
|
|
14
|
+
|
|
13
15
|
```bash
|
|
16
|
+
mkdir -p my-project
|
|
17
|
+
cd my-project
|
|
18
|
+
npm init -y
|
|
14
19
|
npm i -D @k0t0vich/meta-agents-template
|
|
15
|
-
npx meta-agents init
|
|
20
|
+
npx meta-agents init . --yes --tracker github
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Альтернатива через `npx` (init сам добавит пакет в `devDependencies`, если его нет локально):
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
mkdir -p my-project
|
|
27
|
+
cd my-project
|
|
28
|
+
npx -y @k0t0vich/meta-agents-template init . --yes --tracker github
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Важно:
|
|
32
|
+
- если пользователь дал URL `https://www.npmjs.com/package/@k0t0vich/meta-agents-template`, извлекай имя пакета `@k0t0vich/meta-agents-template` и ставь именно его;
|
|
33
|
+
- не запускай `npm i -D ...` в папке без `package.json`, иначе npm может установить пакет в родительский проект.
|
|
34
|
+
- `meta-agents init` по умолчанию работает non-destructive: в корне создаёт/обновляет только `.meta-agents/config/*`, аккуратно merge-ит `meta:*` scripts в `package.json` и добавляет ссылочный блок в `agents.md` вместо полной перезаписи.
|
|
35
|
+
- `--force` нужен только если надо перезаписать уже существующие `.meta-agents/config/*` и мигрировать legacy `meta:*` scripts.
|
|
36
|
+
|
|
37
|
+
## One-line для агентного запуска
|
|
38
|
+
Если пользователь пишет только:
|
|
39
|
+
- `поставь https://www.npmjs.com/package/@k0t0vich/meta-agents-template`
|
|
40
|
+
- `поставь @k0t0vich/meta-agents-template`
|
|
41
|
+
|
|
42
|
+
используй безопасный one-liner:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
mkdir -p my-project && cd my-project && npm init -y && npm i -D @k0t0vich/meta-agents-template && npx meta-agents init . --yes --tracker github
|
|
16
46
|
```
|
|
17
47
|
|
|
18
|
-
|
|
48
|
+
Проверка, что шаблон и правила действительно развернуты:
|
|
19
49
|
|
|
20
50
|
```bash
|
|
21
|
-
|
|
22
|
-
npx meta-agents init my-project
|
|
51
|
+
test -f agents.md && test -f .meta-agents/config/project-context.yaml && test -f node_modules/@k0t0vich/meta-agents-template/agents.md && echo "meta-agents template ready"
|
|
23
52
|
```
|
|
24
53
|
|
|
25
54
|
## Диалог при `init`
|
|
@@ -33,55 +62,24 @@ npx meta-agents init my-project
|
|
|
33
62
|
## Структура проекта после `init`
|
|
34
63
|
```text
|
|
35
64
|
my-project/
|
|
36
|
-
.github/
|
|
37
|
-
workflows/
|
|
38
|
-
gitflow-lite-verify.yml
|
|
39
65
|
package.json
|
|
40
|
-
|
|
66
|
+
package-lock.json
|
|
41
67
|
agents.md
|
|
42
|
-
tracker-command-template.md
|
|
43
68
|
.meta-agents/
|
|
44
69
|
config/
|
|
45
70
|
system.yaml
|
|
46
71
|
roles.yaml
|
|
47
72
|
trackers.yaml
|
|
48
73
|
project-context.yaml
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
sprint-template.md
|
|
55
|
-
task-template.md
|
|
56
|
-
prompts/
|
|
57
|
-
clarifier.md
|
|
58
|
-
architect.md
|
|
59
|
-
verifier-designer.md
|
|
60
|
-
decomposer.md
|
|
61
|
-
reviewer-judge.md
|
|
62
|
-
mr-review-agent.md
|
|
63
|
-
agile-manager.md
|
|
64
|
-
publishing-agent.md
|
|
65
|
-
status-agent.md
|
|
66
|
-
scripts/
|
|
67
|
-
init.mjs
|
|
68
|
-
sync-status.mjs
|
|
69
|
-
verify-branch-strategy.mjs
|
|
70
|
-
task-branch-router.mjs
|
|
71
|
-
run-mr-review-gate.mjs
|
|
72
|
-
generate-prd-step.mjs
|
|
73
|
-
tracker/
|
|
74
|
-
local.mjs
|
|
75
|
-
github.mjs
|
|
76
|
-
mcp.mjs
|
|
77
|
-
custom.mjs
|
|
78
|
-
tracker-gateway.mjs
|
|
79
|
-
tasks/
|
|
80
|
-
backlog.md
|
|
81
|
-
sprint-1.md
|
|
82
|
-
task-status-log.md
|
|
74
|
+
node_modules/
|
|
75
|
+
@k0t0vich/meta-agents-template/
|
|
76
|
+
agents.md
|
|
77
|
+
tracker-command-template.md
|
|
78
|
+
template/.meta-agents/scripts/*.mjs
|
|
83
79
|
```
|
|
84
80
|
|
|
81
|
+
`agents.md` в проекте не перезаписывается целиком: `init` добавляет/обновляет в нём только ссылочный блок на правила из npm-пакета.
|
|
82
|
+
|
|
85
83
|
## Канонические команды
|
|
86
84
|
0. `VERIFY_GOVERNANCE_GATE`
|
|
87
85
|
1. `CREATE_TASK`
|
|
@@ -133,7 +131,7 @@ npm run self:bootstrap
|
|
|
133
131
|
10. Есть отдельное явное подтверждение пользователя на прохождение review (`Review Approved: yes`).
|
|
134
132
|
11. Перед merge пройден MR review gate (`RUN_MR_REVIEW_GATE`) с финальным `PASS_CONFIRMED`.
|
|
135
133
|
12. Есть отдельное явное подтверждение пользователя на MR review (`MR Review Approved: yes`).
|
|
136
|
-
13. Каждый коммит связан с issue
|
|
134
|
+
13. Каждый коммит связан с issue (`#issue` в commit message).
|
|
137
135
|
|
|
138
136
|
Если хотя бы один пункт не выполнен, задача не принимается.
|
|
139
137
|
|
|
@@ -143,14 +141,14 @@ npm run self:bootstrap
|
|
|
143
141
|
```bash
|
|
144
142
|
npm run meta:verify
|
|
145
143
|
npm run meta:branch
|
|
146
|
-
npm run meta:task-start -- --task
|
|
144
|
+
npm run meta:task-start -- --task #12 --slug api-redirect
|
|
147
145
|
npm run meta:review
|
|
148
146
|
npm run meta:review-approve
|
|
149
147
|
npm run meta:mr-review
|
|
150
148
|
npm run meta:mr-review-approve
|
|
151
149
|
npm run meta:verify-link
|
|
152
|
-
npm run meta:ops -- --command SET_STATUS --payload '{"task":"
|
|
153
|
-
npm run meta:ops -- --command PREPARE_TASK_BRANCH --payload '{"task":"
|
|
150
|
+
npm run meta:ops -- --command SET_STATUS --payload '{"task":"#12","status":"IN_PROGRESS"}'
|
|
151
|
+
npm run meta:ops -- --command PREPARE_TASK_BRANCH --payload '{"task":"#12","slug":"api-redirect"}'
|
|
154
152
|
npm run meta:status
|
|
155
153
|
```
|
|
156
154
|
|
|
@@ -158,7 +156,7 @@ npm run meta:status
|
|
|
158
156
|
`meta:branch` валидирует ветку по Git Flow Lite (`main`, `develop`, `feature/*`, `release/*`, `hotfix/*`).
|
|
159
157
|
`meta:task-start` делает branch-routing preflight: сравнивает задачу с текущей веткой, показывает dirty/ahead блокеры и готовит маршрут (`stay_on_current_branch` или `create_new_branch`).
|
|
160
158
|
`meta:task-start` также делает context-protection check для `agents.md` между текущей и базовой веткой и требует явного подтверждения при diff.
|
|
161
|
-
Именование branch task ref:
|
|
159
|
+
Именование branch task ref: использовать GitHub issue ref в формате `issue-<number>`.
|
|
162
160
|
`meta:mr-review` формирует сводный pre-merge отчёт по MR/PR, `meta:mr-review-approve` фиксирует финальный PASS после подтверждения пользователя.
|
|
163
161
|
`meta:status` отдаёт единый статус-срез: trackers used, current sprint, current task, current branch context, git uncommitted и summary.
|
|
164
162
|
В `github` режиме локальные `tasks/*` по умолчанию считаются cache/legacy и не являются источником истины.
|
package/agents.md
CHANGED
|
@@ -148,7 +148,7 @@ Name: <agent role>
|
|
|
148
148
|
- без подтверждения пользователя максимум допустимого статуса: `REVIEW`.
|
|
149
149
|
- `SET_STATUS -> READY` разрешён только после `RUN_REVIEW_GATE: PASS_CONFIRMED`.
|
|
150
150
|
- для задач реализации по умолчанию используется отдельная ветка `feature/*`; прямой рабочий поток на `develop`/`main` не допускается.
|
|
151
|
-
- сообщение коммита обязано содержать ссылку на задачу (
|
|
151
|
+
- сообщение коммита обязано содержать ссылку на задачу (`#issue-number`).
|
|
152
152
|
- `READY` означает: коммит сделан и отправлен (`push`) в `feature/*`, `release/*` или `hotfix/*` с открытым PR по правилам ветвления.
|
|
153
153
|
- `DONE` означает: изменения интегрированы в `main`; для `release/*` и `hotfix/*` подтверждён back-merge в `develop`.
|
|
154
154
|
- `PUBLISH` означает: релиз опубликован и доступен в последней версии пакета.
|
|
@@ -165,8 +165,8 @@ Name: <agent role>
|
|
|
165
165
|
## 10.2) Обязательная маршрутизация ветки для Agile Manager Agent
|
|
166
166
|
Перед началом реализации агент обязан:
|
|
167
167
|
1. Проверить веточный контекст через `meta:status`.
|
|
168
|
-
2. Запустить branch-routing preflight через `meta:task-start -- --task
|
|
169
|
-
3. В названии рабочей ветки использовать
|
|
168
|
+
2. Запустить branch-routing preflight через `meta:task-start -- --task <#issue> --slug <slug> --kind atomic|feature|release|hotfix`.
|
|
169
|
+
3. В названии рабочей ветки использовать GitHub issue ref в формате `issue-<number>` (например, `feature/issue-21-canonical-github-issue-id`).
|
|
170
170
|
4. Если задача относится к текущей feature-ветке (атомарная подзадача), продолжить в этой ветке только после подтверждения пользователя.
|
|
171
171
|
5. Если задача не относится к текущей ветке, проверить незакоммиченные изменения и непушенные коммиты.
|
|
172
172
|
6. Согласовать с пользователем способ обработки (`commit/stash/discard/push`).
|
|
@@ -199,7 +199,7 @@ Name: <agent role>
|
|
|
199
199
|
19. Для статуса `DONE` подтверждена интеграция в `main`; для `release/*` и `hotfix/*` подтверждён back-merge в `develop`.
|
|
200
200
|
20. Для статуса `PUBLISH` подтверждена публикация в последней версии.
|
|
201
201
|
21. Для релиза обновлён публичный `CHANGELOG.md`.
|
|
202
|
-
22. Коммит содержит ссылку на issue
|
|
202
|
+
22. Коммит содержит ссылку на issue (`#issue`).
|
|
203
203
|
23. Для branch routing собран e2e evidence по двум сценариям: `same feature` и `different feature`.
|
|
204
204
|
24. Перед `--apply` подтверждена консистентность контекста `agents.md` (или явно подтверждён осознанный switch при diff).
|
|
205
205
|
|
package/package.json
CHANGED
package/src/cli.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
1
2
|
import path from "node:path";
|
|
2
3
|
import process from "node:process";
|
|
3
4
|
import readline from "node:readline/promises";
|
|
@@ -8,6 +9,25 @@ import { syncTemplate } from "./sync.mjs";
|
|
|
8
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
9
10
|
const __dirname = path.dirname(__filename);
|
|
10
11
|
const templateRoot = path.resolve(__dirname, "..", "template");
|
|
12
|
+
const packageManifestPath = path.resolve(__dirname, "..", "package.json");
|
|
13
|
+
|
|
14
|
+
function readSelfPackageIdentity() {
|
|
15
|
+
try {
|
|
16
|
+
const raw = fs.readFileSync(packageManifestPath, "utf8");
|
|
17
|
+
const parsed = JSON.parse(raw);
|
|
18
|
+
return {
|
|
19
|
+
name: String(parsed.name || "@k0t0vich/meta-agents-template"),
|
|
20
|
+
version: String(parsed.version || ""),
|
|
21
|
+
};
|
|
22
|
+
} catch {
|
|
23
|
+
return {
|
|
24
|
+
name: "@k0t0vich/meta-agents-template",
|
|
25
|
+
version: "",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const selfPackage = readSelfPackageIdentity();
|
|
11
31
|
|
|
12
32
|
function parseOptions(args) {
|
|
13
33
|
const options = {
|
|
@@ -60,13 +80,14 @@ function printHelp() {
|
|
|
60
80
|
" meta-agents --help",
|
|
61
81
|
"",
|
|
62
82
|
"Commands:",
|
|
63
|
-
" init Initialize a project
|
|
83
|
+
" init Initialize a project (config-only in root, npm-linked rules)",
|
|
64
84
|
" sync Update managed template files in an existing project",
|
|
65
85
|
" upgrade Alias for sync",
|
|
66
86
|
"",
|
|
67
87
|
"Init dialog:",
|
|
68
88
|
" By default, 'init' asks about Git mode and tracker provider.",
|
|
69
89
|
" Use --yes to skip dialog and use defaults/flags.",
|
|
90
|
+
" --force overwrites existing .meta-agents/config files and updates legacy meta:* scripts.",
|
|
70
91
|
];
|
|
71
92
|
console.log(lines.join("\n"));
|
|
72
93
|
}
|
|
@@ -233,11 +254,38 @@ export async function main(argv) {
|
|
|
233
254
|
tracker,
|
|
234
255
|
force: options.force,
|
|
235
256
|
gitSetup,
|
|
257
|
+
packageName: selfPackage.name,
|
|
258
|
+
packageVersion: selfPackage.version,
|
|
236
259
|
});
|
|
237
260
|
|
|
238
261
|
console.log(`Initialized meta-agents project at: ${result.targetDir}`);
|
|
239
262
|
console.log(`Default tracker: ${tracker}`);
|
|
240
263
|
console.log(`Git mode: ${result.git.mode}`);
|
|
264
|
+
if (result.packageJson.created) {
|
|
265
|
+
console.log("Package manifest: created package.json");
|
|
266
|
+
}
|
|
267
|
+
if (result.packageJson.dependencyAdded) {
|
|
268
|
+
console.log(`Package dependency: added ${selfPackage.name} to devDependencies`);
|
|
269
|
+
}
|
|
270
|
+
if (result.packageJson.updatedScripts.length > 0) {
|
|
271
|
+
console.log(`Meta scripts updated: ${result.packageJson.updatedScripts.join(", ")}`);
|
|
272
|
+
}
|
|
273
|
+
if (result.runtimePackage.installedNow) {
|
|
274
|
+
console.log(`Runtime package installed: ${selfPackage.name}`);
|
|
275
|
+
}
|
|
276
|
+
if (result.config.updated.length > 0) {
|
|
277
|
+
console.log(`Config files written: ${result.config.updated.join(", ")}`);
|
|
278
|
+
}
|
|
279
|
+
if (result.config.skipped.length > 0) {
|
|
280
|
+
console.log(`Config files kept: ${result.config.skipped.join(", ")}`);
|
|
281
|
+
}
|
|
282
|
+
if (result.agents.created) {
|
|
283
|
+
console.log("agents.md: created with npm links to template rules");
|
|
284
|
+
} else if (result.agents.updated) {
|
|
285
|
+
console.log("agents.md: appended/updated npm links block");
|
|
286
|
+
} else {
|
|
287
|
+
console.log("agents.md: npm links block already up to date");
|
|
288
|
+
}
|
|
241
289
|
if (result.git.actions.length > 0) {
|
|
242
290
|
console.log(`Git actions: ${result.git.actions.join("; ")}`);
|
|
243
291
|
}
|
package/src/init.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import fs from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import process from "node:process";
|
|
4
5
|
|
|
5
6
|
const TEXT_EXTENSIONS = new Set([
|
|
6
7
|
".md",
|
|
@@ -12,10 +13,25 @@ const TEXT_EXTENSIONS = new Set([
|
|
|
12
13
|
".js",
|
|
13
14
|
]);
|
|
14
15
|
|
|
16
|
+
const AGENTS_LINK_BLOCK_START = "<!-- meta-agents-template:links:start -->";
|
|
17
|
+
const AGENTS_LINK_BLOCK_END = "<!-- meta-agents-template:links:end -->";
|
|
18
|
+
|
|
15
19
|
function resolveTargetDir(cwd, target) {
|
|
16
20
|
return path.resolve(cwd, target);
|
|
17
21
|
}
|
|
18
22
|
|
|
23
|
+
function escapeRegExp(value) {
|
|
24
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function replaceTemplatePlaceholders(input, values) {
|
|
28
|
+
let output = input;
|
|
29
|
+
for (const [key, value] of Object.entries(values)) {
|
|
30
|
+
output = output.replaceAll(`__${key}__`, value);
|
|
31
|
+
}
|
|
32
|
+
return output;
|
|
33
|
+
}
|
|
34
|
+
|
|
19
35
|
async function runCommand(command, args, cwd, allowFailure = false) {
|
|
20
36
|
return new Promise((resolve, reject) => {
|
|
21
37
|
const child = spawn(command, args, { cwd, stdio: ["ignore", "pipe", "pipe"] });
|
|
@@ -51,6 +67,15 @@ async function runCommand(command, args, cwd, allowFailure = false) {
|
|
|
51
67
|
});
|
|
52
68
|
}
|
|
53
69
|
|
|
70
|
+
async function pathExists(filePath) {
|
|
71
|
+
try {
|
|
72
|
+
await fs.access(filePath);
|
|
73
|
+
return true;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
54
79
|
async function directoryExists(dir) {
|
|
55
80
|
try {
|
|
56
81
|
const stat = await fs.stat(dir);
|
|
@@ -60,11 +85,6 @@ async function directoryExists(dir) {
|
|
|
60
85
|
}
|
|
61
86
|
}
|
|
62
87
|
|
|
63
|
-
async function isDirectoryEmpty(dir) {
|
|
64
|
-
const entries = await fs.readdir(dir);
|
|
65
|
-
return entries.length === 0;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
88
|
async function walkFiles(dir, list = []) {
|
|
69
89
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
70
90
|
for (const entry of entries) {
|
|
@@ -82,25 +102,198 @@ function shouldReplacePlaceholders(filePath) {
|
|
|
82
102
|
return TEXT_EXTENSIONS.has(path.extname(filePath));
|
|
83
103
|
}
|
|
84
104
|
|
|
85
|
-
|
|
86
|
-
const
|
|
105
|
+
function buildMetaScripts(packageName) {
|
|
106
|
+
const base = `node ./node_modules/${packageName}/template/.meta-agents/scripts`;
|
|
107
|
+
return {
|
|
108
|
+
"meta:status": `${base}/sync-status.mjs`,
|
|
109
|
+
"meta:branch": `${base}/verify-branch-strategy.mjs`,
|
|
110
|
+
"meta:task-start": `${base}/task-branch-router.mjs`,
|
|
111
|
+
"meta:verify": `${base}/verify-governance.mjs`,
|
|
112
|
+
"meta:review": `${base}/run-review-gate.mjs`,
|
|
113
|
+
"meta:review-approve": `${base}/run-review-gate.mjs --approve yes`,
|
|
114
|
+
"meta:mr-review": `${base}/run-mr-review-gate.mjs`,
|
|
115
|
+
"meta:mr-review-approve": `${base}/run-mr-review-gate.mjs --approve yes`,
|
|
116
|
+
"meta:verify-link": `${base}/verify-commit-link.mjs`,
|
|
117
|
+
"meta:ops": `${base}/tracker-gateway.mjs`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function isLegacyMetaScript(value) {
|
|
122
|
+
return (
|
|
123
|
+
value.includes(".meta-agents/scripts/") ||
|
|
124
|
+
value.includes("meta-agents-template/template/.meta-agents/scripts/")
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function defaultPackageNameFromDir(targetDir) {
|
|
129
|
+
const raw = path.basename(targetDir).toLowerCase();
|
|
130
|
+
const sanitized = raw.replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
131
|
+
return sanitized || "meta-agents-project";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function ensurePackageJson(targetDir) {
|
|
135
|
+
const packageJsonPath = path.join(targetDir, "package.json");
|
|
136
|
+
if (await pathExists(packageJsonPath)) {
|
|
137
|
+
const input = await fs.readFile(packageJsonPath, "utf8");
|
|
138
|
+
try {
|
|
139
|
+
return {
|
|
140
|
+
path: packageJsonPath,
|
|
141
|
+
data: JSON.parse(input),
|
|
142
|
+
created: false,
|
|
143
|
+
};
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new Error(`invalid package.json at ${packageJsonPath}: ${error.message}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const data = {
|
|
150
|
+
name: defaultPackageNameFromDir(targetDir),
|
|
151
|
+
version: "0.1.0",
|
|
152
|
+
private: true,
|
|
153
|
+
scripts: {},
|
|
154
|
+
devDependencies: {},
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
path: packageJsonPath,
|
|
158
|
+
data,
|
|
159
|
+
created: true,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
async function mergePackageJsonMeta({
|
|
164
|
+
targetDir,
|
|
165
|
+
packageName,
|
|
166
|
+
packageVersion,
|
|
167
|
+
force,
|
|
168
|
+
}) {
|
|
169
|
+
const packageJson = await ensurePackageJson(targetDir);
|
|
170
|
+
const data = packageJson.data || {};
|
|
171
|
+
data.scripts = data.scripts && typeof data.scripts === "object" ? data.scripts : {};
|
|
172
|
+
data.devDependencies =
|
|
173
|
+
data.devDependencies && typeof data.devDependencies === "object" ? data.devDependencies : {};
|
|
174
|
+
|
|
175
|
+
const desiredScripts = buildMetaScripts(packageName);
|
|
176
|
+
const updatedScripts = [];
|
|
177
|
+
const skippedScripts = [];
|
|
87
178
|
|
|
88
|
-
for (const
|
|
89
|
-
|
|
179
|
+
for (const [key, value] of Object.entries(desiredScripts)) {
|
|
180
|
+
const current = data.scripts[key];
|
|
181
|
+
if (!current) {
|
|
182
|
+
data.scripts[key] = value;
|
|
183
|
+
updatedScripts.push(key);
|
|
90
184
|
continue;
|
|
91
185
|
}
|
|
92
186
|
|
|
93
|
-
|
|
94
|
-
|
|
187
|
+
if (current !== value && (force || isLegacyMetaScript(current))) {
|
|
188
|
+
data.scripts[key] = value;
|
|
189
|
+
updatedScripts.push(key);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
skippedScripts.push(key);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
let dependencyAdded = false;
|
|
197
|
+
if (!data.devDependencies[packageName]) {
|
|
198
|
+
const spec = packageVersion ? `^${packageVersion}` : "latest";
|
|
199
|
+
data.devDependencies[packageName] = spec;
|
|
200
|
+
dependencyAdded = true;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (packageJson.created || updatedScripts.length > 0 || dependencyAdded) {
|
|
204
|
+
await fs.writeFile(packageJson.path, `${JSON.stringify(data, null, 2)}\n`, "utf8");
|
|
205
|
+
}
|
|
95
206
|
|
|
96
|
-
|
|
97
|
-
|
|
207
|
+
return {
|
|
208
|
+
created: packageJson.created,
|
|
209
|
+
updatedScripts,
|
|
210
|
+
skippedScripts,
|
|
211
|
+
dependencyAdded,
|
|
212
|
+
packageJsonPath: packageJson.path,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function buildAgentsLinkBlock(packageName) {
|
|
217
|
+
const packageRoot = `./node_modules/${packageName}`;
|
|
218
|
+
const lines = [
|
|
219
|
+
AGENTS_LINK_BLOCK_START,
|
|
220
|
+
"## Meta Agents Template (npm-linked)",
|
|
221
|
+
"Базовые правила шаблона:",
|
|
222
|
+
`- [Template agents.md](${packageRoot}/agents.md)`,
|
|
223
|
+
`- [Template tracker-command-template.md](${packageRoot}/tracker-command-template.md)`,
|
|
224
|
+
"Локальные конфиги проекта:",
|
|
225
|
+
"- [.meta-agents/config/project-context.yaml](./.meta-agents/config/project-context.yaml)",
|
|
226
|
+
"- [.meta-agents/config/trackers.yaml](./.meta-agents/config/trackers.yaml)",
|
|
227
|
+
"- [.meta-agents/config/system.yaml](./.meta-agents/config/system.yaml)",
|
|
228
|
+
AGENTS_LINK_BLOCK_END,
|
|
229
|
+
];
|
|
230
|
+
return `${lines.join("\n")}\n`;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async function upsertAgentsLinks(targetDir, packageName) {
|
|
234
|
+
const agentsPath = path.join(targetDir, "agents.md");
|
|
235
|
+
const block = buildAgentsLinkBlock(packageName);
|
|
236
|
+
|
|
237
|
+
if (!(await pathExists(agentsPath))) {
|
|
238
|
+
const content = ["# agents.md", "", block].join("\n");
|
|
239
|
+
await fs.writeFile(agentsPath, content, "utf8");
|
|
240
|
+
return { created: true, updated: false, path: agentsPath };
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
const input = await fs.readFile(agentsPath, "utf8");
|
|
244
|
+
const blockRegex = new RegExp(
|
|
245
|
+
`${escapeRegExp(AGENTS_LINK_BLOCK_START)}[\\s\\S]*?${escapeRegExp(AGENTS_LINK_BLOCK_END)}\\n?`,
|
|
246
|
+
"m",
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
let output = input;
|
|
250
|
+
let updated = false;
|
|
251
|
+
|
|
252
|
+
if (blockRegex.test(input)) {
|
|
253
|
+
output = input.replace(blockRegex, block);
|
|
254
|
+
updated = output !== input;
|
|
255
|
+
} else {
|
|
256
|
+
const glue = input.endsWith("\n") ? "\n" : "\n\n";
|
|
257
|
+
output = `${input}${glue}${block}`;
|
|
258
|
+
updated = true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (updated) {
|
|
262
|
+
await fs.writeFile(agentsPath, output, "utf8");
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return { created: false, updated, path: agentsPath };
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function syncConfigFiles({ templateRoot, targetDir, values, force }) {
|
|
269
|
+
const sourceConfigRoot = path.join(templateRoot, ".meta-agents", "config");
|
|
270
|
+
const targetConfigRoot = path.join(targetDir, ".meta-agents", "config");
|
|
271
|
+
const sourceFiles = await walkFiles(sourceConfigRoot);
|
|
272
|
+
|
|
273
|
+
const updated = [];
|
|
274
|
+
const skipped = [];
|
|
275
|
+
|
|
276
|
+
for (const sourceFile of sourceFiles) {
|
|
277
|
+
const relative = path.relative(sourceConfigRoot, sourceFile);
|
|
278
|
+
const destination = path.join(targetConfigRoot, relative);
|
|
279
|
+
|
|
280
|
+
if (!force && (await pathExists(destination))) {
|
|
281
|
+
skipped.push(path.join(".meta-agents", "config", relative));
|
|
282
|
+
continue;
|
|
98
283
|
}
|
|
99
284
|
|
|
100
|
-
|
|
101
|
-
|
|
285
|
+
await fs.mkdir(path.dirname(destination), { recursive: true });
|
|
286
|
+
if (shouldReplacePlaceholders(sourceFile)) {
|
|
287
|
+
const raw = await fs.readFile(sourceFile, "utf8");
|
|
288
|
+
const rendered = replaceTemplatePlaceholders(raw, values);
|
|
289
|
+
await fs.writeFile(destination, rendered, "utf8");
|
|
290
|
+
} else {
|
|
291
|
+
await fs.copyFile(sourceFile, destination);
|
|
102
292
|
}
|
|
293
|
+
updated.push(path.join(".meta-agents", "config", relative));
|
|
103
294
|
}
|
|
295
|
+
|
|
296
|
+
return { updated, skipped };
|
|
104
297
|
}
|
|
105
298
|
|
|
106
299
|
async function setupGit(targetDir, gitSetup) {
|
|
@@ -167,31 +360,70 @@ async function setupGit(targetDir, gitSetup) {
|
|
|
167
360
|
return { mode: setup.mode, actions, warnings };
|
|
168
361
|
}
|
|
169
362
|
|
|
170
|
-
|
|
363
|
+
function packageDirFromName(targetDir, packageName) {
|
|
364
|
+
return path.join(targetDir, "node_modules", ...packageName.split("/"));
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
async function ensureRuntimePackageInstalled({ targetDir, packageName, packageVersion }) {
|
|
368
|
+
const installDir = packageDirFromName(targetDir, packageName);
|
|
369
|
+
if (await directoryExists(installDir)) {
|
|
370
|
+
return { installedNow: false, installDir };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const spec = packageVersion ? `${packageName}@${packageVersion}` : packageName;
|
|
374
|
+
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
375
|
+
await runCommand(npmCommand, ["install", "-D", spec], targetDir);
|
|
376
|
+
return { installedNow: true, installDir };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export async function initProject({
|
|
380
|
+
cwd,
|
|
381
|
+
templateRoot,
|
|
382
|
+
target,
|
|
383
|
+
tracker,
|
|
384
|
+
force,
|
|
385
|
+
gitSetup,
|
|
386
|
+
packageName = "@k0t0vich/meta-agents-template",
|
|
387
|
+
packageVersion = "",
|
|
388
|
+
}) {
|
|
171
389
|
const targetDir = resolveTargetDir(cwd, target);
|
|
172
390
|
const exists = await directoryExists(targetDir);
|
|
173
|
-
|
|
174
|
-
if (exists) {
|
|
175
|
-
const empty = await isDirectoryEmpty(targetDir);
|
|
176
|
-
if (!empty && !force) {
|
|
177
|
-
throw new Error(`target directory is not empty: ${targetDir}. Use --force to overwrite.`);
|
|
178
|
-
}
|
|
179
|
-
} else {
|
|
391
|
+
if (!exists) {
|
|
180
392
|
await fs.mkdir(targetDir, { recursive: true });
|
|
181
393
|
}
|
|
182
394
|
|
|
183
|
-
await
|
|
184
|
-
|
|
395
|
+
const packageJson = await mergePackageJsonMeta({
|
|
396
|
+
targetDir,
|
|
397
|
+
packageName,
|
|
398
|
+
packageVersion,
|
|
185
399
|
force,
|
|
186
|
-
|
|
400
|
+
});
|
|
401
|
+
const runtimePackage = await ensureRuntimePackageInstalled({
|
|
402
|
+
targetDir,
|
|
403
|
+
packageName,
|
|
404
|
+
packageVersion,
|
|
187
405
|
});
|
|
188
406
|
|
|
189
407
|
const projectName = path.basename(targetDir);
|
|
190
|
-
await
|
|
191
|
-
|
|
192
|
-
|
|
408
|
+
const config = await syncConfigFiles({
|
|
409
|
+
templateRoot,
|
|
410
|
+
targetDir,
|
|
411
|
+
values: {
|
|
412
|
+
PROJECT_NAME: projectName,
|
|
413
|
+
DEFAULT_TRACKER: tracker,
|
|
414
|
+
},
|
|
415
|
+
force,
|
|
193
416
|
});
|
|
194
417
|
|
|
418
|
+
const agents = await upsertAgentsLinks(targetDir, packageName);
|
|
195
419
|
const git = await setupGit(targetDir, gitSetup);
|
|
196
|
-
|
|
420
|
+
|
|
421
|
+
return {
|
|
422
|
+
targetDir,
|
|
423
|
+
git,
|
|
424
|
+
packageJson,
|
|
425
|
+
runtimePackage,
|
|
426
|
+
config,
|
|
427
|
+
agents,
|
|
428
|
+
};
|
|
197
429
|
}
|
|
@@ -87,12 +87,8 @@ system:
|
|
|
87
87
|
release: "release/vX.Y.Z"
|
|
88
88
|
hotfix: "hotfix/<task-ref>-<slug>"
|
|
89
89
|
task_ref_policy:
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
- "REL-<n>"
|
|
93
|
-
- "DOC-<n>"
|
|
94
|
-
- "DEV-<n>"
|
|
95
|
-
issue_fallback_format: "issue-<number>"
|
|
90
|
+
canonical_format: "#<number>"
|
|
91
|
+
branch_format: "issue-<number>"
|
|
96
92
|
allowed_branch_patterns:
|
|
97
93
|
- "^main$"
|
|
98
94
|
- "^develop$"
|
|
@@ -212,7 +208,6 @@ system:
|
|
|
212
208
|
commit_linkage:
|
|
213
209
|
required: true
|
|
214
210
|
accepted_patterns:
|
|
215
|
-
- "TASK-ID"
|
|
216
211
|
- "#issue"
|
|
217
212
|
publish_flow:
|
|
218
213
|
changelog_required: true
|
|
@@ -7,7 +7,7 @@ Rule: для большой фичи в GitHub tracker сначала предл
|
|
|
7
7
|
|
|
8
8
|
Branch routing protocol (обязателен для задач реализации):
|
|
9
9
|
1. Сначала снять контекст: `npm run meta:status -- --json`.
|
|
10
|
-
2. Проверить маршрут ветки: `npm run meta:task-start -- --task
|
|
10
|
+
2. Проверить маршрут ветки: `npm run meta:task-start -- --task <#issue> --slug <slug> --kind atomic`.
|
|
11
11
|
3. Если `route=stay_on_current_branch`, задача считается атомарной внутри текущей feature-ветки.
|
|
12
12
|
4. Если `route=create_new_branch`, перед началом реализации обязательно перейти на базовую ветку (`develop` для feature/release, `main` для hotfix), обновить её и создать новую рабочую ветку.
|
|
13
13
|
5. Создание/переключение ветки выполнять только после явного подтверждения пользователя (`--apply`).
|
|
@@ -19,8 +19,8 @@ Mandatory user dialogue before branch switch:
|
|
|
19
19
|
- подтвердить финальный switch/create.
|
|
20
20
|
|
|
21
21
|
Task ref naming rule:
|
|
22
|
-
-
|
|
23
|
-
-
|
|
22
|
+
- использовать GitHub issue ref как единственный канонический идентификатор (`#<number>`);
|
|
23
|
+
- в имени ветки использовать формат `issue-<number>`.
|
|
24
24
|
|
|
25
25
|
Pre-merge rule:
|
|
26
26
|
- после commit+push и открытия PR обязательно выполнить `RUN_MR_REVIEW_GATE`;
|
|
@@ -21,7 +21,7 @@ Output format (обязательный):
|
|
|
21
21
|
Tooling:
|
|
22
22
|
- Основной путь: `npm run meta:status`.
|
|
23
23
|
- Для machine-readable вывода можно использовать `npm run meta:status -- --json`.
|
|
24
|
-
- Для веточного preflight по конкретной задаче: `npm run meta:task-start -- --task
|
|
24
|
+
- Для веточного preflight по конкретной задаче: `npm run meta:task-start -- --task <#issue> --slug <slug>`.
|
|
25
25
|
|
|
26
26
|
Rule:
|
|
27
27
|
- В `github` режиме локальные `tasks/*` не считать авторитетным источником по умолчанию; рассматривать только как cache/legacy artifacts.
|
|
@@ -390,9 +390,9 @@ function buildPlan(options, gitContext) {
|
|
|
390
390
|
);
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
-
if (
|
|
393
|
+
if (!/^ISSUE-\d+$/.test(taskRef)) {
|
|
394
394
|
namingWarnings.push(
|
|
395
|
-
"
|
|
395
|
+
"Canonical task ref should be GitHub issue number (#<number>) so branch naming stays issue-<number>.",
|
|
396
396
|
);
|
|
397
397
|
}
|
|
398
398
|
|
|
@@ -8,8 +8,7 @@ function readLastCommitSubject(ref = "HEAD") {
|
|
|
8
8
|
|
|
9
9
|
function validateMessage(message) {
|
|
10
10
|
const hasIssueNumber = /#\d+\b/.test(message);
|
|
11
|
-
|
|
12
|
-
return hasIssueNumber || hasTaskId;
|
|
11
|
+
return hasIssueNumber;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
function parseArgs(argv) {
|
|
@@ -49,7 +48,7 @@ function main() {
|
|
|
49
48
|
}
|
|
50
49
|
|
|
51
50
|
if (!validateMessage(message)) {
|
|
52
|
-
console.error("Commit link FAIL: message must contain
|
|
51
|
+
console.error("Commit link FAIL: message must contain #issue.");
|
|
53
52
|
console.error(`Message: ${message}`);
|
|
54
53
|
process.exit(1);
|
|
55
54
|
}
|
package/template/README.md
CHANGED
|
@@ -50,14 +50,14 @@
|
|
|
50
50
|
```bash
|
|
51
51
|
npm run meta:verify
|
|
52
52
|
npm run meta:branch
|
|
53
|
-
npm run meta:task-start -- --task
|
|
53
|
+
npm run meta:task-start -- --task #12 --slug api-redirect
|
|
54
54
|
npm run meta:review
|
|
55
55
|
npm run meta:review-approve
|
|
56
56
|
npm run meta:mr-review
|
|
57
57
|
npm run meta:mr-review-approve
|
|
58
58
|
npm run meta:verify-link
|
|
59
|
-
npm run meta:ops -- --command SET_STATUS --payload '{"task":"
|
|
60
|
-
npm run meta:ops -- --command PREPARE_TASK_BRANCH --payload '{"task":"
|
|
59
|
+
npm run meta:ops -- --command SET_STATUS --payload '{"task":"#12","status":"IN_PROGRESS"}'
|
|
60
|
+
npm run meta:ops -- --command PREPARE_TASK_BRANCH --payload '{"task":"#12","slug":"api-redirect"}'
|
|
61
61
|
npm run meta:status
|
|
62
62
|
```
|
|
63
63
|
|
|
@@ -66,7 +66,7 @@ npm run meta:status
|
|
|
66
66
|
`meta:branch` валидирует ветку по Git Flow Lite (`main`, `develop`, `feature/*`, `release/*`, `hotfix/*`).
|
|
67
67
|
`meta:task-start` делает branch-routing preflight: сравнивает задачу с текущей веткой, показывает dirty/ahead блокеры и готовит маршрут (`stay_on_current_branch` или `create_new_branch`).
|
|
68
68
|
`meta:task-start` также делает context-protection check для `agents.md` между текущей и базовой веткой и требует явного подтверждения при diff.
|
|
69
|
-
Именование branch task ref:
|
|
69
|
+
Именование branch task ref: использовать GitHub issue ref в формате `issue-<number>`.
|
|
70
70
|
`meta:mr-review` формирует сводный pre-merge отчёт по MR/PR, `meta:mr-review-approve` фиксирует финальный PASS после подтверждения пользователя.
|
|
71
71
|
|
|
72
72
|
`meta:status` выдаёт сводный статус:
|
package/template/agents.md
CHANGED
|
@@ -148,7 +148,7 @@ Name: <agent role>
|
|
|
148
148
|
- без подтверждения пользователя максимум допустимого статуса: `REVIEW`.
|
|
149
149
|
- `SET_STATUS -> READY` разрешён только после `RUN_REVIEW_GATE: PASS_CONFIRMED`.
|
|
150
150
|
- для задач реализации по умолчанию используется отдельная ветка `feature/*`; прямой рабочий поток на `develop`/`main` не допускается.
|
|
151
|
-
- сообщение коммита обязано содержать ссылку на задачу (
|
|
151
|
+
- сообщение коммита обязано содержать ссылку на задачу (`#issue-number`).
|
|
152
152
|
- `READY` означает: коммит сделан и отправлен (`push`) в `feature/*`, `release/*` или `hotfix/*` с открытым PR по правилам ветвления.
|
|
153
153
|
- `DONE` означает: изменения интегрированы в `main`; для `release/*` и `hotfix/*` подтверждён back-merge в `develop`.
|
|
154
154
|
- `PUBLISH` означает: релиз опубликован и доступен в последней версии пакета.
|
|
@@ -165,8 +165,8 @@ Name: <agent role>
|
|
|
165
165
|
## 10.2) Обязательная маршрутизация ветки для Agile Manager Agent
|
|
166
166
|
Перед началом реализации агент обязан:
|
|
167
167
|
1. Проверить веточный контекст через `meta:status`.
|
|
168
|
-
2. Запустить branch-routing preflight через `meta:task-start -- --task
|
|
169
|
-
3. В названии рабочей ветки использовать
|
|
168
|
+
2. Запустить branch-routing preflight через `meta:task-start -- --task <#issue> --slug <slug> --kind atomic|feature|release|hotfix`.
|
|
169
|
+
3. В названии рабочей ветки использовать GitHub issue ref в формате `issue-<number>` (например, `feature/issue-21-canonical-github-issue-id`).
|
|
170
170
|
4. Если задача относится к текущей feature-ветке (атомарная подзадача), продолжить в этой ветке только после подтверждения пользователя.
|
|
171
171
|
5. Если задача не относится к текущей ветке, проверить незакоммиченные изменения и непушенные коммиты.
|
|
172
172
|
6. Согласовать с пользователем способ обработки (`commit/stash/discard/push`).
|
|
@@ -199,7 +199,7 @@ Name: <agent role>
|
|
|
199
199
|
19. Для статуса `DONE` подтверждена интеграция в `main`; для `release/*` и `hotfix/*` подтверждён back-merge в `develop`.
|
|
200
200
|
20. Для статуса `PUBLISH` подтверждена публикация в последней версии.
|
|
201
201
|
21. Для релиза обновлён публичный `CHANGELOG.md`.
|
|
202
|
-
22. Коммит содержит ссылку на issue
|
|
202
|
+
22. Коммит содержит ссылку на issue (`#issue`).
|
|
203
203
|
23. Для branch routing собран e2e evidence по двум сценариям: `same feature` и `different feature`.
|
|
204
204
|
24. Перед `--apply` подтверждена консистентность контекста `agents.md` (или явно подтверждён осознанный switch при diff).
|
|
205
205
|
|
|
@@ -26,7 +26,7 @@ Reason: Обязательная проверка соблюдения PRD и к
|
|
|
26
26
|
Name: Governance Watchdog Agent
|
|
27
27
|
|
|
28
28
|
Governance Watchdog Agent: verify governance gate,
|
|
29
|
-
task
|
|
29
|
+
task <#issue>,
|
|
30
30
|
required checks "prd_sections_complete, acceptance_defined, user_confirmation_policy_respected",
|
|
31
31
|
result PASS
|
|
32
32
|
```
|
|
@@ -64,11 +64,11 @@ result PASS
|
|
|
64
64
|
- merge разрешён только после `RUN_MR_REVIEW_GATE: PASS_CONFIRMED`;
|
|
65
65
|
- для задач реализации по умолчанию используется отдельная ветка `feature/*`; прямой поток на `develop`/`main` запрещён;
|
|
66
66
|
- перед началом реализации обязателен `PREPARE_TASK_BRANCH` (веточный preflight и user dialogue);
|
|
67
|
-
- branch naming policy: использовать
|
|
67
|
+
- branch naming policy: использовать только GitHub issue ref в формате `issue-<number>`;
|
|
68
68
|
- если задача атомарная и относится к текущей feature-ветке, допускается выполнение в текущей ветке после явного подтверждения пользователя;
|
|
69
69
|
- если задача не относится к текущей ветке, требуется: проверить dirty/ahead, согласовать действие с пользователем, перейти на `develop` (или `main` для hotfix), обновить и создать новую ветку;
|
|
70
70
|
- перед `--apply` обязателен контекстный check: сравнить `agents.md` текущей и базовой ветки, при diff запросить явное подтверждение пользователя;
|
|
71
|
-
- сообщение коммита обязательно содержит
|
|
71
|
+
- сообщение коммита обязательно содержит `#issue-number`.
|
|
72
72
|
|
|
73
73
|
Для GitHub трекера статус issue задаётся label-ом (одновременно только один статус из набора):
|
|
74
74
|
- `TODO`
|
|
@@ -100,7 +100,7 @@ Reason: Нужна обязательная preflight-проверка проц
|
|
|
100
100
|
Name: Governance Watchdog Agent
|
|
101
101
|
|
|
102
102
|
Governance Watchdog Agent: verify governance gate,
|
|
103
|
-
task
|
|
103
|
+
task #12,
|
|
104
104
|
checklist "PRD(Описание+Проверяемость), hard criteria, user confirmation policy",
|
|
105
105
|
result PASS
|
|
106
106
|
```
|
|
@@ -115,7 +115,7 @@ Reason: Нужен обязательный pre-commit review.
|
|
|
115
115
|
Name: Reviewer/Judge Agent
|
|
116
116
|
|
|
117
117
|
Reviewer/Judge Agent: run review gate,
|
|
118
|
-
task
|
|
118
|
+
task #12,
|
|
119
119
|
checklist "what_done_summary, critical_findings, potential_risks, issue_link_presence",
|
|
120
120
|
result PASS_CANDIDATE,
|
|
121
121
|
report "posted to issue #12"
|
|
@@ -133,7 +133,7 @@ Reason: Подтверждение review пользователем получ
|
|
|
133
133
|
Name: Reviewer/Judge Agent
|
|
134
134
|
|
|
135
135
|
Reviewer/Judge Agent: run review gate,
|
|
136
|
-
task
|
|
136
|
+
task #12,
|
|
137
137
|
approve yes,
|
|
138
138
|
result PASS_CONFIRMED
|
|
139
139
|
```
|
|
@@ -168,7 +168,7 @@ Name: Agile Manager Agent
|
|
|
168
168
|
|
|
169
169
|
Agile Manager Agent: set status,
|
|
170
170
|
tracker __DEFAULT_TRACKER__,
|
|
171
|
-
task
|
|
171
|
+
task #12,
|
|
172
172
|
status IN_PROGRESS,
|
|
173
173
|
reason "начата реализация"
|
|
174
174
|
```
|
|
@@ -184,9 +184,9 @@ Name: Agile Manager Agent
|
|
|
184
184
|
|
|
185
185
|
Agile Manager Agent: prepare task branch,
|
|
186
186
|
tracker __DEFAULT_TRACKER__,
|
|
187
|
-
task "
|
|
187
|
+
task "#12",
|
|
188
188
|
task kind "atomic",
|
|
189
|
-
command "npm run meta:task-start -- --task
|
|
189
|
+
command "npm run meta:task-start -- --task #12 --slug api-redirect",
|
|
190
190
|
user dialogue "confirm branch context + dirty/ahead handling + agents.md context warning + switch decision"
|
|
191
191
|
```
|
|
192
192
|
|
|
@@ -201,7 +201,7 @@ Name: Agile Manager Agent
|
|
|
201
201
|
|
|
202
202
|
Agile Manager Agent: set status,
|
|
203
203
|
tracker __DEFAULT_TRACKER__,
|
|
204
|
-
task
|
|
204
|
+
task #12,
|
|
205
205
|
status REVIEW,
|
|
206
206
|
reason "готово к review gate"
|
|
207
207
|
```
|
|
@@ -257,9 +257,9 @@ Agile Manager Agent: commit by name,
|
|
|
257
257
|
tracker __DEFAULT_TRACKER__,
|
|
258
258
|
task "API редирект офферов",
|
|
259
259
|
issue 12,
|
|
260
|
-
commit message "
|
|
260
|
+
commit message "#12 | API редирект офферов",
|
|
261
261
|
push yes,
|
|
262
|
-
branch "feature/
|
|
262
|
+
branch "feature/issue-12-api-redirect",
|
|
263
263
|
open mr "optional",
|
|
264
264
|
target status READY,
|
|
265
265
|
what done "добавлен endpoint, тесты, обработка ошибок"
|
|
@@ -275,7 +275,7 @@ Reason: Нужен обязательный pre-merge review по MR/PR с пр
|
|
|
275
275
|
Name: MR Review Agent
|
|
276
276
|
|
|
277
277
|
MR Review Agent: run MR review gate,
|
|
278
|
-
task
|
|
278
|
+
task #12,
|
|
279
279
|
pr 34,
|
|
280
280
|
checklist "mr_context, task_linkage, prd_evidence, critical_findings, potential_risks",
|
|
281
281
|
result PASS_CANDIDATE
|
|
@@ -293,7 +293,7 @@ Reason: Подтверждение MR review пользователем полу
|
|
|
293
293
|
Name: MR Review Agent
|
|
294
294
|
|
|
295
295
|
MR Review Agent: run MR review gate,
|
|
296
|
-
task
|
|
296
|
+
task #12,
|
|
297
297
|
pr 34,
|
|
298
298
|
approve yes,
|
|
299
299
|
result PASS_CONFIRMED
|
|
@@ -310,7 +310,7 @@ Name: Agile Manager Agent
|
|
|
310
310
|
|
|
311
311
|
Agile Manager Agent: set status,
|
|
312
312
|
tracker __DEFAULT_TRACKER__,
|
|
313
|
-
task
|
|
313
|
+
task #12,
|
|
314
314
|
status PUBLISH,
|
|
315
315
|
reason "релиз опубликован в latest"
|
|
316
316
|
```
|
|
@@ -329,7 +329,7 @@ Close Task Approved: yes
|
|
|
329
329
|
|
|
330
330
|
Agile Manager Agent: set status,
|
|
331
331
|
tracker __DEFAULT_TRACKER__,
|
|
332
|
-
task
|
|
332
|
+
task #12,
|
|
333
333
|
status DONE,
|
|
334
334
|
reason "пользователь подтвердил закрытие"
|
|
335
335
|
```
|
|
@@ -345,7 +345,7 @@ Name: Agile Manager Agent
|
|
|
345
345
|
|
|
346
346
|
Agile Manager Agent: assign sprint,
|
|
347
347
|
tracker __DEFAULT_TRACKER__,
|
|
348
|
-
task
|
|
348
|
+
task #12,
|
|
349
349
|
sprint SPRINT-3
|
|
350
350
|
```
|
|
351
351
|
|
|
@@ -26,7 +26,7 @@ Reason: Обязательная проверка соблюдения PRD и к
|
|
|
26
26
|
Name: Governance Watchdog Agent
|
|
27
27
|
|
|
28
28
|
Governance Watchdog Agent: verify governance gate,
|
|
29
|
-
task
|
|
29
|
+
task <#issue>,
|
|
30
30
|
required checks "prd_sections_complete, acceptance_defined, user_confirmation_policy_respected",
|
|
31
31
|
result PASS
|
|
32
32
|
```
|
|
@@ -64,11 +64,11 @@ result PASS
|
|
|
64
64
|
- merge разрешён только после `RUN_MR_REVIEW_GATE: PASS_CONFIRMED`;
|
|
65
65
|
- для задач реализации по умолчанию используется отдельная ветка `feature/*`; прямой поток на `develop`/`main` запрещён;
|
|
66
66
|
- перед началом реализации обязателен `PREPARE_TASK_BRANCH` (веточный preflight и user dialogue);
|
|
67
|
-
- branch naming policy: использовать
|
|
67
|
+
- branch naming policy: использовать только GitHub issue ref в формате `issue-<number>`;
|
|
68
68
|
- если задача атомарная и относится к текущей feature-ветке, допускается выполнение в текущей ветке после явного подтверждения пользователя;
|
|
69
69
|
- если задача не относится к текущей ветке, требуется: проверить dirty/ahead, согласовать действие с пользователем, перейти на `develop` (или `main` для hotfix), обновить и создать новую ветку;
|
|
70
70
|
- перед `--apply` обязателен контекстный check: сравнить `agents.md` текущей и базовой ветки, при diff запросить явное подтверждение пользователя;
|
|
71
|
-
- сообщение коммита обязательно содержит
|
|
71
|
+
- сообщение коммита обязательно содержит `#issue-number`.
|
|
72
72
|
|
|
73
73
|
Для GitHub трекера статус issue задаётся label-ом (одновременно только один статус из набора):
|
|
74
74
|
- `TODO`
|
|
@@ -100,7 +100,7 @@ Reason: Нужна обязательная preflight-проверка проц
|
|
|
100
100
|
Name: Governance Watchdog Agent
|
|
101
101
|
|
|
102
102
|
Governance Watchdog Agent: verify governance gate,
|
|
103
|
-
task
|
|
103
|
+
task #12,
|
|
104
104
|
checklist "PRD(Описание+Проверяемость), hard criteria, user confirmation policy",
|
|
105
105
|
result PASS
|
|
106
106
|
```
|
|
@@ -115,7 +115,7 @@ Reason: Нужен обязательный pre-commit review.
|
|
|
115
115
|
Name: Reviewer/Judge Agent
|
|
116
116
|
|
|
117
117
|
Reviewer/Judge Agent: run review gate,
|
|
118
|
-
task
|
|
118
|
+
task #12,
|
|
119
119
|
checklist "what_done_summary, critical_findings, potential_risks, issue_link_presence",
|
|
120
120
|
result PASS_CANDIDATE,
|
|
121
121
|
report "posted to issue #12"
|
|
@@ -133,7 +133,7 @@ Reason: Подтверждение review пользователем получ
|
|
|
133
133
|
Name: Reviewer/Judge Agent
|
|
134
134
|
|
|
135
135
|
Reviewer/Judge Agent: run review gate,
|
|
136
|
-
task
|
|
136
|
+
task #12,
|
|
137
137
|
approve yes,
|
|
138
138
|
result PASS_CONFIRMED
|
|
139
139
|
```
|
|
@@ -168,7 +168,7 @@ Name: Agile Manager Agent
|
|
|
168
168
|
|
|
169
169
|
Agile Manager Agent: set status,
|
|
170
170
|
tracker github,
|
|
171
|
-
task
|
|
171
|
+
task #12,
|
|
172
172
|
status IN_PROGRESS,
|
|
173
173
|
reason "начата реализация"
|
|
174
174
|
```
|
|
@@ -184,9 +184,9 @@ Name: Agile Manager Agent
|
|
|
184
184
|
|
|
185
185
|
Agile Manager Agent: prepare task branch,
|
|
186
186
|
tracker github,
|
|
187
|
-
task "
|
|
187
|
+
task "#12",
|
|
188
188
|
task kind "atomic",
|
|
189
|
-
command "npm run meta:task-start -- --task
|
|
189
|
+
command "npm run meta:task-start -- --task #12 --slug api-redirect",
|
|
190
190
|
user dialogue "confirm branch context + dirty/ahead handling + agents.md context warning + switch decision"
|
|
191
191
|
```
|
|
192
192
|
|
|
@@ -201,7 +201,7 @@ Name: Agile Manager Agent
|
|
|
201
201
|
|
|
202
202
|
Agile Manager Agent: set status,
|
|
203
203
|
tracker github,
|
|
204
|
-
task
|
|
204
|
+
task #12,
|
|
205
205
|
status REVIEW,
|
|
206
206
|
reason "готово к review gate"
|
|
207
207
|
```
|
|
@@ -257,9 +257,9 @@ Agile Manager Agent: commit by name,
|
|
|
257
257
|
tracker github,
|
|
258
258
|
task "API редирект офферов",
|
|
259
259
|
issue 12,
|
|
260
|
-
commit message "
|
|
260
|
+
commit message "#12 | API редирект офферов",
|
|
261
261
|
push yes,
|
|
262
|
-
branch "feature/
|
|
262
|
+
branch "feature/issue-12-api-redirect",
|
|
263
263
|
open mr "optional",
|
|
264
264
|
target status READY,
|
|
265
265
|
what done "добавлен endpoint, тесты, обработка ошибок"
|
|
@@ -275,7 +275,7 @@ Reason: Нужен обязательный pre-merge review по MR/PR с пр
|
|
|
275
275
|
Name: MR Review Agent
|
|
276
276
|
|
|
277
277
|
MR Review Agent: run MR review gate,
|
|
278
|
-
task
|
|
278
|
+
task #12,
|
|
279
279
|
pr 34,
|
|
280
280
|
checklist "mr_context, task_linkage, prd_evidence, critical_findings, potential_risks",
|
|
281
281
|
result PASS_CANDIDATE
|
|
@@ -293,7 +293,7 @@ Reason: Подтверждение MR review пользователем полу
|
|
|
293
293
|
Name: MR Review Agent
|
|
294
294
|
|
|
295
295
|
MR Review Agent: run MR review gate,
|
|
296
|
-
task
|
|
296
|
+
task #12,
|
|
297
297
|
pr 34,
|
|
298
298
|
approve yes,
|
|
299
299
|
result PASS_CONFIRMED
|
|
@@ -310,7 +310,7 @@ Name: Agile Manager Agent
|
|
|
310
310
|
|
|
311
311
|
Agile Manager Agent: set status,
|
|
312
312
|
tracker github,
|
|
313
|
-
task
|
|
313
|
+
task #12,
|
|
314
314
|
status PUBLISH,
|
|
315
315
|
reason "релиз опубликован в latest"
|
|
316
316
|
```
|
|
@@ -329,7 +329,7 @@ Close Task Approved: yes
|
|
|
329
329
|
|
|
330
330
|
Agile Manager Agent: set status,
|
|
331
331
|
tracker github,
|
|
332
|
-
task
|
|
332
|
+
task #12,
|
|
333
333
|
status DONE,
|
|
334
334
|
reason "пользователь подтвердил закрытие"
|
|
335
335
|
```
|
|
@@ -345,7 +345,7 @@ Name: Agile Manager Agent
|
|
|
345
345
|
|
|
346
346
|
Agile Manager Agent: assign sprint,
|
|
347
347
|
tracker github,
|
|
348
|
-
task
|
|
348
|
+
task #12,
|
|
349
349
|
sprint SPRINT-3
|
|
350
350
|
```
|
|
351
351
|
|
|
@@ -362,7 +362,7 @@ Status Agent: status snapshot,
|
|
|
362
362
|
tracker github,
|
|
363
363
|
source policy "github/mcp/custom -> external tracker first, local -> tasks first",
|
|
364
364
|
include "trackers_used,current_sprint,current_task,current_branch_context,git_uncommitted,summary",
|
|
365
|
-
command "
|
|
365
|
+
command "npm run meta:status"
|
|
366
366
|
```
|
|
367
367
|
|
|
368
368
|
### PREPARE_RELEASE_NOTE
|