mister-wolf 2.16.0 → 2.16.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.
Files changed (66) hide show
  1. package/dist/adapters/cli/cli-entry.d.ts.map +1 -1
  2. package/dist/adapters/cli/cli-entry.js +6 -0
  3. package/dist/adapters/cli/cli-entry.js.map +1 -1
  4. package/dist/adapters/cli/commands/memory-doctor.d.ts +3 -0
  5. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  6. package/dist/adapters/cli/commands/memory-doctor.js +104 -3
  7. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  8. package/dist/adapters/cli/commands/memory-uninstall.d.ts +3 -0
  9. package/dist/adapters/cli/commands/memory-uninstall.d.ts.map +1 -0
  10. package/dist/adapters/cli/commands/memory-uninstall.js +111 -0
  11. package/dist/adapters/cli/commands/memory-uninstall.js.map +1 -0
  12. package/dist/adapters/platforms/claude-adapter.d.ts +2 -0
  13. package/dist/adapters/platforms/claude-adapter.d.ts.map +1 -1
  14. package/dist/adapters/platforms/claude-adapter.js +10 -0
  15. package/dist/adapters/platforms/claude-adapter.js.map +1 -1
  16. package/dist/adapters/platforms/opencode-adapter.d.ts +5 -0
  17. package/dist/adapters/platforms/opencode-adapter.d.ts.map +1 -1
  18. package/dist/adapters/platforms/opencode-adapter.js +38 -0
  19. package/dist/adapters/platforms/opencode-adapter.js.map +1 -1
  20. package/dist/app/use-cases/detect-unaggregated-lessons.d.ts +3 -1
  21. package/dist/app/use-cases/detect-unaggregated-lessons.d.ts.map +1 -1
  22. package/dist/app/use-cases/detect-unaggregated-lessons.js +6 -2
  23. package/dist/app/use-cases/detect-unaggregated-lessons.js.map +1 -1
  24. package/dist/app/use-cases/doctor.d.ts +2 -0
  25. package/dist/app/use-cases/doctor.d.ts.map +1 -1
  26. package/dist/app/use-cases/doctor.js +6 -2
  27. package/dist/app/use-cases/doctor.js.map +1 -1
  28. package/dist/app/use-cases/platform-mismatch.d.ts +29 -0
  29. package/dist/app/use-cases/platform-mismatch.d.ts.map +1 -0
  30. package/dist/app/use-cases/platform-mismatch.js +65 -0
  31. package/dist/app/use-cases/platform-mismatch.js.map +1 -0
  32. package/dist/app/use-cases/repair-platform.d.ts +37 -0
  33. package/dist/app/use-cases/repair-platform.d.ts.map +1 -0
  34. package/dist/app/use-cases/repair-platform.js +59 -0
  35. package/dist/app/use-cases/repair-platform.js.map +1 -0
  36. package/dist/app/use-cases/uninstall.d.ts +39 -0
  37. package/dist/app/use-cases/uninstall.d.ts.map +1 -0
  38. package/dist/app/use-cases/uninstall.js +176 -0
  39. package/dist/app/use-cases/uninstall.js.map +1 -0
  40. package/dist/ports/platform-adapter.port.d.ts +9 -2
  41. package/dist/ports/platform-adapter.port.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/templates/.wolf/router.log +1 -1
  44. package/templates/base/AGENTS.md +3 -0
  45. package/templates/base/agents/executor-lead.md +14 -0
  46. package/templates/base/agents/mr-wolf.md +47 -4
  47. package/templates/base/skills/finishing-a-development-branch/SKILL.md +20 -1
  48. package/templates/base/skills/receiving-code-review/SKILL.md +20 -1
  49. package/templates/base/skills/requesting-code-review/SKILL.md +20 -1
  50. package/templates/base/skills/test-driven-development/SKILL.md +20 -1
  51. package/templates/base/skills/using-git-worktrees/SKILL.md +22 -3
  52. package/templates/base/skills/using-skills/SKILL.md +56 -18
  53. package/templates/base/skills/verification-before-completion/SKILL.md +20 -1
  54. package/templates/base/skills/wolf-brainstorm/SKILL.md +54 -17
  55. package/templates/base/skills/wolf-debug/SKILL.md +21 -2
  56. package/templates/base/skills/wolf-design/SKILL.md +20 -1
  57. package/templates/base/skills/wolf-execute/SKILL.md +21 -2
  58. package/templates/base/skills/wolf-explain/SKILL.md +104 -0
  59. package/templates/base/skills/wolf-handoff/SKILL.md +20 -1
  60. package/templates/base/skills/wolf-plan/SKILL.md +20 -1
  61. package/templates/base/skills/wolf-review/SKILL.md +20 -1
  62. package/templates/base/skills/wolf-sdd/SKILL.md +21 -2
  63. package/templates/base/skills/wolf-skill-intake/SKILL.md +20 -1
  64. package/templates/base/skills/wolf-testplan/SKILL.md +20 -1
  65. package/templates/base/skills/writing-skills/SKILL.md +23 -4
  66. package/templates/opencode/plugins/wolf-session-start.js +40 -13
