@nac3/forge-cli 1.0.82 → 1.0.84
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.
- package/dist/core/audit_log.d.ts +9 -0
- package/dist/core/audit_log.d.ts.map +1 -1
- package/dist/core/audit_log.js +34 -0
- package/dist/core/audit_log.js.map +1 -1
- package/dist/core/file_tree.d.ts.map +1 -1
- package/dist/core/file_tree.js +22 -16
- package/dist/core/file_tree.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/dist/core/audit_log.d.ts
CHANGED
|
@@ -30,6 +30,15 @@ export interface LifecycleAudit extends AuditEntryBase {
|
|
|
30
30
|
details?: Record<string, unknown>;
|
|
31
31
|
}
|
|
32
32
|
export type AuditEntry = ShellExecAudit | VerbInvokeAudit | LifecycleAudit | AuditEntryBase;
|
|
33
|
+
/**
|
|
34
|
+
* PND-156 -- redact obvious secrets before they land in the audit ledger.
|
|
35
|
+
* On rpa-osde a DB password leaked into the audit log (and journald) via an
|
|
36
|
+
* inline `mysql -p'<pass>'`. This masks the common shapes: DB passwords
|
|
37
|
+
* (-p / --password / MYSQL_PWD / PGPASSWORD), URL credentials, Bearer tokens,
|
|
38
|
+
* and key=value secrets. Best-effort + conservative -- masks the VALUE, keeps
|
|
39
|
+
* the surrounding command readable so the ledger stays useful.
|
|
40
|
+
*/
|
|
41
|
+
export declare function redactSecrets(text: string): string;
|
|
33
42
|
/** Append a single entry. Best-effort -- never throws. */
|
|
34
43
|
export declare function recordAudit(entry: Partial<AuditEntry> & {
|
|
35
44
|
kind: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit_log.d.ts","sourceRoot":"","sources":["../../src/core/audit_log.ts"],"names":[],"mappings":"AA8BA,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,gBAAgB,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAgB,MAAM,CAAC;IACzB,IAAI,EAAc,MAAM,CAAC;IACzB,OAAO,EAAW,MAAM,CAAC;IACzB,aAAa,EAAK,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,IAAI,EAAc,YAAY,CAAC;IAC/B,OAAO,EAAW,MAAM,CAAC;IACzB,GAAG,EAAe,MAAM,CAAC;IACzB,WAAW,EAAO,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;IACnE,YAAY,EAAM,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAS,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAO,MAAM,CAAC;IACzB,MAAM,EAAY,OAAO,CAAC;IAC1B,YAAY,EAAM,MAAM,CAAC;IACzB,YAAY,EAAM,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAc,aAAa,CAAC;IAChC,OAAO,EAAW,MAAM,CAAC;IACzB,aAAa,EAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAY,IAAI,GAAG,OAAO,CAAC;IACjC,KAAK,CAAC,EAAY,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,IAAI,EAAc,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,kBAAkB,CAAC;IAC/E,WAAW,EAAO,MAAM,CAAC;IACzB,OAAO,CAAC,EAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"audit_log.d.ts","sourceRoot":"","sources":["../../src/core/audit_log.ts"],"names":[],"mappings":"AA8BA,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,eAAe,GACf,eAAe,GACf,oBAAoB,GACpB,gBAAgB,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAgB,MAAM,CAAC;IACzB,IAAI,EAAc,MAAM,CAAC;IACzB,OAAO,EAAW,MAAM,CAAC;IACzB,aAAa,EAAK,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,IAAI,EAAc,YAAY,CAAC;IAC/B,OAAO,EAAW,MAAM,CAAC;IACzB,GAAG,EAAe,MAAM,CAAC;IACzB,WAAW,EAAO,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;IACnE,YAAY,EAAM,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAS,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,EAAO,MAAM,CAAC;IACzB,MAAM,EAAY,OAAO,CAAC;IAC1B,YAAY,EAAM,MAAM,CAAC;IACzB,YAAY,EAAM,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAgB,SAAQ,cAAc;IACrD,IAAI,EAAc,aAAa,CAAC;IAChC,OAAO,EAAW,MAAM,CAAC;IACzB,aAAa,EAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAY,IAAI,GAAG,OAAO,CAAC;IACjC,KAAK,CAAC,EAAY,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,IAAI,EAAc,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,kBAAkB,CAAC;IAC/E,WAAW,EAAO,MAAM,CAAC;IACzB,OAAO,CAAC,EAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;AAE5F;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBlD;AAQD,0DAA0D;AAC1D,wBAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhH;AAED;gCACgC;AAChC,wBAAsB,eAAe,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAaxE;AAED,iBAAiB;AACjB,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|
package/dist/core/audit_log.js
CHANGED
|
@@ -27,6 +27,33 @@
|
|
|
27
27
|
import { promises as fs } from 'node:fs';
|
|
28
28
|
import path from 'node:path';
|
|
29
29
|
import os from 'node:os';
|
|
30
|
+
/**
|
|
31
|
+
* PND-156 -- redact obvious secrets before they land in the audit ledger.
|
|
32
|
+
* On rpa-osde a DB password leaked into the audit log (and journald) via an
|
|
33
|
+
* inline `mysql -p'<pass>'`. This masks the common shapes: DB passwords
|
|
34
|
+
* (-p / --password / MYSQL_PWD / PGPASSWORD), URL credentials, Bearer tokens,
|
|
35
|
+
* and key=value secrets. Best-effort + conservative -- masks the VALUE, keeps
|
|
36
|
+
* the surrounding command readable so the ledger stays useful.
|
|
37
|
+
*/
|
|
38
|
+
export function redactSecrets(text) {
|
|
39
|
+
if (!text)
|
|
40
|
+
return text;
|
|
41
|
+
let s = String(text);
|
|
42
|
+
/* mysql/mariadb inline password: -pSECRET or -p'SECRET' (NO space after -p). */
|
|
43
|
+
s = s.replace(/(^|\s)(-p)(['"]?)[^\s'"]+\3/g, '$1$2$3***$3');
|
|
44
|
+
/* --password=SECRET / --password SECRET / -password SECRET */
|
|
45
|
+
s = s.replace(/(--?password[=\s])(['"]?)[^\s'"]+\2/gi, '$1$2***$2');
|
|
46
|
+
/* env-style secret assignments: MYSQL_PWD=... PGPASSWORD=... PASSWORD=... TOKEN=... SECRET=... API_KEY=... */
|
|
47
|
+
s = s.replace(/\b(MYSQL_PWD|PGPASSWORD|[A-Z0-9_]*(?:PASSWORD|PASSWD|SECRET|TOKEN|API[_-]?KEY))=(['"]?)[^\s'"]+\2/gi, '$1=$2***$2');
|
|
48
|
+
/* key=value inside connection strings / query params: password=..., pwd=..., token=..., secret=... */
|
|
49
|
+
s = s.replace(/\b(password|passwd|pwd|token|secret|api[_-]?key)=([^\s&'";]+)/gi, '$1=***');
|
|
50
|
+
/* URL credentials: scheme://user:SECRET@host */
|
|
51
|
+
s = s.replace(/(:\/\/[^\s:/@]+:)[^\s@/]+(@)/g, '$1***$2');
|
|
52
|
+
/* Bearer / Authorization tokens */
|
|
53
|
+
s = s.replace(/(authorization\s*:?\s*bearer\s+)[A-Za-z0-9._\-]+/gi, '$1***');
|
|
54
|
+
s = s.replace(/(bearer\s+)[A-Za-z0-9._\-]{12,}/gi, '$1***');
|
|
55
|
+
return s;
|
|
56
|
+
}
|
|
30
57
|
function auditLogPath() {
|
|
31
58
|
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
32
59
|
const base = process.env.YF_CONFIG_DIR || path.join(home, '.yujin-forge');
|
|
@@ -43,6 +70,13 @@ export async function recordAudit(entry) {
|
|
|
43
70
|
approval_mode: entry.approval_mode ?? 'not_applicable',
|
|
44
71
|
...entry,
|
|
45
72
|
};
|
|
73
|
+
/* PND-156 -- scrub secrets from the free-text fields before persisting so
|
|
74
|
+
* a leaked inline password (mysql -p'...') never lands in the ledger. */
|
|
75
|
+
if (typeof full.summary === 'string')
|
|
76
|
+
full.summary = redactSecrets(full.summary);
|
|
77
|
+
const withCmd = full;
|
|
78
|
+
if (typeof withCmd.command === 'string')
|
|
79
|
+
withCmd.command = redactSecrets(withCmd.command);
|
|
46
80
|
await fs.appendFile(p, JSON.stringify(full) + '\n', 'utf-8');
|
|
47
81
|
}
|
|
48
82
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit_log.js","sourceRoot":"","sources":["../../src/core/audit_log.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AA6CzB,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;IACzE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AACrD,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA+D;IAC/F,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAe;YACvB,EAAE,EAAc,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACxC,OAAO,EAAS,KAAK,CAAC,OAAO,IAAI,EAAE;YACnC,aAAa,EAAG,KAAK,CAAC,aAAa,IAAI,gBAAgB;YACvD,GAAG,KAAK;SACK,CAAC;QAChB,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6DAA6D;QAC7D,IAAI,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC;QACjG,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;gCACgC;AAChC,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAK,GAAG,GAAG;IAC/C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"audit_log.js","sourceRoot":"","sources":["../../src/core/audit_log.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_tree.d.ts","sourceRoot":"","sources":["../../src/core/file_tree.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"file_tree.d.ts","sourceRoot":"","sources":["../../src/core/file_tree.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC,CAuDnB"}
|
package/dist/core/file_tree.js
CHANGED
|
@@ -31,45 +31,46 @@ export async function listProjectFiles(projectRoot, opts = {}) {
|
|
|
31
31
|
const maxDepth = Math.max(1, Math.min(12, opts.maxDepth ?? 6));
|
|
32
32
|
const maxNodes = Math.max(50, Math.min(20000, opts.maxNodes ?? 5000));
|
|
33
33
|
const absRoot = path.resolve(projectRoot);
|
|
34
|
-
const state = { count: 0, truncated: false };
|
|
35
34
|
const root = { name: path.basename(absRoot) || absRoot, path: '.', kind: 'dir', children: [] };
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
let count = 0;
|
|
36
|
+
let truncated = false;
|
|
37
|
+
const queue = [{ abs: absRoot, node: root, rel: '', depth: 0 }];
|
|
38
|
+
while (queue.length > 0) {
|
|
39
|
+
const { abs, node, rel: relPrefix, depth } = queue.shift();
|
|
39
40
|
if (depth >= maxDepth) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
41
|
+
truncated = true;
|
|
42
|
+
continue;
|
|
43
|
+
} /* depth cap: content omitted */
|
|
44
44
|
let entries;
|
|
45
45
|
try {
|
|
46
|
-
entries = await fs.readdir(
|
|
46
|
+
entries = await fs.readdir(abs, { withFileTypes: true });
|
|
47
47
|
}
|
|
48
48
|
catch {
|
|
49
|
-
|
|
49
|
+
continue;
|
|
50
50
|
}
|
|
51
51
|
const children = [];
|
|
52
|
+
const subdirs = [];
|
|
52
53
|
for (const e of entries) {
|
|
53
54
|
if (e.name.startsWith('.'))
|
|
54
55
|
continue;
|
|
55
56
|
if (e.isDirectory() && SKIP_DIRS.has(e.name))
|
|
56
57
|
continue;
|
|
57
|
-
if (
|
|
58
|
-
|
|
58
|
+
if (count >= maxNodes) {
|
|
59
|
+
truncated = true;
|
|
59
60
|
break;
|
|
60
61
|
}
|
|
61
62
|
const rel = relPrefix ? relPrefix + '/' + e.name : e.name;
|
|
62
63
|
if (e.isDirectory()) {
|
|
63
|
-
|
|
64
|
+
count += 1;
|
|
64
65
|
const child = { name: e.name, path: rel, kind: 'dir', children: [] };
|
|
65
|
-
await walk(path.join(dirAbs, e.name), child, rel, depth + 1);
|
|
66
66
|
children.push(child);
|
|
67
|
+
subdirs.push({ abs: path.join(abs, e.name), node: child, rel, depth: depth + 1 });
|
|
67
68
|
}
|
|
68
69
|
else if (e.isFile()) {
|
|
69
|
-
|
|
70
|
+
count += 1;
|
|
70
71
|
const child = { name: e.name, path: rel, kind: 'file' };
|
|
71
72
|
try {
|
|
72
|
-
const st = await fs.stat(path.join(
|
|
73
|
+
const st = await fs.stat(path.join(abs, e.name));
|
|
73
74
|
child.size = st.size;
|
|
74
75
|
child.mtime = Math.round(st.mtimeMs);
|
|
75
76
|
}
|
|
@@ -78,7 +79,12 @@ export async function listProjectFiles(projectRoot, opts = {}) {
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
node.children = children.sort(sortNodes);
|
|
82
|
+
/* Enqueue this level's subdirs AFTER building the whole node -> the next
|
|
83
|
+
* level is only visited once every dir at THIS level is listed (BFS). */
|
|
84
|
+
for (const s of subdirs)
|
|
85
|
+
queue.push(s);
|
|
81
86
|
}
|
|
87
|
+
return { root, truncated, node_count: count };
|
|
82
88
|
}
|
|
83
89
|
/** Dirs before files, then case-insensitive alphabetical. */
|
|
84
90
|
function sortNodes(a, b) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file_tree.js","sourceRoot":"","sources":["../../src/core/file_tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AA2B7B,0EAA0E;AAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;IACtE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU;IACvE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;IAC/D,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ;IACtE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW;IAC5D,cAAc,EAAE,mBAAmB,EAAE,WAAW;CACjD,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB,EACnB,OAAoB,EAAE;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,
|
|
1
|
+
{"version":3,"file":"file_tree.js","sourceRoot":"","sources":["../../src/core/file_tree.ts"],"names":[],"mappings":"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"}
|
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.
|
|
5
|
+
export declare const VERSION = "1.0.84";
|
|
6
6
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nac3/forge-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.84",
|
|
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>",
|