mister-wolf 1.0.3 → 1.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 (75) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  2. package/dist/adapters/cli/cli-entry.js +2 -0
  3. package/dist/adapters/cli/cli-entry.js.map +1 -1
  4. package/dist/adapters/cli/commands/memory-init.d.ts.map +1 -1
  5. package/dist/adapters/cli/commands/memory-init.js +33 -1
  6. package/dist/adapters/cli/commands/memory-init.js.map +1 -1
  7. package/dist/adapters/cli/commands/memory-sync.d.ts +3 -0
  8. package/dist/adapters/cli/commands/memory-sync.d.ts.map +1 -0
  9. package/dist/adapters/cli/commands/memory-sync.js +28 -0
  10. package/dist/adapters/cli/commands/memory-sync.js.map +1 -0
  11. package/dist/adapters/render/manifest.d.ts +13 -0
  12. package/dist/adapters/render/manifest.d.ts.map +1 -0
  13. package/dist/adapters/render/manifest.js +14 -0
  14. package/dist/adapters/render/manifest.js.map +1 -0
  15. package/dist/adapters/render/opencode/opencode-renderer.d.ts +22 -0
  16. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -0
  17. package/dist/adapters/render/opencode/opencode-renderer.js +125 -0
  18. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -0
  19. package/dist/adapters/render/stamp.d.ts +8 -0
  20. package/dist/adapters/render/stamp.d.ts.map +1 -0
  21. package/dist/adapters/render/stamp.js +23 -0
  22. package/dist/adapters/render/stamp.js.map +1 -0
  23. package/dist/adapters/render/templates-root.d.ts +6 -0
  24. package/dist/adapters/render/templates-root.d.ts.map +1 -0
  25. package/dist/adapters/render/templates-root.js +30 -0
  26. package/dist/adapters/render/templates-root.js.map +1 -0
  27. package/dist/app/use-cases/init-project.d.ts +12 -0
  28. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  29. package/dist/app/use-cases/init-project.js +13 -1
  30. package/dist/app/use-cases/init-project.js.map +1 -1
  31. package/dist/app/use-cases/seed-base-playbooks.d.ts +26 -0
  32. package/dist/app/use-cases/seed-base-playbooks.d.ts.map +1 -0
  33. package/dist/app/use-cases/seed-base-playbooks.js +43 -0
  34. package/dist/app/use-cases/seed-base-playbooks.js.map +1 -0
  35. package/dist/app/use-cases/sync-base-set.d.ts +12 -0
  36. package/dist/app/use-cases/sync-base-set.d.ts.map +1 -0
  37. package/dist/app/use-cases/sync-base-set.js +10 -0
  38. package/dist/app/use-cases/sync-base-set.js.map +1 -0
  39. package/dist/ports/base-set-renderer.port.d.ts +20 -0
  40. package/dist/ports/base-set-renderer.port.d.ts.map +1 -0
  41. package/dist/ports/base-set-renderer.port.js +2 -0
  42. package/dist/ports/base-set-renderer.port.js.map +1 -0
  43. package/package.json +11 -3
  44. package/templates/base/README.md +1 -0
  45. package/templates/base/agents/executor-lead.md +79 -0
  46. package/templates/base/agents/mr-wolf.md +76 -0
  47. package/templates/base/agents/steward.md +56 -0
  48. package/templates/base/agents/worker-implementer.md +58 -0
  49. package/templates/base/agents/worker-researcher.md +59 -0
  50. package/templates/base/agents/worker-reviewer.md +58 -0
  51. package/templates/base/commands/analyze-doc.md +11 -0
  52. package/templates/base/commands/complain.md +13 -0
  53. package/templates/base/commands/doc-review.md +15 -0
  54. package/templates/base/playbooks/complaint-protocol.md +39 -0
  55. package/templates/base/playbooks/steward-nastavnik.md +38 -0
  56. package/templates/base/playbooks/wolf-review-lenses.md +50 -0
  57. package/templates/base/playbooks/worker-implementer-playbook.md +51 -0
  58. package/templates/base/playbooks/worker-researcher-playbook.md +51 -0
  59. package/templates/base/playbooks/worker-reviewer-playbook.md +54 -0
  60. package/templates/base/skills/finishing-a-development-branch/SKILL.md +213 -0
  61. package/templates/base/skills/requesting-code-review/SKILL.md +123 -0
  62. package/templates/base/skills/test-driven-development/SKILL.md +391 -0
  63. package/templates/base/skills/using-git-worktrees/SKILL.md +178 -0
  64. package/templates/base/skills/using-skills/SKILL.md +128 -0
  65. package/templates/base/skills/verification-before-completion/SKILL.md +157 -0
  66. package/templates/base/skills/wolf-brainstorm/SKILL.md +167 -0
  67. package/templates/base/skills/wolf-debug/SKILL.md +293 -0
  68. package/templates/base/skills/wolf-execute/SKILL.md +96 -0
  69. package/templates/base/skills/wolf-handoff/SKILL.md +101 -0
  70. package/templates/base/skills/wolf-plan/SKILL.md +177 -0
  71. package/templates/base/skills/wolf-review/SKILL.md +61 -0
  72. package/templates/base/skills/wolf-sdd/SKILL.md +239 -0
  73. package/templates/opencode/README.md +1 -0
  74. package/templates/opencode/plugins/wolf-router.ts +104 -0
  75. package/templates/opencode/plugins/wolf-session-start.js +144 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Mr.Wolf session-start plugin (шаблон базового набора, спека §5.4).
