resolver-cow 0.4.0 → 0.4.2

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.
@@ -20,7 +20,7 @@
20
20
 
21
21
  | Файл | Обязательные ответы | Кто это читает |
22
22
  |---|---|---|
23
- | `overview.md` | Что за продукт и категория одной строкой; кто пользователи; какие системы рядом; где живёт код (корневые каталоги); где истина спецификаций и как её читать (`cow spec list`) | исследователь, планировщик |
23
+ | `overview.md` | Что за продукт и категория одной строкой; кто пользователи; какие системы рядом; где живёт код (корневые каталоги); где истина спецификаций ({{SPEC_TRUTH}}) и как её читать (`cow spec list`) | исследователь, планировщик |
24
24
  | `architecture.md` | Таблица пакетов и модулей с ответственностью; точки входа (команды, обработчики, страницы); поток данных от входа к результату; границы модулей (кто с кем не может взаимодействовать напрямую); генерируемый код и что нельзя править руками | исследователь, планировщик, реализатор |
25
25
  | `conventions.md` | Язык кода, комментариев и коммитов; форматтер и линтер с командами; запрещённые конструкции; именование файлов, модулей, тестов, веток; правила коммитов | реализатор, ревьюер, тестировщик |
26
26
  | `testing.md` | Таблица уровней тестов: когда какой применять, где лежат, чем запускаются; команды узкого прогона одного файла и полного прогона, проверки типов и линтера; куда пишутся JSON-отчёты и как их получить; правило именования тестов по сценариям спецификации; среда e2e или «—»; что проверяется только руками | тестировщик, реализатор, верификатор |
@@ -28,7 +28,7 @@
28
28
  | `glossary.md` | Термины домена: термин, определение, где встречается в коде. Именно этими словами будут написаны спецификации и тесты | все роли |
29
29
  | `contracts.md` | Внешние API, события, схемы данных, потребители, где лежат машиночитаемые контракты | планировщик, тестировщик |
30
30
 
31
- Особое внимание правилу именования тестов в `testing.md`: инструмент сопоставляет тесты с утверждениями спецификации по цепочке «название фичи › группа › утверждение» (как spec-box). Опиши, как эта цепочка ложится на `describe` и `it` в тестах проекта, с примером.
31
+ Особое внимание правилу именования тестов в `testing.md`: инструмент сопоставляет тесты с утверждениями спецификации по цепочке {{SPEC_CHAIN}}. Опиши, как эта цепочка ложится на `describe` и `it` в тестах проекта, с примером.
32
32
 
33
33
  ## Что не делать
34
34
 
@@ -0,0 +1,68 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { CowError } from '../../core/errors.js';
4
+ import { assetsDir, readText } from '../../core/paths.js';
5
+ import { projectContext } from '../context.js';
6
+ import { emit, emitError } from '../output.js';
7
+ const PROMPTS = {
8
+ 'project-docs': { file: 'fill-project-docs.md', description: 'Заполнить .cow/project/*.md по коду репозитория' },
9
+ };
10
+ /** Подстановки под адаптер спецификаций проекта. */
11
+ function substitutions(adapter) {
12
+ if (adapter === 'openspec') {
13
+ return {
14
+ SPEC_CHAIN: '«название capability › требование › сценарий» из `openspec/specs/<capability>/spec.md` (заголовки `# … Specification`, `### Requirement:`, `#### Scenario:`)',
15
+ SPEC_TRUTH: 'формат OpenSpec, файлы `openspec/specs/<capability>/spec.md`',
16
+ };
17
+ }
18
+ return {
19
+ SPEC_CHAIN: '«название фичи › группа › утверждение» из YAML spec-box (поля `feature`, ключ группы в `specs-unit`, `assert`)',
20
+ SPEC_TRUTH: 'формат spec-box, YAML-файлы по шаблонам из `.tms.json` или `spec.spec-box.files`',
21
+ };
22
+ }
23
+ export function renderPrompt(name, adapter) {
24
+ const entry = PROMPTS[name];
25
+ if (!entry)
26
+ throw new CowError('NO_PROMPT', `Нет промпта ${name}; доступны: ${Object.keys(PROMPTS).join(', ')}`);
27
+ const subs = substitutions(adapter);
28
+ return readText(path.join(assetsDir(), 'prompts', entry.file)).replace(/\{\{(\w+)\}\}/g, (_m, key) => subs[key] ?? `{{${key}}}`);
29
+ }
30
+ export function registerPrompt(program) {
31
+ const prompt = program.command('prompt').description('Готовые промпты для хоста разработчика');
32
+ prompt
33
+ .command('list')
34
+ .description('Список промптов')
35
+ .action((_opts, cmd) => {
36
+ const g = cmd.optsWithGlobals();
37
+ emit(g, { prompts: Object.entries(PROMPTS).map(([name, p]) => ({ name, description: p.description })) }, (d) => d.prompts.map((p) => `${p.name}\t${p.description}`).join('\n'));
38
+ });
39
+ prompt
40
+ .command('show <name>')
41
+ .description('Напечатать промпт с формулировками под адаптер проекта')
42
+ .option('--adapter <name>', 'spec-box | openspec (по умолчанию из конфига проекта)')
43
+ .action((name, opts, cmd) => {
44
+ const g = cmd.optsWithGlobals();
45
+ try {
46
+ let adapter = opts.adapter;
47
+ if (!adapter) {
48
+ try {
49
+ adapter = projectContext(g.cwd).config.spec.adapter;
50
+ }
51
+ catch {
52
+ adapter = 'spec-box';
53
+ }
54
+ }
55
+ const text = renderPrompt(name, adapter);
56
+ if (g.json)
57
+ emit(g, { name, adapter, text }, () => text);
58
+ else
59
+ process.stdout.write(`${text.trimEnd()}\n`);
60
+ }
61
+ catch (e) {
62
+ emitError(g, e);
63
+ process.exitCode = 1;
64
+ }
65
+ });
66
+ }
67
+ export { fs };
68
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/cli/commands/prompt.ts"],"names":[],"mappings":"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"}
package/dist/cli/main.js CHANGED
@@ -14,6 +14,7 @@ import { registerChangeset } from './commands/changeset.js';
14
14
  import { registerDeliver } from './commands/deliver.js';
15
15
  import { registerCoverage } from './commands/coverage.js';
16
16
  import { registerCi } from './commands/ci.js';
17
+ import { registerPrompt } from './commands/prompt.js';
17
18
  function readVersion() {
18
19
  try {
19
20
  return JSON.parse(fs.readFileSync(path.join(packageRoot(), 'package.json'), 'utf8')).version;
@@ -42,6 +43,7 @@ export function buildProgram() {
42
43
  registerDeliver(program);
43
44
  registerCoverage(program);
44
45
  registerCi(program);
46
+ registerPrompt(program);
45
47
  return program;
46
48
  }
47
49
  export async function main(argv) {
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,OAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC,OAAO,CAAC;IACxH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,KAAK,CAAC;SACX,WAAW,CAAC,wDAAwD,CAAC;SACrE,OAAO,CAAC,WAAW,EAAE,CAAC;SACtB,MAAM,CAAC,QAAQ,EAAE,6BAA6B,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC,CAAC;IACnE,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;IACtB,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC3B,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,cAAc,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,YAAY,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,IAAI,eAAe,EAAE,CAAC;IACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resolver-cow",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "cow: автономная реализация продуктовых фич ИИ-агентами",
5
5
  "type": "module",
6
6
  "license": "MIT",