resolver-cow 0.2.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 (139) hide show
  1. package/README.md +71 -0
  2. package/assets/adapters/spec-box/instructions.md +44 -0
  3. package/assets/ci/Dockerfile +9 -0
  4. package/assets/ci/github-cow-run.yml +85 -0
  5. package/assets/ci/github-tests.yml +25 -0
  6. package/assets/project/architecture.md +29 -0
  7. package/assets/project/contracts.md +29 -0
  8. package/assets/project/conventions.md +29 -0
  9. package/assets/project/decisions.README.md +3 -0
  10. package/assets/project/glossary.md +13 -0
  11. package/assets/project/overview.md +29 -0
  12. package/assets/project/testing.md +33 -0
  13. package/assets/project/workflow.md +29 -0
  14. package/assets/roles/challenger.md +33 -0
  15. package/assets/roles/distiller.md +18 -0
  16. package/assets/roles/implementer.md +39 -0
  17. package/assets/roles/planner.md +57 -0
  18. package/assets/roles/researcher.md +40 -0
  19. package/assets/roles/reviewer.md +68 -0
  20. package/assets/roles/tester.md +36 -0
  21. package/assets/roles/verifier.md +56 -0
  22. package/assets/schema/cow-answer.schema.json +42 -0
  23. package/assets/schema/default.yaml +116 -0
  24. package/assets/templates/coverage.yaml +12 -0
  25. package/assets/templates/design.md +39 -0
  26. package/assets/templates/proposal.md +27 -0
  27. package/assets/templates/tasks.md +9 -0
  28. package/assets/templates/test-plan.md +7 -0
  29. package/bin/cow.js +5 -0
  30. package/dist/adapters/host/claude/index.js +94 -0
  31. package/dist/adapters/host/claude/index.js.map +1 -0
  32. package/dist/adapters/repo/git.js +81 -0
  33. package/dist/adapters/repo/git.js.map +1 -0
  34. package/dist/adapters/repo/github/index.js +136 -0
  35. package/dist/adapters/repo/github/index.js.map +1 -0
  36. package/dist/adapters/repo/index.js +4 -0
  37. package/dist/adapters/repo/index.js.map +1 -0
  38. package/dist/adapters/repo/local.js +47 -0
  39. package/dist/adapters/repo/local.js.map +1 -0
  40. package/dist/adapters/runner/claude.js +129 -0
  41. package/dist/adapters/runner/claude.js.map +1 -0
  42. package/dist/adapters/runner/codex.js +151 -0
  43. package/dist/adapters/runner/codex.js.map +1 -0
  44. package/dist/adapters/runner/index.js +4 -0
  45. package/dist/adapters/runner/index.js.map +1 -0
  46. package/dist/adapters/spec/index.js +3 -0
  47. package/dist/adapters/spec/index.js.map +1 -0
  48. package/dist/adapters/spec/spec-box/delta.js +198 -0
  49. package/dist/adapters/spec/spec-box/delta.js.map +1 -0
  50. package/dist/adapters/spec/spec-box/index.js +92 -0
  51. package/dist/adapters/spec/spec-box/index.js.map +1 -0
  52. package/dist/adapters/spec/spec-box/yaml.js +74 -0
  53. package/dist/adapters/spec/spec-box/yaml.js.map +1 -0
  54. package/dist/cli/commands/artifacts.js +86 -0
  55. package/dist/cli/commands/artifacts.js.map +1 -0
  56. package/dist/cli/commands/change.js +106 -0
  57. package/dist/cli/commands/change.js.map +1 -0
  58. package/dist/cli/commands/changeset.js +81 -0
  59. package/dist/cli/commands/changeset.js.map +1 -0
  60. package/dist/cli/commands/ci.js +45 -0
  61. package/dist/cli/commands/ci.js.map +1 -0
  62. package/dist/cli/commands/coverage.js +45 -0
  63. package/dist/cli/commands/coverage.js.map +1 -0
  64. package/dist/cli/commands/deliver.js +70 -0
  65. package/dist/cli/commands/deliver.js.map +1 -0
  66. package/dist/cli/commands/doctor.js +53 -0
  67. package/dist/cli/commands/doctor.js.map +1 -0
  68. package/dist/cli/commands/host.js +30 -0
  69. package/dist/cli/commands/host.js.map +1 -0
  70. package/dist/cli/commands/init.js +93 -0
  71. package/dist/cli/commands/init.js.map +1 -0
  72. package/dist/cli/commands/protocol.js +145 -0
  73. package/dist/cli/commands/protocol.js.map +1 -0
  74. package/dist/cli/commands/run.js +157 -0
  75. package/dist/cli/commands/run.js.map +1 -0
  76. package/dist/cli/commands/spec.js +84 -0
  77. package/dist/cli/commands/spec.js.map +1 -0
  78. package/dist/cli/context.js +18 -0
  79. package/dist/cli/context.js.map +1 -0
  80. package/dist/cli/main.js +57 -0
  81. package/dist/cli/main.js.map +1 -0
  82. package/dist/cli/output.js +31 -0
  83. package/dist/cli/output.js.map +1 -0
  84. package/dist/core/archive.js +39 -0
  85. package/dist/core/archive.js.map +1 -0
  86. package/dist/core/change.js +227 -0
  87. package/dist/core/change.js.map +1 -0
  88. package/dist/core/changeset.js +92 -0
  89. package/dist/core/changeset.js.map +1 -0
  90. package/dist/core/config.js +130 -0
  91. package/dist/core/config.js.map +1 -0
  92. package/dist/core/coverage.js +69 -0
  93. package/dist/core/coverage.js.map +1 -0
  94. package/dist/core/deliver.js +176 -0
  95. package/dist/core/deliver.js.map +1 -0
  96. package/dist/core/diagnostics.js +12 -0
  97. package/dist/core/diagnostics.js.map +1 -0
  98. package/dist/core/errors.js +12 -0
  99. package/dist/core/errors.js.map +1 -0
  100. package/dist/core/gates.js +76 -0
  101. package/dist/core/gates.js.map +1 -0
  102. package/dist/core/lock.js +57 -0
  103. package/dist/core/lock.js.map +1 -0
  104. package/dist/core/packet.js +162 -0
  105. package/dist/core/packet.js.map +1 -0
  106. package/dist/core/paths.js +63 -0
  107. package/dist/core/paths.js.map +1 -0
  108. package/dist/core/phases.js +195 -0
  109. package/dist/core/phases.js.map +1 -0
  110. package/dist/core/pr-body.js +58 -0
  111. package/dist/core/pr-body.js.map +1 -0
  112. package/dist/core/project-docs.js +246 -0
  113. package/dist/core/project-docs.js.map +1 -0
  114. package/dist/core/protect.js +24 -0
  115. package/dist/core/protect.js.map +1 -0
  116. package/dist/core/repo-host.js +11 -0
  117. package/dist/core/repo-host.js.map +1 -0
  118. package/dist/core/report.js +262 -0
  119. package/dist/core/report.js.map +1 -0
  120. package/dist/core/result.js +90 -0
  121. package/dist/core/result.js.map +1 -0
  122. package/dist/core/roles.js +18 -0
  123. package/dist/core/roles.js.map +1 -0
  124. package/dist/core/run.js +221 -0
  125. package/dist/core/run.js.map +1 -0
  126. package/dist/core/runner.js +34 -0
  127. package/dist/core/runner.js.map +1 -0
  128. package/dist/core/schema.js +104 -0
  129. package/dist/core/schema.js.map +1 -0
  130. package/dist/core/spec-adapter.js +12 -0
  131. package/dist/core/spec-adapter.js.map +1 -0
  132. package/dist/core/spec-model.js +8 -0
  133. package/dist/core/spec-model.js.map +1 -0
  134. package/dist/core/tasks.js +15 -0
  135. package/dist/core/tasks.js.map +1 -0
  136. package/dist/core/test-reports.js +60 -0
  137. package/dist/core/test-reports.js.map +1 -0
  138. package/docs/design.md +821 -0
  139. package/package.json +56 -0
