@nac3/forge-cli 1.0.74 → 1.0.76

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fs_editor.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/fs_editor.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwB3D,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAoErB;AAyBD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAChE,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
1
+ {"version":3,"file":"fs_editor.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/fs_editor.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoB3D,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1C,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA0ErB;AAyBD,wBAAsB,mBAAmB,CACvC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EAChE,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CA0ErB"}
@@ -25,22 +25,18 @@
25
25
  import { promises as fs } from 'node:fs';
26
26
  import path from 'node:path';
27
27
  import { runReadFile } from '../tools.js';
28
+ import { classifyForOpen } from '../../core/file_open_kind.js';
28
29
  /* ============================================================
29
30
  * forge_open_file_for_editor
30
31
  * ============================================================ */
31
- /* PND-102 -- formatos que NO se deben volcar crudos a una pestana de
32
- * editor: son binarios; renderizarlos como texto congela el panel.
33
- * Para office docs steereamos a desktop.open (verlos) / office.*.read
34
- * (parsear). Para el resto, un mensaje claro. */
35
- const BINARY_OPEN_EXT = {
36
- '.xlsx': 'office', '.xls': 'office', '.xlsm': 'office', '.ods': 'office',
37
- '.docx': 'office', '.doc': 'office', '.odt': 'office', '.rtf': 'office',
38
- '.pptx': 'office', '.ppt': 'office', '.odp': 'office', '.pdf': 'office',
39
- '.png': 'media', '.jpg': 'media', '.jpeg': 'media', '.gif': 'media', '.webp': 'media',
40
- '.zip': 'binary', '.gz': 'binary', '.tar': 'binary', '.7z': 'binary', '.rar': 'binary',
41
- '.exe': 'binary', '.dll': 'binary', '.bin': 'binary', '.so': 'binary', '.dylib': 'binary',
42
- '.mp4': 'media', '.mp3': 'media', '.wav': 'media', '.mov': 'media',
43
- };
32
+ /* PND-102/150 -- formatos que NO se deben volcar crudos a una
33
+ * pestana de editor: son binarios; renderizarlos como texto congela
34
+ * el panel. La clasificacion vive ahora en el core compartido
35
+ * (classifyForOpen) para que el doble-click del usuario y este verbo
36
+ * del modelo coincidan; office docs steereamos a desktop.open /
37
+ * office.*.read, el resto un mensaje claro. SVG es la excepcion: es
38
+ * texto editable, asi que el modelo SI lo puede abrir aca (el router
39
+ * del doble-click lo trata como imagen). */
44
40
  /* Cap del contenido que va a una pestana (el panel renderiza en el
45
41
  * main thread; megabytes de texto lo cuelgan igual que un binario). */
46
42
  const MAX_TAB_CHARS = 600_000;
