@nac3/forge-cli 1.18.0 → 1.19.1

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 (181) hide show
  1. package/dist/bin/yf.d.ts.map +1 -1
  2. package/dist/bin/yf.js +4 -0
  3. package/dist/bin/yf.js.map +1 -1
  4. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  5. package/dist/chat/doctrine_digest.js +11 -0
  6. package/dist/chat/doctrine_digest.js.map +1 -1
  7. package/dist/chat/panel.d.ts.map +1 -1
  8. package/dist/chat/panel.js +287 -2
  9. package/dist/chat/panel.js.map +1 -1
  10. package/dist/chat/project_slug.d.ts.map +1 -1
  11. package/dist/chat/project_slug.js +29 -0
  12. package/dist/chat/project_slug.js.map +1 -1
  13. package/dist/chat/server.d.ts.map +1 -1
  14. package/dist/chat/server.js +144 -22
  15. package/dist/chat/server.js.map +1 -1
  16. package/dist/chat/tools/evidence.d.ts +30 -0
  17. package/dist/chat/tools/evidence.d.ts.map +1 -0
  18. package/dist/chat/tools/evidence.js +74 -0
  19. package/dist/chat/tools/evidence.js.map +1 -0
  20. package/dist/chat/tools/pending.d.ts +3 -0
  21. package/dist/chat/tools/pending.d.ts.map +1 -1
  22. package/dist/chat/tools/pending.js +71 -1
  23. package/dist/chat/tools/pending.js.map +1 -1
  24. package/dist/chat/tools/urazuke.d.ts +22 -0
  25. package/dist/chat/tools/urazuke.d.ts.map +1 -0
  26. package/dist/chat/tools/urazuke.js +54 -0
  27. package/dist/chat/tools/urazuke.js.map +1 -0
  28. package/dist/chat/tools/workflow.d.ts.map +1 -1
  29. package/dist/chat/tools/workflow.js +5 -3
  30. package/dist/chat/tools/workflow.js.map +1 -1
  31. package/dist/chat/tools.d.ts.map +1 -1
  32. package/dist/chat/tools.js +22 -0
  33. package/dist/chat/tools.js.map +1 -1
  34. package/dist/chat/urazuke_section.d.ts +8 -0
  35. package/dist/chat/urazuke_section.d.ts.map +1 -0
  36. package/dist/chat/urazuke_section.js +42 -0
  37. package/dist/chat/urazuke_section.js.map +1 -0
  38. package/dist/commands/pending.d.ts +1 -0
  39. package/dist/commands/pending.d.ts.map +1 -1
  40. package/dist/commands/pending.js +82 -8
  41. package/dist/commands/pending.js.map +1 -1
  42. package/dist/commands/start.d.ts +60 -0
  43. package/dist/commands/start.d.ts.map +1 -0
  44. package/dist/commands/start.js +265 -0
  45. package/dist/commands/start.js.map +1 -0
  46. package/dist/commands/urazuke.d.ts +17 -0
  47. package/dist/commands/urazuke.d.ts.map +1 -0
  48. package/dist/commands/urazuke.js +541 -0
  49. package/dist/commands/urazuke.js.map +1 -0
  50. package/dist/commands/workflow.js +4 -4
  51. package/dist/commands/workflow.js.map +1 -1
  52. package/dist/core/brain_config.d.ts +4 -0
  53. package/dist/core/brain_config.d.ts.map +1 -1
  54. package/dist/core/brain_config.js +2 -0
  55. package/dist/core/brain_config.js.map +1 -1
  56. package/dist/core/forge_embed.d.ts.map +1 -1
  57. package/dist/core/forge_embed.js +10 -0
  58. package/dist/core/forge_embed.js.map +1 -1
  59. package/dist/core/native_dialogs.d.ts +13 -0
  60. package/dist/core/native_dialogs.d.ts.map +1 -0
  61. package/dist/core/native_dialogs.js +111 -0
  62. package/dist/core/native_dialogs.js.map +1 -0
  63. package/dist/core/projects.d.ts +6 -0
  64. package/dist/core/projects.d.ts.map +1 -1
  65. package/dist/core/projects.js +1 -1
  66. package/dist/core/projects.js.map +1 -1
  67. package/dist/docs/doctrine/urazuke.md +38 -0
  68. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  69. package/dist/nac3/internal_manifest.js +96 -2
  70. package/dist/nac3/internal_manifest.js.map +1 -1
  71. package/dist/pending/store.d.ts +8 -1
  72. package/dist/pending/store.d.ts.map +1 -1
  73. package/dist/pending/store.js +8 -1
  74. package/dist/pending/store.js.map +1 -1
  75. package/dist/pending/types.d.ts +41 -1
  76. package/dist/pending/types.d.ts.map +1 -1
  77. package/dist/pending/types.js.map +1 -1
  78. package/dist/urazuke/catalog.d.ts +109 -0
  79. package/dist/urazuke/catalog.d.ts.map +1 -0
  80. package/dist/urazuke/catalog.js +459 -0
  81. package/dist/urazuke/catalog.js.map +1 -0
  82. package/dist/urazuke/close_gate.d.ts +36 -0
  83. package/dist/urazuke/close_gate.d.ts.map +1 -0
  84. package/dist/urazuke/close_gate.js +48 -0
  85. package/dist/urazuke/close_gate.js.map +1 -0
  86. package/dist/urazuke/current.d.ts +63 -0
  87. package/dist/urazuke/current.d.ts.map +1 -0
  88. package/dist/urazuke/current.js +133 -0
  89. package/dist/urazuke/current.js.map +1 -0
  90. package/dist/urazuke/cycle.d.ts +91 -0
  91. package/dist/urazuke/cycle.d.ts.map +1 -0
  92. package/dist/urazuke/cycle.js +310 -0
  93. package/dist/urazuke/cycle.js.map +1 -0
  94. package/dist/urazuke/enabled.d.ts +31 -0
  95. package/dist/urazuke/enabled.d.ts.map +1 -0
  96. package/dist/urazuke/enabled.js +51 -0
  97. package/dist/urazuke/enabled.js.map +1 -0
  98. package/dist/urazuke/evidence.d.ts +45 -0
  99. package/dist/urazuke/evidence.d.ts.map +1 -0
  100. package/dist/urazuke/evidence.js +264 -0
  101. package/dist/urazuke/evidence.js.map +1 -0
  102. package/dist/urazuke/gate.d.ts +68 -0
  103. package/dist/urazuke/gate.d.ts.map +1 -0
  104. package/dist/urazuke/gate.js +249 -0
  105. package/dist/urazuke/gate.js.map +1 -0
  106. package/dist/urazuke/probes.d.ts +13 -0
  107. package/dist/urazuke/probes.d.ts.map +1 -0
  108. package/dist/urazuke/probes.js +87 -0
  109. package/dist/urazuke/probes.js.map +1 -0
  110. package/dist/urazuke/prompts.generated.d.ts +12 -0
  111. package/dist/urazuke/prompts.generated.d.ts.map +1 -0
  112. package/dist/urazuke/prompts.generated.js +135 -0
  113. package/dist/urazuke/prompts.generated.js.map +1 -0
  114. package/dist/urazuke/prompts_client.d.ts +44 -0
  115. package/dist/urazuke/prompts_client.d.ts.map +1 -0
  116. package/dist/urazuke/prompts_client.js +151 -0
  117. package/dist/urazuke/prompts_client.js.map +1 -0
  118. package/dist/urazuke/quality.d.ts +99 -0
  119. package/dist/urazuke/quality.d.ts.map +1 -0
  120. package/dist/urazuke/quality.js +269 -0
  121. package/dist/urazuke/quality.js.map +1 -0
  122. package/dist/urazuke/receipts.d.ts +90 -0
  123. package/dist/urazuke/receipts.d.ts.map +1 -0
  124. package/dist/urazuke/receipts.js +171 -0
  125. package/dist/urazuke/receipts.js.map +1 -0
  126. package/dist/urazuke/report.d.ts +23 -0
  127. package/dist/urazuke/report.d.ts.map +1 -0
  128. package/dist/urazuke/report.js +62 -0
  129. package/dist/urazuke/report.js.map +1 -0
  130. package/dist/urazuke/retro.d.ts +52 -0
  131. package/dist/urazuke/retro.d.ts.map +1 -0
  132. package/dist/urazuke/retro.js +145 -0
  133. package/dist/urazuke/retro.js.map +1 -0
  134. package/dist/urazuke/section.d.ts +43 -0
  135. package/dist/urazuke/section.d.ts.map +1 -0
  136. package/dist/urazuke/section.js +64 -0
  137. package/dist/urazuke/section.js.map +1 -0
  138. package/dist/urazuke/stacks.d.ts +42 -0
  139. package/dist/urazuke/stacks.d.ts.map +1 -0
  140. package/dist/urazuke/stacks.js +264 -0
  141. package/dist/urazuke/stacks.js.map +1 -0
  142. package/dist/urazuke/workflow.d.ts +23 -0
  143. package/dist/urazuke/workflow.d.ts.map +1 -0
  144. package/dist/urazuke/workflow.js +64 -0
  145. package/dist/urazuke/workflow.js.map +1 -0
  146. package/dist/version.d.ts +1 -1
  147. package/dist/version.js +1 -1
  148. package/dist/workflow/config.d.ts +9 -4
  149. package/dist/workflow/config.d.ts.map +1 -1
  150. package/dist/workflow/config.js +4 -1
  151. package/dist/workflow/config.js.map +1 -1
  152. package/dist/workflow/definitions.d.ts +20 -4
  153. package/dist/workflow/definitions.d.ts.map +1 -1
  154. package/dist/workflow/definitions.js +16 -3
  155. package/dist/workflow/definitions.js.map +1 -1
  156. package/dist/workflow/instances.d.ts.map +1 -1
  157. package/dist/workflow/instances.js +6 -0
  158. package/dist/workflow/instances.js.map +1 -1
  159. package/dist/workflow/orchestrator.d.ts +10 -1
  160. package/dist/workflow/orchestrator.d.ts.map +1 -1
  161. package/dist/workflow/orchestrator.js +54 -7
  162. package/dist/workflow/orchestrator.js.map +1 -1
  163. package/dist/workflow/select.d.ts +5 -1
  164. package/dist/workflow/select.d.ts.map +1 -1
  165. package/dist/workflow/select.js +16 -5
  166. package/dist/workflow/select.js.map +1 -1
  167. package/dist/workflow/state.d.ts +3 -2
  168. package/dist/workflow/state.d.ts.map +1 -1
  169. package/dist/workflow/state.js.map +1 -1
  170. package/docs/doctrine/urazuke.md +38 -0
  171. package/package.json +18 -20
  172. package/src/i18n/catalogs/ar.json +550 -542
  173. package/src/i18n/catalogs/de.json +550 -542
  174. package/src/i18n/catalogs/en.json +550 -542
  175. package/src/i18n/catalogs/es.json +550 -542
  176. package/src/i18n/catalogs/fr.json +550 -542
  177. package/src/i18n/catalogs/hi.json +550 -542
  178. package/src/i18n/catalogs/it.json +550 -542
  179. package/src/i18n/catalogs/ja.json +550 -542
  180. package/src/i18n/catalogs/pt.json +550 -542
  181. package/src/i18n/catalogs/zh.json +550 -542
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Where is the project on the ladder? Binds the catalogue, the workflow
3
+ * instances and the gate into one answer: the open Urazuke workflow, its
4
+ * current canonical task, the step/station it is, its mechanical result,
5
+ * and its prompts. Used by the prompt section, the verbs and the CLI.
6
+ *
7
+ * ASCII-only.
8
+ */
9
+ import { type UrazukeStep, type UrazukeStation } from './catalog.js';
10
+ import { type UrazukeStepResult } from './gate.js';
11
+ export interface UrazukeCurrent {
12
+ code: string;
13
+ kind: 'urazuke' | 'urazuke-legacy';
14
+ task_id: string;
15
+ step?: UrazukeStep;
16
+ station?: UrazukeStation;
17
+ prompts: readonly string[];
18
+ /** override | remote | cache | vendored */
19
+ prompt_source: string;
20
+ result: UrazukeStepResult;
21
+ remaining: number;
22
+ total: number;
23
+ }
24
+ /** The VENDORED prompts (offline, synchronous). Tests and fallbacks. */
25
+ export declare function promptsFor(step?: UrazukeStep, station?: UrazukeStation): readonly string[];
26
+ /** The EFFECTIVE prompts for a project: overrides > published > vendored
27
+ * (src/urazuke/prompts_client.ts). Never throws. */
28
+ export declare function promptsForProject(projectRoot: string | undefined, step?: UrazukeStep, station?: UrazukeStation): Promise<{
29
+ prompts: readonly string[];
30
+ source: string;
31
+ version: string;
32
+ }>;
33
+ /** The open Urazuke workflow of the project, or undefined. */
34
+ export declare function findUrazukeInstance(slug: string): Promise<{
35
+ code: string;
36
+ kind: 'urazuke' | 'urazuke-legacy';
37
+ closed: boolean;
38
+ } | undefined>;
39
+ /** The current step of the project (next open canonical task), evaluated. */
40
+ export declare function urazukeCurrent(slug: string, projectRoot: string): Promise<UrazukeCurrent | undefined>;
41
+ export interface LadderRow {
42
+ num: string;
43
+ title: string;
44
+ status: 'green' | 'red' | 'owner' | 'closed';
45
+ task_id?: string;
46
+ failing: string[];
47
+ }
48
+ /** Every step (or station + step) of the project's ladder with its
49
+ * mechanical status; closed tasks are reported as closed. */
50
+ export interface LadderAdHoc {
51
+ id: string;
52
+ title: string;
53
+ stage_id?: string;
54
+ closed: boolean;
55
+ }
56
+ export declare function urazukeLadder(slug: string, projectRoot: string): Promise<{
57
+ code?: string;
58
+ kind?: string;
59
+ rows: LadderRow[];
60
+ ad_hoc: LadderAdHoc[];
61
+ current_stage_id?: string;
62
+ }>;
63
+ //# sourceMappingURL=current.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../src/urazuke/current.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAEL,KAAK,WAAW,EAAE,KAAK,cAAc,EACtC,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAiC,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGlF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAWD,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,SAAS,MAAM,EAAE,CAE1F;AAED;qDACqD;AACrD,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAS/L;AAED,8DAA8D;AAC9D,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAWlJ;AAED,6EAA6E;AAC7E,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CA8B3G;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;8DAC8D;AAC9D,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAE9F,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkCrL"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Where is the project on the ladder? Binds the catalogue, the workflow
3
+ * instances and the gate into one answer: the open Urazuke workflow, its
4
+ * current canonical task, the step/station it is, its mechanical result,
5
+ * and its prompts. Used by the prompt section, the verbs and the CLI.
6
+ *
7
+ * ASCII-only.
8
+ */
9
+ import { urazukeStep, urazukeStation, URAZUKE_STEPS, URAZUKE_LEGACY_STATIONS, } from './catalog.js';
10
+ import { URAZUKE_PROMPTS } from './prompts.generated.js';
11
+ import { evaluateStep, evaluateStation } from './gate.js';
12
+ import { realProbes } from './probes.js';
13
+ function pick(table, step, station) {
14
+ if (step)
15
+ return table[step.prompt_key] ?? [];
16
+ if (station) {
17
+ const all = table[station.prompt_key] ?? [];
18
+ return station.prompt_indexes.map((i) => all[i]).filter((p) => typeof p === 'string');
19
+ }
20
+ return [];
21
+ }
22
+ /** The VENDORED prompts (offline, synchronous). Tests and fallbacks. */
23
+ export function promptsFor(step, station) {
24
+ return pick(URAZUKE_PROMPTS, step, station);
25
+ }
26
+ /** The EFFECTIVE prompts for a project: overrides > published > vendored
27
+ * (src/urazuke/prompts_client.ts). Never throws. */
28
+ export async function promptsForProject(projectRoot, step, station) {
29
+ try {
30
+ const { resolvePrompts } = await import('./prompts_client.js');
31
+ const r = await resolvePrompts(projectRoot);
32
+ const key = step?.prompt_key ?? station?.prompt_key ?? '';
33
+ return { prompts: pick(r.prompts, step, station), source: r.source[key] ?? 'vendored', version: r.version };
34
+ }
35
+ catch {
36
+ return { prompts: pick(URAZUKE_PROMPTS, step, station), source: 'vendored', version: 'vendored' };
37
+ }
38
+ }
39
+ /** The open Urazuke workflow of the project, or undefined. */
40
+ export async function findUrazukeInstance(slug) {
41
+ const { listInstances } = await import('../workflow/instances.js');
42
+ const isUz = (i) => i.kind === 'urazuke' || i.kind === 'urazuke-legacy';
43
+ const open = (await listInstances(slug, 'open')).find(isUz);
44
+ if (open)
45
+ return { code: open.code, kind: open.kind, closed: false };
46
+ /* The ladder does not vanish when the last step closes: the finished
47
+ * ladder stays visible (and the receipt gate keeps applying to the plan
48
+ * of a project built with the method). Found on 2026-10-19: Turnera
49
+ * closed 24/24 and the Urazuke tab disappeared from the panel. */
50
+ const closed = (await listInstances(slug, 'closed')).filter(isUz).sort((a, b) => (b.closed_at ?? 0) - (a.closed_at ?? 0))[0];
51
+ return closed ? { code: closed.code, kind: closed.kind, closed: true } : undefined;
52
+ }
53
+ /** The current step of the project (next open canonical task), evaluated. */
54
+ export async function urazukeCurrent(slug, projectRoot) {
55
+ const inst = await findUrazukeInstance(slug);
56
+ if (!inst)
57
+ return undefined;
58
+ const { workflowTasks } = await import('../workflow/orchestrator.js');
59
+ const all = await workflowTasks(slug, inst.code, 'all');
60
+ const canonical = all.filter((t) => !t.workflow?.ad_hoc && t.workflow?.urazuke);
61
+ const open = canonical.filter((t) => t.closed_at === undefined);
62
+ const task = open[0];
63
+ if (!task || !task.workflow?.urazuke)
64
+ return undefined;
65
+ const link = task.workflow.urazuke;
66
+ const probes = realProbes(slug);
67
+ let step;
68
+ let station;
69
+ let result;
70
+ if (link.step != null) {
71
+ step = urazukeStep(link.step);
72
+ if (!step)
73
+ return undefined;
74
+ result = await evaluateStep(step, { projectRoot, probes });
75
+ }
76
+ else if (link.station != null) {
77
+ station = urazukeStation(link.station);
78
+ if (!station)
79
+ return undefined;
80
+ result = await evaluateStation(station, { projectRoot, probes });
81
+ }
82
+ else
83
+ return undefined;
84
+ const eff = await promptsForProject(projectRoot, step, station);
85
+ return {
86
+ code: inst.code, kind: inst.kind, task_id: task.id,
87
+ ...(step ? { step } : {}), ...(station ? { station } : {}),
88
+ prompts: eff.prompts, prompt_source: eff.source, result,
89
+ remaining: open.length, total: canonical.length,
90
+ };
91
+ }
92
+ export async function urazukeLadder(slug, projectRoot) {
93
+ const inst = await findUrazukeInstance(slug);
94
+ const probes = realProbes(slug);
95
+ const byStep = new Map();
96
+ /* The ad-hoc tasks hung on a stage during the workflow (the Workflow tab
97
+ * used to show them; the ladder replaces that tab, so it shows them too). */
98
+ const adHoc = [];
99
+ let currentStage;
100
+ if (inst) {
101
+ const { workflowTasks } = await import('../workflow/orchestrator.js');
102
+ for (const t of await workflowTasks(slug, inst.code, 'all')) {
103
+ const u = t.workflow?.urazuke;
104
+ if (t.workflow?.ad_hoc) {
105
+ adHoc.push({ id: t.id, title: t.title, ...(t.workflow.stage_id ? { stage_id: t.workflow.stage_id } : {}), closed: t.closed_at !== undefined });
106
+ continue;
107
+ }
108
+ if (!u)
109
+ continue;
110
+ byStep.set(u.step != null ? 's' + u.step : 'n' + u.station, { id: t.id, closed: t.closed_at !== undefined, ...(t.workflow?.stage_id ? { stage_id: t.workflow.stage_id } : {}) });
111
+ if (!currentStage && t.closed_at === undefined && t.workflow?.stage_id)
112
+ currentStage = t.workflow.stage_id;
113
+ }
114
+ }
115
+ const rows = [];
116
+ const legacy = inst?.kind === 'urazuke-legacy';
117
+ if (legacy) {
118
+ for (const st of URAZUKE_LEGACY_STATIONS) {
119
+ const t = byStep.get('n' + st.num);
120
+ const r = await evaluateStation(st, { projectRoot, probes });
121
+ rows.push({ num: 'N' + st.num, title: st.title, status: t?.closed ? 'closed' : r.status, ...(t ? { task_id: t.id } : {}), failing: r.checks.filter((c) => c.status === 'fail').map((c) => c.detail) });
122
+ }
123
+ }
124
+ for (const s of URAZUKE_STEPS) {
125
+ if (legacy && s.num < 5)
126
+ continue;
127
+ const t = byStep.get('s' + s.num);
128
+ const r = await evaluateStep(s, { projectRoot, probes });
129
+ rows.push({ num: String(s.num).padStart(2, '0'), title: s.title, status: t?.closed ? 'closed' : r.status, ...(t ? { task_id: t.id } : {}), failing: r.checks.filter((c) => c.status === 'fail').map((c) => c.detail) });
130
+ }
131
+ return { ...(inst ? { code: inst.code, kind: inst.kind } : {}), rows, ad_hoc: adHoc, ...(currentStage ? { current_stage_id: currentStage } : {}) };
132
+ }
133
+ //# sourceMappingURL=current.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.js","sourceRoot":"","sources":["../../src/urazuke/current.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ export interface CycleConfig {
2
+ version: 1;
3
+ /** How often the timer runs (informative; the timer unit carries it). */
4
+ every_days?: number;
5
+ /** A read-only COUNT query against the project's .forge/db.json. */
6
+ count_sql?: string;
7
+ /** D-039: a read-only query returning the first and the last timestamp
8
+ * the count spans, as two columns (e.g. `SELECT MIN(created_at) AS a,
9
+ * MAX(created_at) AS b FROM turnos`). With it the window is read from
10
+ * the database; without it a hand-typed `over_days` is used and the
11
+ * report says so. */
12
+ window_sql?: string;
13
+ /** Over how many days the counted rows accumulated (hand-typed; only
14
+ * used when `window_sql` is absent). */
15
+ over_days?: number;
16
+ /** Where the number comes from (the method refuses an unsourced number). */
17
+ source?: string;
18
+ bytes_per_row?: number;
19
+ /** D-038: the sources under which the PRODUCT captures its errors. When
20
+ * set, only these count; when absent, everything but the panel's own
21
+ * sources counts. */
22
+ product_error_sources?: string[];
23
+ }
24
+ export interface CycleState {
25
+ version: 1;
26
+ last_run?: number;
27
+ runs: number;
28
+ }
29
+ export interface CycleMeasured {
30
+ rows_total: number;
31
+ over_days: number;
32
+ source: string;
33
+ bytes_per_row?: number;
34
+ /** D-039: where the window comes from. `db` = read with window_sql
35
+ * (first/last timestamps on record); `manual` = typed by the operator,
36
+ * which only warns and never opens a pending item on its own. */
37
+ window?: 'db' | 'manual';
38
+ window_from?: string;
39
+ window_to?: string;
40
+ }
41
+ export interface CycleResult {
42
+ file: string;
43
+ window: {
44
+ since: number;
45
+ until: number;
46
+ };
47
+ measured?: CycleMeasured;
48
+ drift?: {
49
+ ok: boolean;
50
+ verdict: string;
51
+ ratio?: number;
52
+ declared?: number;
53
+ observed?: number;
54
+ };
55
+ errors: {
56
+ support_reports: number;
57
+ distinct_messages: string[];
58
+ receipts_not_ok: number;
59
+ open_bugs: number;
60
+ tool_reports: number;
61
+ };
62
+ changes_journaled: number;
63
+ ladder?: {
64
+ closed: number;
65
+ red: number;
66
+ total: number;
67
+ };
68
+ pendings_opened: string[];
69
+ blind_spots: string[];
70
+ }
71
+ export declare function cycleConfigPath(root: string): string;
72
+ export declare function readCycleConfig(root: string): Promise<CycleConfig>;
73
+ export interface CycleOptions {
74
+ measured?: CycleMeasured;
75
+ now?: number;
76
+ /** Default: since the last run, or 30 days. */
77
+ since?: number;
78
+ /** Do not open pendings (dry run). */
79
+ no_pendings?: boolean;
80
+ }
81
+ /** Sources the panel UI reports under: its own network and script errors.
82
+ * Product-side captures (the embed, a declared error log) use other names. */
83
+ export declare const PANEL_INTERNAL_SOURCES: Set<string>;
84
+ export declare function isPanelInternal(source: string | undefined): boolean;
85
+ export declare function runCycle(slug: string, root: string, opts?: CycleOptions): Promise<CycleResult>;
86
+ /** systemd units for the cycle on a server: a oneshot service + a timer. */
87
+ export declare function cycleUnits(name: string, deployDir: string, everyDays?: number): {
88
+ service: string;
89
+ timer: string;
90
+ };
91
+ //# sourceMappingURL=cycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycle.d.ts","sourceRoot":"","sources":["../../src/urazuke/cycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * THE CYCLIC REPORT (Urazuke steps 21 + 22) -- and the sizing revalidation
3
+ * tied to it (closes the gap left open in knowledge graph 8.12).
4
+ *
5
+ * Every cycle (a timer on the server, or `yf urazuke cycle` by hand) Forge:
6
+ * 1. measures the real row count when it can (a COUNT(*) declared in
7
+ * .forge/cycle.json, run through the read-only db path) or takes the
8
+ * number the operator passes, and re-runs the sizing drift check;
9
+ * 2. gathers the errors of the window (support reports, receipts with a
10
+ * NOT OK verdict, open bugs) and the configuration changes journaled by
11
+ * operate mode;
12
+ * 3. writes docs/MONITORING_REPORT_<date>.md with the numbers;
13
+ * 4. opens ONE pending per thing that needs a hand: a sizing out of its
14
+ * envelope, each distinct new error without a pending ("ningun error
15
+ * sin pendiente").
16
+ * What Forge cannot measure it says so, in the report, as a blind spot.
17
+ *
18
+ * ASCII-only.
19
+ */
20
+ import fs from 'node:fs/promises';
21
+ import path from 'node:path';
22
+ export function cycleConfigPath(root) { return path.join(root, '.forge', 'cycle.json'); }
23
+ function statePath(root) { return path.join(root, '.forge', 'cycle-state.json'); }
24
+ export async function readCycleConfig(root) {
25
+ try {
26
+ const c = JSON.parse(await fs.readFile(cycleConfigPath(root), 'utf8'));
27
+ if (c && c.version === 1)
28
+ return c;
29
+ }
30
+ catch { /* none */ }
31
+ return { version: 1 };
32
+ }
33
+ async function readState(root) {
34
+ try {
35
+ const s = JSON.parse(await fs.readFile(statePath(root), 'utf8'));
36
+ if (s && s.version === 1)
37
+ return { ...s, runs: s.runs ?? 0 };
38
+ }
39
+ catch { /* none */ }
40
+ return { version: 1, runs: 0 };
41
+ }
42
+ async function writeState(root, s) {
43
+ await fs.mkdir(path.dirname(statePath(root)), { recursive: true });
44
+ await fs.writeFile(statePath(root), JSON.stringify(s, null, 2) + '\n', 'utf8');
45
+ }
46
+ /** Run the declared COUNT query through the read-only db path. */
47
+ async function measureFromDb(root, cfg) {
48
+ if (!cfg.count_sql)
49
+ return undefined;
50
+ try {
51
+ const { runDbQuery } = await import('../chat/tools/db_query.js');
52
+ let win;
53
+ if (cfg.window_sql) {
54
+ try {
55
+ const w = await runDbQuery({ sql: cfg.window_sql, limit: 1 }, { projectRoot: root });
56
+ const row0 = (w.result?.rows ?? [])[0] ?? {};
57
+ const raw = Array.isArray(row0) ? row0 : Object.values(row0);
58
+ const vals = raw.map((v) => String(v ?? '')).filter(Boolean);
59
+ const a = Date.parse(vals[0] ?? '');
60
+ const b = Date.parse(vals[1] ?? '');
61
+ if (!Number.isNaN(a) && !Number.isNaN(b) && b >= a) {
62
+ win = { over_days: Math.max(1, Math.round((b - a) / 86400000)), from: new Date(a).toISOString().slice(0, 10), to: new Date(b).toISOString().slice(0, 10) };
63
+ }
64
+ }
65
+ catch { /* window stays manual */ }
66
+ }
67
+ const r = await runDbQuery({ sql: cfg.count_sql, limit: 1 }, { projectRoot: root });
68
+ if (r.is_error)
69
+ return undefined;
70
+ const res = r.result;
71
+ const first = res.rows?.[0]?.[0];
72
+ const n = typeof first === 'number' ? first : Number(first);
73
+ if (!Number.isFinite(n))
74
+ return undefined;
75
+ return {
76
+ rows_total: n, over_days: win ? win.over_days : (cfg.over_days ?? 365),
77
+ source: cfg.source ?? ('count_sql: ' + cfg.count_sql), ...(cfg.bytes_per_row ? { bytes_per_row: cfg.bytes_per_row } : {}),
78
+ window: win ? 'db' : 'manual', ...(win ? { window_from: win.from, window_to: win.to } : {}),
79
+ };
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ }
85
+ /** Sources the panel UI reports under: its own network and script errors.
86
+ * Product-side captures (the embed, a declared error log) use other names. */
87
+ export const PANEL_INTERNAL_SOURCES = new Set(['window.onerror', 'fetch', 'unhandled', 'panel', 'mobile-voice', 'mobile-relay']);
88
+ export function isPanelInternal(source) {
89
+ return PANEL_INTERNAL_SOURCES.has((source ?? 'panel').trim());
90
+ }
91
+ export async function runCycle(slug, root, opts = {}) {
92
+ const now = opts.now ?? Date.now();
93
+ const cfg = await readCycleConfig(root);
94
+ const state = await readState(root);
95
+ const since = opts.since ?? state.last_run ?? (now - 30 * 24 * 3600 * 1000);
96
+ const blind = [];
97
+ const opened = [];
98
+ /* 1. sizing drift */
99
+ const measured = opts.measured ?? await measureFromDb(root, cfg);
100
+ let drift;
101
+ if (measured) {
102
+ try {
103
+ const { checkDrift } = await import('../sizing/store.js');
104
+ const d = await checkDrift(slug, { rows_total: measured.rows_total, over_days: measured.over_days, source: measured.source, ...(measured.bytes_per_row ? { bytes_per_row: measured.bytes_per_row } : {}) });
105
+ drift = { ok: d.ok, verdict: d.verdict, ratio: d.ratio, declared: d.declared_rows_per_year, observed: d.observed_rows_per_year };
106
+ }
107
+ catch (e) {
108
+ drift = { ok: false, verdict: 'drift check failed: ' + (e instanceof Error ? e.message : String(e)) };
109
+ }
110
+ }
111
+ else {
112
+ blind.push('sizing not revalidated: no measured row count (declare count_sql in .forge/cycle.json or pass --rows/--over-days/--source)');
113
+ }
114
+ /* D-039: a hand-typed window only warns. Found on 2026-10-19 (inherited
115
+ * Turnera): 30,000 rows of three years passed as one year opened a false
116
+ * drift pending. */
117
+ const manualWindow = !!measured && measured.window !== 'db';
118
+ if (manualWindow)
119
+ blind.push('the sizing window (' + measured.over_days + ' days) was typed by hand, not read from the database (declare window_sql in .forge/cycle.json): a drift from it only warns, it opens no pending item');
120
+ /* 2. errors + changes. Only the PRODUCT's errors count: the panel's own
121
+ * sources (a fetch that failed because the panel server was down, a
122
+ * window.onerror in the chat UI) are Forge's problem, not the owner's.
123
+ * Found on 2026-10-19: the first cycle of the Turnera practice opened
124
+ * six "bugs" that were the panel talking to a server that was off. */
125
+ let supportReports = 0;
126
+ let panelReports = 0;
127
+ const messages = new Map();
128
+ const toolMessages = new Map();
129
+ const productSources = (cfg.product_error_sources ?? []).map((s) => s.trim()).filter(Boolean);
130
+ try {
131
+ const { readReports } = await import('../support/reports.js');
132
+ for (const r of await readReports()) {
133
+ const t = Date.parse(r.ts);
134
+ if (!(t >= since && t <= now) || r.level !== 'error')
135
+ continue;
136
+ const isTool = productSources.length ? !productSources.includes((r.source ?? 'panel').trim()) : isPanelInternal(r.source);
137
+ if (isTool) {
138
+ panelReports += 1;
139
+ const tk = ((r.source ?? 'panel') + ': ' + r.message.replace(/\d+/g, '#')).slice(0, 120);
140
+ toolMessages.set(tk, (toolMessages.get(tk) ?? 0) + 1);
141
+ continue;
142
+ }
143
+ supportReports += 1;
144
+ const key = r.message.replace(/\d+/g, '#').slice(0, 120);
145
+ messages.set(key, (messages.get(key) ?? 0) + 1);
146
+ }
147
+ }
148
+ catch {
149
+ blind.push('support reports unreadable');
150
+ }
151
+ /* D-038: the tool's errors are listed apart (section below), never as product errors. */
152
+ let receiptsNotOk = 0;
153
+ try {
154
+ const { readReceipts } = await import('./receipts.js');
155
+ receiptsNotOk = (await readReceipts(slug)).items.filter((r) => r.verdict !== 'ok' && r.started_at >= since && r.started_at <= now).length;
156
+ }
157
+ catch { /* none */ }
158
+ let openBugs = 0;
159
+ let openTitles = new Set();
160
+ try {
161
+ const { listPending } = await import('../pending/store.js');
162
+ const open = await listPending(slug, { status: 'open' });
163
+ openBugs = open.filter((p) => p.category === 'bug').length;
164
+ openTitles = new Set(open.map((p) => p.title));
165
+ }
166
+ catch { /* none */ }
167
+ let changes = 0;
168
+ try {
169
+ const raw = await fs.readFile(path.join(root, '.forge', 'changes', 'changes.jsonl'), 'utf8');
170
+ for (const line of raw.split('\n')) {
171
+ if (!line.trim())
172
+ continue;
173
+ try {
174
+ const j = JSON.parse(line);
175
+ const t = j.ts ? Date.parse(j.ts) : NaN;
176
+ if (t >= since && t <= now)
177
+ changes += 1;
178
+ }
179
+ catch { /* skip */ }
180
+ }
181
+ }
182
+ catch { /* no journal */ }
183
+ if (!cfg.count_sql && !opts.measured)
184
+ blind.push('resource usage (cpu, memory, disk, slow queries) is not measured by Forge: wire the host metrics or the db slow log into this report');
185
+ /* 3. ladder */
186
+ let ladder;
187
+ try {
188
+ const { urazukeLadder } = await import('./current.js');
189
+ const l = await urazukeLadder(slug, root);
190
+ ladder = { closed: l.rows.filter((r) => r.status === 'closed').length, red: l.rows.filter((r) => r.status === 'red').length, total: l.rows.length };
191
+ }
192
+ catch { /* none */ }
193
+ /* 4. pendings: one per thing that needs a hand */
194
+ if (!opts.no_pendings) {
195
+ try {
196
+ const { addPending } = await import('../pending/store.js');
197
+ if (drift && !drift.ok && measured && !manualWindow) {
198
+ const title = 'Dimensionamiento fuera de envoltura (reporte ciclico)';
199
+ if (!openTitles.has(title)) {
200
+ const p = await addPending(slug, { title, category: 'infra', priority: 10, body: drift.verdict + '\n\nMedido: ' + measured.rows_total + ' filas en ' + measured.over_days + ' dias (' + measured.source + '). Revisar con yujin.sizing.show / yujin.sizing.record.' });
201
+ opened.push(p.id);
202
+ }
203
+ }
204
+ const top = [...messages.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10);
205
+ for (const [msg, n] of top) {
206
+ const title = '[error] ' + msg;
207
+ if (openTitles.has(title))
208
+ continue;
209
+ const p = await addPending(slug, { title, category: 'bug', priority: 20, body: n + ' ocurrencia(s) en la ventana del reporte ciclico. Ningun error sin pendiente (peldano 22).' });
210
+ opened.push(p.id);
211
+ }
212
+ }
213
+ catch {
214
+ blind.push('could not open pendings for the findings');
215
+ }
216
+ }
217
+ /* 5. the report */
218
+ const date = new Date(now).toISOString().slice(0, 10);
219
+ const file = path.join(root, 'docs', 'MONITORING_REPORT_' + date + '.md');
220
+ const row = (k, v) => '| ' + k + ' | ' + v + ' |';
221
+ const lines = [
222
+ '# Reporte ciclico ' + date + ' (ventana ' + new Date(since).toISOString().slice(0, 10) + ' .. ' + date + ')',
223
+ '',
224
+ 'Generado por `yf urazuke cycle`. Los numeros salen de los registros de Forge y, cuando esta',
225
+ 'declarado, de una consulta de solo lectura a la base. Lo que no se pudo medir esta en puntos ciegos.',
226
+ '',
227
+ '## Dimensionamiento (peldano 3, revalidado cada ciclo)',
228
+ '',
229
+ measured
230
+ ? '- medido: ' + measured.rows_total + ' filas en ' + measured.over_days + ' dias (' + measured.source + ')'
231
+ : '- sin medicion este ciclo',
232
+ measured
233
+ ? (measured.window === 'db'
234
+ ? '- ventana: leida de la base, ' + measured.window_from + ' .. ' + measured.window_to + ' (D-039)'
235
+ : '- ventana: ESCRITA A MANO (' + measured.over_days + ' dias); un desvio sobre esta ventana solo avisa, no abre pendiente (D-039)')
236
+ : '- ventana: sin medicion',
237
+ drift ? '- veredicto: ' + (drift.ok ? 'ADMISIBLE' : 'FUERA DE ENVOLTURA') + ' -- ' + drift.verdict + (drift.ratio != null ? ' (ratio ' + drift.ratio + ', declarado ' + drift.declared + ' filas/ano, observado ' + drift.observed + ')' : '') : '- veredicto: no evaluado',
238
+ '',
239
+ '## Errores (peldano 22)',
240
+ '',
241
+ '| Medida | Valor |',
242
+ '|---|---|',
243
+ row('Reportes de error (support) en la ventana', supportReports),
244
+ row('Mensajes distintos', messages.size),
245
+ row('Recibos con veredicto NOT OK', receiptsNotOk),
246
+ row('Bugs abiertos hoy', openBugs),
247
+ row('Pendientes abiertos por este reporte', opened.length ? opened.join(', ') : 0),
248
+ '',
249
+ '## Errores de la herramienta (fuera del producto, D-038)',
250
+ '',
251
+ '_Los errores del panel de Forge, del agente residente y del propio monitoreo se listan aparte y no abren pendientes._',
252
+ '',
253
+ ...(panelReports
254
+ ? [row('Reportes en la ventana', panelReports), ...[...toolMessages.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10).map(([m, n]) => '- ' + n + ' x ' + m)]
255
+ : ['- ninguno en la ventana']),
256
+ '',
257
+ '## Cambios de configuracion journalizados (operate mode)',
258
+ '',
259
+ row('Cambios en la ventana', changes).replace('| ', '- ').replace(' |', '').replace(' | ', ': '),
260
+ '',
261
+ '## Escalera',
262
+ '',
263
+ ladder ? '- ' + ladder.closed + ' cerrados, ' + ladder.red + ' en rojo de ' + ladder.total : '- sin workflow urazuke',
264
+ '',
265
+ '## Puntos ciegos',
266
+ '',
267
+ ...(blind.length ? blind.map((b) => '- ' + b) : ['- ninguno declarado']),
268
+ '',
269
+ ];
270
+ await fs.mkdir(path.dirname(file), { recursive: true });
271
+ await fs.writeFile(file, lines.join('\n'), 'utf8');
272
+ await writeState(root, { version: 1, last_run: now, runs: state.runs + 1 });
273
+ return {
274
+ file, window: { since, until: now }, ...(measured ? { measured } : {}), ...(drift ? { drift } : {}),
275
+ errors: { support_reports: supportReports, distinct_messages: [...messages.keys()], receipts_not_ok: receiptsNotOk, open_bugs: openBugs, tool_reports: panelReports },
276
+ changes_journaled: changes, ...(ladder ? { ladder } : {}), pendings_opened: opened, blind_spots: blind,
277
+ };
278
+ }
279
+ /** systemd units for the cycle on a server: a oneshot service + a timer. */
280
+ export function cycleUnits(name, deployDir, everyDays = 7) {
281
+ const service = [
282
+ '[Unit]',
283
+ 'Description=Forge Embedded cyclic report (' + name + ')',
284
+ 'After=network.target',
285
+ '',
286
+ '[Service]',
287
+ 'Type=oneshot',
288
+ 'User=CHANGE_ME',
289
+ 'WorkingDirectory=' + deployDir,
290
+ 'Environment=YF_ENV=prod',
291
+ 'Environment=PATH=/usr/local/bin:/usr/bin:/bin',
292
+ 'ExecStart=/usr/bin/env yf urazuke cycle --cwd ' + deployDir,
293
+ '',
294
+ ].join('\n');
295
+ const timer = [
296
+ '[Unit]',
297
+ 'Description=Forge Embedded cyclic report timer (' + name + ', every ' + everyDays + ' days)',
298
+ '',
299
+ '[Timer]',
300
+ 'OnBootSec=15min',
301
+ 'OnUnitActiveSec=' + everyDays + 'd',
302
+ 'Persistent=true',
303
+ '',
304
+ '[Install]',
305
+ 'WantedBy=timers.target',
306
+ '',
307
+ ].join('\n');
308
+ return { service, timer };
309
+ }
310
+ //# sourceMappingURL=cycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycle.js","sourceRoot":"","sources":["../../src/urazuke/cycle.ts"],"names":[],"mappings":"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"}