@nac3/forge-cli 1.23.4 → 1.23.5

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 (61) hide show
  1. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  2. package/dist/chat/doctrine_digest.js +4 -1
  3. package/dist/chat/doctrine_digest.js.map +1 -1
  4. package/dist/chat/tools/evidence.d.ts +34 -2
  5. package/dist/chat/tools/evidence.d.ts.map +1 -1
  6. package/dist/chat/tools/evidence.js +90 -12
  7. package/dist/chat/tools/evidence.js.map +1 -1
  8. package/dist/commands/urazuke.d.ts.map +1 -1
  9. package/dist/commands/urazuke.js +27 -0
  10. package/dist/commands/urazuke.js.map +1 -1
  11. package/dist/core/error_catalog.d.ts +4 -0
  12. package/dist/core/error_catalog.d.ts.map +1 -1
  13. package/dist/core/error_catalog.js +16 -0
  14. package/dist/core/error_catalog.js.map +1 -1
  15. package/dist/core/loopback_post.d.ts +101 -0
  16. package/dist/core/loopback_post.d.ts.map +1 -0
  17. package/dist/core/loopback_post.js +156 -0
  18. package/dist/core/loopback_post.js.map +1 -0
  19. package/dist/docs/doctrine/urazuke.md +50 -38
  20. package/dist/mcp/forge_panel_server.d.ts +1 -26
  21. package/dist/mcp/forge_panel_server.d.ts.map +1 -1
  22. package/dist/mcp/forge_panel_server.js +5 -26
  23. package/dist/mcp/forge_panel_server.js.map +1 -1
  24. package/dist/mcp/forge_verbs_server.d.ts +1 -11
  25. package/dist/mcp/forge_verbs_server.d.ts.map +1 -1
  26. package/dist/mcp/forge_verbs_server.js +7 -23
  27. package/dist/mcp/forge_verbs_server.js.map +1 -1
  28. package/dist/mcp/panel_invoke.d.ts +51 -0
  29. package/dist/mcp/panel_invoke.d.ts.map +1 -0
  30. package/dist/mcp/panel_invoke.js +102 -0
  31. package/dist/mcp/panel_invoke.js.map +1 -0
  32. package/dist/nac3/internal_manifest.d.ts +2 -0
  33. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  34. package/dist/nac3/internal_manifest.js +18 -3
  35. package/dist/nac3/internal_manifest.js.map +1 -1
  36. package/dist/nac3/verb_budget.d.ts +110 -0
  37. package/dist/nac3/verb_budget.d.ts.map +1 -0
  38. package/dist/nac3/verb_budget.js +142 -0
  39. package/dist/nac3/verb_budget.js.map +1 -0
  40. package/dist/relay/loopback_turn.d.ts +15 -42
  41. package/dist/relay/loopback_turn.d.ts.map +1 -1
  42. package/dist/relay/loopback_turn.js +27 -115
  43. package/dist/relay/loopback_turn.js.map +1 -1
  44. package/dist/urazuke/evidence.d.ts +22 -0
  45. package/dist/urazuke/evidence.d.ts.map +1 -1
  46. package/dist/urazuke/evidence.js +42 -3
  47. package/dist/urazuke/evidence.js.map +1 -1
  48. package/dist/version.d.ts +1 -1
  49. package/dist/version.js +1 -1
  50. package/docs/doctrine/urazuke.md +50 -38
  51. package/package.json +1 -1
  52. package/src/i18n/catalogs/ar.json +3 -0
  53. package/src/i18n/catalogs/de.json +3 -0
  54. package/src/i18n/catalogs/en.json +3 -0
  55. package/src/i18n/catalogs/es.json +3 -0
  56. package/src/i18n/catalogs/fr.json +3 -0
  57. package/src/i18n/catalogs/hi.json +3 -0
  58. package/src/i18n/catalogs/it.json +3 -0
  59. package/src/i18n/catalogs/ja.json +3 -0
  60. package/src/i18n/catalogs/pt.json +3 -0
  61. package/src/i18n/catalogs/zh.json +3 -0