@@ -0,0 +1,227 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { z } from 'zod';
5
+ import { CowError } from './errors.js';
6
+ import { exists, readText, today, writeText } from './paths.js';
7
+ import { headRevision, isGitRepo } from './changeset.js';
8
+ export const PHASES = [
9
+ 'intake',
10
+ 'research',
11
+ 'propose',
12
+ 'plan',
13
+ 'cover',
14
+ 'tests_review',
15
+ 'implement',
16
+ 'verify',
17
+ 'review',
18
+ 'deliver',
19
+ 'archived',
20
+ ];
21
+ export const STATUSES = [
22
+ 'active',
23
+ 'waiting_approval',
24
+ 'waiting_user',
25
+ 'waiting_peer',
26
+ 'parked',
27
+ 'blocked',
28
+ 'stopped',
29
+ 'delivery_unknown',
30
+ 'failed',
31
+ 'archived',
32
+ 'done',
33
+ ];
34
+ /** Терминальные статусы не меняются обычными командами (docs/design.md, «Файл change.yaml»). */
35
+ export const TERMINAL_STATUSES = new Set(['archived', 'done', 'stopped', 'delivery_unknown']);
36
+ export const SIZES = ['small', 'normal', 'large'];
37
+ const gateStateSchema = z.object({
38
+ state: z.enum(['pending', 'approved', 'rejected', 'skipped']),
39
+ by: z.string().optional(),
40
+ at: z.string().optional(),
41
+ comment: z.string().optional(),
42
+ reason: z.string().optional(),
43
+ promoted: z.array(z.string()).optional(),
44
+ answers: z.record(z.string(), z.string()).optional(),
45
+ posted_at: z.string().optional(),
46
+ });
47
+ const runSchema = z.object({
48
+ id: z.string(),
49
+ role: z.string(),
50
+ phase: z.string(),
51
+ attempt: z.number().int().positive().default(1),
52
+ runner: z.string().optional(),
53
+ model: z.string().optional(),
54
+ session: z.string().optional(),
55
+ started: z.string().optional(),
56
+ finished: z.string().optional(),
57
+ status: z.enum(['done', 'failed', 'blocked', 'running', 'stopped']),
58
+ dir: z.string().optional(),
59
+ cost_usd: z.number().optional(),
60
+ failure: z.string().optional(),
61
+ });
62
+ const checkSchema = z.object({ id: z.string(), purpose: z.string().optional(), result: z.enum(['PASS', 'FAIL', 'PARTIAL', 'NOT_RUN']), evidence: z.string().optional() });
63
+ const gapSchema = z.object({ id: z.string(), environment: z.string().optional(), oracle: z.string().optional(), risk: z.string().optional() });
64
+ export const changeSchema = z.object({
65
+ id: z.string(),
66
+ title: z.string(),
67
+ created: z.string(),
68
+ revision: z.number().int().nonnegative().default(0),
69
+ source: z
70
+ .object({ kind: z.enum(['text', 'file', 'tracker', 'brief']), ref: z.string().optional(), brief: z.string().optional() })
71
+ .default({ kind: 'text' }),
72
+ size: z.enum(SIZES).default('normal'),
73
+ skip_specs: z.boolean().default(false),
74
+ autonomy: z.enum(['supervised', 'checkpoint', 'autonomous']).optional(),
75
+ phase: z.enum(PHASES).default('intake'),
76
+ status: z.enum(STATUSES).default('active'),
77
+ settled: z.boolean().default(true),
78
+ active_run: z.string().nullable().default(null),
79
+ stop_requested: z.boolean().default(false),
80
+ base_revision: z.string().nullable().default(null),
81
+ gates: z.record(z.string(), gateStateSchema).default({}),
82
+ complexity: z
83
+ .object({ implementation: z.enum(['обычная', 'высокая']), review: z.enum(['обычная', 'высокая']) })
84
+ .optional(),
85
+ assumptions: z.array(z.object({ question: z.string(), priority: z.string(), accepted: z.string() })).default([]),
86
+ protected: z.array(z.string()).default([]),
87
+ blocker: z
88
+ .object({
89
+ category: z.string(),
90
+ artifact: z.string().optional(),
91
+ message: z.string(),
92
+ role: z.string().optional(),
93
+ phase: z.string().optional(),
94
+ resolution: z.string().optional(),
95
+ })
96
+ .nullable()
97
+ .default(null),
98
+ returns: z.record(z.string(), z.number().int()).default({}),
99
+ returns_limit: z.number().int().positive().nullable().default(null),
100
+ changeset: z
101
+ .object({ base: z.string(), digest: z.string(), paths: z.number().int(), sealed_after: z.string().nullable(), sealed_at: z.string() })
102
+ .nullable()
103
+ .default(null),
104
+ reviewed_digest: z.string().nullable().default(null),
105
+ verification: z.object({ run: z.string(), checks: z.array(checkSchema), gaps: z.array(gapSchema) }).nullable().default(null),
106
+ accepted_gaps: z.array(z.object({ item: z.string(), reason: z.string().optional() })).default([]),
107
+ delivery: z
108
+ .object({
109
+ intent_key: z.string(),
110
+ created_at: z.string(),
111
+ state: z.enum(['intent', 'archived', 'committed', 'pushed', 'pr_created', 'done']),
112
+ commit: z.string().nullable().default(null),
113
+ pr: z.object({ number: z.number().optional(), url: z.string().optional() }).nullable().default(null),
114
+ error: z.string().nullable().default(null),
115
+ })
116
+ .nullable()
117
+ .default(null),
118
+ coordination: z.unknown().nullable().default(null),
119
+ branch: z.string().optional(),
120
+ pr: z.object({ number: z.number().optional(), url: z.string().optional(), draft: z.boolean().optional() }).optional(),
121
+ runs: z.array(runSchema).default([]),
122
+ });
123
+ export const CHANGE_FILE = 'change.yaml';
124
+ export function changesDir(root, config) {
125
+ return path.join(root, config.changes.dir);
126
+ }
127
+ export function changeDir(root, config, id) {
128
+ return path.join(changesDir(root, config), id);
129
+ }
130
+ export function archiveDir(root, config) {
131
+ return path.join(changesDir(root, config), 'archive');
132
+ }
133
+ export function isValidChangeId(id) {
134
+ return /^[a-z][a-z0-9-]{1,60}$/.test(id);
135
+ }
136
+ function parseChange(file) {
137
+ const parsed = changeSchema.safeParse(YAML.parse(readText(file)) ?? {});
138
+ if (!parsed.success) {
139
+ const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
140
+ throw new CowError('BAD_CHANGE', `Некорректный ${file}: ${issues}`);
141
+ }
142
+ return parsed.data;
143
+ }
144
+ export function loadChange(dir) {
145
+ const file = path.join(dir, CHANGE_FILE);
146
+ if (!exists(file))
147
+ throw new CowError('NO_CHANGE', `Нет файла ${file}`);
148
+ return parseChange(file);
149
+ }
150
+ /**
151
+ * Атомарная запись с проверкой ревизии: временный файл и переименование,
152
+ * отклонение устаревшей копии и защита терминальных статусов.
153
+ */
154
+ export function saveChange(dir, change, opts = {}) {
155
+ const file = path.join(dir, CHANGE_FILE);
156
+ if (exists(file)) {
157
+ const disk = parseChange(file);
158
+ if (disk.revision !== change.revision) {
159
+ throw new CowError('REVISION_CONFLICT', `change.yaml изменён другим процессом: на диске ревизия ${disk.revision}, в памяти ${change.revision}.`, 'Перечитайте изменение и повторите действие.');
160
+ }
161
+ if (TERMINAL_STATUSES.has(disk.status) && change.status !== disk.status && !opts.allowTerminalReopen) {
162
+ throw new CowError('TERMINAL_IMMUTABLE', `Статус ${disk.status} терминальный; переход в ${change.status} возможен только через \`cow change resume\` или \`cow change reopen\`.`);
163
+ }
164
+ }
165
+ change.revision += 1;
166
+ const tmp = `${file}.${process.pid}.tmp`;
167
+ fs.mkdirSync(dir, { recursive: true });
168
+ fs.writeFileSync(tmp, YAML.stringify(change, { lineWidth: 0 }), 'utf8');
169
+ fs.renameSync(tmp, file);
170
+ return change;
171
+ }
172
+ export function listChanges(root, config) {
173
+ const base = changesDir(root, config);
174
+ if (!exists(base))
175
+ return [];
176
+ return fs
177
+ .readdirSync(base, { withFileTypes: true })
178
+ .filter((e) => e.isDirectory() && e.name !== 'archive' && exists(path.join(base, e.name, CHANGE_FILE)))
179
+ .map((e) => ({ id: e.name, dir: path.join(base, e.name), change: loadChange(path.join(base, e.name)) }))
180
+ .sort((a, b) => a.id.localeCompare(b.id));
181
+ }
182
+ export function createChange(root, config, input) {
183
+ if (!isValidChangeId(input.id)) {
184
+ throw new CowError('BAD_CHANGE_ID', `Идентификатор "${input.id}" должен быть в kebab-case: буквы, цифры, дефис, начинаться с буквы.`);
185
+ }
186
+ const dir = changeDir(root, config, input.id);
187
+ if (exists(dir))
188
+ throw new CowError('CHANGE_EXISTS', `Изменение ${input.id} уже существует: ${dir}`);
189
+ const change = changeSchema.parse({
190
+ id: input.id,
191
+ title: input.title,
192
+ created: today(),
193
+ source: input.source ?? { kind: 'text' },
194
+ size: input.size ?? 'normal',
195
+ autonomy: input.autonomy,
196
+ phase: 'research',
197
+ status: 'active',
198
+ base_revision: isGitRepo(root) ? headRevision(root) : null,
199
+ });
200
+ fs.mkdirSync(path.join(dir, 'evidence'), { recursive: true });
201
+ fs.mkdirSync(path.join(dir, 'runs'), { recursive: true });
202
+ fs.mkdirSync(path.join(dir, 'specs'), { recursive: true });
203
+ writeText(path.join(dir, 'request.md'), input.request.endsWith('\n') ? input.request : `${input.request}\n`);
204
+ writeText(path.join(dir, 'log.md'), `---\nchange: ${input.id}\n---\n\n# Журнал — ${input.id}\n\n<!-- [TASK] событие | [CODE] факт о коде | [RULE] правило | [HUMAN] предпочтение -->\n`);
205
+ saveChange(dir, change);
206
+ return { dir, change };
207
+ }
208
+ /** Найти изменение по id или единственное активное. */
209
+ export function resolveChange(root, config, id) {
210
+ if (id) {
211
+ const dir = changeDir(root, config, id);
212
+ return { dir, change: loadChange(dir) };
213
+ }
214
+ const all = listChanges(root, config);
215
+ if (all.length === 1)
216
+ return { dir: all[0].dir, change: all[0].change };
217
+ if (all.length === 0)
218
+ throw new CowError('NO_CHANGES', 'Активных изменений нет.', 'Создайте изменение: `cow change new <id> --title "..."`.');
219
+ throw new CowError('AMBIGUOUS_CHANGE', `Активных изменений несколько: ${all.map((c) => c.id).join(', ')}.`, 'Укажите --change <id>.');
220
+ }
221
+ export function nextRunId(change) {
222
+ return `r${change.runs.length + 1}`;
223
+ }
224
+ export function runDir(dir, runId) {
225
+ return path.join(dir, 'runs', runId);
226
+ }
227
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../src/core/change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { execFileSync } from 'node:child_process';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import picomatch from 'picomatch';
6
+ import { CowError } from './errors.js';
7
+ import { toPosix } from './paths.js';
8
+ function git(root, args) {
9
+ return execFileSync('git', args, { cwd: root, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
10
+ }
11
+ export function isGitRepo(root) {
12
+ try {
13
+ git(root, ['rev-parse', '--is-inside-work-tree']);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export function headRevision(root) {
21
+ try {
22
+ return git(root, ['rev-parse', 'HEAD']).trim();
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function sha256File(file) {
29
+ return createHash('sha256').update(fs.readFileSync(file)).digest('hex');
30
+ }
31
+ /**
32
+ * Изменённые файлы относительно базовой ревизии: закоммиченные в ветке, staged, unstaged и новые.
33
+ * Папка самого изменения и другие пути из exclude не учитываются.
34
+ */
35
+ export function computeChangeSet(root, base, exclude = []) {
36
+ if (!isGitRepo(root))
37
+ throw new CowError('NO_GIT', 'Change-set требует git-репозитория.');
38
+ const skip = exclude.length > 0 ? picomatch(exclude, { dot: true }) : () => false;
39
+ const entries = new Map();
40
+ const diff = git(root, ['diff', '--name-status', '-M', base, '--']);
41
+ for (const line of diff.split('\n')) {
42
+ if (!line.trim())
43
+ continue;
44
+ const parts = line.split('\t');
45
+ const code = parts[0][0];
46
+ const file = parts[parts.length - 1];
47
+ entries.set(file, code === 'R' ? 'R' : code);
48
+ }
49
+ const untracked = git(root, ['ls-files', '--others', '--exclude-standard']);
50
+ for (const line of untracked.split('\n')) {
51
+ if (line.trim())
52
+ entries.set(line.trim(), 'A');
53
+ }
54
+ const files = [...entries.entries()]
55
+ .filter(([p]) => !skip(p))
56
+ .sort(([a], [b]) => a.localeCompare(b))
57
+ .map(([p, status]) => {
58
+ const abs = path.join(root, p);
59
+ const exists = fs.existsSync(abs) && fs.statSync(abs).isFile();
60
+ return { path: toPosix(p), status: exists ? status : 'D', sha256: exists ? sha256File(abs) : null };
61
+ });
62
+ const digest = createHash('sha256');
63
+ for (const f of files)
64
+ digest.update(`${f.status} ${f.path} ${f.sha256 ?? '-'}\n`);
65
+ return { version: 1, base, digest: `sha256:${digest.digest('hex')}`, paths: files.length, files };
66
+ }
67
+ export function sealChangeSet(root, base, exclude, sealedAfter) {
68
+ const computed = computeChangeSet(root, base, exclude);
69
+ return { ...computed, sealed_at: new Date().toISOString(), sealed_after: sealedAfter };
70
+ }
71
+ export function writeChangeSet(dir, changeset) {
72
+ const file = path.join(dir, 'changeset.json');
73
+ fs.writeFileSync(file, `${JSON.stringify(changeset, null, 2)}\n`);
74
+ return file;
75
+ }
76
+ export function readChangeSet(dir) {
77
+ const file = path.join(dir, 'changeset.json');
78
+ if (!fs.existsSync(file))
79
+ return null;
80
+ return JSON.parse(fs.readFileSync(file, 'utf8'));
81
+ }
82
+ /** Сверка: совпадает ли текущая рабочая копия с запечатанным дайджестом. */
83
+ export function changeSetDrift(root, sealed, exclude) {
84
+ const current = computeChangeSet(root, sealed.base, exclude);
85
+ const before = new Map(sealed.files.map((f) => [f.path, f.sha256]));
86
+ const after = new Map(current.files.map((f) => [f.path, f.sha256]));
87
+ const added = [...after.keys()].filter((p) => !before.has(p));
88
+ const removed = [...before.keys()].filter((p) => !after.has(p));
89
+ const modified = [...after.keys()].filter((p) => before.has(p) && before.get(p) !== after.get(p));
90
+ return { drifted: current.digest !== sealed.digest, currentDigest: current.digest, added, removed, modified };
91
+ }
92
+ //# sourceMappingURL=changeset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset.js","sourceRoot":"","sources":["../../src/core/changeset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ import path from 'node:path';
2
+ import YAML from 'yaml';
3
+ import { z } from 'zod';
4
+ import { CowError } from './errors.js';
5
+ import { COW_DIR, CONFIG_FILE, exists, readText, writeText } from './paths.js';
6
+ export const AUTONOMY_PROFILES = ['supervised', 'checkpoint', 'autonomous'];
7
+ export const GATES = ['proposal', 'plan', 'tests'];
8
+ const modelsSchema = z.record(z.string(), z.string());
9
+ export const configSchema = z.object({
10
+ version: z.literal(1),
11
+ spec: z.object({
12
+ adapter: z.enum(['spec-box', 'openspec']),
13
+ 'spec-box': z
14
+ .object({
15
+ config: z.string().default('.tms.json'),
16
+ files: z.array(z.string()).optional(),
17
+ newFile: z.string().default('specs/{code}.spec-box.yml'),
18
+ })
19
+ .prefault({}),
20
+ }),
21
+ autonomy: z.enum(AUTONOMY_PROFILES).default('supervised'),
22
+ gates: z
23
+ .object({
24
+ channels: z.array(z.enum(['cli', 'pr-comments', 'tracker', 'chat'])).default(['cli']),
25
+ /** Явный набор гейтов; если задан, имеет приоритет над профилем. */
26
+ enabled: z.array(z.enum(GATES)).optional(),
27
+ })
28
+ .prefault({}),
29
+ runner: z
30
+ .object({
31
+ default: z.enum(['claude', 'codex']).default('claude'),
32
+ models: modelsSchema.default({}),
33
+ /** Каталог вне репозитория для событий и stderr запусков. */
34
+ stateDir: z.string().default('~/.cow/runs'),
35
+ timeoutMinutes: z.number().positive().default(120),
36
+ idleTimeoutMinutes: z.number().positive().default(20),
37
+ claude: z
38
+ .object({
39
+ executable: z.string().optional(),
40
+ permissionMode: z.enum(['default', 'acceptEdits', 'bypassPermissions']).default('acceptEdits'),
41
+ allowedTools: z.array(z.string()).default(['Read', 'Grep', 'Glob', 'Bash', 'Edit', 'Write', 'MultiEdit', 'NotebookEdit']),
42
+ readOnlyTools: z.array(z.string()).default(['Read', 'Grep', 'Glob', 'Bash']),
43
+ maxBudgetUsd: z.number().positive().optional(),
44
+ maxTurns: z.number().int().positive().optional(),
45
+ })
46
+ .prefault({}),
47
+ codex: z
48
+ .object({
49
+ executable: z.string().default('codex'),
50
+ sandboxWrite: z.string().default('workspace-write'),
51
+ sandboxRead: z.string().default('read-only'),
52
+ approvalPolicy: z.string().default('on-request'),
53
+ extraConfig: z.array(z.string()).default([]),
54
+ })
55
+ .prefault({}),
56
+ })
57
+ .prefault({}),
58
+ repo: z
59
+ .object({
60
+ adapter: z.enum(['github', 'local']).default('local'),
61
+ baseBranch: z.string().default('main'),
62
+ branchPrefix: z.string().default('cow/'),
63
+ github: z
64
+ .object({
65
+ owner: z.string().optional(),
66
+ repo: z.string().optional(),
67
+ apiUrl: z.string().default('https://api.github.com'),
68
+ tokenEnv: z.string().default('GITHUB_TOKEN'),
69
+ })
70
+ .prefault({}),
71
+ })
72
+ .prefault({}),
73
+ changeset: z.object({ exclude: z.array(z.string()).optional() }).prefault({}),
74
+ changes: z.object({ dir: z.string().default('.cow/changes') }).prefault({}),
75
+ project: z.object({ docs: z.string().default('.cow/project') }).prefault({}),
76
+ testing: z
77
+ .object({
78
+ manualPlan: z.enum(['always', 'when-needed', 'never']).default('when-needed'),
79
+ protectedGlobs: z.array(z.string()).default([]),
80
+ })
81
+ .prefault({}),
82
+ limits: z
83
+ .object({
84
+ returnsPerPhase: z.number().int().positive().default(3),
85
+ rejectionsPerPhase: z.number().int().nonnegative().default(2),
86
+ maxRunsPerInvocation: z.number().int().positive().default(20),
87
+ maxCostUsdPerInvocation: z.number().positive().optional(),
88
+ packetFileChars: z.number().int().positive().default(4000),
89
+ })
90
+ .prefault({}),
91
+ context: z.string().optional(),
92
+ rules: z.record(z.string(), z.array(z.string())).prefault({}),
93
+ });
94
+ export function configPath(root) {
95
+ return path.join(root, COW_DIR, CONFIG_FILE);
96
+ }
97
+ export function loadConfig(root) {
98
+ const file = configPath(root);
99
+ if (!exists(file)) {
100
+ throw new CowError('NO_CONFIG', `Нет файла ${file}`, 'Выполните `cow init`.');
101
+ }
102
+ const raw = YAML.parse(readText(file)) ?? {};
103
+ const parsed = configSchema.safeParse(raw);
104
+ if (!parsed.success) {
105
+ const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
106
+ throw new CowError('BAD_CONFIG', `Некорректный ${file}: ${issues}`);
107
+ }
108
+ return parsed.data;
109
+ }
110
+ export function saveConfig(root, config) {
111
+ writeText(configPath(root), YAML.stringify(config));
112
+ }
113
+ export function defaultConfig(specAdapter = 'spec-box') {
114
+ return configSchema.parse({ version: 1, spec: { adapter: specAdapter } });
115
+ }
116
+ /** Какие гейты включены: явный список из конфига, иначе профиль автономии. */
117
+ export function enabledGates(config, autonomy) {
118
+ if (config.gates.enabled)
119
+ return [...config.gates.enabled];
120
+ const profile = autonomy ?? config.autonomy;
121
+ switch (profile) {
122
+ case 'supervised':
123
+ return ['proposal', 'plan', 'tests'];
124
+ case 'checkpoint':
125
+ return ['plan'];
126
+ case 'autonomous':
127
+ return [];
128
+ }
129
+ }
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { z } from 'zod';
5
+ import { CowError } from './errors.js';
6
+ /**
7
+ * coverage.yaml: capability → группа → утверждение → tests[] | manual.
8
+ * Сопоставление с отчётом повторяет ключи spec-box: название фичи › группы › утверждения.
9
+ */
10
+ const testRefSchema = z.object({ level: z.string().optional(), file: z.string().optional(), name: z.string().min(1) });
11
+ const entrySchema = z.union([z.object({ tests: z.array(testRefSchema).min(1) }), z.object({ manual: z.string().min(1) })]);
12
+ export const coverageSchema = z.record(z.string(), z.record(z.string(), z.record(z.string(), entrySchema)));
13
+ export function readCoverage(dir) {
14
+ const file = path.join(dir, 'coverage.yaml');
15
+ if (!fs.existsSync(file))
16
+ throw new CowError('NO_COVERAGE', `Нет файла ${file}`);
17
+ const raw = YAML.parse(fs.readFileSync(file, 'utf8')) ?? {};
18
+ const parsed = coverageSchema.safeParse(raw);
19
+ if (!parsed.success) {
20
+ const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
21
+ throw new CowError('BAD_COVERAGE', `coverage.yaml не соответствует контракту: ${issues}`);
22
+ }
23
+ return parsed.data;
24
+ }
25
+ const norm = (s) => s.replace(/\s+/g, ' ').trim().toLowerCase();
26
+ /** Состояние каждого утверждения из дельт: покрыто зелёным тестом, падает, теста нет в отчёте, ручное, не описано в coverage. */
27
+ export function matchCoverage(coverage, deltas, report) {
28
+ const byName = new Map();
29
+ for (const t of report ?? []) {
30
+ byName.set(norm(t.fullName), t);
31
+ byName.set(norm(t.titles.join(' › ')), t);
32
+ byName.set(norm(t.titles.join(' ')), t);
33
+ }
34
+ const rows = [];
35
+ for (const delta of deltas) {
36
+ const cap = coverage[delta.capabilityId] ?? {};
37
+ for (const op of delta.ops) {
38
+ if (op.op !== 'add-requirement' && op.op !== 'modify-requirement')
39
+ continue;
40
+ const group = cap[op.requirement.title] ?? {};
41
+ for (const s of op.requirement.scenarios) {
42
+ const entry = group[s.title];
43
+ if (!entry) {
44
+ rows.push({ capability: delta.capabilityId, requirement: op.requirement.title, scenario: s.title, kind: 'automated', tests: [], state: 'unlisted' });
45
+ continue;
46
+ }
47
+ if ('manual' in entry) {
48
+ rows.push({ capability: delta.capabilityId, requirement: op.requirement.title, scenario: s.title, kind: 'manual', tests: [], manual: entry.manual, state: 'manual' });
49
+ continue;
50
+ }
51
+ const tests = entry.tests.map((t) => {
52
+ const found = report ? byName.get(norm(t.name)) : undefined;
53
+ const status = report ? (found?.status ?? 'missing') : 'pending';
54
+ return { name: t.name, ...(t.level ? { level: t.level } : {}), ...(t.file ? { file: t.file } : {}), status };
55
+ });
56
+ const state = !report ? 'missing' : tests.every((t) => t.status === 'passed') ? 'green' : tests.some((t) => t.status === 'failed') ? 'red' : 'missing';
57
+ rows.push({ capability: delta.capabilityId, requirement: op.requirement.title, scenario: s.title, kind: 'automated', tests, state });
58
+ }
59
+ }
60
+ }
61
+ return rows;
62
+ }
63
+ export function coverageSummary(rows) {
64
+ const out = { green: 0, red: 0, missing: 0, manual: 0, unlisted: 0 };
65
+ for (const r of rows)
66
+ out[r.state] += 1;
67
+ return out;
68
+ }
69
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/core/coverage.ts"],"names":[],"mappings":"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"}