gennady 0.8.4-draft.2 → 0.8.4-draft.3

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 (146) hide show
  1. package/ai/directives/sdd-v2/root.directive.xml +36 -3
  2. package/ai/directives/sdd-v2/router.directive.xml +22 -1
  3. package/ai/kit/templates/sdd-v2/root.directive.hbs +11 -3
  4. package/ai/kit/templates/sdd-v2/router.directive.hbs +22 -1
  5. package/ai/skills/agent-inbox/SKILL.md +1 -1
  6. package/ai/skills/sdd/SKILL.md +5 -3
  7. package/ai/skills/sdd-audit/SKILL.md +5 -2
  8. package/ai/skills/sdd-check/SKILL.md +2 -2
  9. package/ai/skills/sdd-code-review/SKILL.md +4 -1
  10. package/ai/skills/sdd-critic/SKILL.md +5 -2
  11. package/ai/skills/sdd-execute/SKILL.md +5 -2
  12. package/ai/skills/sdd-reconcile/SKILL.md +5 -2
  13. package/ai/skills/sdd-scaffold/SKILL.md +5 -2
  14. package/dist/ai/directives/sdd-v2/root.directive.xml +36 -3
  15. package/dist/ai/directives/sdd-v2/router.directive.xml +22 -1
  16. package/dist/ai/kit/templates/sdd-v2/root.directive.hbs +11 -3
  17. package/dist/ai/kit/templates/sdd-v2/router.directive.hbs +22 -1
  18. package/dist/ai/skills/agent-inbox/SKILL.md +1 -1
  19. package/dist/ai/skills/sdd/SKILL.md +5 -3
  20. package/dist/ai/skills/sdd-audit/SKILL.md +5 -2
  21. package/dist/ai/skills/sdd-check/SKILL.md +2 -2
  22. package/dist/ai/skills/sdd-code-review/SKILL.md +4 -1
  23. package/dist/ai/skills/sdd-critic/SKILL.md +5 -2
  24. package/dist/ai/skills/sdd-execute/SKILL.md +5 -2
  25. package/dist/ai/skills/sdd-reconcile/SKILL.md +5 -2
  26. package/dist/ai/skills/sdd-scaffold/SKILL.md +5 -2
  27. package/dist/chunks/{classify-mr-stage.logic-BiCHTmPp.js → classify-mr-stage.logic-CazmQDwZ.js} +2 -2
  28. package/dist/chunks/{config-index-9VHWSDQD.js → config-index-DU8-FEjq.js} +1 -1
  29. package/dist/chunks/{devtools-b0DwO1x_.js → devtools-1JmXJjUG.js} +1 -1
  30. package/dist/chunks/{eval.cmd-CwNPaNJd.js → eval.cmd-CBANnOFG.js} +1 -1
  31. package/dist/chunks/{help-D5cXtdMI.js → help-DVloaFF5.js} +1 -1
  32. package/dist/chunks/{index-BVnJEutp.js → index-2xhpqJtd.js} +2 -2
  33. package/dist/chunks/{index-RR5OUxje.js → index-AxsLBUAx.js} +14 -14
  34. package/dist/chunks/{index-CUkeTGqM.js → index-B7sydB0W.js} +2 -2
  35. package/dist/chunks/{index-CMCn9ErF.js → index-BKxk4zOz.js} +2 -2
  36. package/dist/chunks/{index-Db13NlHh.js → index-BNMmX_Mv.js} +21 -21
  37. package/dist/chunks/{index-CmQO-RmM.js → index-BPzldG3a.js} +2 -2
  38. package/dist/chunks/{index-BOQl7F_Z.js → index-BQlFDvKW.js} +2 -2
  39. package/dist/chunks/{index-RzkvIfJQ.js → index-Baq7RL1L.js} +3 -3
  40. package/dist/chunks/index-BbPiwvY9.js +2 -0
  41. package/dist/chunks/{index-ClJLPEUB.js → index-BreGNLJ_.js} +1 -1
  42. package/dist/chunks/{index-DjSafAkN.js → index-BslPwGtM.js} +2 -2
  43. package/dist/chunks/{index-DiMFxS0z.js → index-BtCUN2fZ.js} +16 -16
  44. package/dist/chunks/{index-CS0VbiLD.js → index-C10-EOdB.js} +1 -1
  45. package/dist/chunks/{index-2BOEcJIa.js → index-C4JmZLaj.js} +2 -2
  46. package/dist/chunks/index-CA-JKLr4.js +2 -0
  47. package/dist/chunks/{index-43GiH--T.js → index-CG_jJZVu.js} +2 -2
  48. package/dist/chunks/{index-BdkFKsMm.js → index-CGyP2uDE.js} +3 -3
  49. package/dist/chunks/{index-BOKv0b01.js → index-CPl1s9XJ.js} +2 -2
  50. package/dist/chunks/{index-DIPrBH-4.js → index-CSxE4cEm.js} +9 -9
  51. package/dist/chunks/{index-Cm7U1-fU.js → index-CWR5EzXx.js} +2 -2
  52. package/dist/chunks/{index-BwN5llCR.js → index-Camql5kL.js} +2 -2
  53. package/dist/chunks/{index-Drh-J9O7.js → index-CdUiTipO.js} +7 -7
  54. package/dist/chunks/{index-Cn029KTN.js → index-Crg61pK5.js} +2 -2
  55. package/dist/chunks/{index-Dja2O-hV.js → index-Cv9ZYXso.js} +1 -1
  56. package/dist/chunks/{index-Ck8v_Gv7.js → index-D7ADMlG3.js} +1 -1
  57. package/dist/chunks/index-DNl2gC8l.js +158 -0
  58. package/dist/chunks/{index-BYIzl-Ut.js → index-DVJA0qVm.js} +36 -36
  59. package/dist/chunks/{index-BAEIZVx0.js → index-DcFJhkY1.js} +2 -2
  60. package/dist/chunks/{index-Dx5_CB2E.js → index-DdEd-L3x.js} +2 -2
  61. package/dist/chunks/{index-DVmqMmgb.js → index-DkGA1eW_.js} +32 -32
  62. package/dist/chunks/{index-3k7mPX1e.js → index-Dnwxlti3.js} +1 -1
  63. package/dist/chunks/{index-CrizvxOJ.js → index-DqdEJDi2.js} +2 -2
  64. package/dist/chunks/{index-BIPebtDl.js → index-DqiwmBt4.js} +1 -1
  65. package/dist/chunks/{index-DS4MhAw-.js → index-PfuqBWjY.js} +2 -2
  66. package/dist/chunks/{index-BmFT1Kx2.js → index-SVP6RfVl.js} +2 -2
  67. package/dist/chunks/{index-CDxV4b81.js → index-Y8wu48Q0.js} +1 -1
  68. package/dist/chunks/index-_ewSKppm.js +2 -0
  69. package/dist/chunks/{index-Ctcr_Qeu.js → index-aBVtCLIJ.js} +2 -2
  70. package/dist/chunks/index-dNdz9j6d.js +2 -0
  71. package/dist/chunks/{index-BFUkVkSo.js → index-gskOpu3H.js} +16 -16
  72. package/dist/chunks/{index-CXpkT25O.js → index-pBSLMn5Q.js} +3 -3
  73. package/dist/chunks/index-sqPhX5Io.js +2 -0
  74. package/dist/chunks/{index-BzmR4Es2.js → index-vfrjhUD1.js} +39 -39
  75. package/dist/chunks/{index-J2NvjjDV.js → index-xGF5XC_i.js} +2 -2
  76. package/dist/chunks/{run-review-command.logic-CA2Rjymb.js → run-review-command.logic-B9GoCxh-.js} +24 -24
  77. package/dist/chunks/{serve.cmd-RxYS6WoN.js → serve.cmd-UXkaeaPI.js} +2 -2
  78. package/dist/chunks/{services-Csd556Tv.js → services-BYCeGBlO.js} +4 -4
  79. package/dist/chunks/{shared-B5CTGvpG.js → shared-B3cXL2Np.js} +1178 -1117
  80. package/dist/chunks/{stats-index-BLztvK69.js → stats-index-AIAnnp9S.js} +2 -2
  81. package/dist/gennady.js +46 -46
  82. package/dist/index.js +4 -4
  83. package/dist/shared/sdd/ladder.d.ts +42 -0
  84. package/dist/shared/sdd/module-specs.d.ts +7 -0
  85. package/dist/shared/sdd/tracker.d.ts +9 -0
  86. package/package.json +1 -1
  87. package/dist/chunks/classify-mr-stage.logic-ClmhzQPQ.js +0 -53
  88. package/dist/chunks/config-index-RFeqlDWs.js +0 -104
  89. package/dist/chunks/devtools-p8tmPuLn.js +0 -79
  90. package/dist/chunks/eval.cmd-ewU5lcUY.js +0 -34
  91. package/dist/chunks/help-DzGnMNi2.js +0 -7
  92. package/dist/chunks/index--AXFi0ty.js +0 -89
  93. package/dist/chunks/index-64TSesTc.js +0 -186
  94. package/dist/chunks/index-9Gv5trS_.js +0 -125
  95. package/dist/chunks/index-B1DQIryA.js +0 -2
  96. package/dist/chunks/index-B1PiBeQ3.js +0 -2
  97. package/dist/chunks/index-B4rzuhkt.js +0 -183
  98. package/dist/chunks/index-B97HJjkg.js +0 -159
  99. package/dist/chunks/index-BF6qypm0.js +0 -131
  100. package/dist/chunks/index-BK84ZQsh.js +0 -128
  101. package/dist/chunks/index-BRVIirjj.js +0 -141
  102. package/dist/chunks/index-BXnryCGW.js +0 -96
  103. package/dist/chunks/index-BaZm7Otb.js +0 -2
  104. package/dist/chunks/index-Bhk746A2.js +0 -129
  105. package/dist/chunks/index-Bi-eY_dY.js +0 -164
  106. package/dist/chunks/index-BjumU69g.js +0 -2
  107. package/dist/chunks/index-BkWXcpXU.js +0 -16979
  108. package/dist/chunks/index-BlY4jQIA.js +0 -168
  109. package/dist/chunks/index-C0iy7GxD.js +0 -140
  110. package/dist/chunks/index-CCBTXczb.js +0 -56
  111. package/dist/chunks/index-CDAfkSrr.js +0 -2
  112. package/dist/chunks/index-CDHymWzC.js +0 -102
  113. package/dist/chunks/index-CNfXJAao.js +0 -2
  114. package/dist/chunks/index-CQsae1nq.js +0 -207
  115. package/dist/chunks/index-CVmd0prf.js +0 -2
  116. package/dist/chunks/index-CZuTNeNm.js +0 -2
  117. package/dist/chunks/index-CasNhhrL.js +0 -96
  118. package/dist/chunks/index-Ce7GWENF.js +0 -377
  119. package/dist/chunks/index-Cf-02TAg.js +0 -265
  120. package/dist/chunks/index-CfjQWSrh.js +0 -52
  121. package/dist/chunks/index-Chr7gBBz.js +0 -443
  122. package/dist/chunks/index-Ci875Zlg.js +0 -346
  123. package/dist/chunks/index-CwA6RzIB.js +0 -3793
  124. package/dist/chunks/index-D1dI63ej.js +0 -46
  125. package/dist/chunks/index-DCS32A2i.js +0 -663
  126. package/dist/chunks/index-DOFoNxvb.js +0 -131
  127. package/dist/chunks/index-DVkCEuws.js +0 -136
  128. package/dist/chunks/index-DkadaaXq.js +0 -658
  129. package/dist/chunks/index-Dn11CLtk.js +0 -7
  130. package/dist/chunks/index-Do3spFJT.js +0 -340
  131. package/dist/chunks/index-DrFRZ0Yg.js +0 -2
  132. package/dist/chunks/index-DvEQhXi2.js +0 -1054
  133. package/dist/chunks/index-GiS0x6jg.js +0 -90
  134. package/dist/chunks/index-NacvqeQ5.js +0 -69
  135. package/dist/chunks/index-RNJhFzdr.js +0 -227
  136. package/dist/chunks/index-R_vUB6CL.js +0 -2
  137. package/dist/chunks/index-TQft1s5H.js +0 -20
  138. package/dist/chunks/index-ZmQRP38W.js +0 -26969
  139. package/dist/chunks/index-jdOZ4AkD.js +0 -143
  140. package/dist/chunks/index-kNa21kUI.js +0 -279
  141. package/dist/chunks/index-v4AV9kAc.js +0 -108
  142. package/dist/chunks/run-review-command.logic-CU1Slmc_.js +0 -331
  143. package/dist/chunks/serve.cmd-dWu_k_G_.js +0 -162
  144. package/dist/chunks/services-CwvXl2MB.js +0 -46832
  145. package/dist/chunks/shared-DSZTUx5b.js +0 -4509
  146. package/dist/chunks/stats-index-H6ALcjxy.js +0 -66
