specrails-core 4.8.1 → 4.9.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/bin/specrails-core.mjs +5 -1
- package/bin/tui-installer.mjs +87 -65
- package/dist/installer/cli.js +46 -6
- package/dist/installer/cli.js.map +1 -1
- package/dist/installer/commands/doctor.js +14 -5
- package/dist/installer/commands/doctor.js.map +1 -1
- package/dist/installer/commands/framework.js +134 -0
- package/dist/installer/commands/framework.js.map +1 -0
- package/dist/installer/commands/init.js +107 -32
- package/dist/installer/commands/init.js.map +1 -1
- package/dist/installer/commands/update.js +60 -34
- package/dist/installer/commands/update.js.map +1 -1
- package/dist/installer/phases/scaffold.js +592 -67
- package/dist/installer/phases/scaffold.js.map +1 -1
- package/dist/installer/util/fs.js +143 -1
- package/dist/installer/util/fs.js.map +1 -1
- package/dist/installer/util/registry.js +339 -0
- package/dist/installer/util/registry.js.map +1 -0
- package/package.json +1 -1
- package/pinned-versions.json +1 -1
- package/templates/agents/sr-architect.md +14 -10
- package/templates/agents/sr-backend-developer.md +4 -2
- package/templates/agents/sr-developer.md +20 -8
- package/templates/agents/sr-frontend-developer.md +4 -2
- package/templates/agents/sr-reviewer.md +10 -6
- package/templates/codex-skills/implement/SKILL.md +19 -10
- package/templates/codex-skills/rails/sr-architect/SKILL.md +17 -8
- package/templates/codex-skills/rails/sr-backend-developer/SKILL.md +4 -1
- package/templates/codex-skills/rails/sr-developer/SKILL.md +13 -4
- package/templates/codex-skills/rails/sr-doc-sync/SKILL.md +3 -2
- package/templates/codex-skills/rails/sr-frontend-developer/SKILL.md +4 -1
- package/templates/codex-skills/rails/sr-product-manager/SKILL.md +9 -7
- package/templates/codex-skills/rails/sr-reviewer/SKILL.md +13 -7
- package/templates/codex-skills/retry/SKILL.md +10 -5
- package/templates/commands/specrails/implement.md +41 -23
- package/templates/commands/specrails/retry.md +3 -1
- package/templates/gemini-commands/implement.toml +76 -21
|
@@ -5,10 +5,10 @@ import { runCommand } from '../util/exec.js';
|
|
|
5
5
|
import { info, ok, step } from '../util/logger.js';
|
|
6
6
|
import { readTextFile, pathExists } from '../util/fs.js';
|
|
7
7
|
import { loadInstallConfig, resolveConfigPath, } from '../phases/install-config.js';
|
|
8
|
-
import { buildManifest, writeManifestFiles } from '../phases/manifest.js';
|
|
9
8
|
import { checkPrerequisites } from '../phases/prereqs.js';
|
|
10
9
|
import { derivedPaths } from '../phases/provider-detect.js';
|
|
11
|
-
import {
|
|
10
|
+
import { assembleProjectWorkspace, ensureCurrentSymlink, installFramework, } from '../phases/scaffold.js';
|
|
11
|
+
import { frameworkRoot, resolveArtifacts } from '../util/registry.js';
|
|
12
12
|
/**
|
|
13
13
|
* Entry called by cli.ts. Returns a {@link InitResult} on success;
|
|
14
14
|
* throws a typed error (translated to an exit code by the outer CLI)
|
|
@@ -59,25 +59,49 @@ export async function runInit(flags) {
|
|
|
59
59
|
explicitProvider: providerHint,
|
|
60
60
|
skipPrereqs,
|
|
61
61
|
});
|
|
62
|
+
// ─── Relocate-always: resolve where artifacts live ───────────────────
|
|
63
|
+
// EVERY Specrails artifact lands under `artifactRoot` (the $HOME workspace),
|
|
64
|
+
// never in the repo. The ONLY in-repo writes are `openspec/**` (below) and
|
|
65
|
+
// git/worktree ops. `codeRoot` is always the repo.
|
|
66
|
+
const { artifactRoot, codeRoot } = resolveArtifacts(repoRoot, {
|
|
67
|
+
allocate: true,
|
|
68
|
+
allocator: 'core-standalone',
|
|
69
|
+
home: process.env.SPECRAILS_REGISTRY_HOME,
|
|
70
|
+
providers: [prereqs.provider],
|
|
71
|
+
coreVersion: version,
|
|
72
|
+
});
|
|
62
73
|
// ─── Phase 2 + 3 ──────────────────────────────────────────────────────
|
|
74
|
+
// Bundled-framework flow: materialize the provider-INVARIANT framework ONCE
|
|
75
|
+
// under `<home>/.specrails/framework/<version>/<providerDir>/`, point `current`
|
|
76
|
+
// at it, then SYMLINK that copy into the workspace and seed the project layer
|
|
77
|
+
// (agent-memory, manifest, instruction files, gemini acks). The framework
|
|
78
|
+
// source for standalone npx is the package's templates/+commands/ (scriptDir).
|
|
63
79
|
step('Phase 2 & 3: Installing specrails artifacts');
|
|
64
80
|
const { providerDir } = derivedPaths(prereqs.provider);
|
|
65
|
-
|
|
81
|
+
const fwDir = frameworkRoot(process.env.SPECRAILS_REGISTRY_HOME);
|
|
82
|
+
ensureFramework({
|
|
66
83
|
scriptDir,
|
|
67
|
-
|
|
84
|
+
frameworkDir: fwDir,
|
|
68
85
|
provider: prereqs.provider,
|
|
69
86
|
providerDir,
|
|
87
|
+
version,
|
|
70
88
|
agentTeams: agentTeamsHint,
|
|
71
|
-
tier: tierHint ?? 'full',
|
|
72
89
|
selectedAgents: selectedAgentsHint,
|
|
73
90
|
});
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
91
|
+
assembleProjectWorkspace({
|
|
92
|
+
workspace: artifactRoot,
|
|
93
|
+
frameworkDir: fwDir,
|
|
94
|
+
provider: prereqs.provider,
|
|
95
|
+
providerDir,
|
|
96
|
+
version,
|
|
97
|
+
codeRoot,
|
|
98
|
+
scriptDir,
|
|
99
|
+
selectedAgents: selectedAgentsHint,
|
|
100
|
+
agentTeams: agentTeamsHint,
|
|
101
|
+
});
|
|
102
|
+
ok(`Linked ${providerDir}/ from framework ${version} + seeded project layer`);
|
|
103
|
+
// openspec STAYS in the repo (codeRoot) — unchanged behaviour.
|
|
104
|
+
await installOpenSpecProject(codeRoot, prereqs.provider);
|
|
81
105
|
const tier = tierHint ?? 'full';
|
|
82
106
|
if (tier === 'full') {
|
|
83
107
|
step('Next steps');
|
|
@@ -99,6 +123,32 @@ export async function runInit(flags) {
|
|
|
99
123
|
agentTeams: agentTeamsHint,
|
|
100
124
|
};
|
|
101
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Materialize the framework for `(version, provider)` if absent and (by default)
|
|
128
|
+
* point `<frameworkDir>/current` at that version. Idempotent — `installFramework`
|
|
129
|
+
* skips re-materialization when the providerDir already exists with a matching
|
|
130
|
+
* stamp, so a second project (or a repeat init) reuses the SAME framework copy.
|
|
131
|
+
* Shared by `runInit` and `runUpdate`.
|
|
132
|
+
*
|
|
133
|
+
* Pass `swapCurrent: false` to materialize WITHOUT swapping `current` — the
|
|
134
|
+
* multi-provider "materialize-all-then-swap-once" pattern desktop consumes:
|
|
135
|
+
* for (const p of providers) ensureFramework({ ..., provider: p, swapCurrent: false })
|
|
136
|
+
* ensureCurrentSymlink(frameworkDir, version) // single atomic swap at the end
|
|
137
|
+
*/
|
|
138
|
+
export function ensureFramework(input) {
|
|
139
|
+
installFramework({
|
|
140
|
+
scriptDir: input.scriptDir,
|
|
141
|
+
frameworkDir: input.frameworkDir,
|
|
142
|
+
provider: input.provider,
|
|
143
|
+
providerDir: input.providerDir,
|
|
144
|
+
version: input.version,
|
|
145
|
+
agentTeams: input.agentTeams,
|
|
146
|
+
selectedAgents: input.selectedAgents,
|
|
147
|
+
});
|
|
148
|
+
if (input.swapCurrent !== false) {
|
|
149
|
+
ensureCurrentSymlink(input.frameworkDir, input.version);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
102
152
|
/**
|
|
103
153
|
* Resolves the package root (where VERSION, templates/, commands/ live).
|
|
104
154
|
* - Published: `<pkg>/dist/installer/commands/init.js`
|
|
@@ -142,31 +192,56 @@ function readPinnedVersion(scriptDir, key, fallback) {
|
|
|
142
192
|
return fallback;
|
|
143
193
|
}
|
|
144
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Resolve the `{bin, args}` to invoke `openspec init` for a project, honouring
|
|
197
|
+
* two optional env overrides (both default unset → `npx @fission-ai/openspec`):
|
|
198
|
+
*
|
|
199
|
+
* - `SPECRAILS_OPENSPEC_BIN` — path to the openspec CLI entry (a `.js` node
|
|
200
|
+
* script when bundled by the desktop app, OR a real executable in tests).
|
|
201
|
+
* - `SPECRAILS_OPENSPEC_NODE` — path to a node executable. Set ONLY by the
|
|
202
|
+
* desktop bundled-offline path: Tauri strips exec bits from bundled
|
|
203
|
+
* resources and the bundled openspec is a node CLI (not a runnable binary),
|
|
204
|
+
* so it must be invoked as `node <cli> init …` rather than executed directly.
|
|
205
|
+
*
|
|
206
|
+
* Three invocation forms:
|
|
207
|
+
* 1. NODE + BIN set → `runCommand(node, [cli, 'init', '--tools', provider, repoRoot])`
|
|
208
|
+
* (bundled offline — Tauri-stripped node CLI).
|
|
209
|
+
* 2. BIN set only → `runCommand(cli, ['init', '--tools', provider, repoRoot])`
|
|
210
|
+
* (a real executable: legacy override / test fake binary on PATH).
|
|
211
|
+
* 3. neither set → `runCommand('npx', ['--yes', '-p', '@fission-ai/openspec@<pinned>', '--', 'openspec', 'init', …])`
|
|
212
|
+
* (default online path — users never need a global install).
|
|
213
|
+
*/
|
|
214
|
+
export function buildOpenSpecInvocation(repoRoot, provider, env = process.env, pinnedVersion = readPinnedVersion(resolveScriptDir(), 'openspec', '1.4.1')) {
|
|
215
|
+
const bin = env.SPECRAILS_OPENSPEC_BIN;
|
|
216
|
+
const node = env.SPECRAILS_OPENSPEC_NODE;
|
|
217
|
+
const initArgs = ['init', '--tools', provider, repoRoot];
|
|
218
|
+
if (bin && node) {
|
|
219
|
+
// Form 1: bundled offline — run the node CLI through the given node exe.
|
|
220
|
+
return { bin: node, args: [bin, ...initArgs] };
|
|
221
|
+
}
|
|
222
|
+
if (bin) {
|
|
223
|
+
// Form 2: a real executable (legacy override / test fixture).
|
|
224
|
+
return { bin, args: initArgs };
|
|
225
|
+
}
|
|
226
|
+
// Form 3: default — npx so users never need a global install.
|
|
227
|
+
return {
|
|
228
|
+
bin: 'npx',
|
|
229
|
+
args: [
|
|
230
|
+
'--yes',
|
|
231
|
+
'-p',
|
|
232
|
+
`@fission-ai/openspec@${pinnedVersion}`,
|
|
233
|
+
'--',
|
|
234
|
+
'openspec',
|
|
235
|
+
...initArgs,
|
|
236
|
+
],
|
|
237
|
+
};
|
|
238
|
+
}
|
|
145
239
|
async function installOpenSpecProject(repoRoot, provider) {
|
|
146
240
|
if (process.env.SPECRAILS_SKIP_OPENSPEC_INIT === '1') {
|
|
147
241
|
info('Skipping OpenSpec project init (SPECRAILS_SKIP_OPENSPEC_INIT=1)');
|
|
148
242
|
return;
|
|
149
243
|
}
|
|
150
|
-
|
|
151
|
-
// Default: invoke through npx so users never need a global install.
|
|
152
|
-
const override = process.env.SPECRAILS_OPENSPEC_BIN;
|
|
153
|
-
const pinnedVersion = readPinnedVersion(resolveScriptDir(), 'openspec', '1.3.1');
|
|
154
|
-
const { bin, args } = override
|
|
155
|
-
? { bin: override, args: ['init', '--tools', provider, repoRoot] }
|
|
156
|
-
: {
|
|
157
|
-
bin: 'npx',
|
|
158
|
-
args: [
|
|
159
|
-
'--yes',
|
|
160
|
-
'-p',
|
|
161
|
-
`@fission-ai/openspec@${pinnedVersion}`,
|
|
162
|
-
'--',
|
|
163
|
-
'openspec',
|
|
164
|
-
'init',
|
|
165
|
-
'--tools',
|
|
166
|
-
provider,
|
|
167
|
-
repoRoot,
|
|
168
|
-
],
|
|
169
|
-
};
|
|
244
|
+
const { bin, args } = buildOpenSpecInvocation(repoRoot, provider);
|
|
170
245
|
step('Phase 3c: Installing OpenSpec');
|
|
171
246
|
try {
|
|
172
247
|
await runCommand(bin, args, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/installer/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAExD,OAAO,EAGL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/installer/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,9 @@ import { copyDir, isDir, pathExists, readTextFile } from '../util/fs.js';
|
|
|
6
6
|
import { loadInstallConfig, resolveConfigPath } from '../phases/install-config.js';
|
|
7
7
|
import { buildManifest, writeManifestFiles } from '../phases/manifest.js';
|
|
8
8
|
import { derivedPaths, detectAvailability, resolveProvider } from '../phases/provider-detect.js';
|
|
9
|
-
import {
|
|
9
|
+
import { assembleProjectWorkspace } from '../phases/scaffold.js';
|
|
10
|
+
import { frameworkRoot, resolveArtifacts } from '../util/registry.js';
|
|
11
|
+
import { ensureFramework } from './init.js';
|
|
10
12
|
const VALID_ONLY = new Set([
|
|
11
13
|
'all',
|
|
12
14
|
'core',
|
|
@@ -22,17 +24,31 @@ export async function runUpdate(flags) {
|
|
|
22
24
|
// Read install-config.yaml so the user's original choices (tier,
|
|
23
25
|
// agent_teams) survive the update. Flag overrides win when present;
|
|
24
26
|
// missing config falls back to defaults (tier=full, agent_teams=false).
|
|
25
|
-
|
|
27
|
+
// ─── Relocate-always: resolve where artifacts live ───────────────────
|
|
28
|
+
// All Specrails artifacts (incl. the specrails-version marker, manifest,
|
|
29
|
+
// install-config) live under `artifactRoot` (the $HOME workspace), never the
|
|
30
|
+
// repo. On update the registry entry already exists (created by init), so the
|
|
31
|
+
// `providers` hint is ignored; we resolve first, then read the install.
|
|
32
|
+
const { artifactRoot, codeRoot } = resolveArtifacts(repoRoot, {
|
|
33
|
+
allocate: true,
|
|
34
|
+
allocator: 'core-standalone',
|
|
35
|
+
home: process.env.SPECRAILS_REGISTRY_HOME,
|
|
36
|
+
coreVersion: currentVersion,
|
|
37
|
+
});
|
|
38
|
+
// install-config.yaml is a USER-authored file that lives in the repo (the user
|
|
39
|
+
// can't know the relocated workspace path), so it is read from repoRoot — NOT
|
|
40
|
+
// the artifactRoot. Falls back to a workspace copy if present (none today).
|
|
41
|
+
const config = loadInstallConfig(resolveConfigPath(repoRoot)) ?? loadInstallConfig(resolveConfigPath(artifactRoot));
|
|
26
42
|
const tier = config?.tier ?? 'full';
|
|
27
43
|
const agentTeams = flags['agent-teams'] === true || config?.agent_teams === true;
|
|
28
44
|
const selectedAgents = config?.agents.selected;
|
|
29
|
-
const marker = path.join(
|
|
45
|
+
const marker = path.join(artifactRoot, '.specrails', 'specrails-version');
|
|
30
46
|
if (!pathExists(marker)) {
|
|
31
47
|
throw new PrerequisiteError(`No existing specrails install detected at ${repoRoot}. Run \`npx specrails-core init\` first.`);
|
|
32
48
|
}
|
|
33
|
-
const previousVersion = readExistingVersion(
|
|
49
|
+
const previousVersion = readExistingVersion(artifactRoot);
|
|
34
50
|
step('Update: resolving provider from existing install');
|
|
35
|
-
const provider = await resolveExistingProvider(
|
|
51
|
+
const provider = await resolveExistingProvider(artifactRoot);
|
|
36
52
|
const { providerDir } = derivedPaths(provider);
|
|
37
53
|
ok(`Detected provider: ${provider} (${providerDir})`);
|
|
38
54
|
// ─── Resolve --only scope ────────────────────────────────────────
|
|
@@ -52,35 +68,45 @@ export async function runUpdate(flags) {
|
|
|
52
68
|
}
|
|
53
69
|
step(`Update: refreshing scaffold [scope=${scope}] (${previousVersion ?? '?'} → ${currentVersion})`);
|
|
54
70
|
if (scope === 'all' || scope === 'core') {
|
|
55
|
-
|
|
71
|
+
// Bundled-framework update: re-materialize the framework to the (possibly
|
|
72
|
+
// new) version dir, atomically swap `current`, then RE-ASSEMBLE the
|
|
73
|
+
// workspace (re-link the static subtrees at the new `current` + re-seed the
|
|
74
|
+
// project layer). `assembleProjectWorkspace` rewrites the manifest itself.
|
|
75
|
+
const fwDir = frameworkRoot(process.env.SPECRAILS_REGISTRY_HOME);
|
|
76
|
+
ensureFramework({
|
|
56
77
|
scriptDir,
|
|
57
|
-
|
|
78
|
+
frameworkDir: fwDir,
|
|
58
79
|
provider,
|
|
59
80
|
providerDir,
|
|
81
|
+
version: currentVersion,
|
|
60
82
|
agentTeams,
|
|
61
83
|
selectedAgents,
|
|
62
|
-
// tier read from install-config.yaml above. If the user installed
|
|
63
|
-
// with --quick, we re-apply the quick-tier direct placement
|
|
64
|
-
// (agents + commands into <providerDir> with placeholder substitution
|
|
65
|
-
// and VPC exclusion) instead of leaving the live agents/ stale.
|
|
66
|
-
tier,
|
|
67
84
|
});
|
|
85
|
+
assembleProjectWorkspace({
|
|
86
|
+
workspace: artifactRoot,
|
|
87
|
+
frameworkDir: fwDir,
|
|
88
|
+
provider,
|
|
89
|
+
providerDir,
|
|
90
|
+
version: currentVersion,
|
|
91
|
+
codeRoot,
|
|
92
|
+
scriptDir,
|
|
93
|
+
selectedAgents,
|
|
94
|
+
agentTeams,
|
|
95
|
+
});
|
|
96
|
+
ok(`Re-linked ${providerDir}/ at framework ${currentVersion} + rewrote manifest`);
|
|
68
97
|
}
|
|
69
|
-
else if (scope === 'rules') {
|
|
70
|
-
rescaffoldComponent(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
98
|
+
else if (scope === 'rules' || scope === 'agents') {
|
|
99
|
+
rescaffoldComponent(scope, { scriptDir, artifactRoot });
|
|
100
|
+
step('Update: rewriting manifest');
|
|
101
|
+
const manifest = buildManifest({
|
|
102
|
+
scriptDir,
|
|
103
|
+
repoRoot: artifactRoot,
|
|
104
|
+
version: currentVersion,
|
|
105
|
+
});
|
|
106
|
+
const { manifestPath, versionPath } = writeManifestFiles(artifactRoot, manifest);
|
|
107
|
+
ok(`Wrote ${path.relative(artifactRoot, manifestPath)}`);
|
|
108
|
+
ok(`Wrote ${path.relative(artifactRoot, versionPath)}`);
|
|
74
109
|
}
|
|
75
|
-
step('Update: rewriting manifest');
|
|
76
|
-
const manifest = buildManifest({
|
|
77
|
-
scriptDir,
|
|
78
|
-
repoRoot,
|
|
79
|
-
version: currentVersion,
|
|
80
|
-
});
|
|
81
|
-
const { manifestPath, versionPath } = writeManifestFiles(repoRoot, manifest);
|
|
82
|
-
ok(`Wrote ${path.relative(repoRoot, manifestPath)}`);
|
|
83
|
-
ok(`Wrote ${path.relative(repoRoot, versionPath)}`);
|
|
84
110
|
step('Update complete');
|
|
85
111
|
info(`specrails-core ${previousVersion ?? '?'} → ${currentVersion}`);
|
|
86
112
|
// Terminal sentinel for programmatic consumers (see comment in init.ts).
|
|
@@ -100,7 +126,7 @@ function rescaffoldComponent(component, args) {
|
|
|
100
126
|
warn(`templates/${component} not found at ${src} — nothing to update`);
|
|
101
127
|
return;
|
|
102
128
|
}
|
|
103
|
-
const stagingDest = path.join(args.
|
|
129
|
+
const stagingDest = path.join(args.artifactRoot, '.specrails', 'setup-templates', component);
|
|
104
130
|
copyDir(src, stagingDest, {
|
|
105
131
|
filter: (_s, rel) => !rel.includes('node_modules') && !rel.endsWith('package-lock.json'),
|
|
106
132
|
});
|
|
@@ -122,12 +148,12 @@ function resolveScope(only) {
|
|
|
122
148
|
}
|
|
123
149
|
return normalised;
|
|
124
150
|
}
|
|
125
|
-
async function resolveExistingProvider(
|
|
126
|
-
if (pathExists(path.join(
|
|
151
|
+
async function resolveExistingProvider(artifactRoot) {
|
|
152
|
+
if (pathExists(path.join(artifactRoot, '.claude')))
|
|
127
153
|
return 'claude';
|
|
128
|
-
if (pathExists(path.join(
|
|
154
|
+
if (pathExists(path.join(artifactRoot, '.codex')))
|
|
129
155
|
return 'codex';
|
|
130
|
-
if (pathExists(path.join(
|
|
156
|
+
if (pathExists(path.join(artifactRoot, '.gemini')))
|
|
131
157
|
return 'gemini';
|
|
132
158
|
// None present — fall back to resolving via CLI availability.
|
|
133
159
|
const avail = await detectAvailability();
|
|
@@ -137,11 +163,11 @@ async function resolveExistingProvider(repoRoot) {
|
|
|
137
163
|
catch (err) {
|
|
138
164
|
if (err instanceof InstallerError)
|
|
139
165
|
throw err;
|
|
140
|
-
throw new InstallerError(`could not determine provider of existing install at ${
|
|
166
|
+
throw new InstallerError(`could not determine provider of existing install at ${artifactRoot}`, 40);
|
|
141
167
|
}
|
|
142
168
|
}
|
|
143
|
-
function readExistingVersion(
|
|
144
|
-
const p = path.join(
|
|
169
|
+
function readExistingVersion(artifactRoot) {
|
|
170
|
+
const p = path.join(artifactRoot, '.specrails', 'specrails-version');
|
|
145
171
|
if (!pathExists(p))
|
|
146
172
|
return null;
|
|
147
173
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/installer/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAExE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAa,MAAM,6BAA6B,CAAA;AAC7F,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAA0B,MAAM,uBAAuB,CAAA;AACjG,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAiB,MAAM,8BAA8B,CAAA;AAC/G,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/installer/commands/update.ts"],"names":[],"mappings":"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"}
|