specrails-core 4.11.2 → 4.12.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/README.md +56 -20
- package/bin/specrails-core.mjs +343 -20
- package/bin/tui-installer.mjs +103 -52
- package/dist/installer/cli.js +1 -1
- package/dist/installer/cli.js.map +1 -1
- package/dist/installer/commands/doctor.js +486 -24
- package/dist/installer/commands/doctor.js.map +1 -1
- package/dist/installer/commands/framework.js +49 -7
- package/dist/installer/commands/framework.js.map +1 -1
- package/dist/installer/commands/init.js +423 -25
- package/dist/installer/commands/init.js.map +1 -1
- package/dist/installer/commands/update.js +36 -9
- package/dist/installer/commands/update.js.map +1 -1
- package/dist/installer/phases/framework-lifecycle.js +125 -0
- package/dist/installer/phases/framework-lifecycle.js.map +1 -0
- package/dist/installer/phases/install-config.js +157 -5
- package/dist/installer/phases/install-config.js.map +1 -1
- package/dist/installer/phases/manifest.js +27 -2
- package/dist/installer/phases/manifest.js.map +1 -1
- package/dist/installer/phases/prereqs.js +57 -2
- package/dist/installer/phases/prereqs.js.map +1 -1
- package/dist/installer/phases/provider-detect.js +116 -6
- package/dist/installer/phases/provider-detect.js.map +1 -1
- package/dist/installer/phases/scaffold.js +1222 -12
- package/dist/installer/phases/scaffold.js.map +1 -1
- package/dist/installer/runtime/kimi.js +255 -0
- package/dist/installer/runtime/kimi.js.map +1 -0
- package/dist/installer/util/paths.js +12 -0
- package/dist/installer/util/paths.js.map +1 -1
- package/dist/installer/util/registry.js +234 -14
- package/dist/installer/util/registry.js.map +1 -1
- package/docs/README.md +1 -0
- package/docs/deployment.md +6 -7
- package/docs/getting-started.md +11 -7
- package/docs/installation.md +34 -16
- package/docs/plugin-architecture.md +11 -8
- package/docs/updating.md +21 -3
- package/docs/user-docs/cli-reference.md +43 -22
- package/docs/user-docs/codex-vs-claude-code.md +11 -9
- package/docs/user-docs/faq.md +1 -1
- package/docs/user-docs/getting-started-codex.md +5 -8
- package/docs/user-docs/getting-started-kimi.md +423 -0
- package/docs/user-docs/installation.md +49 -14
- package/docs/user-docs/quick-start.md +11 -8
- package/docs/windows.md +29 -4
- package/integration-contract.json +85 -13
- package/package.json +9 -5
- package/schemas/profile.v1.json +67 -5
- package/templates/codex-skills/batch-implement/SKILL.md +4 -0
- package/templates/commands/specrails/batch-implement.md +11 -0
- package/templates/gemini-commands/batch-implement.toml +4 -0
- package/templates/kimi/specrails/run-skill.mjs +3005 -0
- package/templates/kimi/specrails/vendor/js-yaml/LICENSE +21 -0
- package/templates/kimi/specrails/vendor/js-yaml/NOTICE.md +16 -0
- package/templates/kimi/specrails/vendor/js-yaml/js-yaml.mjs +3856 -0
- package/templates/profiles/kimi-default.json +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/installer/phases/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/installer/phases/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,41 @@ import { commandExists, runCommand } from '../util/exec.js';
|
|
|
4
4
|
import { isDir, isFile, listDir } from '../util/fs.js';
|
|
5
5
|
import { info, ok, warn } from '../util/logger.js';
|
|
6
6
|
import { gitInstalled, initRepo, isGitRepo, repoRoot } from '../util/git.js';
|
|
7
|
-
import { assertClaudeAuthenticated, claudeVersion, detectAvailability, resolveProvider, } from './provider-detect.js';
|
|
7
|
+
import { assertClaudeAuthenticated, assertKimiAuthenticated, claudeVersion, detectAvailability, isSupportedKimiVersion, kimiVersion, MIN_KIMI_VERSION, resolveProvider, } from './provider-detect.js';
|
|
8
|
+
/**
|
|
9
|
+
* OpenSpec 1.4.1, which the installer invokes during the default init/update
|
|
10
|
+
* flow, requires Node >=20.19.0. Keep this floor independent from Kimi's npm
|
|
11
|
+
* package requirement: SpecRails launches an externally installed Kimi CLI and
|
|
12
|
+
* does not require the Kimi npm distribution.
|
|
13
|
+
*/
|
|
14
|
+
export const MIN_NODE_VERSION = '20.19.0';
|
|
15
|
+
export function isSupportedNodeVersion(version) {
|
|
16
|
+
const parsed = /^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(version.trim());
|
|
17
|
+
if (!parsed)
|
|
18
|
+
return false;
|
|
19
|
+
const actual = parsed.slice(1, 4).map(Number);
|
|
20
|
+
const minimum = MIN_NODE_VERSION.split('.').map(Number);
|
|
21
|
+
for (let index = 0; index < minimum.length; index++) {
|
|
22
|
+
if (actual[index] > minimum[index])
|
|
23
|
+
return true;
|
|
24
|
+
if (actual[index] < minimum[index])
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
8
29
|
/**
|
|
9
30
|
* Orchestrates every prerequisite check that must pass before the
|
|
10
31
|
* installer proceeds to Phase 3 (scaffolding). Emits ok/warn/info
|
|
11
32
|
* lines matching the retired bash output.
|
|
12
33
|
*/
|
|
13
34
|
export async function checkPrerequisites(options) {
|
|
35
|
+
const nodeVersion = process.versions.node;
|
|
36
|
+
if (!isSupportedNodeVersion(nodeVersion)) {
|
|
37
|
+
throw new PrerequisiteError(`Node.js ${nodeVersion} is unsupported. SpecRails requires Node.js ` +
|
|
38
|
+
`${MIN_NODE_VERSION} or newer because OpenSpec 1.4.1 uses that runtime floor. ` +
|
|
39
|
+
'Install a supported Node.js release from https://nodejs.org/');
|
|
40
|
+
}
|
|
41
|
+
ok(`Node.js: ${nodeVersion}`);
|
|
14
42
|
if (!(await gitInstalled())) {
|
|
15
43
|
throw new PrerequisiteError('git is required but not on PATH. Install git: https://git-scm.com/');
|
|
16
44
|
}
|
|
@@ -40,18 +68,45 @@ export async function checkPrerequisites(options) {
|
|
|
40
68
|
ok(`Provider: claude (--provider flag)`);
|
|
41
69
|
}
|
|
42
70
|
}
|
|
71
|
+
if (provider === 'kimi') {
|
|
72
|
+
if (availability.kimi) {
|
|
73
|
+
const v = await kimiVersion();
|
|
74
|
+
if (!isSupportedKimiVersion(v) && !options.skipPrereqs) {
|
|
75
|
+
throw new PrerequisiteError(`Kimi Code ${v} is unsupported. Upgrade to ${MIN_KIMI_VERSION} or newer: ` +
|
|
76
|
+
'https://www.kimi.com/code/docs/en/kimi-code-cli/guides/getting-started.html');
|
|
77
|
+
}
|
|
78
|
+
ok(`Kimi Code CLI: ${v}`);
|
|
79
|
+
}
|
|
80
|
+
else if (options.explicitProvider === 'kimi') {
|
|
81
|
+
if (!options.skipPrereqs) {
|
|
82
|
+
throw new PrerequisiteError('Kimi Code CLI is not installed. Install it from https://www.kimi.com/code/docs/en/ ' +
|
|
83
|
+
'and retry, or run with SPECRAILS_SKIP_PREREQS=1 for fixture generation.');
|
|
84
|
+
}
|
|
85
|
+
ok('Provider: kimi (--provider flag)');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
43
88
|
// 1.3 Authentication for the selected provider.
|
|
44
89
|
if (provider === 'claude') {
|
|
45
90
|
await assertClaudeAuthenticated({ skipPrereqs: options.skipPrereqs });
|
|
46
91
|
ok('Claude: authenticated');
|
|
47
92
|
}
|
|
93
|
+
if (provider === 'kimi' && availability.kimi) {
|
|
94
|
+
const status = await assertKimiAuthenticated({ skipPrereqs: options.skipPrereqs });
|
|
95
|
+
if (status === 'authenticated') {
|
|
96
|
+
ok('Kimi: authentication evidence found');
|
|
97
|
+
}
|
|
98
|
+
else if (status === 'unknown') {
|
|
99
|
+
info('Kimi authentication could not be proven without a billable prompt; ' +
|
|
100
|
+
'the first workflow will report 401/login errors. Run `kimi login` if needed.');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
48
103
|
// 1.4 npm — required for running the TUI and for the `update` command.
|
|
49
104
|
if (!(await commandExists('npm'))) {
|
|
50
105
|
if (options.skipPrereqs) {
|
|
51
106
|
warn('npm not found (skipped — SPECRAILS_SKIP_PREREQS=1)');
|
|
52
107
|
}
|
|
53
108
|
else {
|
|
54
|
-
throw new PrerequisiteError(
|
|
109
|
+
throw new PrerequisiteError(`npm is required but not on PATH. Install Node.js ${MIN_NODE_VERSION}+ from https://nodejs.org/`);
|
|
55
110
|
}
|
|
56
111
|
}
|
|
57
112
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prereqs.js","sourceRoot":"","sources":["../../../src/installer/phases/prereqs.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,EAGL,yBAAyB,EACzB,aAAa,EACb,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"prereqs.js","sourceRoot":"","sources":["../../../src/installer/phases/prereqs.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,17 +3,20 @@ import path from 'node:path';
|
|
|
3
3
|
import { ProviderError } from '../util/errors.js';
|
|
4
4
|
import { commandExists, runCommand } from '../util/exec.js';
|
|
5
5
|
import { pathExists, readTextFile } from '../util/fs.js';
|
|
6
|
+
/** Oldest TypeScript Kimi Code CLI release covered by this integration. */
|
|
7
|
+
export const MIN_KIMI_VERSION = '0.27.0';
|
|
6
8
|
/**
|
|
7
9
|
* Detects which AI CLIs are on PATH. Runs `where` on Windows and
|
|
8
10
|
* `which` on POSIX via the cross-platform commandExists helper.
|
|
9
11
|
*/
|
|
10
12
|
export async function detectAvailability() {
|
|
11
|
-
const [claude, codex, gemini] = await Promise.all([
|
|
13
|
+
const [claude, codex, gemini, kimi] = await Promise.all([
|
|
12
14
|
commandExists('claude'),
|
|
13
15
|
commandExists('codex'),
|
|
14
16
|
commandExists('gemini'),
|
|
17
|
+
commandExists('kimi'),
|
|
15
18
|
]);
|
|
16
|
-
return { claude, codex, gemini };
|
|
19
|
+
return { claude, codex, gemini, kimi };
|
|
17
20
|
}
|
|
18
21
|
/**
|
|
19
22
|
* Returns the Claude CLI version string (stdout of `claude --version`)
|
|
@@ -28,13 +31,36 @@ export async function claudeVersion() {
|
|
|
28
31
|
return 'unknown';
|
|
29
32
|
}
|
|
30
33
|
}
|
|
34
|
+
/** Returns the raw Kimi Code CLI version or `unknown` when it cannot be probed. */
|
|
35
|
+
export async function kimiVersion() {
|
|
36
|
+
try {
|
|
37
|
+
const { stdout, stderr } = await runCommand('kimi', ['--version'], {
|
|
38
|
+
inherit: false,
|
|
39
|
+
timeoutMs: 10_000,
|
|
40
|
+
});
|
|
41
|
+
return stdout.trim() || stderr.trim() || 'unknown';
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return 'unknown';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Extracts a semver-like triple from version output such as `kimi-code 0.27.0`. */
|
|
48
|
+
export function parseCliVersion(raw) {
|
|
49
|
+
return /(?:^|[^\d])(\d+)\.(\d+)\.(\d+)(?:[^\d]|$)/.exec(raw)?.slice(1, 4).join('.') ?? null;
|
|
50
|
+
}
|
|
51
|
+
/** True when `raw` identifies a Kimi CLI at or above {@link MIN_KIMI_VERSION}. */
|
|
52
|
+
export function isSupportedKimiVersion(raw) {
|
|
53
|
+
const parsed = parseCliVersion(raw);
|
|
54
|
+
if (!parsed)
|
|
55
|
+
return false;
|
|
56
|
+
return compareVersionTriples(parsed, MIN_KIMI_VERSION) >= 0;
|
|
57
|
+
}
|
|
31
58
|
/**
|
|
32
59
|
* Resolves which provider the installer should use. Priority:
|
|
33
60
|
* 1. Explicit `--provider claude` flag (already passed through args).
|
|
34
61
|
* 2. Config file (read upstream in install-config.ts).
|
|
35
62
|
* 3. Whichever CLI is installed.
|
|
36
63
|
*
|
|
37
|
-
* Codex-only installs error out — see design: Codex is "coming soon".
|
|
38
64
|
* The caller may bypass prereq failures with `skipPrereqs: true`
|
|
39
65
|
* (env `SPECRAILS_SKIP_PREREQS=1`).
|
|
40
66
|
*/
|
|
@@ -45,26 +71,33 @@ export async function resolveProvider(availability, options = {}) {
|
|
|
45
71
|
return 'claude';
|
|
46
72
|
if (options.explicit === 'gemini')
|
|
47
73
|
return 'gemini';
|
|
74
|
+
if (options.explicit === 'kimi')
|
|
75
|
+
return 'kimi';
|
|
48
76
|
// No multi-provider auto-pick beyond the historical Claude-first default: when
|
|
49
77
|
// several CLIs are installed and no provider was requested, prefer Claude so
|
|
50
78
|
// existing projects don't get re-bootstrapped onto a different provider. Users
|
|
51
|
-
// pick codex/gemini via --provider or install-config.yaml.
|
|
79
|
+
// pick codex/gemini/kimi via --provider or install-config.yaml.
|
|
52
80
|
if (availability.claude)
|
|
53
81
|
return 'claude';
|
|
54
82
|
if (availability.codex)
|
|
55
83
|
return 'codex';
|
|
56
84
|
if (availability.gemini)
|
|
57
85
|
return 'gemini';
|
|
86
|
+
if (availability.kimi)
|
|
87
|
+
return 'kimi';
|
|
58
88
|
if (options.skipPrereqs)
|
|
59
89
|
return 'claude';
|
|
60
90
|
throw new ProviderError('No AI CLI found. Install Claude Code (https://claude.ai/download), ' +
|
|
61
91
|
'Codex CLI (https://developers.openai.com/codex), or ' +
|
|
62
|
-
'Gemini CLI (https://github.com/google-gemini/gemini-cli)
|
|
92
|
+
'Gemini CLI (https://github.com/google-gemini/gemini-cli), or ' +
|
|
93
|
+
'Kimi Code (https://www.kimi.com/code/docs/en/) before running specrails-core init.');
|
|
63
94
|
}
|
|
64
95
|
/**
|
|
65
96
|
* Directory / filename conventions the provider dictates.
|
|
66
97
|
* - Claude Code: .claude/ + CLAUDE.md
|
|
67
98
|
* - Codex: .codex/ + AGENTS.md
|
|
99
|
+
* - Gemini CLI: .gemini/ + GEMINI.md
|
|
100
|
+
* - Kimi Code: .kimi-code/ + AGENTS.md
|
|
68
101
|
*/
|
|
69
102
|
export function derivedPaths(provider) {
|
|
70
103
|
if (provider === 'codex') {
|
|
@@ -73,7 +106,13 @@ export function derivedPaths(provider) {
|
|
|
73
106
|
if (provider === 'gemini') {
|
|
74
107
|
return { providerDir: '.gemini', instructionsFile: 'GEMINI.md' };
|
|
75
108
|
}
|
|
76
|
-
|
|
109
|
+
if (provider === 'kimi') {
|
|
110
|
+
return { providerDir: '.kimi-code', instructionsFile: '.kimi-code/AGENTS.md' };
|
|
111
|
+
}
|
|
112
|
+
if (provider === 'claude') {
|
|
113
|
+
return { providerDir: '.claude', instructionsFile: 'CLAUDE.md' };
|
|
114
|
+
}
|
|
115
|
+
throw new ProviderError(`Unsupported provider: ${String(provider)}`);
|
|
77
116
|
}
|
|
78
117
|
/**
|
|
79
118
|
* Asserts that Claude Code is authenticated. Matches the three-path
|
|
@@ -96,6 +135,59 @@ export async function assertClaudeAuthenticated(options = {}) {
|
|
|
96
135
|
' Option 2 (OAuth): claude auth login',
|
|
97
136
|
].join('\n'));
|
|
98
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Bounded, non-billing Kimi authentication probe.
|
|
140
|
+
*
|
|
141
|
+
* Kimi 0.27 has no CLI command that proves managed OAuth readiness without
|
|
142
|
+
* starting a model request. We therefore recognise non-secret evidence (the
|
|
143
|
+
* managed credential file or a process-scoped model key), and honour explicit
|
|
144
|
+
* login failures emitted by `kimi doctor`. A successful `kimi doctor` only
|
|
145
|
+
* validates configuration, so it deliberately yields `unknown`.
|
|
146
|
+
*/
|
|
147
|
+
export async function probeKimiAuthentication(options = {}) {
|
|
148
|
+
const env = options.env ?? process.env;
|
|
149
|
+
if (typeof env.KIMI_MODEL_API_KEY === 'string' &&
|
|
150
|
+
env.KIMI_MODEL_API_KEY.length > 0 &&
|
|
151
|
+
typeof env.KIMI_MODEL_NAME === 'string' &&
|
|
152
|
+
env.KIMI_MODEL_NAME.length > 0) {
|
|
153
|
+
return 'authenticated';
|
|
154
|
+
}
|
|
155
|
+
const kimiHome = options.kimiCodeHome ??
|
|
156
|
+
(typeof env.KIMI_CODE_HOME === 'string' && env.KIMI_CODE_HOME.length > 0
|
|
157
|
+
? env.KIMI_CODE_HOME
|
|
158
|
+
: path.join(homedir(), '.kimi-code'));
|
|
159
|
+
if (pathExists(path.join(kimiHome, 'credentials', 'kimi-code.json'))) {
|
|
160
|
+
return 'authenticated';
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const { stdout, stderr } = await runCommand('kimi', ['doctor'], {
|
|
164
|
+
inherit: false,
|
|
165
|
+
timeoutMs: 10_000,
|
|
166
|
+
env,
|
|
167
|
+
});
|
|
168
|
+
return textReportsMissingKimiLogin(`${stdout}\n${stderr}`) ? 'unauthenticated' : 'unknown';
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const probe = error;
|
|
172
|
+
const text = `${probe.stdout ?? ''}\n${probe.stderr ?? ''}\n${probe.message ?? ''}`;
|
|
173
|
+
return textReportsMissingKimiLogin(text) ? 'unauthenticated' : 'unknown';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Rejects only a conclusive login failure. `unknown` is allowed because setup
|
|
178
|
+
* must not spend quota merely to prove authentication.
|
|
179
|
+
*/
|
|
180
|
+
export async function assertKimiAuthenticated(options = {}) {
|
|
181
|
+
const status = await probeKimiAuthentication(options);
|
|
182
|
+
if (status !== 'unauthenticated' || options.skipPrereqs)
|
|
183
|
+
return status;
|
|
184
|
+
throw new ProviderError([
|
|
185
|
+
'Kimi Code is installed but login is required.',
|
|
186
|
+
'',
|
|
187
|
+
' Run: kimi login',
|
|
188
|
+
' Then retry specrails-core init.',
|
|
189
|
+
].join('\n'));
|
|
190
|
+
}
|
|
99
191
|
async function hasClaudeApiKeyConfigured() {
|
|
100
192
|
try {
|
|
101
193
|
const { stdout } = await runCommand('claude', ['config', 'list'], { inherit: false });
|
|
@@ -117,4 +209,22 @@ async function hasClaudeOauthJson() {
|
|
|
117
209
|
return false;
|
|
118
210
|
}
|
|
119
211
|
}
|
|
212
|
+
function textReportsMissingKimiLogin(raw) {
|
|
213
|
+
const text = raw.toLowerCase();
|
|
214
|
+
return (text.includes('login required') ||
|
|
215
|
+
text.includes('not logged in') ||
|
|
216
|
+
text.includes('not authenticated') ||
|
|
217
|
+
text.includes('please run kimi login') ||
|
|
218
|
+
text.includes('run `kimi login`'));
|
|
219
|
+
}
|
|
220
|
+
function compareVersionTriples(left, right) {
|
|
221
|
+
const a = left.split('.').map(Number);
|
|
222
|
+
const b = right.split('.').map(Number);
|
|
223
|
+
for (let i = 0; i < 3; i++) {
|
|
224
|
+
const diff = (a[i] ?? 0) - (b[i] ?? 0);
|
|
225
|
+
if (diff !== 0)
|
|
226
|
+
return diff;
|
|
227
|
+
}
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
120
230
|
//# sourceMappingURL=provider-detect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-detect.js","sourceRoot":"","sources":["../../../src/installer/phases/provider-detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"provider-detect.js","sourceRoot":"","sources":["../../../src/installer/phases/provider-detect.ts"],"names":[],"mappings":"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"}
|