@justfortytwo/installer 0.1.1 → 0.1.2
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/commands/forget.d.ts +15 -1
- package/dist/commands/forget.d.ts.map +1 -1
- package/dist/commands/forget.js +121 -16
- package/dist/commands/forget.js.map +1 -1
- package/dist/commands/pair.d.ts +14 -1
- package/dist/commands/pair.d.ts.map +1 -1
- package/dist/commands/pair.js +52 -21
- package/dist/commands/pair.js.map +1 -1
- package/dist/engine.d.ts +7 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +19 -47
- package/dist/engine.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface ForgetFlags {
|
|
2
|
+
id?: number;
|
|
3
|
+
query?: string;
|
|
4
|
+
since?: string;
|
|
5
|
+
until?: string;
|
|
6
|
+
tag?: string;
|
|
7
|
+
source?: string;
|
|
8
|
+
yes?: boolean;
|
|
9
|
+
limit: number;
|
|
10
|
+
dbPath: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseForgetArgs(argv: string[]): ForgetFlags;
|
|
13
|
+
/** True when at least one selector was given (refuse a blanket delete). */
|
|
14
|
+
export declare function hasForgetSelector(f: ForgetFlags): boolean;
|
|
15
|
+
export declare function runForget(argv: string[]): Promise<number>;
|
|
2
16
|
//# sourceMappingURL=forget.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/commands/forget.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"forget.d.ts","sourceRoot":"","sources":["../../src/commands/forget.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAoB3D;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAEzD;AAWD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA0D/D"}
|
package/dist/commands/forget.js
CHANGED
|
@@ -1,19 +1,124 @@
|
|
|
1
|
-
// forget —
|
|
1
|
+
// forget — remove specific memories from the memory store.
|
|
2
2
|
//
|
|
3
|
-
// The data-hygiene verb: the
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
3
|
+
// The data-hygiene verb: the OWNER asks to forget something (a specific entry,
|
|
4
|
+
// a topic, a date range, a source). This is a privileged operation against the
|
|
5
|
+
// canonical store — deliberately a CLI command and NOT an MCP tool, so the
|
|
6
|
+
// assistant can never be tricked by injected content into deleting memories.
|
|
7
|
+
// Selectors resolve candidates, which are previewed and confirmed before a hard
|
|
8
|
+
// delete (row + vector + FTS) via @justfortytwo/memory's deleteByIds.
|
|
9
|
+
import { createInterface } from 'node:readline/promises';
|
|
10
|
+
import { loadMemory } from '../engine.js';
|
|
11
|
+
import { EMBED_MODEL, DEFAULT_DB_PATH } from './init.js';
|
|
12
|
+
export function parseForgetArgs(argv) {
|
|
13
|
+
const f = { limit: 50, dbPath: process.env.DB_PATH ?? DEFAULT_DB_PATH };
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const a = argv[i];
|
|
16
|
+
if (a === undefined)
|
|
17
|
+
continue;
|
|
18
|
+
if (a === '--yes' || a === '-y') {
|
|
19
|
+
f.yes = true;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (!a.startsWith('--'))
|
|
23
|
+
continue;
|
|
24
|
+
const v = argv[++i] ?? '';
|
|
25
|
+
switch (a.slice(2)) {
|
|
26
|
+
case 'id':
|
|
27
|
+
f.id = Number(v);
|
|
28
|
+
break;
|
|
29
|
+
case 'query':
|
|
30
|
+
f.query = v;
|
|
31
|
+
break;
|
|
32
|
+
case 'since':
|
|
33
|
+
f.since = v;
|
|
34
|
+
break;
|
|
35
|
+
case 'until':
|
|
36
|
+
f.until = v;
|
|
37
|
+
break;
|
|
38
|
+
case 'tag':
|
|
39
|
+
f.tag = v;
|
|
40
|
+
break;
|
|
41
|
+
case 'source':
|
|
42
|
+
f.source = v;
|
|
43
|
+
break;
|
|
44
|
+
case 'limit':
|
|
45
|
+
f.limit = Number(v) || 50;
|
|
46
|
+
break;
|
|
47
|
+
case 'db-path':
|
|
48
|
+
f.dbPath = v;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return f;
|
|
53
|
+
}
|
|
54
|
+
/** True when at least one selector was given (refuse a blanket delete). */
|
|
55
|
+
export function hasForgetSelector(f) {
|
|
56
|
+
return f.id !== undefined || !!f.query || !!f.tag || !!f.source || !!f.since || !!f.until;
|
|
57
|
+
}
|
|
58
|
+
export async function runForget(argv) {
|
|
59
|
+
const f = parseForgetArgs(argv);
|
|
60
|
+
if (!hasForgetSelector(f)) {
|
|
61
|
+
process.stderr.write('forget: specify what to forget — --id <n>, --query <text>, --tag/--source <v>, or --since/--until <date>.\n');
|
|
62
|
+
return 2;
|
|
63
|
+
}
|
|
64
|
+
const mem = (await loadMemory());
|
|
65
|
+
if (!mem || typeof mem.deleteByIds !== 'function') {
|
|
66
|
+
process.stderr.write('forget: @justfortytwo/memory (>=0.1.1, with deleteByIds) is not installed.\n');
|
|
67
|
+
return 2;
|
|
68
|
+
}
|
|
69
|
+
const h = mem.openDb(f.dbPath);
|
|
70
|
+
try {
|
|
71
|
+
let rows;
|
|
72
|
+
if (f.id !== undefined) {
|
|
73
|
+
rows = (await mem.query(h, { liveOnly: false, limit: 100000 })).filter((r) => r.id === f.id);
|
|
74
|
+
}
|
|
75
|
+
else if (f.query) {
|
|
76
|
+
const embedder = process.env.EMBED_MODEL
|
|
77
|
+
? new mem.OllamaEmbedder(process.env.EMBED_MODEL, process.env.OLLAMA_BASE_URL)
|
|
78
|
+
: new mem.FakeEmbedder();
|
|
79
|
+
rows = await mem.recall(h, embedder, f.query, f.limit);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
rows = await mem.query(h, {
|
|
83
|
+
source: f.source, tag: f.tag, since: f.since, until: f.until, liveOnly: false, limit: f.limit,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (rows.length === 0) {
|
|
87
|
+
process.stdout.write('forget: no matching memories.\n');
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
process.stdout.write(`forget: ${rows.length} match(es):\n`);
|
|
91
|
+
for (const r of rows.slice(0, 10)) {
|
|
92
|
+
process.stdout.write(` [${r.id}] ${r.content.replace(/\s+/g, ' ').slice(0, 80)}\n`);
|
|
93
|
+
}
|
|
94
|
+
if (rows.length > 10)
|
|
95
|
+
process.stdout.write(` … and ${rows.length - 10} more\n`);
|
|
96
|
+
if (!f.yes) {
|
|
97
|
+
if (!process.stdin.isTTY) {
|
|
98
|
+
process.stderr.write('forget: refusing to delete without confirmation — re-run with --yes.\n');
|
|
99
|
+
return 2;
|
|
100
|
+
}
|
|
101
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
102
|
+
const ans = (await rl.question(`Permanently forget ${rows.length} memory(ies)? [y/N] `)).trim().toLowerCase();
|
|
103
|
+
rl.close();
|
|
104
|
+
if (ans !== 'y' && ans !== 'yes') {
|
|
105
|
+
process.stdout.write('forget: aborted; nothing deleted.\n');
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const n = mem.deleteByIds(h, rows.map((r) => r.id));
|
|
110
|
+
process.stdout.write(`✓ forgot ${n} memory(ies).\n`);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
try {
|
|
115
|
+
await h.k?.destroy?.();
|
|
116
|
+
}
|
|
117
|
+
catch { /* best-effort */ }
|
|
118
|
+
try {
|
|
119
|
+
h.close?.();
|
|
120
|
+
}
|
|
121
|
+
catch { /* best-effort */ }
|
|
122
|
+
}
|
|
18
123
|
}
|
|
19
124
|
//# sourceMappingURL=forget.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/commands/forget.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"forget.js","sourceRoot":"","sources":["../../src/commands/forget.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pair.d.ts
CHANGED
|
@@ -1,2 +1,15 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface PairFlags {
|
|
2
|
+
/** Which channel to pair. Defaults to telegram (the only adapter at v0). */
|
|
3
|
+
channel: string;
|
|
4
|
+
/** Optional TTL override (seconds) for the code. */
|
|
5
|
+
ttlSeconds?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function parsePairArgs(argv: string[]): PairFlags;
|
|
8
|
+
/**
|
|
9
|
+
* The bindings db the bridge uses — MUST match @justfortytwo/telegram's bridge
|
|
10
|
+
* (`<root>/state/telegram-bindings.db`, overridable via TELEGRAM_BINDINGS_DB),
|
|
11
|
+
* or a code minted here would land in a db the bridge never reads.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveBindingsDbPath(root: string): string;
|
|
14
|
+
export declare function runPair(argv: string[]): Promise<number>;
|
|
2
15
|
//# sourceMappingURL=pair.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,SAAS;IACxB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAUvD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AASD,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB7D"}
|
package/dist/commands/pair.js
CHANGED
|
@@ -1,26 +1,57 @@
|
|
|
1
1
|
// pair — issue a one-time `/login` pairing code for a channel.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
// from the target chat
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
3
|
+
// Mints a short-lived code and PERSISTS it (via @justfortytwo/telegram's
|
|
4
|
+
// store-backed challenges) to the SAME bindings db the running bridge reads.
|
|
5
|
+
// The owner sends `/login <code>` from the target chat; the bridge — a separate
|
|
6
|
+
// process — redeems the persisted challenge and records the binding. This is the
|
|
7
|
+
// dynamic counterpart to the static ALLOWED_CHAT_IDS allowlist, and the
|
|
8
|
+
// lifecycle counterpart to `unbind`.
|
|
9
|
+
import { resolve, dirname } from 'node:path';
|
|
10
|
+
import { mkdirSync } from 'node:fs';
|
|
11
|
+
import { loadTelegram } from '../engine.js';
|
|
12
|
+
export function parsePairArgs(argv) {
|
|
13
|
+
const f = { channel: 'telegram' };
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const a = argv[i];
|
|
16
|
+
if (a === undefined || !a.startsWith('--'))
|
|
17
|
+
continue;
|
|
18
|
+
const v = argv[++i] ?? '';
|
|
19
|
+
if (a === '--channel')
|
|
20
|
+
f.channel = v || 'telegram';
|
|
21
|
+
else if (a === '--ttl')
|
|
22
|
+
f.ttlSeconds = Number(v) || undefined;
|
|
23
|
+
}
|
|
24
|
+
return f;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The bindings db the bridge uses — MUST match @justfortytwo/telegram's bridge
|
|
28
|
+
* (`<root>/state/telegram-bindings.db`, overridable via TELEGRAM_BINDINGS_DB),
|
|
29
|
+
* or a code minted here would land in a db the bridge never reads.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveBindingsDbPath(root) {
|
|
32
|
+
return process.env.TELEGRAM_BINDINGS_DB
|
|
33
|
+
? resolve(root, process.env.TELEGRAM_BINDINGS_DB)
|
|
34
|
+
: resolve(root, 'state', 'telegram-bindings.db');
|
|
22
35
|
}
|
|
23
|
-
function
|
|
24
|
-
|
|
36
|
+
export async function runPair(argv) {
|
|
37
|
+
const flags = parsePairArgs(argv);
|
|
38
|
+
if (flags.channel !== 'telegram') {
|
|
39
|
+
process.stderr.write(`pair: unsupported channel "${flags.channel}" (only telegram at v0).\n`);
|
|
40
|
+
return 2;
|
|
41
|
+
}
|
|
42
|
+
const tg = (await loadTelegram());
|
|
43
|
+
if (!tg || typeof tg.SqliteBindingStore !== 'function' || typeof tg.TelegramAdapter !== 'function') {
|
|
44
|
+
process.stderr.write('pair: @justfortytwo/telegram (>=0.1.1, with persisted challenges) is not installed.\n');
|
|
45
|
+
return 2;
|
|
46
|
+
}
|
|
47
|
+
const dbPath = resolveBindingsDbPath(process.cwd());
|
|
48
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
49
|
+
const store = new tg.SqliteBindingStore(dbPath);
|
|
50
|
+
const adapter = new tg.TelegramAdapter(store, flags.ttlSeconds ? { ttlSeconds: flags.ttlSeconds } : {});
|
|
51
|
+
const { code, ttl } = adapter.issueChallenge('owner');
|
|
52
|
+
process.stdout.write(`Pairing code: ${code}\n`);
|
|
53
|
+
process.stdout.write(`From your Telegram chat, send: /login ${code}\n`);
|
|
54
|
+
process.stdout.write(`(valid ${Math.round(ttl / 60)} min — the running bridge binds that chat to you)\n`);
|
|
55
|
+
return 0;
|
|
25
56
|
}
|
|
26
57
|
//# sourceMappingURL=pair.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
CHANGED
|
@@ -15,7 +15,13 @@ export declare const loadMemory: () => Promise<{
|
|
|
15
15
|
runMigrations?: (k: unknown) => Promise<void>;
|
|
16
16
|
} | null>;
|
|
17
17
|
export declare const loadTelegram: () => Promise<Record<string, unknown> | null>;
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Installed version of a sibling (its package.json `version`), or null. Walks up
|
|
20
|
+
* ancestor `node_modules` dirs exactly like Node's resolver — pure fs, so it is
|
|
21
|
+
* immune to import-only `exports` maps (which defeat require.resolve) and to
|
|
22
|
+
* bundled test runners where import.meta.resolve is unavailable. Matches where
|
|
23
|
+
* loadSibling's dynamic import would find the package.
|
|
24
|
+
*/
|
|
19
25
|
export declare function readInstalledVersion(spec: string): string | null;
|
|
20
26
|
/** The CLI's declared compat ranges (package.json `fortytwo.compat`). */
|
|
21
27
|
export declare function readSelfCompatRanges(): Record<string, string>;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAWA,yEAAyE;AACzE,wBAAsB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAM9F;AAED,eAAO,MAAM,QAAQ;4BAA+C,MAAM;SAAyB,CAAC;AACpG,eAAO,MAAM,UAAU;mCAEY,MAAM;aAG5B,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,CAAC,EAAE;YAAE,MAAM,EAAE;gBAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;aAAE,CAAA;SAAE,CAAA;KAAE;oBAC1E,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;SACrB,CAAC;AAC7B,eAAO,MAAM,YAAY,+CAA8C,CAAC;AAExE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBhE;AAoBD,yEAAyE;AACzE,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAetE;AAED,oFAAoF;AACpF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CASjF;AAED,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAAC;AAE1E;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAehF"}
|
package/dist/engine.js
CHANGED
|
@@ -4,11 +4,9 @@
|
|
|
4
4
|
// reaches them via dynamic import, so a partial install (e.g. gate-only) never
|
|
5
5
|
// crashes the CLI — a missing sibling makes the dependent command/check report
|
|
6
6
|
// "not installed" instead of throwing.
|
|
7
|
-
import { createRequire } from 'node:module';
|
|
8
7
|
import { readFileSync, existsSync } from 'node:fs';
|
|
9
8
|
import { fileURLToPath } from 'node:url';
|
|
10
9
|
import { dirname, join, parse } from 'node:path';
|
|
11
|
-
const require = createRequire(import.meta.url);
|
|
12
10
|
/** Dynamically import an engine sibling; null if it is not installed. */
|
|
13
11
|
export async function loadSibling(spec) {
|
|
14
12
|
try {
|
|
@@ -21,56 +19,30 @@ export async function loadSibling(spec) {
|
|
|
21
19
|
export const loadGate = () => loadSibling('@justfortytwo/gate');
|
|
22
20
|
export const loadMemory = () => loadSibling('@justfortytwo/memory');
|
|
23
21
|
export const loadTelegram = () => loadSibling('@justfortytwo/telegram');
|
|
24
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Installed version of a sibling (its package.json `version`), or null. Walks up
|
|
24
|
+
* ancestor `node_modules` dirs exactly like Node's resolver — pure fs, so it is
|
|
25
|
+
* immune to import-only `exports` maps (which defeat require.resolve) and to
|
|
26
|
+
* bundled test runners where import.meta.resolve is unavailable. Matches where
|
|
27
|
+
* loadSibling's dynamic import would find the package.
|
|
28
|
+
*/
|
|
25
29
|
export function readInstalledVersion(spec) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
try {
|
|
38
|
-
return readVersion(require.resolve(`${spec}/package.json`));
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
/* exports-restricted — fall through */
|
|
42
|
-
}
|
|
43
|
-
try {
|
|
44
|
-
// Resolve the entry with the ESM resolver (matches the package's `import`
|
|
45
|
-
// condition — the same path loadSibling uses), then walk up to the
|
|
46
|
-
// package.json whose name matches. CJS require.resolve can't see
|
|
47
|
-
// import-only exports maps, so prefer import.meta.resolve.
|
|
48
|
-
let entry = null;
|
|
49
|
-
const esmResolve = import.meta.resolve;
|
|
50
|
-
if (esmResolve) {
|
|
30
|
+
const segments = spec.split('/'); // e.g. ['@justfortytwo', 'gate']
|
|
31
|
+
let dir = dirname(fileURLToPath(import.meta.url));
|
|
32
|
+
const root = parse(dir).root;
|
|
33
|
+
while (true) {
|
|
34
|
+
const candidate = join(dir, 'node_modules', ...segments, 'package.json');
|
|
35
|
+
if (existsSync(candidate)) {
|
|
51
36
|
try {
|
|
52
|
-
|
|
37
|
+
return JSON.parse(readFileSync(candidate, 'utf8')).version ?? null;
|
|
53
38
|
}
|
|
54
|
-
catch {
|
|
55
|
-
}
|
|
56
|
-
if (!entry)
|
|
57
|
-
entry = require.resolve(spec);
|
|
58
|
-
let dir = dirname(entry);
|
|
59
|
-
const root = parse(dir).root;
|
|
60
|
-
while (true) {
|
|
61
|
-
const candidate = join(dir, 'package.json');
|
|
62
|
-
if (existsSync(candidate)) {
|
|
63
|
-
const json = JSON.parse(readFileSync(candidate, 'utf8'));
|
|
64
|
-
if (json.name === spec)
|
|
65
|
-
return json.version ?? null;
|
|
66
|
-
}
|
|
67
|
-
if (dir === root)
|
|
39
|
+
catch {
|
|
68
40
|
return null;
|
|
69
|
-
|
|
41
|
+
}
|
|
70
42
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
43
|
+
if (dir === root)
|
|
44
|
+
return null;
|
|
45
|
+
dir = dirname(dir);
|
|
74
46
|
}
|
|
75
47
|
}
|
|
76
48
|
/** Walk up from this module to find the installer's own package.json. */
|
package/dist/engine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,EAAE;AACF,8EAA8E;AAC9E,+EAA+E;AAC/E,+EAA+E;AAC/E,uCAAuC;AAEvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justfortytwo/installer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "All-in-one installer and lifecycle CLI for fortytwo — scaffolds the persona surface and provisions the npm engine (memory MCP, safety gate, channel adapters, embedder).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
"fortytwo": {
|
|
68
68
|
"comment": "Compatibility contract this CLI version was authored against. doctor cross-checks the *installed* sibling packages against these ranges; update/rollback record the resolved set into .fortytwo/state.json. TODO(wire): bump these as sibling contracts evolve.",
|
|
69
69
|
"compat": {
|
|
70
|
-
"@justfortytwo/memory": "^0.1.
|
|
70
|
+
"@justfortytwo/memory": "^0.1.1",
|
|
71
71
|
"@justfortytwo/gate": "^0.1.0",
|
|
72
72
|
"@justfortytwo/persona": "^0.1.0",
|
|
73
|
-
"@justfortytwo/telegram": "^0.1.
|
|
73
|
+
"@justfortytwo/telegram": "^0.1.1"
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
"publishConfig": {
|