@@ -1 +1 @@
1
- {"version":3,"file":"detect-unaggregated-lessons.js","sourceRoot":"","sources":["../../../src/app/use-cases/detect-unaggregated-lessons.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,CAAC;AAO9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAmB,EAAE,SAAqB,EAAE,GAAS;IAC7F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC;QAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,eAAe,CAAC;QAClD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;YAAE,SAAS;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,kBAAkB,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,eAAe,CAC3G,CAAC,MAAM,CAAC;IACT,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"detect-unaggregated-lessons.js","sourceRoot":"","sources":["../../../src/app/use-cases/detect-unaggregated-lessons.ts"],"names":[],"mappings":"AAGA,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,UAAU,CAAC;AAO9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAmB,EAAE,SAAqB,EAAE,GAAS;IAC7F,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC;QAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,KAAK,eAAe,CAAC;QAClD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;YAAE,SAAS;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClE,sDAAsD;YACtD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC1B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,kBAAkB,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,eAAe,CAC3G,CAAC,MAAM,CAAC;IACT,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC"}
@@ -24,6 +24,8 @@ export interface DoctorDeps {
24
24
  isSandbox?: (p: string) => boolean;
25
25
  /** Чтение файла для маркера onboarding; null — файла нет. */
26
26
  readFile?: (p: string) => Promise<string | null>;
27
+ /** 2.16.2 (REQ-02): строки несоответствия платформы (v1→v2) для пути; нет — проверка отключена. */
28
+ detectMismatch?: (path: string) => Promise<string[]>;
27
29
  }
28
30
  /**
29
31
  * `wolf doctor` (спека §3): по реестру проектов — версия бинаря vs схема каждого проекта,
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAErH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qGAAqG;IACrG,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAClD;AAiCD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA6CvE"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/doctor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAErH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qGAAqG;IACrG,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,mGAAmG;IACnG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtD;AAiCD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAiDvE"}
@@ -67,15 +67,19 @@ export async function runDoctor(deps) {
67
67
  issues.push(`${adapter.id}: wolf entry missing — run wolf init`);
68
68
  }
69
69
  }
70
+ // 2.16.2 (REQ-02): несоответствие «установлено под v1, рантайм v2» (design §C2)
71
+ issues.push(...((await deps.detectMismatch?.(proj.path)) ?? []));
70
72
  }
71
73
  issues.push(...(await ghostIssues(deps, proj.path)));
72
74
  entries.push({ path: proj.path, status, schemaVersion, issues });
73
75
  }
74
76
  // призрак-детект cwd (§8.2): незарегистрированный cwd проверяется тоже; запись
75
- // добавляем только при наличии issue — чистый cwd не шумит в отчёте
77
+ // добавляем только при наличии issue — чистый cwd не шумит в отчёте.
78
+ // 2.16.2 (REQ-02): mismatch «установлено под v1, рантайм v2» — тоже cwd-проверка:
79
+ // проект в tmp-реестре может быть pruned как sandbox, но mismatch от платформы не зависит.
76
80
  const cwd = deps.cwd;
77
81
  if (cwd && !entries.some((e) => e.path === cwd) && (await deps.exists(cwd))) {
78
- const issues = await ghostIssues(deps, cwd);
82
+ const issues = [...(await ghostIssues(deps, cwd)), ...((await deps.detectMismatch?.(cwd)) ?? [])];
79
83
  if (issues.length > 0) {
80
84
  const { status, schemaVersion } = classify(await deps.readSchema(cwd));
81
85
  entries.push({ path: cwd, status, schemaVersion, issues });
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/app/use-cases/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/app/use-cases/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { PlatformVersionInfo } from '../../ports/platform-adapter.port.js';
2
+ /** Выпуск, с которого шаблоны плагинов dual (v1+v2 в одном файле) — hotfix 2.14.1. */
3
+ export declare const DUAL_SINCE = "2.14.1";
4
+ export interface PlatformMismatch {
5
+ platform: string;
6
+ runtime: PlatformVersionInfo;
7
+ installedSet: string;
8
+ issue: string;
9
+ }
10
+ export interface MismatchDeps {
11
+ baseDir: string;
12
+ /** Уже вычисленная версия рантайма платформы (adapter.detectVersion). */
13
+ runtime: () => PlatformVersionInfo;
14
+ /** Толерантная загрузка sync-state; null — файла/свидетельства нет. */
15
+ readSyncState: () => {
16
+ files: Record<string, string>;
17
+ } | null;
18
+ /** Прочитать файл проекта; null — нет/нечитаем. */
19
+ readFile: (absPath: string) => string | null;
20
+ }
21
+ /** Сравнение semver-строк X.Y.Z; не-семвер → null. */
22
+ export declare function compareSemver(a: string, b: string): number | null;
23
+ /**
24
+ * Mismatch однонаправлен по конструкции (design ADR-1): dual-шаблоны работают в обоих
25
+ * рантаймах; правило сравнения формы рендера и рантайма задействуется константой,
26
+ * когда появится v2-only выпуск.
27
+ */
28
+ export declare function detectPlatformMismatch(deps: MismatchDeps): Promise<PlatformMismatch | null>;
29
+ //# sourceMappingURL=platform-mismatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-mismatch.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/platform-mismatch.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAEhF,sFAAsF;AACtF,eAAO,MAAM,UAAU,WAAW,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,MAAM,mBAAmB,CAAC;IACnC,uEAAuE;IACvE,aAAa,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,mDAAmD;IACnD,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUjE;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA8BjG"}
@@ -0,0 +1,65 @@
1
+ import { join } from 'path';
2
+ import { parseStamp } from '../../adapters/render/stamp.js';
3
+ /** Выпуск, с которого шаблоны плагинов dual (v1+v2 в одном файле) — hotfix 2.14.1. */
4
+ export const DUAL_SINCE = '2.14.1';
5
+ /** Сравнение semver-строк X.Y.Z; не-семвер → null. */
6
+ export function compareSemver(a, b) {
7
+ const pa = a.match(/^(\d+)\.(\d+)\.(\d+)$/);
8
+ const pb = b.match(/^(\d+)\.(\d+)\.(\d+)$/);
9
+ if (!pa || !pb)
10
+ return null;
11
+ const [ma, na, ka] = [Number(pa[1]), Number(pa[2]), Number(pa[3])];
12
+ const [mb, nb, kb] = [Number(pb[1]), Number(pb[2]), Number(pb[3])];
13
+ if (ma !== mb)
14
+ return ma < mb ? -1 : 1;
15
+ if (na !== nb)
16
+ return na < nb ? -1 : 1;
17
+ if (ka !== kb)
18
+ return ka < kb ? -1 : 1;
19
+ return 0;
20
+ }
21
+ /**
22
+ * Mismatch однонаправлен по конструкции (design ADR-1): dual-шаблоны работают в обоих
23
+ * рантаймах; правило сравнения формы рендера и рантайма задействуется константой,
24
+ * когда появится v2-only выпуск.
25
+ */
26
+ export async function detectPlatformMismatch(deps) {
27
+ const rt = deps.runtime();
28
+ if (rt.status !== 'v2')
29
+ return null;
30
+ const state = deps.readSyncState();
31
+ if (state === null)
32
+ return null; // без свидетельства рендера ничего не утверждаем
33
+ const sets = [];
34
+ for (const [rel] of Object.entries(state.files)) {
35
+ if (!rel.startsWith('.opencode/plugins/'))
36
+ continue;
37
+ const raw = deps.readFile(join(deps.baseDir, rel));
38
+ if (raw === null)
39
+ continue;
40
+ const stamp = parseStamp(raw);
41
+ if (stamp === null)
42
+ continue; // запись без штампа не наша (F-02 cross-check)
43
+ sets.push(stamp.set);
44
+ }
45
+ if (sets.length === 0)
46
+ return null;
47
+ // Q-01: не-семверные штампы исключаем до reduce — порядок записей не влияет на результат.
48
+ const parseable = sets.filter((s) => compareSemver(s, '0.0.0') !== null);
49
+ if (parseable.length === 0)
50
+ return null;
51
+ const min = parseable.reduce((acc, s) => {
52
+ const c = compareSemver(s, acc);
53
+ return c !== null && c < 0 ? s : acc;
54
+ }, parseable[0]);
55
+ const cmp = compareSemver(min, DUAL_SINCE);
56
+ if (cmp === null || cmp >= 0)
57
+ return null;
58
+ return {
59
+ platform: 'opencode',
60
+ runtime: rt,
61
+ installedSet: min,
62
+ issue: `opencode: installed under v1 (set ${min} < ${DUAL_SINCE}), runtime v2 — plugins are v1-only, run wolf doctor --repair`,
63
+ };
64
+ }
65
+ //# sourceMappingURL=platform-mismatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-mismatch.js","sourceRoot":"","sources":["../../../src/app/use-cases/platform-mismatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { RenderOutcome } from '../../ports/base-set-renderer.port.js';
2
+ import type { PlatformWriteResult } from '../../ports/platform-adapter.port.js';
3
+ export interface RepairPlatformDeps {
4
+ baseDir: string;
5
+ /** Платформа детектится по маркерам (конфиг/.opencode). */
6
+ detect: () => boolean;
7
+ /** Записи wolf-sync-state; null — файла нет. */
8
+ syncStateFiles: () => Record<string, string> | null;
9
+ /** Прочитать файл проекта; null — нет/нечитаем (C-02: fallback-скан штампов). */
10
+ readFile: (abs: string) => string | null;
11
+ /** Файлы в каталоге (любая глубина); пусто — каталога нет. */
12
+ listFiles: (dir: string) => string[];
13
+ /** Строки несоответствия (detectPlatformMismatch) — для плана. */
14
+ mismatch: () => Promise<string[]>;
15
+ /** Штатный перерендер штампованных файлов (mutated-skip внутри). */
16
+ syncBaseSet: () => Promise<{
17
+ outcomes: RenderOutcome[];
18
+ orphaned: string[];
19
+ }>;
20
+ writeConfig: () => Promise<PlatformWriteResult>;
21
+ }
22
+ export interface RepairPlatformReport {
23
+ /** План/действия для dry-run (без записей). */
24
+ plan: string[];
25
+ /** Фактические действия (пусто в dry-run). */
26
+ actions: string[];
27
+ /** Штампованные файлы вне текущего набора (repair не трогает, F-02). */
28
+ orphaned: string[];
29
+ /** Рекомендация по orphaned. */
30
+ orphanedNote: string;
31
+ /** Причина skip или null. */
32
+ skipped: string | null;
33
+ }
34
+ export declare function repairPlatform(deps: RepairPlatformDeps, opts: {
35
+ dryRun: boolean;
36
+ }): Promise<RepairPlatformReport>;
37
+ //# sourceMappingURL=repair-platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-platform.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/repair-platform.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAGhF,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,gDAAgD;IAChD,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACpD,iFAAiF;IACjF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACzC,8DAA8D;IAC9D,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,kEAAkE;IAClE,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,oEAAoE;IACpE,WAAW,EAAE,MAAM,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC9E,WAAW,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8CAA8C;IAC9C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,oBAAoB,CAAC,CA+C/B"}
@@ -0,0 +1,59 @@
1
+ // REQ-02 (2.16.2): ремонт платформы «установлено под v1, рантайм v2» — перерендер
2
+ // штампованных файлов (syncBaseSet) + канонизация конфига (writeConfig).
3
+ // Гвард (F-01/F-10): без установки или без wolf-контента — честный skip, ноль записей.
4
+ import { join } from 'path';
5
+ import { parseStamp } from '../../adapters/render/stamp.js';
6
+ export async function repairPlatform(deps, opts) {
7
+ const empty = { plan: [], actions: [], orphaned: [], orphanedNote: '', skipped: null };
8
+ if (!deps.detect())
9
+ return { ...empty, skipped: 'no opencode install' };
10
+ const state = deps.syncStateFiles();
11
+ // C-02: при пустом/отсутствующем state wolf-контент опознаём по штампу на диске
12
+ // (syncBaseSet рендерит по штампам, state не источник) — легаси <2.11.0 ремонтопригоден.
13
+ const stateFiles = state === null || Object.keys(state).length === 0 ? null : state;
14
+ let owned = stateFiles ? Object.keys(stateFiles) : [];
15
+ let viaFallback = false;
16
+ if (stateFiles === null) {
17
+ owned = [];
18
+ for (const root of ['.opencode/agents', '.opencode/skills', '.opencode/command', '.opencode/plugins']) {
19
+ for (const f of deps.listFiles(join(deps.baseDir, root))) {
20
+ const raw = deps.readFile(f);
21
+ if (raw !== null && parseStamp(raw) !== null)
22
+ owned.push(relPath(deps.baseDir, f));
23
+ }
24
+ }
25
+ viaFallback = true;
26
+ }
27
+ if (owned.length === 0) {
28
+ return { ...empty, skipped: 'no wolf-managed content in .opencode' };
29
+ }
30
+ const mismatchLines = await deps.mismatch();
31
+ const fileList = viaFallback
32
+ ? owned.map((f) => `- ${f} (identified by stamp, no sync-state)`)
33
+ : owned.map((f) => `- ${f}`);
34
+ const plan = [
35
+ ...mismatchLines.map((m) => `mismatch: ${m}`),
36
+ `syncBaseSet: re-render ${owned.length} stamped file(s) under current templates:`,
37
+ ...fileList,
38
+ 'writeConfig: canonicalize mcp.wolf / default_agent / subagent_depth',
39
+ ];
40
+ if (opts.dryRun)
41
+ return { ...empty, plan };
42
+ const { outcomes, orphaned } = await deps.syncBaseSet();
43
+ const actions = outcomes.map((o) => `${o.file} — ${o.action}${o.reason ? ` (${o.reason})` : ''}`);
44
+ const wc = await deps.writeConfig();
45
+ actions.push(`writeConfig: ${wc.action}${wc.reason ? ` (${wc.reason})` : ''}`);
46
+ return {
47
+ plan,
48
+ actions,
49
+ orphaned,
50
+ orphanedNote: orphaned.length > 0
51
+ ? 'orphaned stamped files are not touched by repair — remove manually or run wolf uninstall'
52
+ : '',
53
+ skipped: null,
54
+ };
55
+ }
56
+ function relPath(baseDir, abs) {
57
+ return abs.startsWith(baseDir + '/') ? abs.slice(baseDir.length + 1) : abs;
58
+ }
59
+ //# sourceMappingURL=repair-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-platform.js","sourceRoot":"","sources":["../../../src/app/use-cases/repair-platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { PlatformAdapter } from '../../ports/platform-adapter.port.js';
2
+ export interface UninstallDeps {
3
+ baseDir: string;
4
+ /** Записи wolf-sync-state; null — файла нет; 'broken' — битый JSON (F-11: без fallback). */
5
+ syncStateFiles: () => Record<string, string> | null | 'broken';
6
+ readFile: (abs: string) => string | null;
7
+ exists: (abs: string) => boolean;
8
+ listFiles: (dir: string) => string[];
9
+ /** Подкаталоги root (любая глубина), без самого root. */
10
+ listDirs: (root: string) => string[];
11
+ removeFile: (abs: string) => Promise<void>;
12
+ removeDirIfEmpty: (abs: string) => Promise<boolean>;
13
+ removeTree: (abs: string) => Promise<void>;
14
+ adapters: PlatformAdapter[];
15
+ }
16
+ export interface UninstallEntry {
17
+ target: string;
18
+ kind: 'file' | 'purge' | 'skip' | 'config';
19
+ detail?: string;
20
+ }
21
+ export interface UninstallPlan {
22
+ entries: UninstallEntry[];
23
+ }
24
+ export interface UninstallResult {
25
+ actions: string[];
26
+ errors: string[];
27
+ plan: UninstallPlan;
28
+ }
29
+ /** План read-only: что будет удалено; без yes ничего не пишется (dry-run по умолчанию). */
30
+ export declare function planUninstall(deps: UninstallDeps): Promise<UninstallPlan>;
31
+ /**
32
+ * Без yes — ничего не пишет (NFR-02). С yes — удаляет по плану; ошибки отдельных
33
+ * файлов попадают в errors, остальные продолжаются (частичный сбой, U-11).
34
+ */
35
+ export declare function executeUninstall(deps: UninstallDeps, plan: UninstallPlan, opts: {
36
+ yes: boolean;
37
+ purge: boolean;
38
+ }): Promise<UninstallResult>;
39
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/app/use-cases/uninstall.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAW5E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC/D,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACzC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACjC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,yDAAyD;IACzD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACrC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,2FAA2F;AAC3F,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CA8F/E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAAC,eAAe,CAAC,CAmD1B"}
@@ -0,0 +1,176 @@
1
+ // REQ-03 (2.16.2): wolf uninstall — план + подтверждение (паттерн careful re-init:
2
+ // planInit/--yes), удаление только wolf-контента (design §C4, ADR-2, NFR-02).
3
+ // Primary источник — wolf-sync-state (свидетель рендера); fallback — штамп файла при
4
+ // отсутствующем/пустом state (легаси < 2.11.0). AGENTS.md/CLAUDE.md не удаляются никогда:
5
+ // marker-append может содержать чужой контент (F-04).
6
+ import { join } from 'path';
7
+ import { parseStamp } from '../../adapters/render/stamp.js';
8
+ const STATE_REL = join('.opencode', 'wolf-sync-state.json');
9
+ const SCAN_ROOTS = [
10
+ join('.opencode', 'agents'),
11
+ join('.opencode', 'skills'),
12
+ join('.opencode', 'command'),
13
+ join('.opencode', 'plugins'),
14
+ ];
15
+ const ROOT_DOCS = new Set(['AGENTS.md', 'CLAUDE.md']);
16
+ /** План read-only: что будет удалено; без yes ничего не пишется (dry-run по умолчанию). */
17
+ export async function planUninstall(deps) {
18
+ const entries = [];
19
+ const state = deps.syncStateFiles();
20
+ const stateBroken = state === 'broken';
21
+ const stateEmpty = stateBroken || state === null || Object.keys(state).length === 0;
22
+ if (stateBroken) {
23
+ // F-11: битый state не даёт права считать чужие файлы своими — fallback-скан не запускаем.
24
+ entries.push({
25
+ target: STATE_REL,
26
+ kind: 'skip',
27
+ detail: 'sync-state is unreadable (broken JSON) — stamp fallback disabled, remove manually after inspection',
28
+ });
29
+ }
30
+ else if (stateEmpty) {
31
+ // Fallback (F-03): легаси без state — штамп = wolf-owned.
32
+ for (const root of SCAN_ROOTS) {
33
+ for (const f of deps.listFiles(join(deps.baseDir, root))) {
34
+ const raw = deps.readFile(f);
35
+ if (raw !== null && parseStamp(raw) !== null) {
36
+ entries.push({ target: rel(deps.baseDir, f), kind: 'file' });
37
+ }
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ const recorded = new Set(Object.keys(state));
43
+ for (const relPath of recorded) {
44
+ if (ROOT_DOCS.has(relPath)) {
45
+ entries.push({
46
+ target: relPath,
47
+ kind: 'skip',
48
+ detail: 'kept by design (may contain user content) — remove the wolf block manually if unwanted',
49
+ });
50
+ continue;
51
+ }
52
+ const abs = join(deps.baseDir, relPath);
53
+ if (!deps.exists(abs)) {
54
+ // C-03: отсутствие файла — тоже отчётная строка, не тихий continue.
55
+ entries.push({ target: relPath, kind: 'skip', detail: 'recorded in sync-state but missing on disk' });
56
+ continue;
57
+ }
58
+ const raw = deps.readFile(abs);
59
+ if (raw !== null && parseStamp(raw) === null) {
60
+ entries.push({
61
+ target: relPath,
62
+ kind: 'skip',
63
+ detail: 'file exists but has no wolf stamp — not removing (cross-check, ADR-2)',
64
+ });
65
+ continue;
66
+ }
67
+ entries.push({ target: relPath, kind: 'file' });
68
+ }
69
+ // C-04: штампованный, но не записанный в state — отчётная skip-строка (не удаляем).
70
+ for (const root of SCAN_ROOTS) {
71
+ for (const f of deps.listFiles(join(deps.baseDir, root))) {
72
+ const relPath = rel(deps.baseDir, f);
73
+ if (recorded.has(relPath))
74
+ continue;
75
+ const raw = deps.readFile(f);
76
+ if (raw !== null && parseStamp(raw) !== null) {
77
+ entries.push({ target: relPath, kind: 'skip', detail: 'stamped but unrecorded — not in sync-state' });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ // Сам реестр штампов — тоже след Wolf (кроме случая broken: предупреждающая строка уже в плане).
83
+ if (!stateBroken && deps.exists(join(deps.baseDir, STATE_REL))) {
84
+ entries.push({ target: STATE_REL, kind: 'file' });
85
+ }
86
+ // Конфиги платформ, которые писал Wolf (OpenCode opencode.json, Claude Code .mcp.json).
87
+ for (const adapter of deps.adapters) {
88
+ if (typeof adapter.removeWolfKeys !== 'function' || !adapter.detect(deps.baseDir))
89
+ continue;
90
+ const cfg = await adapter.readConfig(deps.baseDir).catch(() => null);
91
+ if (cfg === null) {
92
+ entries.push({
93
+ target: `config:${adapter.id}`,
94
+ kind: 'config',
95
+ detail: 'no config file — will be skipped with reason',
96
+ });
97
+ }
98
+ else {
99
+ entries.push({
100
+ target: `config:${adapter.id}`,
101
+ kind: 'config',
102
+ detail: 'wolf keys with our exact values will be removed',
103
+ });
104
+ }
105
+ }
106
+ // .wolf/ — не удаляем по умолчанию (память проекта); --purge стирает.
107
+ if (deps.exists(join(deps.baseDir, '.wolf'))) {
108
+ entries.push({ target: '.wolf', kind: 'skip', detail: 'project memory kept by default — pass --purge to erase' });
109
+ }
110
+ return { entries };
111
+ }
112
+ /**
113
+ * Без yes — ничего не пишет (NFR-02). С yes — удаляет по плану; ошибки отдельных
114
+ * файлов попадают в errors, остальные продолжаются (частичный сбой, U-11).
115
+ */
116
+ export async function executeUninstall(deps, plan, opts) {
117
+ if (!opts.yes)
118
+ return { actions: [], errors: [], plan };
119
+ const actions = [];
120
+ const errors = [];
121
+ const fileTargets = plan.entries.filter((e) => e.kind === 'file');
122
+ for (const e of fileTargets) {
123
+ try {
124
+ await deps.removeFile(join(deps.baseDir, e.target));
125
+ actions.push(`${e.target} — removed`);
126
+ }
127
+ catch (err) {
128
+ errors.push(`${e.target} — remove failed: ${err instanceof Error ? err.message : String(err)}`);
129
+ }
130
+ }
131
+ // Пустые каталоги набора убираем снизу вверх; непустые (чужой контент) не трогаем.
132
+ // Q-02: только когда реально удаляли wolf-файлы — пустые пользовательские каталоги не трогаем.
133
+ if (fileTargets.length > 0) {
134
+ for (const root of SCAN_ROOTS) {
135
+ const abs = join(deps.baseDir, root);
136
+ const dirs = deps.listDirs(abs);
137
+ for (const d of [...dirs].sort((a, b) => b.length - a.length)) {
138
+ if (await deps.removeDirIfEmpty(d))
139
+ actions.push(`${rel(deps.baseDir, d)} — removed (empty)`);
140
+ }
141
+ if (await deps.removeDirIfEmpty(abs))
142
+ actions.push(`${root} — removed (empty)`);
143
+ }
144
+ }
145
+ for (const e of plan.entries.filter((x) => x.kind === 'config')) {
146
+ const id = e.target.slice('config:'.length);
147
+ const adapter = deps.adapters.find((a) => a.id === id);
148
+ if (!adapter?.removeWolfKeys)
149
+ continue;
150
+ try {
151
+ const r = await adapter.removeWolfKeys(deps.baseDir);
152
+ actions.push(`config ${id}: ${r.action}${r.reason ? ` (${r.reason})` : ''}${r.keys?.length ? ` [${r.keys.join(', ')}]` : ''}`);
153
+ }
154
+ catch (err) {
155
+ errors.push(`config ${id} — failed: ${err instanceof Error ? err.message : String(err)}`);
156
+ }
157
+ }
158
+ if (fileTargets.length === 0) {
159
+ actions.push('nothing to remove — no wolf-managed files in .opencode');
160
+ }
161
+ const wolfKept = plan.entries.find((e) => e.target === '.wolf');
162
+ if (opts.purge && deps.exists(join(deps.baseDir, '.wolf'))) {
163
+ await deps.removeTree(join(deps.baseDir, '.wolf'));
164
+ actions.push('.wolf — removed (--purge)');
165
+ }
166
+ else if (wolfKept && !opts.purge) {
167
+ actions.push(`.wolf — kept (project memory; ${wolfKept.detail ?? ''})`);
168
+ }
169
+ actions.push('hint: to remove the global binary, run: npm uninstall -g mister-wolf');
170
+ actions.push('note: AGENTS.md/CLAUDE.md wolf blocks are not removed — remove manually if unwanted');
171
+ return { actions, errors, plan };
172
+ }
173
+ function rel(baseDir, abs) {
174
+ return abs.startsWith(baseDir + '/') ? abs.slice(baseDir.length + 1) : abs;
175
+ }
176
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/app/use-cases/uninstall.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,9 @@ export interface McpCommand {
5
5
  }
6
6
  /** Конфиг платформы как распарсенный JSON-объект; структуру знает адаптер. */
7
7
  export type PlatformConfig = Record<string, unknown>;
8
- /** Результат writeConfig: action + опциональный reason-канал (§6.1: конфликт default_agent → needs-fix). */
8
+ /** Результат writeConfig/removeWolfKeys: action + опциональный reason-канал (§6.1: конфликт default_agent → needs-fix). */
9
9
  export interface PlatformWriteResult {
10
- action: 'written' | 'replaced' | 'unchanged';
10
+ action: 'written' | 'replaced' | 'unchanged' | 'removed' | 'skipped';
11
11
  reason?: string;
12
12
  /** F6 (спека 2.1.0 §2.4): имя конфиг-файла платформы для честного лога (напр. 'opencode.json'). */
13
13
  configFile?: string;
@@ -45,6 +45,13 @@ export interface PlatformAdapter {
45
45
  writeConfig(projectRoot: string, cmd: McpCommand): Promise<PlatformWriteResult>;
46
46
  /** Удалить wolf-запись (для --platform replace-семантики); true если удалил. */
47
47
  removeWolf(projectRoot: string): Promise<boolean>;
48
+ /**
49
+ * 2.16.2 (uninstall): удалить ТОЛЬКО wolf-ключи с ТОЧНЫМ нашим значением
50
+ * (mcp.wolf / mcpServers.wolf; default_agent === mr-wolf; subagent_depth === 2 —
51
+ * пользовательскую повышенную настройку не трогаем). Отсутствующий конфиг —
52
+ * { action: 'skipped', reason }.
53
+ */
54
+ removeWolfKeys?(projectRoot: string): Promise<PlatformWriteResult>;
48
55
  /** Детект версии платформы (опционально; init не ломается, если адаптер не умеет). */
49
56
  detectVersion?(projectRoot: string): Promise<PlatformVersionInfo>;
50
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"platform-adapter.port.d.ts","sourceRoot":"","sources":["../../src/ports/platform-adapter.port.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,4GAA4G;AAC5G,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE3F,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,yDAAyD;IACzD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChE;;;;;OAKG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChF,gFAAgF;IAChF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,sFAAsF;IACtF,aAAa,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnE"}
1
+ {"version":3,"file":"platform-adapter.port.d.ts","sourceRoot":"","sources":["../../src/ports/platform-adapter.port.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,2HAA2H;AAC3H,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mGAAmG;IACnG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gHAAgH;IAChH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE3F,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACrC,yDAAyD;IACzD,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChE;;;;;OAKG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChF,gFAAgF;IAChF,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD;;;;;OAKG;IACH,cAAc,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnE,sFAAsF;IACtF,aAAa,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mister-wolf",
3
- "version": "2.16.0",
3
+ "version": "2.16.2",
4
4
  "description": "Local-first project memory for AI coding agents: decisions, lessons, tools and processes that outlive the session",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -1 +1 @@
1
- 2026-10-10T20:36:30.479Z agent-id=v2-router-probe-xyz playbook=hit name=fallback variant=fallback injected=yes ms=1 bytes=1274
1
+ 2026-10-12T15:03:13.303Z agent-id=v2-router-probe-xyz playbook=hit name=fallback variant=fallback injected=yes ms=0 bytes=1274
@@ -26,4 +26,7 @@
26
26
  ## Указатели
27
27
 
28
28
  - Документация: `docs/README.md`
29
+ - Номер версии всегда полный X.Y.Z — в планах, тредах, волнах, тегах и разговоре.
30
+ Голый минор («2.16») запрещён как имя релиза/волны/треда/плана: релизов «2.16» не
31
+ существует, есть «2.16.0», «2.16.1» (пример корректного полного номера: 2.16.2).
29
32
  <!-- /wolf:onboarding -->
@@ -44,6 +44,20 @@ agent-id: executor-lead
44
44
  файл (Metadata / Summary / Changes / Task Decomposition / Workers
45
45
  Used / Validation Results).
46
46
 
47
+ ## Методика до исполнения
48
+
49
+ Применяй полный using-skills из bootstrap; при отсутствии загрузи его.
50
+ До исследования, планирования и правок загрузи назначенные процессные
51
+ скиллы. Принятый бриф не разрешает пропустить их обязательные шаги.
52
+ Утверждённую неизменившуюся задачу не возвращай в discovery.
53
+
54
+ До выбора документного профиля зафиксируй FULL/LITE/FIX. Для FULL
55
+ организуй папку wolf scaffold artifact <slug>, заполняй её шаблоны,
56
+ проверяй структуру и связывай пути с тредом. Воркеру передай методику,
57
+ входы, allowlist и ожидаемый результат; общие план и память имеют одного
58
+ назначенного владельца. При недоступном генераторе нужен точный проверенный
59
+ шаблон; произвольный формат не является штатным.
60
+
47
61
  ## Диспетчеризация воркеров
48
62
 
49
63
  - Промпт воркера: полный текст подзадачи, точные пути, контракт