@@ -1,38 +1,50 @@
1
- # Urazuke -- the evidence method, as Forge runs it
2
-
3
- Urazuke (github.com/pkuschnirof/urazuke) is the method behind every project
4
- Forge builds or maintains: 24 ordered steps in four stretches, each with an
5
- exact prompt, the inputs the owner prepares, the artifacts the agent leaves
6
- in the repository, and a completion check the owner does WITHOUT reading
7
- code. An existing system built without it goes through eight normalisation
8
- stations (N0..N7) first and enters the loop at step 5.
9
-
10
- ## What is mechanical (not prose)
11
-
12
- - The project's workflow is `urazuke` (no code) or `urazuke-legacy` (code
13
- without the method's artifacts). Every canonical task carries its step.
14
- - The CURRENT step's prompt is injected into your system prompt every turn,
15
- with the state of its checks (section "URAZUKE -- peldano NN"). Act on
16
- that prompt as if the owner had pasted it. Do not skip ahead.
17
- - A canonical task closes ONLY when `evaluateStep()` is GREEN: the files
18
- the step names exist, are not stubs, say what they must; the sizing
19
- record is admissible (G9); the plan items carry a spec; the evidence
20
- receipts exist. `yujin.pending.close` refuses a red step. An override
21
- needs the OWNER's written `force_reason` (kept in history); never pass
22
- one on your own initiative.
23
- - Evidence is a RECEIPT Forge records (command, ref, exit code, counts),
24
- never your summary. "Tests pass" without a receipt is a claim.
25
-
26
- ## How to work inside it
27
-
28
- 1. Read the URAZUKE section: red checks are what is missing. Produce the
29
- artifact at the path named, with real content, or ask the owner for the
30
- input that is theirs (`antes de enviar`). Never invent an owner input.
31
- 2. When the section says GREEN, close the task with `yujin.pending.close`
32
- (full expediente) and the next step's prompt arrives on the next turn.
33
- 3. `yujin.urazuke.status` shows the whole ladder; `yujin.urazuke.step`
34
- shows any step in full (prompts, inputs, artifacts, checklist).
35
- 4. The plan is the pendings: each item needs `spec` (acceptance "given /
36
- when / then" + `how_verified`) before it is implemented (step 5).
37
- 5. No deadlines, ever: the method fixes the order and the gates, not the
38
- calendar. Speed is a consequence, not the objective.
1
+ # Urazuke -- the evidence method, as Forge runs it
2
+
3
+ Urazuke (github.com/pkuschnirof/urazuke) is the method behind every project
4
+ Forge builds or maintains: 24 ordered steps in four stretches, each with an
5
+ exact prompt, the inputs the owner prepares, the artifacts the agent leaves
6
+ in the repository, and a completion check the owner does WITHOUT reading
7
+ code. An existing system built without it goes through eight normalisation
8
+ stations (N0..N7) first and enters the loop at step 5.
9
+
10
+ ## What is mechanical (not prose)
11
+
12
+ - The project's workflow is `urazuke` (no code) or `urazuke-legacy` (code
13
+ without the method's artifacts). Every canonical task carries its step.
14
+ - The CURRENT step's prompt is injected into your system prompt every turn,
15
+ with the state of its checks (section "URAZUKE -- peldano NN"). Act on
16
+ that prompt as if the owner had pasted it. Do not skip ahead.
17
+ - A canonical task closes ONLY when `evaluateStep()` is GREEN: the files
18
+ the step names exist, are not stubs, say what they must; the sizing
19
+ record is admissible (G9); the plan items carry a spec; the evidence
20
+ receipts exist. `yujin.pending.close` refuses a red step. An override
21
+ needs the OWNER's written `force_reason` (kept in history); never pass
22
+ one on your own initiative.
23
+ - Evidence is a RECEIPT Forge records (command, ref, exit code, counts),
24
+ never your summary. "Tests pass" without a receipt is a claim.
25
+ - A LONG run leaves its receipt the same way. `yujin.evidence.run` blocks
26
+ the turn only while the run fits the blocking window (10 min, lowered with
27
+ `limits.claude_cli_silence_ms`); over that, or with `background: true`, it
28
+ is launched detached and returns a HANDLE. That is not a degraded mode:
29
+ the receipt is written by whoever runs, not by whoever waits. Read it with
30
+ `yujin.evidence.list` when the task finishes (`yujin.task.status({id})`
31
+ for the progress). Do NOT relaunch a run that already has a handle.
32
+ - And the corollary for any invocation that dies waiting: a verb call that
33
+ comes back UNANSWERED (E_VERB_CALL_UNANSWERED) did not necessarily fail.
34
+ Before redoing the work, LOOK FOR THE TRACE -- `yujin.evidence.list` for a
35
+ receipt, `yujin.task.list` for a task. Two closes were reported as
36
+ "believed" over a receipt that existed on disk the whole time.
37
+
38
+ ## How to work inside it
39
+
40
+ 1. Read the URAZUKE section: red checks are what is missing. Produce the
41
+ artifact at the path named, with real content, or ask the owner for the
42
+ input that is theirs (`antes de enviar`). Never invent an owner input.
43
+ 2. When the section says GREEN, close the task with `yujin.pending.close`
44
+ (full expediente) and the next step's prompt arrives on the next turn.
45
+ 3. `yujin.urazuke.status` shows the whole ladder; `yujin.urazuke.step`
46
+ shows any step in full (prompts, inputs, artifacts, checklist).
47
+ 4. The plan is the pendings: each item needs `spec` (acceptance "given /
48
+ when / then" + `how_verified`) before it is implemented (step 5).
49
+ 5. No deadlines, ever: the method fixes the order and the gates, not the
50
+ calendar. Speed is a consequence, not the objective.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "1.23.4",
3
+ "version": "1.23.5",
4
4
  "description": "Yujin Forge -- voice-first NAC-3 React development framework. CLI + chat panel + spec ingest + 10-format document reader + voice loop.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Pablo Kuschnirof <pablo@rpaforce.com>",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "خادم المحادثة في سطح المكتب لم يكن يستمع على المنفذ {port}. لم يُنفَّذ أي شيء هنا.",
136
136
  "error.mobile_turn_undelivered.fix": "افتح لوحة Forge على سطح المكتب (أو شغّلها بـ yf chat) ثم أعد إرسال الطلب.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "لم يُرجع استدعاء {verb} أي استجابة خلال {minutes} دقيقة.",
139
+ "error.verb_call_unanswered.why": "ما انتهت مدته هو الانتظار لا العمل: قد يستمر هذا الفعل في العمل على جانب Forge وينتهي بنجاح.",
140
+ "error.verb_call_unanswered.fix": "لا تُعد المحاولة بشكل أعمى. إذا كان الفعل يترك أثرًا فاقرأ الأثر أولًا: yujin.evidence.list للإيصال، وyujin.task.list للمهمة الخلفية.",
138
141
  "panel.button.agents": "الوكلاء",
139
142
  "panel.agents.title": "الوكلاء",
140
143
  "panel.agents.subtitle": "المدير والوكلاء الفرعيون المسجلون في هذا المشروع",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "Der Chat-Server des Desktops lauschte nicht auf Port {port}. Hier wurde nichts ausgefuehrt.",
136
136
  "error.mobile_turn_undelivered.fix": "Oeffne das Forge-Panel auf dem Desktop (oder starte es mit yf chat) und sende die Anfrage erneut.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "Der Aufruf von {verb} hat in {minutes} Minuten keine Antwort geliefert.",
139
+ "error.verb_call_unanswered.why": "Abgelaufen ist das Warten, nicht die Arbeit: das Verb kann auf der Forge-Seite weiterlaufen und korrekt enden.",
140
+ "error.verb_call_unanswered.fix": "Nicht blind wiederholen. Wenn das Verb eine Spur hinterlasst, lies zuerst die Spur: yujin.evidence.list fuer einen Beleg, yujin.task.list fuer einen Hintergrundauftrag.",
138
141
  "panel.button.agents": "Agenten",
139
142
  "panel.agents.title": "Agenten",
140
143
  "panel.agents.subtitle": "Director und Sub-Agenten registriert in diesem Projekt",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "The desktop chat server was not listening on port {port}. Nothing ran here.",
136
136
  "error.mobile_turn_undelivered.fix": "Open the Forge panel on the desktop (or start it with yf chat) and send the request again.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "The call to {verb} returned no response within {minutes} minutes.",
139
+ "error.verb_call_unanswered.why": "What expired is the wait, not the work: the verb may still be running on the Forge side and finish fine.",
140
+ "error.verb_call_unanswered.fix": "Do not blindly retry. If the verb leaves a trace, read the trace first: yujin.evidence.list for a receipt, yujin.task.list for a background task.",
138
141
  "panel.button.agents": "Agents",
139
142
  "panel.agents.title": "Agents",
140
143
  "panel.agents.subtitle": "Director and sub-agents registered in this project",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "El servidor de chat del escritorio no estaba escuchando en el puerto {port}. Aca no se ejecuto nada.",
136
136
  "error.mobile_turn_undelivered.fix": "Abri el panel de Forge en el escritorio (o arrancalo con yf chat) y volve a mandar el pedido.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "La invocacion de {verb} no devolvio respuesta en {minutes} minutos.",
139
+ "error.verb_call_unanswered.why": "Lo que vencio es la espera, no el trabajo: el verbo puede seguir corriendo del lado de Forge y terminar bien.",
140
+ "error.verb_call_unanswered.fix": "No lo repitas a ciegas. Si el verbo deja rastro, mira el rastro primero: yujin.evidence.list para un recibo, yujin.task.list para una tarea de fondo.",
138
141
  "panel.button.agents": "Agentes",
139
142
  "panel.agents.title": "Agentes",
140
143
  "panel.agents.subtitle": "Director + sub-agentes registrados en este proyecto",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "Le serveur de chat du bureau n'ecoutait pas sur le port {port}. Rien n'a ete execute ici.",
136
136
  "error.mobile_turn_undelivered.fix": "Ouvre le panneau Forge sur le bureau (ou lance-le avec yf chat) puis renvoie la demande.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "L'appel de {verb} n'a pas renvoye de reponse en {minutes} minutes.",
139
+ "error.verb_call_unanswered.why": "Ce qui a expire, c'est l'attente, pas le travail : le verbe peut continuer a tourner cote Forge et se terminer correctement.",
140
+ "error.verb_call_unanswered.fix": "Ne relancez pas a l'aveugle. Si le verbe laisse une trace, lisez-la d'abord : yujin.evidence.list pour un recu, yujin.task.list pour une tache de fond.",
138
141
  "panel.button.agents": "Agents",
139
142
  "panel.agents.title": "Agents",
140
143
  "panel.agents.subtitle": "Director et sous-agents enregistres dans ce projet",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "डेस्कटॉप का चैट सर्वर पोर्ट {port} पर सुन नहीं रहा था। यहां कुछ भी नहीं चला।",
136
136
  "error.mobile_turn_undelivered.fix": "डेस्कटॉप पर Forge पैनल खोलें (या yf chat से शुरू करें) और अनुरोध दोबारा भेजें।",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "{verb} की कॉल ने {minutes} मिनट में कोई उत्तर नहीं लौटाया।",
139
+ "error.verb_call_unanswered.why": "समय-सीमा प्रतीक्षा की समाप्त हुई, काम की नहीं: यह वर्ब Forge की ओर चलता रह सकता है और ठीक से पूरा हो सकता है।",
140
+ "error.verb_call_unanswered.fix": "आंख मूंदकर दोबारा न चलाएं। यदि वर्ब कोई निशान छोड़ता है, तो पहले निशान देखें: रसीद के लिए yujin.evidence.list, बैकग्राउंड कार्य के लिए yujin.task.list।",
138
141
  "panel.button.agents": "एजेंट",
139
142
  "panel.agents.title": "एजेंट",
140
143
  "panel.agents.subtitle": "इस परियोजना में पंजीकृत निदेशक और उप-एजेंट",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "Il server di chat del desktop non era in ascolto sulla porta {port}. Qui non e stato eseguito nulla.",
136
136
  "error.mobile_turn_undelivered.fix": "Apri il pannello Forge sul desktop (o avvialo con yf chat) e rimanda la richiesta.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "La chiamata di {verb} non ha restituito risposta in {minutes} minuti.",
139
+ "error.verb_call_unanswered.why": "Cio che e scaduto e l'attesa, non il lavoro: il verbo puo continuare a girare dal lato Forge e finire bene.",
140
+ "error.verb_call_unanswered.fix": "Non ripetere alla cieca. Se il verbo lascia una traccia, guarda prima la traccia: yujin.evidence.list per una ricevuta, yujin.task.list per un'attivita in background.",
138
141
  "panel.button.agents": "Agenti",
139
142
  "panel.agents.title": "Agenti",
140
143
  "panel.agents.subtitle": "Director e sub-agenti registrati in questo progetto",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "デスクトップのチャットサーバーがポート {port} で待ち受けていませんでした。ここでは何も実行されていません。",
136
136
  "error.mobile_turn_undelivered.fix": "デスクトップで Forge パネルを開き (または yf chat で起動し)、もう一度リクエストを送ってください。",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "{verb} の呼び出しは {minutes} 分以内に応答を返しませんでした。",
139
+ "error.verb_call_unanswered.why": "期限切れになったのは待機であって、作業ではありません。この動詞は Forge 側で動き続け、正常に終わる可能性があります。",
140
+ "error.verb_call_unanswered.fix": "やみくもに再実行しないでください。痕跡が残る動詞なら、まず痕跡を見てください: レシートは yujin.evidence.list、バックグラウンド処理は yujin.task.list。",
138
141
  "panel.button.agents": "エージェント",
139
142
  "panel.agents.title": "エージェント",
140
143
  "panel.agents.subtitle": "このプロジェクトに登録されたディレクターとサブエージェント",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "O servidor de chat do desktop nao estava escutando na porta {port}. Aqui nada foi executado.",
136
136
  "error.mobile_turn_undelivered.fix": "Abra o painel do Forge no desktop (ou inicie com yf chat) e envie o pedido de novo.",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "A chamada de {verb} nao devolveu resposta em {minutes} minutos.",
139
+ "error.verb_call_unanswered.why": "O que expirou foi a espera, nao o trabalho: o verbo pode continuar rodando no lado do Forge e terminar bem.",
140
+ "error.verb_call_unanswered.fix": "Nao repita as cegas. Se o verbo deixa rastro, veja o rastro primeiro: yujin.evidence.list para um recibo, yujin.task.list para uma tarefa em segundo plano.",
138
141
  "panel.button.agents": "Agentes",
139
142
  "panel.agents.title": "Agentes",
140
143
  "panel.agents.subtitle": "Director e sub-agentes registados neste projeto",
@@ -135,6 +135,9 @@
135
135
  "error.mobile_turn_undelivered.why": "桌面端的聊天服务没有在端口 {port} 上监听。这里没有执行任何操作。",
136
136
  "error.mobile_turn_undelivered.fix": "在桌面端打开 Forge 面板(或用 yf chat 启动),然后重新发送请求。",
137
137
  "error.mobile_turn_undelivered.cmd": "yf chat",
138
+ "error.verb_call_unanswered.what": "{verb} 的调用在 {minutes} 分钟内没有返回响应。",
139
+ "error.verb_call_unanswered.why": "超时的是等待,不是工作:该动词可能仍在 Forge 一侧运行并正常结束。",
140
+ "error.verb_call_unanswered.fix": "不要盲目重试。如果该动词会留下痕迹,请先查看痕迹:收据用 yujin.evidence.list,后台任务用 yujin.task.list。",
138
141
  "panel.button.agents": "智能体",
139
142
  "panel.agents.title": "智能体",
140
143
  "panel.agents.subtitle": "本项目已注册的总监和子智能体",