@@ -1,5 +1,5 @@
1
- import { s as e } from "./shared-DSZTUx5b.js";
2
- import { b as u, p, o as d } from "./services-CwvXl2MB.js";
1
+ import { s as e } from "./shared-B3cXL2Np.js";
2
+ import { b as u, p, o as d } from "./services-BYCeGBlO.js";
3
3
  function i(t) {
4
4
  const r = t.find((n) => n.startsWith("--days=")), o = r ? Number(r.slice(7)) : (() => {
5
5
  const n = t.indexOf("--days");
package/dist/gennady.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { a as s } from "./chunks/shared-B5CTGvpG.js";
2
+ import { a as s } from "./chunks/shared-B3cXL2Np.js";
3
3
  import "node:fs";
4
4
  import "node:path";
5
5
  import "node:url";
6
- const r = "0.8.4-draft.2", i = /* @__PURE__ */ new Set(["help", "--help", "-h"]), o = /* @__PURE__ */ new Set(["--version", "-v"]), t = process.argv[2];
6
+ const r = "0.8.4-draft.3", i = /* @__PURE__ */ new Set(["help", "--help", "-h"]), o = /* @__PURE__ */ new Set(["--version", "-v"]), t = process.argv[2];
7
7
  o.has(t) && (console.log(r), process.exit(0));
8
8
  (!t || i.has(t)) && (await import("./chunks/help.cmd-B3JddBhg.js"), process.exit(0));
9
9
  s({ name: "gennady", version: r });
@@ -36,7 +36,7 @@ if (p.some((a) => i.has(a))) {
36
36
  ), console.info(" exit 0 = все прогоны PASS; exit 1 = хотя бы один FAIL")) : await import("./chunks/help-Bb-4xa8Y.js").then((e) => e.printHelp()), a = !0;
37
37
  break;
38
38
  case "inbox-context":
39
- await import("./chunks/help-DzGnMNi2.js").then((e) => e.printHelp()), a = !0;
39
+ await import("./chunks/help-DVloaFF5.js").then((e) => e.printHelp()), a = !0;
40
40
  break;
41
41
  case "inbox-review-plan":
42
42
  console.info("gennady inbox-review-plan — детерминированный план ревью MR"), console.info(
@@ -156,136 +156,136 @@ if (p.some((a) => i.has(a))) {
156
156
  }
157
157
  switch (t) {
158
158
  case "cat":
159
- await import("./chunks/index-CwA6RzIB.js");
159
+ await import("./chunks/index-Crg61pK5.js");
160
160
  break;
161
161
  case "review":
162
- await import("./chunks/index-Dx5_CB2E.js");
162
+ await import("./chunks/index-DdEd-L3x.js");
163
163
  break;
164
164
  case "vcs-reply":
165
- await import("./chunks/index-CNfXJAao.js");
165
+ await import("./chunks/index-CA-JKLr4.js");
166
166
  break;
167
167
  case "review-verify":
168
- await import("./chunks/index-ClJLPEUB.js");
168
+ await import("./chunks/index-BreGNLJ_.js");
169
169
  break;
170
170
  case "review-issues":
171
- await import("./chunks/index-TQft1s5H.js");
171
+ await import("./chunks/index-CG_jJZVu.js");
172
172
  break;
173
173
  case "inbox":
174
- process.argv[3] === "config" ? await import("./chunks/config-index-RFeqlDWs.js") : process.argv[3] === "serve" ? await import("./chunks/serve.cmd-dWu_k_G_.js") : process.argv[3] === "stats" ? await import("./chunks/stats-index-H6ALcjxy.js") : process.argv[3] === "eval" ? await import("./chunks/eval.cmd-ewU5lcUY.js") : await import("./chunks/index-RzkvIfJQ.js");
174
+ process.argv[3] === "config" ? await import("./chunks/config-index-DU8-FEjq.js") : process.argv[3] === "serve" ? await import("./chunks/serve.cmd-UXkaeaPI.js") : process.argv[3] === "stats" ? await import("./chunks/stats-index-AIAnnp9S.js") : process.argv[3] === "eval" ? await import("./chunks/eval.cmd-CBANnOFG.js") : await import("./chunks/index-Baq7RL1L.js");
175
175
  break;
176
176
  case "inbox-context":
177
- await import("./chunks/index-BdkFKsMm.js");
177
+ await import("./chunks/index-CGyP2uDE.js");
178
178
  break;
179
179
  case "inbox-review-plan":
180
- await import("./chunks/index-CZuTNeNm.js");
180
+ await import("./chunks/index-sqPhX5Io.js");
181
181
  break;
182
182
  case "inbox-eval":
183
- await import("./chunks/index-Ck8v_Gv7.js");
183
+ await import("./chunks/index-D7ADMlG3.js");
184
184
  break;
185
185
  case "vcs-worktree":
186
- await import("./chunks/index-BVnJEutp.js");
186
+ await import("./chunks/index-2xhpqJtd.js");
187
187
  break;
188
188
  case "resolve-conflicts":
189
- await import("./chunks/index-DiMFxS0z.js");
189
+ await import("./chunks/index-BtCUN2fZ.js");
190
190
  break;
191
191
  case "commit":
192
- await import("./chunks/index-CXpkT25O.js");
192
+ await import("./chunks/index-pBSLMn5Q.js");
193
193
  break;
194
194
  case "remote-console":
195
- await import("./chunks/index-BAEIZVx0.js");
195
+ await import("./chunks/index-DcFJhkY1.js");
196
196
  break;
197
197
  case "lint":
198
- await import("./chunks/index-DVmqMmgb.js");
198
+ await import("./chunks/index-DkGA1eW_.js");
199
199
  break;
200
200
  case "alt-opinion":
201
- await import("./chunks/index-BkWXcpXU.js");
201
+ await import("./chunks/index-DqiwmBt4.js");
202
202
  break;
203
203
  case "agent-mon":
204
- await import("./chunks/index-ZmQRP38W.js");
204
+ await import("./chunks/index-xGF5XC_i.js");
205
205
  break;
206
206
  case "sync":
207
- await import("./chunks/index-DIPrBH-4.js");
207
+ await import("./chunks/index-CSxE4cEm.js");
208
208
  break;
209
209
  case "sync-skills":
210
- await import("./chunks/index-BzmR4Es2.js");
210
+ await import("./chunks/index-vfrjhUD1.js");
211
211
  break;
212
212
  case "orient":
213
- await import("./chunks/index-3k7mPX1e.js");
213
+ await import("./chunks/index-Dnwxlti3.js");
214
214
  break;
215
215
  case "agents-rules":
216
216
  await import("./chunks/index-CtJKSOL0.js");
217
217
  break;
218
218
  case "run":
219
- await import("./chunks/index-CfjQWSrh.js");
219
+ await import("./chunks/index-C10-EOdB.js");
220
220
  break;
221
221
  case "vcs-approve":
222
- await import("./chunks/index-CVmd0prf.js");
222
+ await import("./chunks/index-BbPiwvY9.js");
223
223
  break;
224
224
  case "testcov":
225
- await import("./chunks/index-DCS32A2i.js");
225
+ await import("./chunks/index-Cv9ZYXso.js");
226
226
  break;
227
227
  case "vcs-diff":
228
- await import("./chunks/index-CUkeTGqM.js");
228
+ await import("./chunks/index-B7sydB0W.js");
229
229
  break;
230
230
  case "vcs-pipeline":
231
- await import("./chunks/index-Bi-eY_dY.js");
231
+ await import("./chunks/index-Camql5kL.js");
232
232
  break;
233
233
  case "vcs-todo":
234
- await import("./chunks/index-CMCn9ErF.js");
234
+ await import("./chunks/index-BKxk4zOz.js");
235
235
  break;
236
236
  case "vcs-job":
237
- await import("./chunks/index-DjSafAkN.js");
237
+ await import("./chunks/index-BslPwGtM.js");
238
238
  break;
239
239
  case "vcs-job-log":
240
- await import("./chunks/index-CasNhhrL.js");
240
+ await import("./chunks/index-DqdEJDi2.js");
241
241
  break;
242
242
  case "vcs-draft-note":
243
- await import("./chunks/index-DrFRZ0Yg.js");
243
+ await import("./chunks/index-dNdz9j6d.js");
244
244
  break;
245
245
  case "vcs-mr-create":
246
- await import("./chunks/index-BOQl7F_Z.js");
246
+ await import("./chunks/index-BQlFDvKW.js");
247
247
  break;
248
248
  case "vcs-mr-edit":
249
- await import("./chunks/index--AXFi0ty.js");
249
+ await import("./chunks/index-CWR5EzXx.js");
250
250
  break;
251
251
  case "vcs-discussions":
252
- await import("./chunks/index-BRVIirjj.js");
252
+ await import("./chunks/index-SVP6RfVl.js");
253
253
  break;
254
254
  case "vcs-react":
255
- await import("./chunks/index-BaZm7Otb.js");
255
+ await import("./chunks/index-_ewSKppm.js");
256
256
  break;
257
257
  case "sdd-state":
258
- await import("./chunks/index-DOFoNxvb.js");
258
+ await import("./chunks/index-DNl2gC8l.js");
259
259
  break;
260
260
  case "sdd-check":
261
- await import("./chunks/index-Ci875Zlg.js");
261
+ await import("./chunks/index-DVJA0qVm.js");
262
262
  break;
263
263
  case "sdd-extract":
264
- await import("./chunks/index-DVkCEuws.js");
264
+ await import("./chunks/index-aBVtCLIJ.js");
265
265
  break;
266
266
  case "sdd-new":
267
- await import("./chunks/index-64TSesTc.js");
267
+ await import("./chunks/index-CPl1s9XJ.js");
268
268
  break;
269
269
  case "sdd-verify":
270
- await import("./chunks/index-CDxV4b81.js");
270
+ await import("./chunks/index-Y8wu48Q0.js");
271
271
  break;
272
272
  case "sdd-log":
273
- await import("./chunks/index-CmQO-RmM.js");
273
+ await import("./chunks/index-BPzldG3a.js");
274
274
  break;
275
275
  case "sdd-sync":
276
- await import("./chunks/index-BK84ZQsh.js");
276
+ await import("./chunks/index-BNMmX_Mv.js");
277
277
  break;
278
278
  case "sdd-task":
279
- await import("./chunks/index-C0iy7GxD.js");
279
+ await import("./chunks/index-AxsLBUAx.js");
280
280
  break;
281
281
  case "sdd-migrate":
282
- await import("./chunks/index-Drh-J9O7.js");
282
+ await import("./chunks/index-CdUiTipO.js");
283
283
  break;
284
284
  case "mr-stats":
285
- await import("./chunks/index-CQsae1nq.js");
285
+ await import("./chunks/index-PfuqBWjY.js");
286
286
  break;
287
287
  case "yagni":
288
- await import("./chunks/index-v4AV9kAc.js");
288
+ await import("./chunks/index-gskOpu3H.js");
289
289
  break;
290
290
  default:
291
291
  await import("./chunks/help.cmd-B3JddBhg.js"), process.exit(0);
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { u, aG as m } from "./chunks/shared-B5CTGvpG.js";
2
- import { G as y, aH as d, aI as A, aJ as f, aK as R } from "./chunks/shared-B5CTGvpG.js";
3
- import { az as C, aA as O, aB as T, aC as L, ao as G } from "./chunks/services-Csd556Tv.js";
1
+ import { u, aJ as m } from "./chunks/shared-B3cXL2Np.js";
2
+ import { G as y, aK as d, aL as A, aM as f, aN as R } from "./chunks/shared-B3cXL2Np.js";
3
+ import { az as C, aA as O, aB as T, aC as L, ao as $ } from "./chunks/services-BYCeGBlO.js";
4
4
  class h {
5
5
  /**
6
6
  * @purpose Create an instance with default settings (Ollama local).
@@ -178,7 +178,7 @@ export {
178
178
  f as parseGitDiff,
179
179
  T as remoteConsoleClient,
180
180
  L as serializeRemoteConsoleArg,
181
- G as startRemoteConsoleServer,
181
+ $ as startRemoteConsoleServer,
182
182
  R as unguard,
183
183
  u as unguardOrThrow
184
184
  };
@@ -0,0 +1,42 @@
1
+ /** @purpose Exact-name presence of the three gate scripts checked at the Infrastructure rung. */
2
+ export type LadderGates = {
3
+ /** @purpose `typecheck` npm script declared. */
4
+ typecheck: boolean;
5
+ /** @purpose `test` npm script declared. */
6
+ test: boolean;
7
+ /** @purpose `lint` npm script declared. */
8
+ lint: boolean;
9
+ };
10
+ /**
11
+ * @purpose Deterministic inputs for the readiness ladder — a reduction of what sdd-state already gathers.
12
+ * @invariant `scopesApproved` <= `scopesTotal`; `tasksDone` <= `tasksTotal` whenever both are non-null.
13
+ */
14
+ export type LadderInput = {
15
+ /** @purpose Project name parsed from the portal's `# ` heading, or null when absent/untitled. */
16
+ projectName: string | null;
17
+ /** @purpose Whether specs/README.md (the portal) exists. */
18
+ portalPresent: boolean;
19
+ /** @purpose Scope count from the portal Scopes table. */
20
+ scopesTotal: number;
21
+ /** @purpose Scopes whose status is `done` (approved). */
22
+ scopesApproved: number;
23
+ /** @purpose Count of module-classified spec files (MODULE_VISION marker) anywhere under specs/. */
24
+ moduleSpecCount: number;
25
+ /** @purpose Whether a parseable package.json exists — the rung reads not-configured when false. */
26
+ packageJsonPresent: boolean;
27
+ /** @purpose Exact-name presence of the three gate scripts. */
28
+ gates: LadderGates;
29
+ /** @purpose Total tickets across the project task rollup (specs/3-tasks.md), or null when absent/unparseable. */
30
+ tasksTotal: number | null;
31
+ /** @purpose Done tickets across the rollup; meaningful only when tasksTotal is non-null. */
32
+ tasksDone: number | null;
33
+ };
34
+ /**
35
+ * @purpose Render the five-rung SDD readiness ladder card, verbatim text the router shows the operator.
36
+ * @invariant Rung order is fixed: Portal, Scopes, Modules, Infrastructure, Tasks — product rungs before infra.
37
+ * @invariant Infrastructure never blocks Scopes/Modules; the scan reaches it only once both are closed, gating only the path to Tasks.
38
+ * @invariant Icons are restricted to the fixed set ✅ ⬜ 🏗 👉.
39
+ * @param s Deterministic ladder inputs gathered by sdd-state.
40
+ * @returns The card as one multi-line string, ready to print verbatim.
41
+ */
42
+ export declare function renderLadder(s: LadderInput): string;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @purpose Recursively count `.spec.md` files under a specs/ tree that carry the MODULE_VISION marker.
3
+ * @invariant Read-only; a scope spec (SCOPE_TYPE, no MODULE_VISION) or the portal (README.md) is not counted.
4
+ * @param specsDir Absolute path to the project's specs/ directory.
5
+ * @returns Count of module-classified spec files; 0 when specsDir is absent or holds none.
6
+ */
7
+ export declare function countModuleSpecs(specsDir: string): number;
@@ -68,3 +68,12 @@ export declare function recomputeRollupProgress(content: string, resolveRows: (i
68
68
  text: string;
69
69
  updated: string[];
70
70
  };
71
+ /**
72
+ * @purpose Sum a rollup table's existing Tasks/Done cells as literal numbers — read-only, no recompute.
73
+ * @param content Full markdown of the rollup file (e.g. `specs/3-tasks.md`).
74
+ * @returns Summed `{totalTasks, totalDone}` across every row, or null when no rollup table exists.
75
+ */
76
+ export declare function sumRollupProgress(content: string): {
77
+ totalTasks: number;
78
+ totalDone: number;
79
+ } | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gennady",
3
- "version": "0.8.4-draft.2",
3
+ "version": "0.8.4-draft.3",
4
4
  "author": "Konstantin Lebedev <ibnrubaxa@gmail.com>",
5
5
  "description": "Gennady — General Extensible Neural Network Adaptive Data Yntelligence",
6
6
  "keywords": [
@@ -1,53 +0,0 @@
1
- import { b as d } from "./shared-B5CTGvpG.js";
2
- import { a as f } from "./services-Csd556Tv.js";
3
- function h(s, r) {
4
- const a = s?.trim().replace(/^https?:\/\//, "").replace(/\/+$/, "");
5
- if (a) return a;
6
- if (r?.trim())
7
- return r.trim().replace(/^https?:\/\//, "").replace(/\/+$/, "");
8
- const e = d();
9
- if (!e?.host)
10
- throw new Error(
11
- "Не удалось определить GitLab host. Укажите --vcs-host=<host> или запустите команду в репозитории с настроенным origin remote."
12
- );
13
- return e.host;
14
- }
15
- function b(s, r) {
16
- const a = process.env.GITLAB_PERSONAL_TOKEN;
17
- if (!a)
18
- throw new Error(
19
- "Не найден токен доступа GitLab. Установите GITLAB_PERSONAL_TOKEN и повторите попытку."
20
- );
21
- const e = h(s, r);
22
- if (!/gitlab/i.test(e))
23
- throw new Error(`Провайдер "${e}" пока не поддерживается.`);
24
- const n = `https://${e}/api/v4`;
25
- return new f({ token: a, baseUrl: n });
26
- }
27
- function v(s) {
28
- return s.flatMap((r) => r?.notes ?? []);
29
- }
30
- function p(s, r, a, e = !1) {
31
- if (e && a === "reviewer") return "review_needed";
32
- const n = (t) => Date.parse(t.updated_at ?? t.created_at ?? "") || 0, i = s.filter((t) => !t.system), u = i.filter((t) => t.author?.username === r), l = i.filter((t) => t.author?.username && t.author.username !== r), o = u.length > 0 ? Math.max(...u.map(n)) : null, c = l.length > 0 ? Math.max(...l.map(n)) : null;
33
- return a === "reviewer" && o === null ? "review_needed" : c !== null && (o === null || c > o) || o !== null && s.filter((m) => m.system && m.body).some((m) => n(m) > o && /added \d+ commit/.test(m.body ?? "")) ? "reply_needed" : o !== null ? "awaiting_reply" : "idle";
34
- }
35
- function N(s) {
36
- const r = (e) => Date.parse(e.updated_at ?? e.created_at ?? "") || 0, a = s.filter((e) => !e.system && e.author?.username);
37
- return a.length === 0 ? "" : a.reduce((e, n) => r(n) >= r(e) ? n : e).author?.username ?? "";
38
- }
39
- function A(s, r, a, e = !1) {
40
- const n = (t) => Date.parse(t.updated_at ?? t.created_at ?? "") || 0, i = s.filter((t) => !t.system), u = i.filter((t) => t.author?.username === r), l = u.length > 0 ? Math.max(...u.map(n)) : null, o = i.filter((t) => t.author?.username && t.author.username !== r).filter((t) => l === null || n(t) > l).map((t) => ({
41
- author: t.author?.username ?? "",
42
- at: t.updated_at ?? t.created_at ?? "",
43
- body: t.body ?? ""
44
- })), c = p(s, r, a, e);
45
- return { stage: c, role: a, needsReview: c === "review_needed", openNotes: o };
46
- }
47
- export {
48
- A as a,
49
- b,
50
- p as c,
51
- v as f,
52
- N as l
53
- };
@@ -1,104 +0,0 @@
1
- import { existsSync as w, statSync as v } from "node:fs";
2
- import { isAbsolute as O } from "node:path";
3
- import { createInterface as S } from "node:readline";
4
- import { b as k, c as x, s as p, d as h, v as B } from "./services-Csd556Tv.js";
5
- function b(e) {
6
- const o = /* @__PURE__ */ new Map();
7
- for (let t = 0; t < e.length; t++) {
8
- const r = e[t];
9
- if (r === "--set" && e[t + 1] !== void 0) {
10
- const i = e[t + 1].indexOf("=");
11
- i > 0 && o.set(e[t + 1].slice(0, i), e[t + 1].slice(i + 1)), t++;
12
- } else if (r.startsWith("--set=")) {
13
- const i = r.slice(6), s = i.indexOf("=");
14
- s > 0 && o.set(i.slice(0, s), i.slice(s + 1));
15
- }
16
- }
17
- return o;
18
- }
19
- function C(e) {
20
- const o = [];
21
- for (let t = 0; t < e.length; t++) {
22
- const r = e[t];
23
- r === "--unset" && e[t + 1] !== void 0 ? (o.push(e[t + 1]), t++) : r.startsWith("--unset=") && o.push(r.slice(8));
24
- }
25
- return o;
26
- }
27
- function d(e, o) {
28
- return e.includes(o);
29
- }
30
- function m(e) {
31
- return e ? O(e) ? w(e) ? v(e).isDirectory() ? null : `"${e}" не является директорией` : `Путь "${e}" не существует` : "reposBase должен быть абсолютным путём" : "reposBase не может быть пустым";
32
- }
33
- function F(e) {
34
- return e ? null : "vcsHost не может быть пустым";
35
- }
36
- function l(e) {
37
- return JSON.stringify({ ok: !1, error: "CONFIG", detail: e });
38
- }
39
- function u(e) {
40
- const { valid: o } = B(e), { version: t, ...r } = e;
41
- return JSON.stringify({ configured: o, ...r });
42
- }
43
- async function q() {
44
- const e = process.argv.slice(2), o = k(e), t = x(o);
45
- if (d(e, "--path"))
46
- return console.info(t), 0;
47
- if (d(e, "--init")) {
48
- const s = S({ input: process.stdin, output: process.stdout }), n = (c) => new Promise((y) => s.question(c, y));
49
- let f = "";
50
- for (; ; ) {
51
- f = await n("reposBase (абсолютный путь): ");
52
- const c = m(f);
53
- if (!c) break;
54
- console.error(c);
55
- }
56
- let a = "";
57
- for (; ; ) {
58
- a = await n("vcsHost: ");
59
- const c = F(a);
60
- if (!c) break;
61
- console.error(c);
62
- }
63
- s.close();
64
- const g = { version: 1, reposBase: f, vcsHost: a };
65
- try {
66
- await p(t, g);
67
- } catch (c) {
68
- return console.error(l(c.message)), 1;
69
- }
70
- return console.info(u(g)), 0;
71
- }
72
- const r = b(e), i = C(e);
73
- if (r.size > 0 || i.length > 0) {
74
- for (const [n, f] of r)
75
- if (n === "reposBase") {
76
- const a = m(f);
77
- if (a)
78
- return console.error(l(a)), 1;
79
- }
80
- let s;
81
- try {
82
- s = await h(t) ?? { version: 1 };
83
- } catch (n) {
84
- return console.error(l(n.message)), 1;
85
- }
86
- for (const [n, f] of r)
87
- s[n] = f;
88
- for (const n of i)
89
- delete s[n];
90
- try {
91
- await p(t, s);
92
- } catch (n) {
93
- return console.error(l(n.message)), 1;
94
- }
95
- return console.info(u(s)), 0;
96
- }
97
- try {
98
- const s = await h(t);
99
- return s ? (console.info(u(s)), 0) : (console.info(JSON.stringify({ configured: !1 })), 0);
100
- } catch (s) {
101
- return console.error(l(s.message)), 1;
102
- }
103
- }
104
- process.exit(await q());
@@ -1,79 +0,0 @@
1
- import { an as l } from "./services-CwvXl2MB.js";
2
- var o, s;
3
- function u() {
4
- return s || (s = 1, o = function() {
5
- throw new Error(
6
- "ws does not work in the browser. Browser clients must use the native WebSocket object"
7
- );
8
- }), o;
9
- }
10
- var c = u();
11
- const i = /* @__PURE__ */ l(c), t = globalThis;
12
- t.WebSocket ||= i;
13
- t.window ||= globalThis;
14
- t.self ||= globalThis;
15
- t.window.__REACT_DEVTOOLS_COMPONENT_FILTERS__ = [
16
- {
17
- // ComponentFilterElementType
18
- type: 1,
19
- // ElementTypeHostComponent
20
- value: 7,
21
- isEnabled: !0
22
- },
23
- {
24
- // ComponentFilterDisplayName
25
- type: 2,
26
- value: "InternalApp",
27
- isEnabled: !0,
28
- isValid: !0
29
- },
30
- {
31
- // ComponentFilterDisplayName
32
- type: 2,
33
- value: "InternalAppContext",
34
- isEnabled: !0,
35
- isValid: !0
36
- },
37
- {
38
- // ComponentFilterDisplayName
39
- type: 2,
40
- value: "InternalStdoutContext",
41
- isEnabled: !0,
42
- isValid: !0
43
- },
44
- {
45
- // ComponentFilterDisplayName
46
- type: 2,
47
- value: "InternalStderrContext",
48
- isEnabled: !0,
49
- isValid: !0
50
- },
51
- {
52
- // ComponentFilterDisplayName
53
- type: 2,
54
- value: "InternalStdinContext",
55
- isEnabled: !0,
56
- isValid: !0
57
- },
58
- {
59
- // ComponentFilterDisplayName
60
- type: 2,
61
- value: "InternalFocusContext",
62
- isEnabled: !0,
63
- isValid: !0
64
- }
65
- ];
66
- const a = {}, d = async () => new Promise((r) => {
67
- const e = new i("ws://localhost:8097"), n = setTimeout(() => {
68
- e.terminate(), r(!1);
69
- }, 2e3);
70
- n.unref(), e.on("open", () => {
71
- clearTimeout(n), e.terminate(), r(!0);
72
- }), e.on("error", () => {
73
- clearTimeout(n), e.terminate(), r(!1);
74
- });
75
- });
76
- await d() ? (a.initialize(), a.connectToDevTools()) : console.warn(`DEV is set to true, but the React DevTools server is not running. Start it with:
77
-
78
- $ npx react-devtools
79
- `);
@@ -1,34 +0,0 @@
1
- import { join as d } from "node:path";
2
- import { l, S as f, E, D as x, q as h } from "./services-Csd556Tv.js";
3
- function c(o, r) {
4
- const n = o.find((a) => a.startsWith(`${r}=`));
5
- if (n) return n.slice(r.length + 1);
6
- const t = o.indexOf(r);
7
- return t !== -1 ? o[t + 1] : void 0;
8
- }
9
- async function w(o = process.argv) {
10
- const r = o.slice(3), n = c(r, "--mr");
11
- if (!n)
12
- return console.error("Error: --mr <url> is required"), 1;
13
- const t = c(r, "--runs")?.split(",").map((e) => e.trim()).filter(Boolean), a = c(r, "--report");
14
- try {
15
- l.info("[inboxEvalCmd#run] [idle → running]", { mr: n, runsFilter: t });
16
- const i = new f().getStateDir(), g = d(i, "agent-inbox", "events.jsonl"), u = new E(g), m = new x(u), p = a ?? d(i, "agent-inbox", "eval-reports", (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-")), s = await h({
17
- mr: n,
18
- journal: u,
19
- decisionJournal: m,
20
- reportsDir: p,
21
- runFilter: t
22
- });
23
- return console.log(`Eval report: ${p}/eval-report.json`), console.log(`Verdict: ${s.verdict}`), console.log(
24
- `Runs: ${s.runs.filter((v) => v.status === "pass").length}/${s.runs.length} passed`
25
- ), l.info("[inboxEvalCmd#run] [running → done]", { verdict: s.verdict }), s.verdict === "pass" ? 0 : 1;
26
- } catch (e) {
27
- const i = new Error("[inboxEvalCmd#run] Eval run failed", { cause: e });
28
- return l.error("[inboxEvalCmd#run] [running → failed]", { error: i }), console.error(`Error: ${e.message ?? String(e)}`), 1;
29
- }
30
- }
31
- process.exit(await w());
32
- export {
33
- w as run
34
- };
@@ -1,7 +0,0 @@
1
- import { s as o } from "./shared-B5CTGvpG.js";
2
- function n() {
3
- console.info(o.bold("gennady inbox-context — атомарный сбор контекста MR")), console.info(""), console.info(" gennady inbox-context --ref <group/project!iid> [флаги]"), console.info(""), console.info(o.bold("Флаги:")), console.info(" --ref <ref> MR ref (обязателен)"), console.info(" --vcs-host=<host> GitLab host (автодетект из origin)"), console.info(" --skip-worktree Без клона — changeset и worktree пусты"), console.info(" --skip-threads Без обсуждений — threads/stage пусты"), console.info(" --repos-base=<dir> База поиска клонов (default ~/Developer)"), console.info(" --state-dir=<dir> Директория состояния (default ~/.gennady)"), console.info(" --json Вывод в JSON (по умолчанию)"), console.info(""), console.info(o.bold("Вывод (JSON):")), console.info(" ref, title, webUrl — идентификация MR"), console.info(" worktree — path, base, diffRefs, repoLayout"), console.info(" changeset — files [{path, status, plus, minus}], totals, byCategory"), console.info(" stage — review_needed | reply_needed | awaiting_reply | idle"), console.info(" openQuestions, lastAuthor — из обсуждений"), console.info(" threads — { all, drafts } — полные треды и черновики"), console.info(" package — role, author, reviewers, description, approvedBy");
4
- }
5
- export {
6
- n as printHelp
7
- };