3
+ *
4
+ * Инъекция bootstrap-контекста выполняется, когда в актуальном транскрипте
5
+ * НЕТ маркера — покрывает старт сессии, /clear и compact (MAJ-1: кэша на
6
+ * процесс нет; маркер исчез → инъекция выполняется снова). Уровень сессии —
7
+ * по agent-id маркеру в system-промпте, механизм wolf-router (MAJ-4):
8
+ * `worker-*` (L2) → усечённое тело без диспетчерского контура using-skills;
9
+ * L0/L1 (остальные) → recap/call + полный governance-набор (H2).
10
+ *
11
+ * Ноль зависимостей (Node stdlib). Fail-safe: любая ошибка плагина — тихий
12
+ * скип, сессию не ронять (m13). Через этот файл при рендере проходят
13
+ * подстановка {{tool.*}} и штамп `// wolf:rendered` (ставит рендерер).
14
+ */
15
+
16
+ import path from 'path';
17
+ import { execFile } from 'child_process';
18
+ import { promisify } from 'util';
19
+ import { fileURLToPath } from 'url';
20
+
21
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
22
+ const PROJECT_ROOT = path.join(__dirname, '..', '..');
23
+ const LOCAL_CLI = path.join(PROJECT_ROOT, 'dist', 'bootstrap', 'cli.js');
24
+ const TIMEOUT_MS = 10_000;
25
+
26
+ // Контракт opencode: у файла плагина РОВНО ОДИН export — фабрика плагина;
27
+ // loader вызывает каждый export как фабрику (лишний export-строка или
28
+ // функция, возвращающая null, валит загрузку всего плагина — дефект,
29
+ // найден живым догфудингом фазы C). MARKER и computeInjection — приватные.
30
+ const MARKER = 'Mr.Wolf session bootstrap';
31
+
32
+ // [ \t] вместо \s: \s съедает переводы строк и вытаскивает id с чужой строки.
33
+ const AGENT_ID_RE = /^agent-id:[ \t]*([\w-]+)[ \t]*$/m;
34
+
35
+ const FULL_BODY = `## Протокол сессии Wolf (L0/L1)
36
+
37
+ - Начало сессии и после /clear: \`wolf call\` и \`wolf brief\` — активное руководство проекта; они приоритетнее статических файлов.
38
+ - Значимое фиксируй в памяти: \`wolf add --type decision|lesson|blocker\`; устаревшее — \`wolf supersede\`.
39
+ - Состояние проекта — только у Wolf (\`wolf search\` / \`wolf get\` / \`wolf brief\`), статические списки в файлах устаревают.
40
+
41
+ ## using-skills: governance-набор (H2)
42
+
43
+ - **1%-правило**: есть хоть 1% шанс применимости скилла — загрузи через {{tool.skill}} и проверь. «Это простой вопрос», «сначала соберу контекст» — рационализации, стоп.
44
+ - **SUBAGENT-STOP**: отправлен как субагент на конкретную задачу — не диспетчь, работай по задаче.
45
+ - **Лестница приоритетов**: правила проекта/память Wolf (AGENTS.md, \`wolf search\`) > скиллы > дефолт-поведение.
46
+ - **Порядок выбора**: process-скиллы (brainstorming, systematic-debugging) ПЕРЕД implementation-скиллами.
47
+ - **Типы скиллов**: rigid — следуй точно, не адаптируй; flexible — адаптируй принципы к контексту.`;
48
+
49
+ const WORKER_BODY = `## using-skills: пассивный режим воркера (L2)
50
+
51
+ - Скиллы пассивны: читай процесс СВОЕЙ задачи, но не диспетчь и не выбирай скиллы сам — подзадача уже выдана диспетчером.
52
+ - rigid-скилл твоей задачи выполняй точно; flexible — адаптируй к контексту подзадачи.
53
+ - Red flags (кратко): «слишком просто, скиллы не нужны», «сначала соберу контекст» — сначала убедись, что процесс твоей задачи прочитан.`;
54
+
55
+ /**
56
+ * Чистая функция инъекции (юнит-тестируемая): по маркеру в транскрипте и
57
+ * agent-id решает, какое тело доставить. null = инъекция не нужна.
58
+ * Fail-safe (m13): битый вход → null, никогда не бросает.
59
+ */
60
+ function computeInjection(messages, agentId) {
61
+ try {
62
+ if (!Array.isArray(messages)) return null;
63
+ // H3: идемпотентность — маркер в ЛЮБОМ сообщении транскрипта → не инъекцируем.
64
+ const seen = messages.some(
65
+ (m) =>
66
+ Array.isArray(m?.parts) &&
67
+ m.parts.some((p) => p?.type === 'text' && String(p.text ?? '').includes(MARKER))
68
+ );
69
+ if (seen) return null;
70
+ // MAJ-4: worker-* → усечённое тело (без диспетчерского контура using-skills).
71
+ return /^worker-/.test(String(agentId ?? '')) ? WORKER_BODY : FULL_BODY;
72
+ } catch {
73
+ return null;
74
+ }
75
+ }
76
+
77
+ const run = promisify(execFile);
78
+ // execFile: args array, no shell — текст пользователя не попадёт в команду.
79
+ // Целевой проект — глобальный `wolf`; догфуд в репо Wolf — локальный dist.
80
+ const runWolf = (args) => {
81
+ const opts = { cwd: PROJECT_ROOT, timeout: TIMEOUT_MS };
82
+ return run('wolf', args, opts)
83
+ .then((r) => r.stdout)
84
+ .catch(() => run('node', [LOCAL_CLI, ...args], opts).then((r) => r.stdout))
85
+ .catch(() => null);
86
+ };
87
+
88
+ // Topic = первые слова первого пользовательского сообщения, для `call --for`.
89
+ const topicOf = (message) =>
90
+ (message?.parts ?? [])
91
+ .filter((p) => p.type === 'text' && p.text)
92
+ .map((p) => p.text)
93
+ .join(' ')
94
+ .trim()
95
+ .split(/\s+/)
96
+ .slice(0, 10)
97
+ .join(' ');
98
+
99
+ // MAJ-4: уровень сессии читаем из system-промпта (маркер agent-id в теле
100
+ // рамки агента). Порядок хуков на первый запрос — на совести рантайма;
101
+ // пока agent-id не виден, дефолт — полный набор (L0/L1, primary-сессии).
102
+ let currentAgentId = null;
103
+
104
+ export const WolfSessionStartPlugin = async () => ({
105
+ 'experimental.chat.system.transform': async (_input, output) => {
106
+ try {
107
+ const m = (output?.system ?? []).join('\n').match(AGENT_ID_RE);
108
+ currentAgentId = m ? m[1] : null;
109
+ } catch {
110
+ /* fail-safe */
111
+ }
112
+ },
113
+ 'experimental.chat.messages.transform': async (_input, output) => {
114
+ try {
115
+ const messages = output?.messages;
116
+ const body = computeInjection(messages, currentAgentId);
117
+ if (!body) return;
118
+ const firstUser = messages.find((m) => m.info?.role === 'user');
119
+ if (!firstUser?.parts?.length) return;
120
+
121
+ const sections = [body];
122
+ // MAJ-1: БЕЗ кэша на процесс — каждый запуск без маркера пересчитывает
123
+ // recap/call заново (маркер исчез после /clear или compact → снова).
124
+ if (!(currentAgentId ?? '').startsWith('worker-')) {
125
+ const topic = topicOf(firstUser);
126
+ const [recap, call] = await Promise.all([
127
+ runWolf(['recap']),
128
+ topic ? runWolf(['call', '--for', topic, '--compact', '600']) : null,
129
+ ]);
130
+ if (call?.trim()) sections.unshift(`## Active injections\n${call.trim()}`);
131
+ if (recap?.trim()) sections.unshift(`## Recap\n${recap.trim()}`);
132
+ }
133
+
134
+ const ref = firstUser.parts[0];
135
+ firstUser.parts.unshift({
136
+ ...ref,
137
+ type: 'text',
138
+ text: `<session_context>\n${MARKER}\n\n${sections.join('\n\n')}\n</session_context>`,
139
+ });
140
+ } catch {
141
+ // Fail-safe (m13): ошибка плагина не имеет права уронить сессию.
142
+ }
143
+ },
144
+ });