@aligndottech/cli 0.53.0 → 0.54.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/registry.js +1 -1
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +3 -0
- package/dist/commands/setup.js.map +1 -1
- package/dist/lib/ask-key-offer.d.ts +2 -0
- package/dist/lib/ask-key-offer.d.ts.map +1 -1
- package/dist/lib/ask-key-offer.js +1 -1
- package/dist/lib/ask-key-offer.js.map +1 -1
- package/dist/lib/launch/adapters/amp.js +2 -2
- package/dist/lib/launch/adapters/amp.js.map +1 -1
- package/dist/lib/launch/adapters/auggie.js +2 -2
- package/dist/lib/launch/adapters/auggie.js.map +1 -1
- package/dist/lib/launch/adapters/claude-code.js +2 -2
- package/dist/lib/launch/adapters/claude-code.js.map +1 -1
- package/dist/lib/launch/adapters/cline.js +3 -3
- package/dist/lib/launch/adapters/cline.js.map +1 -1
- package/dist/lib/launch/adapters/codex.js +2 -2
- package/dist/lib/launch/adapters/codex.js.map +1 -1
- package/dist/lib/launch/adapters/continue.js +2 -2
- package/dist/lib/launch/adapters/continue.js.map +1 -1
- package/dist/lib/launch/adapters/copilot.js +2 -2
- package/dist/lib/launch/adapters/copilot.js.map +1 -1
- package/dist/lib/launch/adapters/cursor.js +2 -2
- package/dist/lib/launch/adapters/cursor.js.map +1 -1
- package/dist/lib/launch/adapters/droid.js +2 -2
- package/dist/lib/launch/adapters/droid.js.map +1 -1
- package/dist/lib/launch/adapters/gemini-cli.js +2 -2
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -1
- package/dist/lib/launch/adapters/goose.js +2 -2
- package/dist/lib/launch/adapters/goose.js.map +1 -1
- package/dist/lib/launch/adapters/grok-build.js +2 -2
- package/dist/lib/launch/adapters/grok-build.js.map +1 -1
- package/dist/lib/launch/adapters/kiro.js +2 -2
- package/dist/lib/launch/adapters/kiro.js.map +1 -1
- package/dist/lib/launch/adapters/opencode.js +2 -2
- package/dist/lib/launch/adapters/opencode.js.map +1 -1
- package/dist/lib/launch/adapters/pi.js +2 -2
- package/dist/lib/launch/adapters/pi.js.map +1 -1
- package/dist/lib/launch/adapters/qwen.js +2 -2
- package/dist/lib/launch/adapters/qwen.js.map +1 -1
- package/dist/lib/launch/mcp-child-env.js +1 -1
- package/dist/lib/launch/mcp-child-env.js.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +0 -9
- package/dist/lib/launch/strict-entry.d.ts.map +1 -1
- package/dist/lib/launch/strict-entry.js +19 -4
- package/dist/lib/launch/strict-entry.js.map +1 -1
- package/dist/lib/mcp-setup.d.ts +1 -0
- package/dist/lib/mcp-setup.d.ts.map +1 -1
- package/dist/lib/mcp-setup.js +6 -5
- package/dist/lib/mcp-setup.js.map +1 -1
- package/dist/lib/model-step.d.ts +46 -0
- package/dist/lib/model-step.d.ts.map +1 -0
- package/dist/lib/model-step.js +74 -0
- package/dist/lib/model-step.js.map +1 -0
- package/dist/lib/trusted-align-bin.d.ts +25 -0
- package/dist/lib/trusted-align-bin.d.ts.map +1 -0
- package/dist/lib/trusted-align-bin.js +58 -0
- package/dist/lib/trusted-align-bin.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { createConfigStore } from './config.js';
|
|
4
|
+
import { freeGroqKey, promptForProviderKey } from './ask-key-offer.js';
|
|
5
|
+
import { guardedPrompt } from './prompt-guard.js';
|
|
6
|
+
import { PROVIDER_LABEL } from './llm-providers.js';
|
|
7
|
+
import { hasConfiguredProvider, probeOllama, RECOMMENDED_OLLAMA_PULL, unusedExportedKeys } from './local-llm.js';
|
|
8
|
+
export function modelStepOptions(exported) {
|
|
9
|
+
return [
|
|
10
|
+
...exported.map((k) => ({ value: `env:${k.id}`, label: `Use ${PROVIDER_LABEL[k.id]}`, hint: `found ${k.envVar} in your shell` })),
|
|
11
|
+
{ value: 'key', label: 'Paste an API key I already have', hint: 'Anthropic, OpenAI, Gemini, DeepSeek and more' },
|
|
12
|
+
{ value: 'groq', label: 'Get a free Groq key', hint: 'no card needed' },
|
|
13
|
+
{ value: 'ollama', label: 'Run a local model with Ollama', hint: 'free, nothing leaves this machine' },
|
|
14
|
+
{ value: 'skip', label: 'Skip for now', hint: 'checks will not run until one is set up' },
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
export function noModelLines() {
|
|
18
|
+
return [
|
|
19
|
+
'Conflict checks need an AI model, and none is set up, so they will not run yet (a check says "could not check").',
|
|
20
|
+
`Free and local: ollama pull ${RECOMMENDED_OLLAMA_PULL}`,
|
|
21
|
+
'Or a key: export ANTHROPIC_API_KEY (or OPENAI_API_KEY, GEMINI_API_KEY, DEEPSEEK_API_KEY ...), then run: align ai',
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
function realDeps() {
|
|
25
|
+
const config = createConfigStore();
|
|
26
|
+
return {
|
|
27
|
+
hasProvider: hasConfiguredProvider,
|
|
28
|
+
ollamaModel: probeOllama,
|
|
29
|
+
unusedExported: () => unusedExportedKeys().filter((k) => k.id !== 'custom' && k.id !== 'ollama'),
|
|
30
|
+
select: async (options) => {
|
|
31
|
+
const choice = await guardedPrompt('AI model', () => p.select({ message: 'Which AI model should check your changes against the graph?', options }));
|
|
32
|
+
return choice === null || p.isCancel(choice) ? null : choice;
|
|
33
|
+
},
|
|
34
|
+
pasteKey: () => promptForProviderKey(config),
|
|
35
|
+
freeGroq: () => freeGroqKey(config),
|
|
36
|
+
setPreference: (pref) => config.setLlmPreference(pref),
|
|
37
|
+
log: { info: (m) => p.log.info(m), warn: (m) => p.log.warn(m), success: (m) => p.log.success(m) },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function runModelStep(opts, deps = realDeps()) {
|
|
41
|
+
if (deps.hasProvider())
|
|
42
|
+
return 'ready';
|
|
43
|
+
try {
|
|
44
|
+
if ((await deps.ollamaModel()) !== null)
|
|
45
|
+
return 'ready';
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// A probe that fails is the same as no Ollama.
|
|
49
|
+
}
|
|
50
|
+
const warn = () => {
|
|
51
|
+
deps.log.warn(noModelLines().join('\n'));
|
|
52
|
+
return 'skipped';
|
|
53
|
+
};
|
|
54
|
+
if (!opts.interactive)
|
|
55
|
+
return warn();
|
|
56
|
+
const choice = await deps.select(modelStepOptions(deps.unusedExported()));
|
|
57
|
+
if (choice === null || choice === 'skip')
|
|
58
|
+
return warn();
|
|
59
|
+
if (choice.startsWith('env:')) {
|
|
60
|
+
const provider = choice.slice(4);
|
|
61
|
+
deps.setPreference({ provider });
|
|
62
|
+
deps.log.success(`Checks will use ${PROVIDER_LABEL[provider]} with the key in your shell.`);
|
|
63
|
+
return 'configured';
|
|
64
|
+
}
|
|
65
|
+
if (choice === 'ollama') {
|
|
66
|
+
deps.log.info(`Run this in another terminal; checks pick it up on their own:\n ${chalk.bold(`ollama pull ${RECOMMENDED_OLLAMA_PULL}`)}`);
|
|
67
|
+
return warn();
|
|
68
|
+
}
|
|
69
|
+
const saved = choice === 'groq' ? await deps.freeGroq() : (await deps.pasteKey()) !== null;
|
|
70
|
+
if (saved)
|
|
71
|
+
return 'configured';
|
|
72
|
+
return warn();
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=model-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-step.js","sourceRoot":"","sources":["../../src/lib/model-step.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type McpFormat } from './mcp-setup.js';
|
|
2
|
+
/**
|
|
3
|
+
* The absolute path of the `align` executable, resolved by align itself (ALI-1515).
|
|
4
|
+
*
|
|
5
|
+
* The MCP command handed to an agent used to be a bare `align`, which the AGENT then finds through its own PATH. A
|
|
6
|
+
* PATH can carry relative or empty entries (`.`, `node_modules/.bin`), so a repo could plant an `align` and have the
|
|
7
|
+
* agent spawn it. This resolves the path once, here, from the PATH entries that cannot be planted:
|
|
8
|
+
*
|
|
9
|
+
* - ABSOLUTE entries only (a relative or empty entry is read against whatever directory the agent runs in);
|
|
10
|
+
* - never an entry inside the directory align was started in, because that directory is the repo (`npx` adds the
|
|
11
|
+
* repo's own `node_modules/.bin` to PATH as an absolute entry). Same guard as migrateLocalDb, and the same
|
|
12
|
+
* exception: when cwd is an ancestor of home (`/`), it is not a repo.
|
|
13
|
+
*
|
|
14
|
+
* The result is the path AS FOUND, not its realpath: an npm global `align` is a symlink, and an upgrade retargets the
|
|
15
|
+
* link, so the link path keeps working where the resolved target would go stale.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveTrustedAlignBin(opts?: {
|
|
18
|
+
pathEnv?: string;
|
|
19
|
+
cwd?: string;
|
|
20
|
+
home?: string;
|
|
21
|
+
platform?: typeof process.platform;
|
|
22
|
+
}): string | null;
|
|
23
|
+
/** Entry for the `align` server handed to an agent per session (ALI-1515): absolute trusted path when one resolves, bare `align` otherwise. */
|
|
24
|
+
export declare function launchAlignEntry(format: McpFormat): Record<string, unknown>;
|
|
25
|
+
//# sourceMappingURL=trusted-align-bin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-align-bin.d.ts","sourceRoot":"","sources":["../../src/lib/trusted-align-bin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAElE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAA;CAAO,GAC/F,MAAM,GAAG,IAAI,CAsBf;AAED,+IAA+I;AAC/I,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI3E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { alignServerEntry } from './mcp-setup.js';
|
|
5
|
+
/**
|
|
6
|
+
* The absolute path of the `align` executable, resolved by align itself (ALI-1515).
|
|
7
|
+
*
|
|
8
|
+
* The MCP command handed to an agent used to be a bare `align`, which the AGENT then finds through its own PATH. A
|
|
9
|
+
* PATH can carry relative or empty entries (`.`, `node_modules/.bin`), so a repo could plant an `align` and have the
|
|
10
|
+
* agent spawn it. This resolves the path once, here, from the PATH entries that cannot be planted:
|
|
11
|
+
*
|
|
12
|
+
* - ABSOLUTE entries only (a relative or empty entry is read against whatever directory the agent runs in);
|
|
13
|
+
* - never an entry inside the directory align was started in, because that directory is the repo (`npx` adds the
|
|
14
|
+
* repo's own `node_modules/.bin` to PATH as an absolute entry). Same guard as migrateLocalDb, and the same
|
|
15
|
+
* exception: when cwd is an ancestor of home (`/`), it is not a repo.
|
|
16
|
+
*
|
|
17
|
+
* The result is the path AS FOUND, not its realpath: an npm global `align` is a symlink, and an upgrade retargets the
|
|
18
|
+
* link, so the link path keeps working where the resolved target would go stale.
|
|
19
|
+
*/
|
|
20
|
+
export function resolveTrustedAlignBin(opts = {}) {
|
|
21
|
+
const platform = opts.platform ?? process.platform;
|
|
22
|
+
const pathEnv = opts.pathEnv ?? process.env['PATH'] ?? '';
|
|
23
|
+
const real = (p) => { try {
|
|
24
|
+
return fs.realpathSync(p);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return path.resolve(p);
|
|
28
|
+
} };
|
|
29
|
+
const cwd = real(opts.cwd ?? process.cwd());
|
|
30
|
+
const home = real(opts.home ?? os.homedir());
|
|
31
|
+
const inside = (child, parent) => {
|
|
32
|
+
const rel = path.relative(parent, child);
|
|
33
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
34
|
+
};
|
|
35
|
+
const names = platform === 'win32' ? ['align.exe', 'align.cmd'] : ['align'];
|
|
36
|
+
for (const entry of pathEnv.split(path.delimiter)) {
|
|
37
|
+
if (!path.isAbsolute(entry))
|
|
38
|
+
continue;
|
|
39
|
+
if (inside(real(entry), cwd) && !inside(home, cwd))
|
|
40
|
+
continue;
|
|
41
|
+
for (const name of names) {
|
|
42
|
+
const candidate = path.join(entry, name);
|
|
43
|
+
try {
|
|
44
|
+
if (fs.statSync(candidate).isFile())
|
|
45
|
+
return candidate;
|
|
46
|
+
}
|
|
47
|
+
catch { /* not here */ }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/** Entry for the `align` server handed to an agent per session (ALI-1515): absolute trusted path when one resolves, bare `align` otherwise. */
|
|
53
|
+
export function launchAlignEntry(format) {
|
|
54
|
+
// ALIGN_NO_TRUSTED_BIN=1 keeps the bare name (an escape hatch, and how the suite stays machine-independent).
|
|
55
|
+
const trustedBin = process.env['ALIGN_NO_TRUSTED_BIN'] === '1' ? null : resolveTrustedAlignBin();
|
|
56
|
+
return alignServerEntry(format, 'local', { trustedBin });
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=trusted-align-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trusted-align-bin.js","sourceRoot":"","sources":["../../src/lib/trusted-align-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAkB,MAAM,gBAAgB,CAAC;AAElE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA8F,EAAE;IAEhG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC,CAAC,CAAC,CAAC;IAC7G,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAW,EAAE;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QACtC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,SAAS;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,SAAS,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+IAA+I;AAC/I,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,6GAA6G;IAC7G,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC;IACjG,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|