@furkankoykiran/contextify-cli 0.4.4 → 0.6.0
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/compile.d.ts +27 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +142 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +31 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -1
- package/dist/prompt-client.d.ts +49 -0
- package/dist/prompt-client.d.ts.map +1 -0
- package/dist/prompt-client.js +45 -0
- package/dist/prompt-client.js.map +1 -0
- package/dist/updater.d.ts +83 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +472 -0
- package/dist/updater.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type CompileMode = 'raw' | 'paste' | 'claude';
|
|
2
|
+
export interface CompileArgs {
|
|
3
|
+
readonly intent: string | null;
|
|
4
|
+
/**
|
|
5
|
+
* Output modes the user passed. Empty array defaults to 'raw'. More than
|
|
6
|
+
* one entry is rejected with exit 2 — the modes are mutually exclusive
|
|
7
|
+
* and silently picking one would hide a typo.
|
|
8
|
+
*/
|
|
9
|
+
readonly modes: readonly CompileMode[];
|
|
10
|
+
readonly topK?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CompileOptions {
|
|
13
|
+
readonly cwd: string;
|
|
14
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
15
|
+
readonly fetchImpl?: typeof fetch;
|
|
16
|
+
readonly readStdin?: () => Promise<string>;
|
|
17
|
+
readonly stdout?: NodeJS.WriteStream;
|
|
18
|
+
readonly stderr?: NodeJS.WriteStream;
|
|
19
|
+
readonly clipboardWrite?: (text: string) => Promise<{
|
|
20
|
+
ok: true;
|
|
21
|
+
} | {
|
|
22
|
+
ok: false;
|
|
23
|
+
reason: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export declare function runCompile(args: CompileArgs, opts: CompileOptions): Promise<number>;
|
|
27
|
+
//# sourceMappingURL=compile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnG;AAeD,wBAAsB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFzF"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `contextify compile <intent>`
|
|
3
|
+
*
|
|
4
|
+
* Compile a Claude-Code-ready XML prompt from an intent draft. Same server
|
|
5
|
+
* synth engine as the (deprecated) `contextify prompt` command — the only
|
|
6
|
+
* difference is output: --raw to stdout (default), --paste to the system
|
|
7
|
+
* clipboard, --claude to the clipboard with a stderr tip framed for Claude
|
|
8
|
+
* Code paste.
|
|
9
|
+
*
|
|
10
|
+
* contextify compile "build a date picker" # stdout
|
|
11
|
+
* contextify compile "build a date picker" --paste # clipboard
|
|
12
|
+
* contextify compile "build a date picker" --claude # clipboard + tip
|
|
13
|
+
* echo "draft from stdin" | contextify compile -
|
|
14
|
+
*
|
|
15
|
+
* The output modes are mutually exclusive. Passing two flags errors with
|
|
16
|
+
* exit 2 so the user notices the ambiguity instead of silently picking one.
|
|
17
|
+
*/
|
|
18
|
+
import { spawnSync } from 'node:child_process';
|
|
19
|
+
import { resolveConfig } from '../config.js';
|
|
20
|
+
import { compilePrompt } from '../prompt-client.js';
|
|
21
|
+
const MAX_INTENT_CHARS = 20_000;
|
|
22
|
+
async function defaultReadStdin() {
|
|
23
|
+
if (process.stdin.isTTY)
|
|
24
|
+
return '';
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
let buf = '';
|
|
27
|
+
process.stdin.setEncoding('utf8');
|
|
28
|
+
process.stdin.on('data', (chunk) => (buf += chunk));
|
|
29
|
+
process.stdin.on('end', () => resolve(buf));
|
|
30
|
+
process.stdin.on('error', reject);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function runCompile(args, opts) {
|
|
34
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
35
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
36
|
+
if (args.modes.length > 1) {
|
|
37
|
+
stderr.write(`contextify: compile: choose at most one of --raw, --paste, --claude (got ${args.modes.join(', ')})\n`);
|
|
38
|
+
return 2;
|
|
39
|
+
}
|
|
40
|
+
const mode = args.modes[0] ?? 'raw';
|
|
41
|
+
let config;
|
|
42
|
+
try {
|
|
43
|
+
config = await resolveConfig(opts.cwd, opts.env);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
stderr.write(`contextify: ${err.message}\n`);
|
|
47
|
+
return 2;
|
|
48
|
+
}
|
|
49
|
+
let intent;
|
|
50
|
+
if (args.intent === null) {
|
|
51
|
+
const readStdin = opts.readStdin ?? defaultReadStdin;
|
|
52
|
+
intent = (await readStdin()).trim();
|
|
53
|
+
if (intent.length === 0) {
|
|
54
|
+
stderr.write('contextify: compile: no intent provided (stdin was empty)\n');
|
|
55
|
+
return 2;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
intent = args.intent.trim();
|
|
60
|
+
if (intent.length === 0) {
|
|
61
|
+
stderr.write('contextify: compile: intent cannot be empty\n');
|
|
62
|
+
return 2;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (intent.length > MAX_INTENT_CHARS) {
|
|
66
|
+
stderr.write(`contextify: compile: intent exceeds ${MAX_INTENT_CHARS} chars (got ${intent.length})\n`);
|
|
67
|
+
return 2;
|
|
68
|
+
}
|
|
69
|
+
if (args.topK !== undefined &&
|
|
70
|
+
(!Number.isInteger(args.topK) || args.topK < 1 || args.topK > 25)) {
|
|
71
|
+
stderr.write('contextify: compile: --top-k must be an integer in [1, 25]\n');
|
|
72
|
+
return 2;
|
|
73
|
+
}
|
|
74
|
+
const result = await compilePrompt({ draft: intent, topK: args.topK }, { config, env: opts.env, fetchImpl: opts.fetchImpl });
|
|
75
|
+
if (!result.ok) {
|
|
76
|
+
if (result.status === null) {
|
|
77
|
+
stderr.write(`contextify: compile: request failed: ${result.statusText}\n`);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
stderr.write(`contextify: compile: server returned ${result.status} ${result.statusText}\n`);
|
|
81
|
+
if (result.body.length > 0)
|
|
82
|
+
stderr.write(`${result.body}\n`);
|
|
83
|
+
}
|
|
84
|
+
return 1;
|
|
85
|
+
}
|
|
86
|
+
const xml = result.data.xml;
|
|
87
|
+
if (mode === 'raw') {
|
|
88
|
+
stdout.write(xml.endsWith('\n') ? xml : `${xml}\n`);
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
const clipboardWrite = opts.clipboardWrite ?? writeToSystemClipboard;
|
|
92
|
+
const clip = await clipboardWrite(xml);
|
|
93
|
+
if (!clip.ok) {
|
|
94
|
+
stderr.write(`contextify: compile: clipboard unavailable (${clip.reason}); writing XML to stdout instead.\n`);
|
|
95
|
+
stdout.write(xml.endsWith('\n') ? xml : `${xml}\n`);
|
|
96
|
+
return 1;
|
|
97
|
+
}
|
|
98
|
+
if (mode === 'claude') {
|
|
99
|
+
stderr.write('Copied Claude Code prompt to clipboard. Paste it as the next Claude Code message.\n');
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
stderr.write('Copied compiled prompt to clipboard.\n');
|
|
103
|
+
}
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Cross-platform clipboard write via the platform's native tool. No npm
|
|
108
|
+
* dep on clipboardy/clipboard-cli — they pull binaries and we want this
|
|
109
|
+
* CLI to stay small. Order: pbcopy (macOS) → wl-copy (Wayland) → xclip
|
|
110
|
+
* (X11) → xsel (X11 fallback) → clip.exe (Windows / WSL interop).
|
|
111
|
+
*/
|
|
112
|
+
async function writeToSystemClipboard(text) {
|
|
113
|
+
const candidates = [
|
|
114
|
+
{ cmd: 'pbcopy', args: [] },
|
|
115
|
+
{ cmd: 'wl-copy', args: [] },
|
|
116
|
+
{ cmd: 'xclip', args: ['-selection', 'clipboard'] },
|
|
117
|
+
{ cmd: 'xsel', args: ['--clipboard', '--input'] },
|
|
118
|
+
{ cmd: 'clip.exe', args: [] },
|
|
119
|
+
{ cmd: 'clip', args: [] },
|
|
120
|
+
];
|
|
121
|
+
const tried = [];
|
|
122
|
+
for (const { cmd, args } of candidates) {
|
|
123
|
+
const probe = spawnSync('which', [cmd], { stdio: 'ignore' });
|
|
124
|
+
if (probe.status !== 0)
|
|
125
|
+
continue;
|
|
126
|
+
tried.push(cmd);
|
|
127
|
+
const res = spawnSync(cmd, args, { input: text, encoding: 'utf8' });
|
|
128
|
+
if (res.error)
|
|
129
|
+
continue;
|
|
130
|
+
if (typeof res.status === 'number' && res.status !== 0)
|
|
131
|
+
continue;
|
|
132
|
+
return { ok: true };
|
|
133
|
+
}
|
|
134
|
+
if (tried.length === 0) {
|
|
135
|
+
return {
|
|
136
|
+
ok: false,
|
|
137
|
+
reason: 'no clipboard tool found (install pbcopy, wl-copy, xclip, xsel, or clip.exe)',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return { ok: false, reason: `clipboard tools failed (tried: ${tried.join(', ')})` };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface UpdateArgs {
|
|
2
|
+
readonly check?: boolean;
|
|
3
|
+
readonly force?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseUpdateArgs(argv: readonly string[]): UpdateArgs;
|
|
6
|
+
export declare function runUpdateCommand(args: UpdateArgs, ctx: {
|
|
7
|
+
env: NodeJS.ProcessEnv;
|
|
8
|
+
currentVersion: string;
|
|
9
|
+
}): Promise<number>;
|
|
10
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CAQnE;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,MAAM,CAAC,CAOjB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `contextify update` — actively pull the latest version from npm via the
|
|
3
|
+
* package manager that owns the running binary.
|
|
4
|
+
*
|
|
5
|
+
* Flags:
|
|
6
|
+
* --check Probe registry and print the upgrade command, but do not run it.
|
|
7
|
+
* --force When the registry probe fails, install @latest anyway via the
|
|
8
|
+
* package manager. Without --force, we abort rather than risk a
|
|
9
|
+
* silent downgrade for users on a local/prerelease build.
|
|
10
|
+
*/
|
|
11
|
+
import { runUpdate } from '../updater.js';
|
|
12
|
+
export function parseUpdateArgs(argv) {
|
|
13
|
+
let check = false;
|
|
14
|
+
let force = false;
|
|
15
|
+
for (const arg of argv) {
|
|
16
|
+
if (arg === '--check')
|
|
17
|
+
check = true;
|
|
18
|
+
else if (arg === '--force')
|
|
19
|
+
force = true;
|
|
20
|
+
}
|
|
21
|
+
return { check, force };
|
|
22
|
+
}
|
|
23
|
+
export async function runUpdateCommand(args, ctx) {
|
|
24
|
+
return runUpdate({
|
|
25
|
+
env: ctx.env,
|
|
26
|
+
currentVersion: ctx.currentVersion,
|
|
27
|
+
check: args.check,
|
|
28
|
+
force: args.force,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAO1C,MAAM,UAAU,eAAe,CAAC,IAAuB;IACrD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,SAAS;YAAE,KAAK,GAAG,IAAI,CAAC;aAC/B,IAAI,GAAG,KAAK,SAAS;YAAE,KAAK,GAAG,IAAI,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAgB,EAChB,GAAuD;IAEvD,OAAO,SAAS,CAAC;QACf,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,cAAc,EAAE,GAAG,CAAC,cAAc;QAClC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,4 +6,10 @@ export interface CliEntry {
|
|
|
6
6
|
readonly env?: NodeJS.ProcessEnv;
|
|
7
7
|
}
|
|
8
8
|
export declare function main(entry: CliEntry): Promise<number>;
|
|
9
|
+
/**
|
|
10
|
+
* Strip a global flag that appears BEFORE the subcommand position and BEFORE
|
|
11
|
+
* any `--` separator. Anything after the subcommand belongs to the subcommand
|
|
12
|
+
* (or, for `wrap --`, to the wrapped child process).
|
|
13
|
+
*/
|
|
14
|
+
export declare function stripGlobalFlag(argv: string[], flag: string): boolean;
|
|
9
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA4BA,eAAO,MAAM,OAAO,QAA0D,CAAC;AAqE/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAqC3D;AA8CD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAerE"}
|
package/dist/index.js
CHANGED
|
Binary file
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAkB,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared HTTP client for /api/prompt/generate.
|
|
3
|
+
*
|
|
4
|
+
* `prompt` (deprecated) and `compile` both call this — there is one synth
|
|
5
|
+
* engine and one client. New commands that want compiled XML go through
|
|
6
|
+
* here; do not fork the fetch.
|
|
7
|
+
*/
|
|
8
|
+
import type { ResolvedConfig } from './config.js';
|
|
9
|
+
export interface PromptApiResponse {
|
|
10
|
+
readonly projectId: string;
|
|
11
|
+
readonly xml: string;
|
|
12
|
+
readonly retrievedMemories: ReadonlyArray<{
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly content: string;
|
|
15
|
+
readonly kind: string;
|
|
16
|
+
readonly source: string;
|
|
17
|
+
readonly distance: number;
|
|
18
|
+
}>;
|
|
19
|
+
readonly directives: ReadonlyArray<{
|
|
20
|
+
readonly skill: string;
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
readonly category: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export interface CompileRequest {
|
|
26
|
+
readonly draft: string;
|
|
27
|
+
readonly topK?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface CompileClientOptions {
|
|
30
|
+
readonly config: ResolvedConfig;
|
|
31
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
32
|
+
readonly fetchImpl?: typeof fetch;
|
|
33
|
+
}
|
|
34
|
+
export type CompileResult = {
|
|
35
|
+
ok: true;
|
|
36
|
+
data: PromptApiResponse;
|
|
37
|
+
} | {
|
|
38
|
+
ok: false;
|
|
39
|
+
status: number;
|
|
40
|
+
statusText: string;
|
|
41
|
+
body: string;
|
|
42
|
+
} | {
|
|
43
|
+
ok: false;
|
|
44
|
+
status: null;
|
|
45
|
+
statusText: string;
|
|
46
|
+
body: string;
|
|
47
|
+
};
|
|
48
|
+
export declare function compilePrompt(req: CompileRequest, opts: CompileClientOptions): Promise<CompileResult>;
|
|
49
|
+
//# sourceMappingURL=prompt-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-client.d.ts","sourceRoot":"","sources":["../src/prompt-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC;QACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;QACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CACnC;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAElE,wBAAsB,aAAa,CACjC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,aAAa,CAAC,CAyCxB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { resolveApiKey } from './credentials.js';
|
|
2
|
+
export async function compilePrompt(req, opts) {
|
|
3
|
+
const fetchImpl = opts.fetchImpl ?? fetch;
|
|
4
|
+
const url = new URL('/api/prompt/generate', opts.config.serverUrl).toString();
|
|
5
|
+
const body = {
|
|
6
|
+
projectId: opts.config.projectId,
|
|
7
|
+
projectName: opts.config.projectName,
|
|
8
|
+
draft: req.draft,
|
|
9
|
+
topK: req.topK,
|
|
10
|
+
};
|
|
11
|
+
const creds = resolveApiKey(opts.env);
|
|
12
|
+
const headers = { 'content-type': 'application/json' };
|
|
13
|
+
if (creds)
|
|
14
|
+
headers.authorization = `Bearer ${creds.apiKey}`;
|
|
15
|
+
let res;
|
|
16
|
+
try {
|
|
17
|
+
// The CLI intentionally sends its locally-stored Contextify project config
|
|
18
|
+
// (from .contextify.json) and API credential (from ~/.contextify/credentials.json)
|
|
19
|
+
// to the configured Contextify server. That is the entire purpose of this
|
|
20
|
+
// binary; there is no untrusted intermediary. The URL is constructed from
|
|
21
|
+
// the operator-controlled `serverUrl` in resolveConfig.
|
|
22
|
+
// lgtm[js/file-access-to-http]
|
|
23
|
+
res = await fetchImpl(url, { method: 'POST', headers, body: JSON.stringify(body) });
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
return { ok: false, status: null, statusText: err.message, body: '' };
|
|
27
|
+
}
|
|
28
|
+
if (!res.ok) {
|
|
29
|
+
const text = await res.text().catch(() => '');
|
|
30
|
+
return { ok: false, status: res.status, statusText: res.statusText, body: text };
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const data = (await res.json());
|
|
34
|
+
return { ok: true, data };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
status: res.status,
|
|
40
|
+
statusText: `invalid JSON: ${err.message}`,
|
|
41
|
+
body: '',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=prompt-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-client.js","sourceRoot":"","sources":["../src/prompt-client.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmCjD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAmB,EACnB,IAA0B;IAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9E,MAAM,IAAI,GAAG;QACX,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;QAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC;IAEF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,KAAK;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,CAAC;IAE5D,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,2EAA2E;QAC3E,mFAAmF;QACnF,0EAA0E;QAC1E,0EAA0E;QAC1E,wDAAwD;QACxD,+BAA+B;QAC/B,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAG,GAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,UAAU,EAAE,iBAAkB,GAAa,CAAC,OAAO,EAAE;YACrD,IAAI,EAAE,EAAE;SACT,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "@furkankoykiran/contextify-cli";
|
|
2
|
+
export declare const REGISTRY_URL: string;
|
|
3
|
+
export declare const UPDATE_CHECK_INTERVAL_MS: number;
|
|
4
|
+
/** When the registry probe fails, retry after this long instead of every invocation. */
|
|
5
|
+
export declare const PROBE_BACKOFF_MS: number;
|
|
6
|
+
export interface UpdateCache {
|
|
7
|
+
/** Latest version observed on the registry (or '' if no successful probe yet). */
|
|
8
|
+
readonly latest: string;
|
|
9
|
+
/** Epoch ms of the last *successful* probe. */
|
|
10
|
+
readonly checkedAt: number;
|
|
11
|
+
/**
|
|
12
|
+
* Epoch ms of the last *failed* probe. Used to apply PROBE_BACKOFF_MS so we
|
|
13
|
+
* don't respawn the detached probe on every invocation while the registry
|
|
14
|
+
* is unreachable, AND we still re-check before the 24h `checkedAt` window
|
|
15
|
+
* elapses once the network recovers. Undefined when the most recent probe
|
|
16
|
+
* succeeded.
|
|
17
|
+
*/
|
|
18
|
+
readonly failedAt?: number;
|
|
19
|
+
/** Version of the CLI that wrote this cache — invalidates on upgrade. */
|
|
20
|
+
readonly currentAtCheck: string;
|
|
21
|
+
}
|
|
22
|
+
export interface UpdaterOptions {
|
|
23
|
+
readonly env: NodeJS.ProcessEnv;
|
|
24
|
+
readonly currentVersion: string;
|
|
25
|
+
readonly now?: () => number;
|
|
26
|
+
/** Injected for tests — defaults to fetchLatestVersion against the npm registry. */
|
|
27
|
+
readonly fetchLatest?: () => Promise<string | null>;
|
|
28
|
+
}
|
|
29
|
+
export declare function stateDirFor(env: NodeJS.ProcessEnv): string;
|
|
30
|
+
export declare function cachePathFor(env: NodeJS.ProcessEnv): string;
|
|
31
|
+
/** Opt-out checks: CI, tests, explicit env flag, or non-TTY stderr. */
|
|
32
|
+
export declare function isUpdateCheckDisabled(env: NodeJS.ProcessEnv): boolean;
|
|
33
|
+
export interface ParsedVersion {
|
|
34
|
+
readonly major: number;
|
|
35
|
+
readonly minor: number;
|
|
36
|
+
readonly patch: number;
|
|
37
|
+
readonly prerelease: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
export declare function parseVersion(v: string): ParsedVersion | null;
|
|
40
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
41
|
+
/** True if `latest` is strictly newer than `current`. Robust to junk inputs. */
|
|
42
|
+
export declare function isUpdateAvailable(current: string, latest: string): boolean;
|
|
43
|
+
export declare function readCache(env: NodeJS.ProcessEnv): Promise<UpdateCache | null>;
|
|
44
|
+
export declare function writeCache(env: NodeJS.ProcessEnv, cache: UpdateCache): Promise<void>;
|
|
45
|
+
export declare function fetchLatestVersion(timeoutMs?: number): Promise<string | null>;
|
|
46
|
+
export declare function shouldSpawnProbe(cache: UpdateCache | null, currentVersion: string, now: number): boolean;
|
|
47
|
+
export declare function spawnProbeIfNeeded(opts: UpdaterOptions, cache: UpdateCache | null): void;
|
|
48
|
+
/** Runs inside the detached child: fetch + write cache, then exit. */
|
|
49
|
+
export declare function runProbe(opts: UpdaterOptions): Promise<void>;
|
|
50
|
+
export declare function formatBanner(current: string, latest: string): string;
|
|
51
|
+
export interface NotifierResult {
|
|
52
|
+
readonly shown: boolean;
|
|
53
|
+
readonly latest?: string;
|
|
54
|
+
}
|
|
55
|
+
export declare function runNotifier(opts: UpdaterOptions, stderr?: NodeJS.WriteStream): Promise<NotifierResult>;
|
|
56
|
+
export type PackageManager = 'npm' | 'pnpm' | 'yarn';
|
|
57
|
+
/**
|
|
58
|
+
* Heuristic: look at the realpath of the running binary. pnpm and yarn each
|
|
59
|
+
* install globals into distinctive directories; everything else falls back
|
|
60
|
+
* to npm.
|
|
61
|
+
*/
|
|
62
|
+
export declare function detectPackageManager(argv1: string | undefined): PackageManager;
|
|
63
|
+
export declare function updateCommandFor(pm: PackageManager, version?: string): readonly string[];
|
|
64
|
+
export interface RunUpdateOptions {
|
|
65
|
+
readonly env: NodeJS.ProcessEnv;
|
|
66
|
+
readonly currentVersion: string;
|
|
67
|
+
readonly argv1?: string;
|
|
68
|
+
readonly check?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Opt in to running the package-manager install even when we couldn't
|
|
71
|
+
* verify the registry version is newer. Without this, a probe failure
|
|
72
|
+
* with no cached `latest` aborts rather than risk a silent downgrade for
|
|
73
|
+
* users on a local/prerelease build that's ahead of `@latest`.
|
|
74
|
+
*/
|
|
75
|
+
readonly force?: boolean;
|
|
76
|
+
readonly stdout?: NodeJS.WriteStream;
|
|
77
|
+
readonly stderr?: NodeJS.WriteStream;
|
|
78
|
+
/** Injected for tests — defaults to fetchLatestVersion + child_process.spawn. */
|
|
79
|
+
readonly fetchLatest?: () => Promise<string | null>;
|
|
80
|
+
readonly runCommand?: (cmd: readonly string[]) => Promise<number>;
|
|
81
|
+
}
|
|
82
|
+
export declare function runUpdate(opts: RunUpdateOptions): Promise<number>;
|
|
83
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update mechanism for the contextify CLI.
|
|
3
|
+
*
|
|
4
|
+
* Pattern: classic `update-notifier` (npm, yarn, vercel) — never modify the
|
|
5
|
+
* running executable, never block the user's command. Instead:
|
|
6
|
+
*
|
|
7
|
+
* 1. Once per UPDATE_CHECK_INTERVAL_MS, fork a detached background process
|
|
8
|
+
* that hits `https://registry.npmjs.org/<pkg>/latest` and writes the
|
|
9
|
+
* result to `~/.contextify/update-check.json`.
|
|
10
|
+
* 2. On every foreground command, read the cache and print a one-line
|
|
11
|
+
* banner on stderr if a newer version is available. Cache reads cost
|
|
12
|
+
* a single fs.stat + readFile, so this is effectively free.
|
|
13
|
+
* 3. `contextify update` shells out to the package manager that owns the
|
|
14
|
+
* running binary (npm / pnpm / yarn) and installs the latest.
|
|
15
|
+
*
|
|
16
|
+
* Zero new runtime deps — uses node:https + a hand-rolled SemVer compare.
|
|
17
|
+
*/
|
|
18
|
+
import { spawn } from 'node:child_process';
|
|
19
|
+
import { existsSync } from 'node:fs';
|
|
20
|
+
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
21
|
+
import { request } from 'node:https';
|
|
22
|
+
import { createRequire } from 'node:module';
|
|
23
|
+
import { homedir } from 'node:os';
|
|
24
|
+
import { join, resolve as resolvePath } from 'node:path';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
export const PACKAGE_NAME = '@furkankoykiran/contextify-cli';
|
|
27
|
+
export const REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME).replace('%40', '@')}/latest`;
|
|
28
|
+
export const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24h
|
|
29
|
+
/** When the registry probe fails, retry after this long instead of every invocation. */
|
|
30
|
+
export const PROBE_BACKOFF_MS = 60 * 60 * 1000; // 1h
|
|
31
|
+
const HTTP_TIMEOUT_MS = 5_000;
|
|
32
|
+
/** Hard cap on the registry response body — the JSON we want is well under 8KB. */
|
|
33
|
+
const MAX_RESPONSE_BYTES = 256 * 1024;
|
|
34
|
+
export function stateDirFor(env) {
|
|
35
|
+
return env.CONTEXTIFY_STATE_DIR ?? join(homedir(), '.contextify');
|
|
36
|
+
}
|
|
37
|
+
export function cachePathFor(env) {
|
|
38
|
+
return join(stateDirFor(env), 'update-check.json');
|
|
39
|
+
}
|
|
40
|
+
/** Opt-out checks: CI, tests, explicit env flag, or non-TTY stderr. */
|
|
41
|
+
export function isUpdateCheckDisabled(env) {
|
|
42
|
+
if (env.CONTEXTIFY_NO_UPDATE_CHECK && env.CONTEXTIFY_NO_UPDATE_CHECK !== '0')
|
|
43
|
+
return true;
|
|
44
|
+
if (env.NO_UPDATE_NOTIFIER && env.NO_UPDATE_NOTIFIER !== '0')
|
|
45
|
+
return true;
|
|
46
|
+
if (env.CI && env.CI !== 'false' && env.CI !== '0')
|
|
47
|
+
return true;
|
|
48
|
+
if (env.NODE_ENV === 'test')
|
|
49
|
+
return true;
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
// Numeric identifiers MUST NOT have leading zeroes per SemVer 2.0.0 §2 / §9.
|
|
53
|
+
const NUMERIC_ID = '(?:0|[1-9]\\d*)';
|
|
54
|
+
const PRERELEASE_ID = '(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9A-Za-z-]*)';
|
|
55
|
+
const PRERELEASE = `(?:${PRERELEASE_ID}(?:\\.${PRERELEASE_ID})*)`;
|
|
56
|
+
const SEMVER_RE = new RegExp(`^v?(${NUMERIC_ID})\\.(${NUMERIC_ID})\\.(${NUMERIC_ID})(?:-(${PRERELEASE}))?(?:\\+[0-9A-Za-z.-]+)?$`);
|
|
57
|
+
export function parseVersion(v) {
|
|
58
|
+
const m = SEMVER_RE.exec(v.trim());
|
|
59
|
+
if (!m)
|
|
60
|
+
return null;
|
|
61
|
+
const [, maj, min, pat, pre] = m;
|
|
62
|
+
return {
|
|
63
|
+
major: Number(maj),
|
|
64
|
+
minor: Number(min),
|
|
65
|
+
patch: Number(pat),
|
|
66
|
+
prerelease: pre ? pre.split('.') : [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export function compareVersions(a, b) {
|
|
70
|
+
const pa = parseVersion(a);
|
|
71
|
+
const pb = parseVersion(b);
|
|
72
|
+
if (!pa && !pb)
|
|
73
|
+
return 0;
|
|
74
|
+
if (!pa)
|
|
75
|
+
return -1;
|
|
76
|
+
if (!pb)
|
|
77
|
+
return 1;
|
|
78
|
+
if (pa.major !== pb.major)
|
|
79
|
+
return pa.major < pb.major ? -1 : 1;
|
|
80
|
+
if (pa.minor !== pb.minor)
|
|
81
|
+
return pa.minor < pb.minor ? -1 : 1;
|
|
82
|
+
if (pa.patch !== pb.patch)
|
|
83
|
+
return pa.patch < pb.patch ? -1 : 1;
|
|
84
|
+
// Prerelease tiebreak: 1.0.0-rc.1 < 1.0.0; 1.0.0-alpha < 1.0.0-beta.
|
|
85
|
+
if (pa.prerelease.length === 0 && pb.prerelease.length === 0)
|
|
86
|
+
return 0;
|
|
87
|
+
if (pa.prerelease.length === 0)
|
|
88
|
+
return 1;
|
|
89
|
+
if (pb.prerelease.length === 0)
|
|
90
|
+
return -1;
|
|
91
|
+
const len = Math.max(pa.prerelease.length, pb.prerelease.length);
|
|
92
|
+
for (let i = 0; i < len; i++) {
|
|
93
|
+
const ai = pa.prerelease[i];
|
|
94
|
+
const bi = pb.prerelease[i];
|
|
95
|
+
if (ai === undefined)
|
|
96
|
+
return -1;
|
|
97
|
+
if (bi === undefined)
|
|
98
|
+
return 1;
|
|
99
|
+
const an = /^\d+$/.test(ai) ? Number(ai) : null;
|
|
100
|
+
const bn = /^\d+$/.test(bi) ? Number(bi) : null;
|
|
101
|
+
if (an !== null && bn !== null) {
|
|
102
|
+
if (an !== bn)
|
|
103
|
+
return an < bn ? -1 : 1;
|
|
104
|
+
}
|
|
105
|
+
else if (an !== null) {
|
|
106
|
+
return -1; // numeric < alphanumeric per semver spec
|
|
107
|
+
}
|
|
108
|
+
else if (bn !== null) {
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
else if (ai !== bi) {
|
|
112
|
+
return ai < bi ? -1 : 1;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
/** True if `latest` is strictly newer than `current`. Robust to junk inputs. */
|
|
118
|
+
export function isUpdateAvailable(current, latest) {
|
|
119
|
+
if (!latest)
|
|
120
|
+
return false;
|
|
121
|
+
return compareVersions(latest, current) > 0;
|
|
122
|
+
}
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
// Cache I/O
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
export async function readCache(env) {
|
|
127
|
+
const path = cachePathFor(env);
|
|
128
|
+
if (!existsSync(path))
|
|
129
|
+
return null;
|
|
130
|
+
try {
|
|
131
|
+
const raw = await readFile(path, 'utf8');
|
|
132
|
+
const parsed = JSON.parse(raw);
|
|
133
|
+
if (typeof parsed.latest !== 'string' ||
|
|
134
|
+
typeof parsed.checkedAt !== 'number' ||
|
|
135
|
+
typeof parsed.currentAtCheck !== 'string') {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
latest: parsed.latest,
|
|
140
|
+
checkedAt: parsed.checkedAt,
|
|
141
|
+
...(typeof parsed.failedAt === 'number' ? { failedAt: parsed.failedAt } : {}),
|
|
142
|
+
currentAtCheck: parsed.currentAtCheck,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function writeCache(env, cache) {
|
|
150
|
+
const dir = stateDirFor(env);
|
|
151
|
+
if (!existsSync(dir))
|
|
152
|
+
await mkdir(dir, { recursive: true });
|
|
153
|
+
const path = cachePathFor(env);
|
|
154
|
+
await writeFile(path, JSON.stringify(cache, null, 2), 'utf8');
|
|
155
|
+
try {
|
|
156
|
+
await chmod(path, 0o600);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// chmod is best-effort (e.g. Windows) — the file content is non-secret.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Registry fetch (used by the background probe AND `contextify update`).
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
export async function fetchLatestVersion(timeoutMs = HTTP_TIMEOUT_MS) {
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
const req = request(REGISTRY_URL, {
|
|
168
|
+
method: 'GET',
|
|
169
|
+
headers: {
|
|
170
|
+
accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8',
|
|
171
|
+
'user-agent': `contextify-cli updater`,
|
|
172
|
+
},
|
|
173
|
+
timeout: timeoutMs,
|
|
174
|
+
}, (res) => {
|
|
175
|
+
if (res.statusCode !== 200) {
|
|
176
|
+
res.resume();
|
|
177
|
+
resolve(null);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const chunks = [];
|
|
181
|
+
let received = 0;
|
|
182
|
+
let aborted = false;
|
|
183
|
+
res.on('data', (c) => {
|
|
184
|
+
if (aborted)
|
|
185
|
+
return;
|
|
186
|
+
received += c.length;
|
|
187
|
+
if (received > MAX_RESPONSE_BYTES) {
|
|
188
|
+
aborted = true;
|
|
189
|
+
res.destroy();
|
|
190
|
+
resolve(null);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
chunks.push(c);
|
|
194
|
+
});
|
|
195
|
+
res.on('end', () => {
|
|
196
|
+
if (aborted)
|
|
197
|
+
return;
|
|
198
|
+
try {
|
|
199
|
+
const body = Buffer.concat(chunks).toString('utf8');
|
|
200
|
+
const json = JSON.parse(body);
|
|
201
|
+
resolve(typeof json.version === 'string' ? json.version : null);
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
resolve(null);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
res.on('error', () => resolve(null));
|
|
208
|
+
});
|
|
209
|
+
req.on('error', () => resolve(null));
|
|
210
|
+
req.on('timeout', () => {
|
|
211
|
+
req.destroy();
|
|
212
|
+
resolve(null);
|
|
213
|
+
});
|
|
214
|
+
req.end();
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Background probe spawner — runs `node <thisFile> --probe` detached.
|
|
219
|
+
// The probe writes the cache and exits; the parent process never waits on it.
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
export function shouldSpawnProbe(cache, currentVersion, now) {
|
|
222
|
+
if (!cache)
|
|
223
|
+
return true;
|
|
224
|
+
if (cache.currentAtCheck !== currentVersion)
|
|
225
|
+
return true; // user upgraded; recheck
|
|
226
|
+
// If the most recent probe failed, honor the short backoff regardless of
|
|
227
|
+
// whether we still have a stale-but-good `latest` cached. Otherwise a
|
|
228
|
+
// transient outage at the scheduled 24h check would suppress retries for
|
|
229
|
+
// another full day instead of retrying in PROBE_BACKOFF_MS.
|
|
230
|
+
if (cache.failedAt !== undefined) {
|
|
231
|
+
return now - cache.failedAt >= PROBE_BACKOFF_MS;
|
|
232
|
+
}
|
|
233
|
+
return now - cache.checkedAt >= UPDATE_CHECK_INTERVAL_MS;
|
|
234
|
+
}
|
|
235
|
+
export function spawnProbeIfNeeded(opts, cache) {
|
|
236
|
+
const now = (opts.now ?? Date.now)();
|
|
237
|
+
if (!shouldSpawnProbe(cache, opts.currentVersion, now))
|
|
238
|
+
return;
|
|
239
|
+
try {
|
|
240
|
+
const entry = fileURLToPath(import.meta.url);
|
|
241
|
+
const child = spawn(process.execPath, [entry, '--probe'], {
|
|
242
|
+
detached: true,
|
|
243
|
+
stdio: 'ignore',
|
|
244
|
+
env: { ...opts.env, CONTEXTIFY_UPDATER_PROBE: '1' },
|
|
245
|
+
});
|
|
246
|
+
// spawn reports OS-level failures (EMFILE, EAGAIN, Windows ENOENT) via an
|
|
247
|
+
// 'error' event on the returned ChildProcess — NOT via the synchronous
|
|
248
|
+
// throw caught below. Without a listener, Node would crash the foreground
|
|
249
|
+
// CLI command on an unhandled error event.
|
|
250
|
+
child.on('error', () => {
|
|
251
|
+
// Best-effort: swallow. The next invocation will retry per
|
|
252
|
+
// shouldSpawnProbe / PROBE_BACKOFF_MS gating.
|
|
253
|
+
});
|
|
254
|
+
child.unref();
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Synchronous spawn failure (rare — most platforms surface via 'error').
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** Runs inside the detached child: fetch + write cache, then exit. */
|
|
261
|
+
export async function runProbe(opts) {
|
|
262
|
+
const fetcher = opts.fetchLatest ?? (() => fetchLatestVersion());
|
|
263
|
+
const latest = await fetcher();
|
|
264
|
+
const now = (opts.now ?? Date.now)();
|
|
265
|
+
if (latest === null) {
|
|
266
|
+
// Negative-cache the failure so we don't respawn a probe on every
|
|
267
|
+
// invocation while the registry is unreachable. Preserve any
|
|
268
|
+
// previously-known `latest` (so the banner doesn't disappear during a
|
|
269
|
+
// transient outage) AND the previous `checkedAt` (so the 24h interval
|
|
270
|
+
// isn't silently reset by a failure). The new `failedAt` field carries
|
|
271
|
+
// the short-backoff signal independently.
|
|
272
|
+
const existing = await readCache(opts.env);
|
|
273
|
+
await writeCache(opts.env, {
|
|
274
|
+
latest: existing?.latest ?? '',
|
|
275
|
+
checkedAt: existing?.checkedAt ?? 0,
|
|
276
|
+
failedAt: now,
|
|
277
|
+
currentAtCheck: opts.currentVersion,
|
|
278
|
+
});
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
await writeCache(opts.env, {
|
|
282
|
+
latest,
|
|
283
|
+
checkedAt: now,
|
|
284
|
+
currentAtCheck: opts.currentVersion,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
// Notifier — read cache and print banner if a newer version exists.
|
|
289
|
+
// ---------------------------------------------------------------------------
|
|
290
|
+
export function formatBanner(current, latest) {
|
|
291
|
+
const line1 = `┌──────────────────────────────────────────────────────────┐`;
|
|
292
|
+
const line2 = `│ Update available: ${current.padEnd(8)} → ${latest.padEnd(8)} │`;
|
|
293
|
+
const line3 = `│ Run: contextify update │`;
|
|
294
|
+
const line4 = `└──────────────────────────────────────────────────────────┘`;
|
|
295
|
+
return `${line1}\n${line2}\n${line3}\n${line4}\n`;
|
|
296
|
+
}
|
|
297
|
+
export async function runNotifier(opts, stderr = process.stderr) {
|
|
298
|
+
if (isUpdateCheckDisabled(opts.env))
|
|
299
|
+
return { shown: false };
|
|
300
|
+
const cache = await readCache(opts.env);
|
|
301
|
+
spawnProbeIfNeeded(opts, cache);
|
|
302
|
+
if (!cache)
|
|
303
|
+
return { shown: false };
|
|
304
|
+
if (!isUpdateAvailable(opts.currentVersion, cache.latest))
|
|
305
|
+
return { shown: false };
|
|
306
|
+
// Only show banner to interactive stderr — keeps machine-parseable output
|
|
307
|
+
// clean. Node sets isTTY to `true` ONLY for real ttys; redirected / piped
|
|
308
|
+
// streams leave it `undefined` (NOT `false`), so we must treat anything
|
|
309
|
+
// other than explicit `true` as non-interactive.
|
|
310
|
+
if (stderr.isTTY !== true) {
|
|
311
|
+
return { shown: false, latest: cache.latest };
|
|
312
|
+
}
|
|
313
|
+
stderr.write(formatBanner(opts.currentVersion, cache.latest));
|
|
314
|
+
return { shown: true, latest: cache.latest };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Heuristic: look at the realpath of the running binary. pnpm and yarn each
|
|
318
|
+
* install globals into distinctive directories; everything else falls back
|
|
319
|
+
* to npm.
|
|
320
|
+
*/
|
|
321
|
+
export function detectPackageManager(argv1) {
|
|
322
|
+
if (!argv1)
|
|
323
|
+
return 'npm';
|
|
324
|
+
// Lowercase the normalized path: Windows is case-insensitive on filesystem
|
|
325
|
+
// and Yarn classic installs under %LOCALAPPDATA%\Yarn\... — without this
|
|
326
|
+
// a Yarn-owned install would fall through to npm.
|
|
327
|
+
const norm = resolvePath(argv1).replace(/\\/g, '/').toLowerCase();
|
|
328
|
+
if (norm.includes('/pnpm/') || norm.includes('/.pnpm/'))
|
|
329
|
+
return 'pnpm';
|
|
330
|
+
if (norm.includes('/yarn/') || norm.includes('/.yarn/'))
|
|
331
|
+
return 'yarn';
|
|
332
|
+
return 'npm';
|
|
333
|
+
}
|
|
334
|
+
export function updateCommandFor(pm, version = 'latest') {
|
|
335
|
+
// Pin to an explicit version when we verified one against the npm registry.
|
|
336
|
+
// If the user's package manager points at a lagging private mirror,
|
|
337
|
+
// `@latest` could still resolve to an older version and silently downgrade
|
|
338
|
+
// them; pinning the exact version we probed avoids that. Fallback path
|
|
339
|
+
// (--force without a probed version) passes `latest`.
|
|
340
|
+
const spec = `${PACKAGE_NAME}@${version}`;
|
|
341
|
+
switch (pm) {
|
|
342
|
+
case 'pnpm':
|
|
343
|
+
return ['pnpm', 'add', '-g', spec];
|
|
344
|
+
case 'yarn':
|
|
345
|
+
return ['yarn', 'global', 'add', spec];
|
|
346
|
+
case 'npm':
|
|
347
|
+
default:
|
|
348
|
+
return ['npm', 'install', '-g', spec];
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
export async function runUpdate(opts) {
|
|
352
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
353
|
+
const stderr = opts.stderr ?? process.stderr;
|
|
354
|
+
const fetcher = opts.fetchLatest ?? (() => fetchLatestVersion());
|
|
355
|
+
const latest = await fetcher();
|
|
356
|
+
const pm = detectPackageManager(opts.argv1 ?? process.argv[1]);
|
|
357
|
+
// If our direct probe to registry.npmjs.org failed (corporate proxy, custom
|
|
358
|
+
// mirror, IPv6-only, registry outage, rate limit), the user's package
|
|
359
|
+
// manager may still be able to fetch a newer version. But we can't blindly
|
|
360
|
+
// install @latest: if the user is on a local/prerelease build that's ahead
|
|
361
|
+
// of the registry's `latest` dist-tag (or a corporate mirror is lagging),
|
|
362
|
+
// doing so silently DOWNGRADES them. So: print the command, explain, and
|
|
363
|
+
// require --force to actually run it.
|
|
364
|
+
if (latest === null) {
|
|
365
|
+
// Fallback path: we don't know the target version, so `@latest` is the
|
|
366
|
+
// best we can do. The user opted in via --force.
|
|
367
|
+
const fallbackCmd = updateCommandFor(pm, 'latest');
|
|
368
|
+
stderr.write(`contextify: could not reach npm registry directly. ` +
|
|
369
|
+
`Cannot confirm whether ${PACKAGE_NAME}@latest is newer than ${opts.currentVersion}.\n`);
|
|
370
|
+
stdout.write(`Run manually: ${fallbackCmd.join(' ')}\n`);
|
|
371
|
+
if (opts.check)
|
|
372
|
+
return 0;
|
|
373
|
+
if (!opts.force) {
|
|
374
|
+
stdout.write(`Or re-run with --force to install @latest anyway.\n`);
|
|
375
|
+
return 1;
|
|
376
|
+
}
|
|
377
|
+
stdout.write(`--force given; deferring to ${pm} (note: this may downgrade if ${PACKAGE_NAME}@latest < ${opts.currentVersion}).\n`);
|
|
378
|
+
stdout.write(`$ ${fallbackCmd.join(' ')}\n`);
|
|
379
|
+
return runInstall(opts, fallbackCmd, undefined, stdout, stderr);
|
|
380
|
+
}
|
|
381
|
+
if (!isUpdateAvailable(opts.currentVersion, latest)) {
|
|
382
|
+
stdout.write(`contextify ${opts.currentVersion} is already the latest version.\n`);
|
|
383
|
+
return 0;
|
|
384
|
+
}
|
|
385
|
+
// Pin to the exact verified version. Using `@latest` here would let a
|
|
386
|
+
// lagging private mirror return an older release than the one we just
|
|
387
|
+
// confirmed on npmjs.org, silently downgrading the user.
|
|
388
|
+
const cmd = updateCommandFor(pm, latest);
|
|
389
|
+
if (opts.check) {
|
|
390
|
+
stdout.write(`Update available: ${opts.currentVersion} → ${latest}\n`);
|
|
391
|
+
stdout.write(`Run: ${cmd.join(' ')}\n`);
|
|
392
|
+
return 0;
|
|
393
|
+
}
|
|
394
|
+
stdout.write(`Updating contextify ${opts.currentVersion} → ${latest} via ${pm}…\n`);
|
|
395
|
+
stdout.write(`$ ${cmd.join(' ')}\n`);
|
|
396
|
+
return runInstall(opts, cmd, latest, stdout, stderr);
|
|
397
|
+
}
|
|
398
|
+
async function runInstall(opts, cmd, latest, stdout, stderr) {
|
|
399
|
+
const runner = opts.runCommand ??
|
|
400
|
+
((c) => new Promise((resolveExit) => {
|
|
401
|
+
// Windows: npm/pnpm/yarn ship as `.cmd` shim files. child_process.spawn
|
|
402
|
+
// without `shell: true` cannot launch .cmd scripts by their bare name,
|
|
403
|
+
// so `contextify update` would otherwise fail with ENOENT on Windows.
|
|
404
|
+
// `shell: true` is safe here: every argument is either a hardcoded
|
|
405
|
+
// string (the package name, the manager subcommand) or a version we
|
|
406
|
+
// already parsed through the strict SemVer regex — no shell-metachar
|
|
407
|
+
// injection surface.
|
|
408
|
+
const useShell = process.platform === 'win32';
|
|
409
|
+
const child = spawn(c[0], c.slice(1), {
|
|
410
|
+
stdio: 'inherit',
|
|
411
|
+
env: opts.env,
|
|
412
|
+
shell: useShell,
|
|
413
|
+
});
|
|
414
|
+
child.on('exit', (code) => resolveExit(code ?? 1));
|
|
415
|
+
child.on('error', (err) => {
|
|
416
|
+
stderr.write(`contextify: failed to launch ${c[0]}: ${err.message}\n`);
|
|
417
|
+
resolveExit(127);
|
|
418
|
+
});
|
|
419
|
+
}));
|
|
420
|
+
const code = await runner(cmd);
|
|
421
|
+
if (code === 0) {
|
|
422
|
+
if (latest !== undefined) {
|
|
423
|
+
// Invalidate the cache so the banner stops showing immediately.
|
|
424
|
+
try {
|
|
425
|
+
await writeCache(opts.env, {
|
|
426
|
+
latest,
|
|
427
|
+
checkedAt: Date.now(),
|
|
428
|
+
currentAtCheck: latest,
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
// Non-fatal: stale banner will self-heal on next probe.
|
|
433
|
+
}
|
|
434
|
+
stdout.write(`contextify updated to ${latest}.\n`);
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
// We deferred to the package manager without knowing the target version;
|
|
438
|
+
// drop the cache so the next probe re-establishes ground truth.
|
|
439
|
+
try {
|
|
440
|
+
await writeCache(opts.env, {
|
|
441
|
+
latest: '',
|
|
442
|
+
checkedAt: 0,
|
|
443
|
+
currentAtCheck: opts.currentVersion,
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
// Non-fatal.
|
|
448
|
+
}
|
|
449
|
+
stdout.write(`contextify update complete.\n`);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
stderr.write(`contextify: update failed (exit ${code}).\n`);
|
|
454
|
+
}
|
|
455
|
+
return code;
|
|
456
|
+
}
|
|
457
|
+
// ---------------------------------------------------------------------------
|
|
458
|
+
// CLI entry for the detached probe subprocess.
|
|
459
|
+
// ---------------------------------------------------------------------------
|
|
460
|
+
async function maybeRunProbeMain() {
|
|
461
|
+
if (process.env.CONTEXTIFY_UPDATER_PROBE !== '1')
|
|
462
|
+
return;
|
|
463
|
+
if (!process.argv.includes('--probe'))
|
|
464
|
+
return;
|
|
465
|
+
// Read the version baked into the dist at build time.
|
|
466
|
+
const req = createRequire(import.meta.url);
|
|
467
|
+
const pkg = req('../package.json');
|
|
468
|
+
const currentVersion = typeof pkg.version === 'string' ? pkg.version : '0.0.0';
|
|
469
|
+
await runProbe({ env: process.env, currentVersion });
|
|
470
|
+
}
|
|
471
|
+
void maybeRunProbeMain();
|
|
472
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,gCAAgC,CAAC;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,8BAA8B,kBAAkB,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC;AACxH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AACnE,wFAAwF;AACxF,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK;AACrD,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,mFAAmF;AACnF,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,CAAC;AA2BtC,MAAM,UAAU,WAAW,CAAC,GAAsB;IAChD,OAAO,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAsB;IACjD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC;AACrD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IAC1D,IAAI,GAAG,CAAC,0BAA0B,IAAI,GAAG,CAAC,0BAA0B,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1F,IAAI,GAAG,CAAC,kBAAkB,IAAI,GAAG,CAAC,kBAAkB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAcD,6EAA6E;AAC7E,MAAM,UAAU,GAAG,iBAAiB,CAAC;AACrC,MAAM,aAAa,GAAG,4CAA4C,CAAC;AACnE,MAAM,UAAU,GAAG,MAAM,aAAa,SAAS,aAAa,KAAK,CAAC;AAClE,MAAM,SAAS,GAAG,IAAI,MAAM,CAC1B,OAAO,UAAU,QAAQ,UAAU,QAAQ,UAAU,SAAS,UAAU,4BAA4B,CACrG,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;QAClB,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC;IACnB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAElB,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/D,qEAAqE;IACrE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC;IAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC,CAAC,CAAC,yCAAyC;QACtD,CAAC;aAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IAC/D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAsB;IACpD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,IACE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;YACpC,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,EACzC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAsB,EAAE,KAAkB;IACzE,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAS,GAAG,eAAe;IAClE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,OAAO,CACjB,YAAY,EACZ;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,MAAM,EAAE,qEAAqE;gBAC7E,YAAY,EAAE,wBAAwB;aACvC;YACD,OAAO,EAAE,SAAS;SACnB,EACD,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;gBAC3B,IAAI,OAAO;oBAAE,OAAO;gBACpB,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC;gBACrB,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;oBAClC,OAAO,GAAG,IAAI,CAAC;oBACf,GAAG,CAAC,OAAO,EAAE,CAAC;oBACd,OAAO,CAAC,IAAI,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,IAAI,OAAO;oBAAE,OAAO;gBACpB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA0B,CAAC;oBACvD,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAClE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAC9E,8EAA8E;AAE9E,MAAM,UAAU,gBAAgB,CAC9B,KAAyB,EACzB,cAAsB,EACtB,GAAW;IAEX,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,CAAC,cAAc,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC,CAAC,yBAAyB;IACnF,yEAAyE;IACzE,sEAAsE;IACtE,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,GAAG,GAAG,KAAK,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,wBAAwB,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAoB,EAAE,KAAyB;IAChF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC;QAAE,OAAO;IAC/D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE;YACxD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,wBAAwB,EAAE,GAAG,EAAE;SACpD,CAAC,CAAC;QACH,0EAA0E;QAC1E,uEAAuE;QACvE,0EAA0E;QAC1E,2CAA2C;QAC3C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,2DAA2D;YAC3D,8CAA8C;QAChD,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAoB;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,kEAAkE;QAClE,6DAA6D;QAC7D,sEAAsE;QACtE,sEAAsE;QACtE,uEAAuE;QACvE,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,EAAE;YAC9B,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,CAAC;YACnC,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;QACzB,MAAM;QACN,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,IAAI,CAAC,cAAc;KACpC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,oEAAoE;AACpE,8EAA8E;AAE9E,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAc;IAC1D,MAAM,KAAK,GAAG,8DAA8D,CAAC;IAC7E,MAAM,KAAK,GAAG,uBAAuB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAClG,MAAM,KAAK,GAAG,8DAA8D,CAAC;IAC7E,MAAM,KAAK,GAAG,8DAA8D,CAAC;IAC7E,OAAO,GAAG,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,SAA6B,OAAO,CAAC,MAAM;IAE3C,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAE7D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEhC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACpC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAEnF,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,iDAAiD;IACjD,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AAC/C,CAAC;AAQD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAyB;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,2EAA2E;IAC3E,yEAAyE;IACzE,kDAAkD;IAClD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACvE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAkB,EAAE,OAAO,GAAG,QAAQ;IACrE,4EAA4E;IAC5E,oEAAoE;IACpE,2EAA2E;IAC3E,uEAAuE;IACvE,sDAAsD;IACtD,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,OAAO,EAAE,CAAC;IAC1C,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,KAAK,KAAK,CAAC;QACX;YACE,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAqBD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAsB;IACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjE,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/D,4EAA4E;IAC5E,sEAAsE;IACtE,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,sCAAsC;IACtC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,uEAAuE;QACvE,iDAAiD;QACjD,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CACV,qDAAqD;YACnD,0BAA0B,YAAY,yBAAyB,IAAI,CAAC,cAAc,KAAK,CAC1F,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,kBAAkB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACpE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,CAAC,KAAK,CACV,+BAA+B,EAAE,iCAAiC,YAAY,aAAa,IAAI,CAAC,cAAc,MAAM,CACrH,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,cAAc,mCAAmC,CAAC,CAAC;QACnF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sEAAsE;IACtE,sEAAsE;IACtE,yDAAyD;IACzD,MAAM,GAAG,GAAG,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAEzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,cAAc,MAAM,MAAM,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,cAAc,MAAM,MAAM,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpF,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,IAAsB,EACtB,GAAsB,EACtB,MAA0B,EAC1B,MAA0B,EAC1B,MAA0B;IAE1B,MAAM,MAAM,GACV,IAAI,CAAC,UAAU;QACf,CAAC,CAAC,CAAC,EAAE,EAAE,CACL,IAAI,OAAO,CAAS,CAAC,WAAW,EAAE,EAAE;YAClC,wEAAwE;YACxE,uEAAuE;YACvE,sEAAsE;YACtE,mEAAmE;YACnE,oEAAoE;YACpE,qEAAqE;YACrE,qBAAqB;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;YAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACrC,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;gBACvE,WAAW,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,gEAAgE;YAChE,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;oBACzB,MAAM;oBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,cAAc,EAAE,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;YAC1D,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,KAAK,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,gEAAgE;YAChE,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;oBACzB,MAAM,EAAE,EAAE;oBACV,SAAS,EAAE,CAAC;oBACZ,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,aAAa;YACf,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,mCAAmC,IAAI,MAAM,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,+CAA+C;AAC/C,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAAE,OAAO;IACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO;IAC9C,sDAAsD;IACtD,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,CAA0B,CAAC;IAC5D,MAAM,cAAc,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/E,MAAM,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,iBAAiB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furkankoykiran/contextify-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Open-source CLI for Claude Code: capture sessions, ship transcripts to your memory pipeline, and synthesize Claude-ready prompts.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|