@@ -57,7 +53,13 @@ export async function runOpenFileForEditor(args, ctx) {
57
53
  /* Guarda por extension ANTES de leer: nunca volcar un binario/office
58
54
  * a una pestana de texto (eso congelo el panel -- PND-102). */
59
55
  const ext = path.extname(rel).toLowerCase();
60
- const cls = BINARY_OPEN_EXT[ext];
56
+ const openKind = classifyForOpen(rel);
57
+ /* 'image' includes SVG, but SVG is editable text -- let the model
58
+ * open it in the editor; only refuse true binaries/office/media. */
59
+ const cls = openKind === 'office' ? 'office'
60
+ : (openKind === 'media' || openKind === 'binary' || (openKind === 'image' && ext !== '.svg'))
61
+ ? 'binary'
62
+ : '';
61
63
  if (cls) {
62
64
  const hint = cls === 'office'
63
65
  ? ('Es un documento de oficina (binario). Para VERLO usa desktop.open({target:"' + rel + '"}) '
@@ -1 +1 @@
1
- {"version":3,"file":"fs_editor.js","sourceRoot":"","sources":["../../../src/chat/tools/fs_editor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;kEAEkE;AAElE;;;iDAGiD;AACjD,MAAM,eAAe,GAA2B;IAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IACvE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;IACrF,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ;IACtF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ;IACzF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO;CACnE,CAAC;AACF;uEACuE;AACvE,MAAM,aAAa,GAAG,OAAO,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAA0C,EAC1C,GAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE;YACrC,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IACD;mEAC+D;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,GAAG,KAAK,QAAQ;YAC3B,CAAC,CAAC,CAAC,6EAA6E,GAAG,GAAG,GAAG,MAAM;kBAC3F,mEAAmE;kBACnE,CAAC,6BAA6B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,CAAC;kBAC7I,UAAU,GAAG,GAAG,GAAG,4CAA4C,CAAC;YACpE,CAAC,CAAC,CAAC,yBAAyB,GAAG,GAAG,GAAG,4CAA4C,GAAG,GAAG,GAAG,OAAO;kBAC7F,gDAAgD,CAAC,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE;YAC1C,OAAO,EAAE,aAAa,GAAG,GAAG,GAAG,+BAA+B;SAC/D,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC;IAEpE,MAAM,IAAI,GAAG,CAAC,CAAC,MAAmE,CAAC;IACnF,IAAI,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE;sCACkC;IAClC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,8DAA8D,GAAG,GAAG,GAAG,6BAA6B,EAAE,MAAM,EAAE,IAAI,EAAE;YACrI,OAAO,EAAE,0BAA0B;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,OAAO,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACnC,WAAW,GAAG,iBAAiB,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,aAAa,GAAG,mCAAmC,CAAC;QAC/G,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5C,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO;QACL,IAAI,EAAE,4BAA4B;QAClC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE;YACN,OAAO;YACP,KAAK;YACL,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM;YACnC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,WAAW,KAAK,EAAE;SACzD;QACD,OAAO,EAAE,YAAY,GAAG,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,WAAW;KAC9E,CAAC;AACJ,CAAC;AAED;;gBAEgB;AAChB,SAAS,aAAa,CAAC,CAAS;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;QACpF,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY;QAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;QAChF,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;QACrC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;QAC3E,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;QACrF,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;QAC9E,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;QACtE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;KAC7C,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;AAC5B,CAAC;AAED;;kEAEkE;AAElE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAgE,EAChE,GAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE;YACrC,OAAO,EAAE,SAAS;SACnB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,6DAA6D,EAAE;YAChF,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE;4DACwD;IACxD,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,yDAAyD,EAAE;YAC5E,OAAO,EAAE,QAAQ;SAClB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE;YACjD,OAAO,EAAE,WAAW;SACrB,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,+CAA+C,EAAE;YAClE,OAAO,EAAE,QAAQ;SAClB,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC;IAC9C,IAAI,CAAC;QACH,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD;yCACiC;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,0BAA0B;YAChC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACnE,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE;YACN,IAAI,EAAE,GAAG;YACT,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;SACnD;QACD,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,GAAG,GAAG;KACxD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"fs_editor.js","sourceRoot":"","sources":["../../../src/chat/tools/fs_editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `yf embed` -- scaffold the resident Forge assistant into a project (PND-147).
3
+ * Generates .forge/profile.prod.json + profile.uat.json + mission.md +
4
+ * db.json.example + systemd units + deploy README. Idempotent (skips existing
5
+ * unless --force). ASCII-only.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export interface EmbedCliOptions {
9
+ root?: string;
10
+ db?: string;
11
+ portProd?: string;
12
+ portUat?: string;
13
+ force?: boolean;
14
+ json?: boolean;
15
+ }
16
+ export declare function registerEmbedCommand(program: Command): void;
17
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/commands/embed.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC3D"}
@@ -0,0 +1,46 @@
1
+ import path from 'node:path';
2
+ import { c, header } from '../ui/colors.js';
3
+ import { generateEmbedScaffold } from '../core/forge_embed.js';
4
+ export function registerEmbedCommand(program) {
5
+ program
6
+ .command('embed')
7
+ .description('Scaffold the resident Forge assistant into a project (.forge/ profiles + mission + units). Committed but inert until the server sets YF_ENV=prod|uat.')
8
+ .option('--root <dir>', 'project root (default: current dir)')
9
+ .option('--db <engine>', 'db engine for db.json.example: mariadb | mysql | sqlite (default mariadb)')
10
+ .option('--port-prod <n>', 'PROD panel port (default 4901)')
11
+ .option('--port-uat <n>', 'UAT panel port (default 4902)')
12
+ .option('--force', 'overwrite existing .forge files')
13
+ .option('--json', 'emit JSON')
14
+ .action(async (opts) => {
15
+ const root = path.resolve(opts.root || process.cwd());
16
+ const engine = (opts.db === 'mysql' || opts.db === 'sqlite') ? opts.db : 'mariadb';
17
+ const files = await generateEmbedScaffold({
18
+ root,
19
+ dbEngine: engine,
20
+ portProd: opts.portProd ? parseInt(opts.portProd, 10) : undefined,
21
+ portUat: opts.portUat ? parseInt(opts.portUat, 10) : undefined,
22
+ force: opts.force === true,
23
+ });
24
+ if (opts.json) {
25
+ process.stdout.write(JSON.stringify({ root, files }, null, 2) + '\n');
26
+ return;
27
+ }
28
+ header('Forge Embedded -- scaffold');
29
+ console.log('');
30
+ for (const f of files) {
31
+ const mark = f.written ? c.success('+') : c.dim('.');
32
+ console.log(' ' + mark + ' ' + f.rel + (f.written ? '' : c.dim(' (' + (f.reason || 'skip') + ')')));
33
+ }
34
+ const wrote = files.filter((f) => f.written).length;
35
+ console.log('');
36
+ console.log(' ' + c.success(String(wrote)) + ' archivos escritos.');
37
+ console.log('');
38
+ console.log(' Siguiente:');
39
+ console.log(' 1. Editar ' + c.dim('.forge/mission.md') + ' (que es el sistema + donde vive su config).');
40
+ console.log(' 2. Copiar ' + c.dim('.forge/db.json.example') + ' -> ' + c.dim('.forge/db.json') + ' y completarlo (en el server).');
41
+ console.log(' 3. Commitear .forge/ -- los perfiles son INERTES sin YF_ENV.');
42
+ console.log(' 4. En el server: ' + c.dim('.forge/deploy/README.md') + ' (units + YF_ENV=prod|uat).');
43
+ console.log('');
44
+ });
45
+ }
46
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/commands/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type OpenKind = 'editor' | 'image' | 'office' | 'media' | 'binary';
2
+ /** Route a file path to the IDE surface that should open it. */
3
+ export declare function classifyForOpen(filePath: string): OpenKind;
4
+ /** Content-Type for the raw-image endpoint. Returns null for any
5
+ * non-image extension so the caller refuses to serve it raw. */
6
+ export declare function imageContentType(filePath: string): string | null;
7
+ //# sourceMappingURL=file_open_kind.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_open_kind.d.ts","sourceRoot":"","sources":["../../src/core/file_open_kind.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAkC1E,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAU1D;AAED;iEACiE;AACjE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBhE"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Shared file-open classifier -- IDE open routing (PND-150).
3
+ *
4
+ * ONE source of truth for "what surface opens this file" so the
5
+ * user's double-click (files tab / graph node detail) and the
6
+ * model's open-file verb agree, instead of the two divergent
7
+ * extension lists that used to live independently in
8
+ * desktop_open.ts (DANGEROUS_EXT) and fs_editor.ts (BINARY_OPEN_EXT).
9
+ *
10
+ * The axis here is IDE ROUTING, not execution safety: a shell
11
+ * script (.sh/.ps1/.bat) classifies as 'editor' -- in an IDE you
12
+ * EDIT it, you do not run it -- even though desktop_open still
13
+ * refuses to hand it to the OS `start`, which WOULD execute it.
14
+ * Those are different concerns and stay separate.
15
+ *
16
+ * ASCII-only.
17
+ */
18
+ import path from 'node:path';
19
+ /* Raster/vector images -> inline image viewer tab (kind=image). */
20
+ const IMAGE_EXT = new Set([
21
+ '.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.ico', '.avif', '.svg',
22
+ ]);
23
+ /* Office / print documents -> their native app (Excel/Word/viewer);
24
+ * editing them as text is wrong. .csv and .txt are deliberately NOT
25
+ * here -- they are plain text and open in the editor. */
26
+ const OFFICE_EXT = new Set([
27
+ '.xlsx', '.xls', '.xlsm', '.ods',
28
+ '.docx', '.doc', '.odt', '.rtf',
29
+ '.pptx', '.ppt', '.odp', '.pdf',
30
+ ]);
31
+ /* Audio / video -> native player. */
32
+ const MEDIA_EXT = new Set([
33
+ '.mp4', '.mov', '.avi', '.mkv', '.webm',
34
+ '.mp3', '.wav', '.ogg', '.flac', '.m4a', '.aac',
35
+ ]);
36
+ /* Compiled binaries + archives + fonts + db files -> not openable in
37
+ * an IDE at all. NOTE: scripts (.sh/.ps1/.bat/.cmd/.vbs) are
38
+ * deliberately NOT here -- they are editable text. */
39
+ const BINARY_EXT = new Set([
40
+ '.exe', '.dll', '.so', '.dylib', '.bin', '.o', '.a', '.lib',
41
+ '.class', '.jar', '.wasm', '.node', '.pyc', '.pyd',
42
+ '.msi', '.dmg', '.pkg', '.deb', '.rpm', '.appimage',
43
+ '.zip', '.gz', '.tgz', '.tar', '.7z', '.rar', '.bz2', '.xz', '.zst',
44
+ '.woff', '.woff2', '.ttf', '.otf', '.eot',
45
+ '.db', '.sqlite', '.sqlite3', '.mdb', '.dat',
46
+ ]);
47
+ /** Route a file path to the IDE surface that should open it. */
48
+ export function classifyForOpen(filePath) {
49
+ const ext = path.extname(String(filePath || '')).toLowerCase();
50
+ if (IMAGE_EXT.has(ext))
51
+ return 'image';
52
+ if (OFFICE_EXT.has(ext))
53
+ return 'office';
54
+ if (MEDIA_EXT.has(ext))
55
+ return 'media';
56
+ if (BINARY_EXT.has(ext))
57
+ return 'binary';
58
+ /* Default: editable text/source (config, scripts, code, csv,
59
+ * unknown). The editor path's own NUL-byte + size guard is the
60
+ * final backstop for a mislabeled binary. */
61
+ return 'editor';
62
+ }
63
+ /** Content-Type for the raw-image endpoint. Returns null for any
64
+ * non-image extension so the caller refuses to serve it raw. */
65
+ export function imageContentType(filePath) {
66
+ const ext = path.extname(String(filePath || '')).toLowerCase();
67
+ switch (ext) {
68
+ case '.png': return 'image/png';
69
+ case '.jpg':
70
+ case '.jpeg': return 'image/jpeg';
71
+ case '.gif': return 'image/gif';
72
+ case '.webp': return 'image/webp';
73
+ case '.bmp': return 'image/bmp';
74
+ case '.ico': return 'image/x-icon';
75
+ case '.avif': return 'image/avif';
76
+ /* SVG is served for <img src> only (same-origin loopback); an
77
+ * <img>-loaded SVG cannot run scripts, so this is safe here. */
78
+ case '.svg': return 'image/svg+xml';
79
+ default: return null;
80
+ }
81
+ }
82
+ //# sourceMappingURL=file_open_kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file_open_kind.js","sourceRoot":"","sources":["../../src/core/file_open_kind.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface EmbedOptions {
2
+ root: string;
3
+ projectName?: string;
4
+ dbEngine?: 'mariadb' | 'mysql' | 'sqlite';
5
+ portProd?: number;
6
+ portUat?: number;
7
+ force?: boolean;
8
+ /** Seed the mission body (e.g. a spec summary) instead of the template. */
9
+ missionSeed?: string;
10
+ }
11
+ export interface EmbedFile {
12
+ rel: string;
13
+ written: boolean;
14
+ reason?: string;
15
+ }
16
+ /** Generate the .forge/* embedded-assistant scaffold. Returns per-file status. */
17
+ export declare function generateEmbedScaffold(opts: EmbedOptions): Promise<EmbedFile[]>;
18
+ //# sourceMappingURL=forge_embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge_embed.d.ts","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AA+G7E,kFAAkF;AAClF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAmBpF"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * forge_embed -- scaffold the EMBEDDED assistant into a project (PND-147,
3
+ * Pablo 2026-07-10). Writes the .forge/* files so every project Forge builds
4
+ * ships with a resident assistant: a read-only diagnostic copy for PROD and a
5
+ * permissive copy for UAT, each on its own port, inert on the developer's
6
+ * machine (they only activate when the server sets YF_ENV=prod|uat).
7
+ *
8
+ * Pure generator + writer; the CLI (yf embed) and the brain (diagnostic-mode
9
+ * doctrine) both use it. Idempotent: never overwrites an existing file unless
10
+ * force is set. ASCII-only.
11
+ */
12
+ import { promises as fs } from 'node:fs';
13
+ import path from 'node:path';
14
+ const PROFILE_PROD = {
15
+ version: 1, name: 'prod', read_only: true, pinned_root: true,
16
+ mission_file: '.forge/mission.md', allow_report_dirs: ['docs', '.forge/diagnostics'],
17
+ };
18
+ const PROFILE_UAT = {
19
+ version: 1, name: 'uat', read_only: false, pinned_root: true,
20
+ mission_file: '.forge/mission.md',
21
+ };
22
+ function dbExample(engine) {
23
+ if (engine === 'sqlite')
24
+ return { engine: 'sqlite', sqlite_path: 'app.db' };
25
+ return {
26
+ engine, host: '127.0.0.1', port: engine === 'mysql' || engine === 'mariadb' ? 3306 : 5432,
27
+ database: 'CHANGE_ME', user: 'CHANGE_ME', password_env: 'DB_PASSWORD',
28
+ };
29
+ }
30
+ function missionTemplate(name, seed) {
31
+ if (seed && seed.trim())
32
+ return seed.trim() + '\n';
33
+ return [
34
+ '# Mision del asistente embebido -- ' + name,
35
+ '',
36
+ 'Sos el asistente de diagnostico y soporte de ESTE sistema (' + name + ').',
37
+ 'Tu trabajo: entender el sistema, diagnosticar con evidencia (file:line,',
38
+ 'consultas read-only a la base) y decirle al operador EXACTAMENTE que',
39
+ 'configurar y donde -- no lo hagas por el en PROD.',
40
+ '',
41
+ '## Donde vive la configuracion',
42
+ '- (completar) tablas de config, archivos .env / .ini, variables de entorno,',
43
+ ' servicios/puertos. El asistente los descubre solos, pero anotalos aca',
44
+ ' para respuestas mas rapidas.',
45
+ '',
46
+ '## Que suele fallar / que diagnosticar',
47
+ '- (completar) los casos tipicos: "por que X no paso", "por que el proceso Y',
48
+ ' no arranca", volumenes, errores recientes.',
49
+ '',
50
+ '## Reglas',
51
+ '- PROD: solo lectura. Emiti instrucciones precisas para el operador.',
52
+ '- UAT: podes aplicar cambios y verificarlos vos.',
53
+ '- Los reportes van en docs/ o .forge/diagnostics/.',
54
+ '',
55
+ ].join('\n');
56
+ }
57
+ function serviceUnit(name, env, port, deployDir) {
58
+ return [
59
+ '[Unit]',
60
+ 'Description=Forge Embedded assistant (' + name + ' ' + env.toUpperCase() + ')',
61
+ 'After=network.target',
62
+ '',
63
+ '[Service]',
64
+ 'Type=simple',
65
+ 'User=CHANGE_ME',
66
+ 'WorkingDirectory=' + deployDir,
67
+ 'Environment=YF_ENV=' + env,
68
+ '# Minimal systemd PATH does NOT include ~/.local/bin or npm-global -- add',
69
+ '# the dir where `yf` lives so it is found (see: which yf).',
70
+ 'Environment=PATH=/usr/local/bin:/usr/bin:/bin',
71
+ '# BYOK: the operator configures the brain key on first boot (yf keys / panel).',
72
+ '# Binds 127.0.0.1 by default -- reach it via SSH tunnel or the P2 relay.',
73
+ 'ExecStart=/usr/bin/env yf chat --no-open --port ' + port,
74
+ 'Restart=on-failure',
75
+ 'RestartSec=5',
76
+ '',
77
+ '[Install]',
78
+ 'WantedBy=multi-user.target',
79
+ '',
80
+ ].join('\n');
81
+ }
82
+ function deployReadme(name, portProd, portUat) {
83
+ return [
84
+ '# Forge Embedded -- ' + name,
85
+ '',
86
+ 'This project ships a RESIDENT Forge assistant. The profiles are COMMITTED',
87
+ 'but INERT: they only activate when the server declares YF_ENV.',
88
+ '',
89
+ '## On the server (once)',
90
+ '1. Install Forge: `npm i -g @nac3/forge-cli`',
91
+ '2. Copy the units + set User/PATH/WorkingDirectory:',
92
+ ' sudo cp .forge/deploy/forge-' + name + '-prod.service /etc/systemd/system/',
93
+ ' sudo cp .forge/deploy/forge-' + name + '-uat.service /etc/systemd/system/',
94
+ '3. Configure the DB connection: copy .forge/db.json.example to .forge/db.json',
95
+ ' and fill it (password via the env var named in password_env).',
96
+ '4. Enable: sudo systemctl enable --now forge-' + name + '-prod forge-' + name + '-uat',
97
+ '5. First boot: open the panel (SSH tunnel to 127.0.0.1:' + portProd + ' / :' + portUat + ')',
98
+ ' and set the brain BYOK key (yf keys or the panel).',
99
+ '',
100
+ '## What each does',
101
+ '- PROD (YF_ENV=prod, :' + portProd + '): READ-ONLY diagnostic. Reads code/config,',
102
+ ' runs SELECT-only queries (yujin.db.query), tells you what to change -- never',
103
+ ' touches the system. Reports land in docs/ or .forge/diagnostics/.',
104
+ '- UAT (YF_ENV=uat, :' + portUat + '): permissive. Applies + verifies changes.',
105
+ '',
106
+ 'On a developer machine (no YF_ENV) Forge runs with FULL capabilities as usual.',
107
+ '',
108
+ ].join('\n');
109
+ }
110
+ async function writeIfAbsent(root, rel, content, force) {
111
+ const abs = path.join(root, rel);
112
+ await fs.mkdir(path.dirname(abs), { recursive: true });
113
+ if (!force) {
114
+ try {
115
+ await fs.access(abs);
116
+ return { rel, written: false, reason: 'exists' };
117
+ }
118
+ catch { /* absent */ }
119
+ }
120
+ await fs.writeFile(abs, content, 'utf8');
121
+ return { rel, written: true };
122
+ }
123
+ /** Generate the .forge/* embedded-assistant scaffold. Returns per-file status. */
124
+ export async function generateEmbedScaffold(opts) {
125
+ const name = (opts.projectName || path.basename(opts.root) || 'app')
126
+ .replace(/[^a-z0-9_-]/gi, '-').toLowerCase();
127
+ const engine = opts.dbEngine || 'mariadb';
128
+ const portProd = opts.portProd ?? 4901;
129
+ const portUat = opts.portUat ?? 4902;
130
+ const force = opts.force === true;
131
+ const out = [];
132
+ out.push(await writeIfAbsent(opts.root, '.forge/profile.prod.json', JSON.stringify(PROFILE_PROD, null, 2) + '\n', force));
133
+ out.push(await writeIfAbsent(opts.root, '.forge/profile.uat.json', JSON.stringify(PROFILE_UAT, null, 2) + '\n', force));
134
+ out.push(await writeIfAbsent(opts.root, '.forge/mission.md', missionTemplate(name, opts.missionSeed), force));
135
+ out.push(await writeIfAbsent(opts.root, '.forge/db.json.example', JSON.stringify(dbExample(engine), null, 2) + '\n', force));
136
+ out.push(await writeIfAbsent(opts.root, '.forge/deploy/forge-' + name + '-prod.service', serviceUnit(name, 'prod', portProd, '/opt/' + name), force));
137
+ out.push(await writeIfAbsent(opts.root, '.forge/deploy/forge-' + name + '-uat.service', serviceUnit(name, 'uat', portUat, '/opt/' + name + '-uat'), force));
138
+ out.push(await writeIfAbsent(opts.root, '.forge/deploy/README.md', deployReadme(name, portProd, portUat), force));
139
+ /* keep the report dir in git so PROD can write into it */
140
+ out.push(await writeIfAbsent(opts.root, '.forge/diagnostics/.gitkeep', '', force));
141
+ return out;
142
+ }
143
+ //# sourceMappingURL=forge_embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forge_embed.js","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ # Diagnostic-mode doctrine (Forge Embedded)
2
+
3
+ Every product Forge builds can ship with a RESIDENT assistant: a copy that
4
+ lives with the deployed system and supports it. This doctrine covers two
5
+ things -- how to EMBED it when you build a project, and how to BEHAVE when you
6
+ ARE the embedded assistant.
7
+
8
+ ## 1. Embed it when you scaffold / finish a project
9
+
10
+ When you create a new project (or finish a first slice of a real one), OFFER
11
+ to embed the resident assistant, then run it:
12
+
13
+ yf embed (or generateEmbedScaffold for the brain path)
14
+
15
+ It writes, under `.forge/`:
16
+ - profile.prod.json (read_only + pinned_root -- PROD diagnostic)
17
+ - profile.uat.json (permissive + pinned_root -- UAT)
18
+ - mission.md (WHAT the system is + WHERE its config lives)
19
+ - db.json.example (connection for yujin.db.query -- operator fills it)
20
+ - deploy/*.service (systemd units that declare YF_ENV=prod|uat, bind
21
+ 127.0.0.1) + a deploy README
22
+
23
+ The profiles are COMMITTED but INERT: a developer machine (no YF_ENV) keeps
24
+ full-capability Forge; the server's unit/rpa.env declares YF_ENV=prod|uat and
25
+ the assistant auto-assumes the guardrails.
26
+
27
+ ENRICH the generated `mission.md` from what you actually know about the app:
28
+ its config surface (tables, .env/.ini keys, services/ports) and the cases a
29
+ support operator will ask about ("why did X not pass?", "why is Y stuck?").
30
+ A generic template is worthless; the mission is your differentiator.
31
+
32
+ ## 2. When you ARE the embedded assistant (read-only PROD)
33
+
34
+ The profile prompt already states the posture; the essence:
35
+ - DIAGNOSE with evidence: read code/config/logs, query the DB with
36
+ yujin.db.query (SELECT-only), cite file:line. Do NOT shell out to mysql
37
+ and do NOT invent an HTTP query endpoint.
38
+ - You may run READ-ONLY shell (SELECT, curl GET to localhost, ls/cat/grep)
39
+ -- use it, do not hand queries to the operator.
40
+ - Emit PRECISE operator instructions for changes ("set field X to value V
41
+ in <file/table>, verify with <check>"), one per change, in order.
42
+ - Write reports (any type) under docs/ or .forge/diagnostics/.
43
+ - Record findings as pendings so nothing is lost between sessions.
44
+ - You are PINNED to this system: no re-anchoring, no writes outside the
45
+ report dirs, no push/commit/lifecycle. Those stay with the operator.
46
+
47
+ UAT is permissive: apply the change, verify it, THEN tell the operator the
48
+ exact steps to replicate it in PROD.
package/dist/version.d.ts CHANGED
@@ -2,5 +2,5 @@
2
2
  * Yujin Forge CLI version. Kept in sync with package.json by the npm
3
3
  * "version" lifecycle (scripts/sync_version.mjs) so the two never drift.
4
4
  */
5
- export declare const VERSION = "1.0.74";
5
+ export declare const VERSION = "1.0.76";
6
6
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  * Yujin Forge CLI version. Kept in sync with package.json by the npm
3
3
  * "version" lifecycle (scripts/sync_version.mjs) so the two never drift.
4
4
  */
5
- export const VERSION = '1.0.74';
5
+ export const VERSION = '1.0.76';
6
6
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,48 @@
1
+ # Diagnostic-mode doctrine (Forge Embedded)
2
+
3
+ Every product Forge builds can ship with a RESIDENT assistant: a copy that
4
+ lives with the deployed system and supports it. This doctrine covers two
5
+ things -- how to EMBED it when you build a project, and how to BEHAVE when you
6
+ ARE the embedded assistant.
7
+
8
+ ## 1. Embed it when you scaffold / finish a project
9
+
10
+ When you create a new project (or finish a first slice of a real one), OFFER
11
+ to embed the resident assistant, then run it:
12
+
13
+ yf embed (or generateEmbedScaffold for the brain path)
14
+
15
+ It writes, under `.forge/`:
16
+ - profile.prod.json (read_only + pinned_root -- PROD diagnostic)
17
+ - profile.uat.json (permissive + pinned_root -- UAT)
18
+ - mission.md (WHAT the system is + WHERE its config lives)
19
+ - db.json.example (connection for yujin.db.query -- operator fills it)
20
+ - deploy/*.service (systemd units that declare YF_ENV=prod|uat, bind
21
+ 127.0.0.1) + a deploy README
22
+
23
+ The profiles are COMMITTED but INERT: a developer machine (no YF_ENV) keeps
24
+ full-capability Forge; the server's unit/rpa.env declares YF_ENV=prod|uat and
25
+ the assistant auto-assumes the guardrails.
26
+
27
+ ENRICH the generated `mission.md` from what you actually know about the app:
28
+ its config surface (tables, .env/.ini keys, services/ports) and the cases a
29
+ support operator will ask about ("why did X not pass?", "why is Y stuck?").
30
+ A generic template is worthless; the mission is your differentiator.
31
+
32
+ ## 2. When you ARE the embedded assistant (read-only PROD)
33
+
34
+ The profile prompt already states the posture; the essence:
35
+ - DIAGNOSE with evidence: read code/config/logs, query the DB with
36
+ yujin.db.query (SELECT-only), cite file:line. Do NOT shell out to mysql
37
+ and do NOT invent an HTTP query endpoint.
38
+ - You may run READ-ONLY shell (SELECT, curl GET to localhost, ls/cat/grep)
39
+ -- use it, do not hand queries to the operator.
40
+ - Emit PRECISE operator instructions for changes ("set field X to value V
41
+ in <file/table>, verify with <check>"), one per change, in order.
42
+ - Write reports (any type) under docs/ or .forge/diagnostics/.
43
+ - Record findings as pendings so nothing is lost between sessions.
44
+ - You are PINNED to this system: no re-anchoring, no writes outside the
45
+ report dirs, no push/commit/lifecycle. Those stay with the operator.
46
+
47
+ UAT is permissive: apply the change, verify it, THEN tell the operator the
48
+ exact steps to replicate it in PROD.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nac3/forge-cli",
3
- "version": "1.0.74",
3
+ "version": "1.0.76",
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>",