create-snipara 1.3.17 → 1.3.18
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 +20 -6
- package/dist/index.js +62 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -52,6 +52,7 @@ The default CLI path wires the local companion around those surfaces:
|
|
|
52
52
|
|
|
53
53
|
- `snipara-companion` for local workflow commands and managed phase commits; legacy `rlm-hook` commands remain compatible
|
|
54
54
|
- `snipara-sandbox` for optional local code execution
|
|
55
|
+
- `snipara-orchestrator` only when explicitly requested with `--with-orchestrator`
|
|
55
56
|
- local config, env files, hook scripts, and a project companion pack
|
|
56
57
|
- `snipara-mcp` only for local stdio compatibility, development, or testing
|
|
57
58
|
|
|
@@ -59,12 +60,12 @@ The default CLI path wires the local companion around those surfaces:
|
|
|
59
60
|
|
|
60
61
|
The CLI now works around explicit install profiles:
|
|
61
62
|
|
|
62
|
-
| Profile | What it installs | Best for
|
|
63
|
-
| ------------------ | --------------------------------------------- |
|
|
64
|
-
| `hosted-companion` | MCP + `snipara-companion` | Default: hosted context plus managed local workflow
|
|
65
|
-
| `hosted-only` | Hosted MCP config only | Locked-down or minimal environments
|
|
66
|
-
| `full-stack` | MCP + `snipara-companion` + `snipara-sandbox` | Hosted context plus sandboxed local execution
|
|
67
|
-
| `runtime-only` | `snipara-sandbox` only | Local execution without hosted API
|
|
63
|
+
| Profile | What it installs | Best for |
|
|
64
|
+
| ------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
65
|
+
| `hosted-companion` | MCP + `snipara-companion` | Default: hosted context plus managed local workflow |
|
|
66
|
+
| `hosted-only` | Hosted MCP config only | Locked-down or minimal environments |
|
|
67
|
+
| `full-stack` | MCP + `snipara-companion` + `snipara-sandbox` | Hosted context plus sandboxed local execution. Does not include orchestrator unless `--with-orchestrator` is passed |
|
|
68
|
+
| `runtime-only` | `snipara-sandbox` only | Local execution without hosted API |
|
|
68
69
|
|
|
69
70
|
Default profile: `hosted-companion`
|
|
70
71
|
|
|
@@ -102,6 +103,7 @@ That distinction matters:
|
|
|
102
103
|
- explains the GitHub PR Answer Packs path for AI-assisted pull request workflows
|
|
103
104
|
- installs `snipara-companion` by default for local managed workflows
|
|
104
105
|
- installs optional `snipara-sandbox`
|
|
106
|
+
- installs optional `snipara-orchestrator` for proof gates, drift checks, and htask workflows when requested
|
|
105
107
|
- configures `.mcp.json`
|
|
106
108
|
- generates merge-ready AI agent templates in `.snipara/templates/`, including Pro+ symbol-card, code-impact, and managed workflow guidance for paid Context plans
|
|
107
109
|
- creates `AGENTS.md`, `CLAUDE.md`, `.cursor/rules/snipara.mdc`, and `.codex/config.toml` when those files do not already exist
|
|
@@ -140,6 +142,8 @@ By default, this uses the recommended `hosted-companion` setup: hosted MCP plus
|
|
|
140
142
|
the local `snipara-companion` workflow helper. Legacy `rlm-hook` commands remain
|
|
141
143
|
compatible. Add `--advanced` when you want profile selection, project id entry,
|
|
142
144
|
hook prompts, GitHub automation prompts, or sandbox provider prompts.
|
|
145
|
+
Use `--with-orchestrator` only when you explicitly need the advanced production
|
|
146
|
+
validation and htask package; it is not part of `full-stack` by default.
|
|
143
147
|
|
|
144
148
|
The advanced flow asks for:
|
|
145
149
|
|
|
@@ -421,6 +425,16 @@ npx create-snipara --profile full-stack --advanced
|
|
|
421
425
|
|
|
422
426
|
Best when the user also wants sandboxed `snipara-sandbox` execution.
|
|
423
427
|
|
|
428
|
+
### Full local stack plus production orchestration
|
|
429
|
+
|
|
430
|
+
```bash
|
|
431
|
+
npx create-snipara --profile full-stack --with-orchestrator
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Best when the user wants Hosted MCP, companion workflows, Sandbox execution, and
|
|
435
|
+
the explicit `snipara-orchestrator` package for production gates, drift checks,
|
|
436
|
+
or htask coordination.
|
|
437
|
+
|
|
424
438
|
### Connect the current repository
|
|
425
439
|
|
|
426
440
|
```bash
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import fs from "fs";
|
|
|
9
9
|
import path from "path";
|
|
10
10
|
import { execSync, spawn } from "child_process";
|
|
11
11
|
import { homedir } from "os";
|
|
12
|
-
var VERSION = "1.3.
|
|
12
|
+
var VERSION = "1.3.18";
|
|
13
13
|
var BASE_URL = "https://www.snipara.com";
|
|
14
14
|
var API_URL = "https://api.snipara.com";
|
|
15
15
|
var COMPANION_PACKAGE_NAME = "snipara-companion";
|
|
@@ -18,10 +18,12 @@ var LEGACY_COMPANION_COMMAND_NAME = "rlm-hook";
|
|
|
18
18
|
var GITHUB_ANSWER_PACKS_LABEL = "GitHub PR Answer Packs";
|
|
19
19
|
var MCP_PACKAGE_NAME = "snipara-mcp";
|
|
20
20
|
var SANDBOX_PACKAGE_NAME = "snipara-sandbox[all]";
|
|
21
|
+
var ORCHESTRATOR_PACKAGE_NAME = "snipara-orchestrator";
|
|
21
22
|
var SANDBOX_SERVER_NAME = "snipara-sandbox";
|
|
22
23
|
var LEGACY_RUNTIME_SERVER_NAME = "rlm-runtime";
|
|
23
24
|
var SANDBOX_COMMAND_NAME = "snipara-sandbox";
|
|
24
25
|
var LEGACY_SANDBOX_COMMAND_NAME = "rlm";
|
|
26
|
+
var ORCHESTRATOR_COMMAND_NAME = "snipara-orchestrator";
|
|
25
27
|
var DEVICE_CLIENT_ID = "create-snipara";
|
|
26
28
|
var DeviceAuthorizationAborted = class extends Error {
|
|
27
29
|
};
|
|
@@ -94,7 +96,7 @@ function buildProgram() {
|
|
|
94
96
|
program.command("init").description("Install and configure Snipara for this project").option("--api-key <key>", "Snipara API key").option("--slug <slug>", "Project slug").option("--project-id <id>", "Project ID").option("--advanced", "Show advanced profile, project id, hooks, GitHub, and sandbox prompts").option(
|
|
95
97
|
"--profile <profile>",
|
|
96
98
|
"Install profile: hosted-only, hosted-companion, full-stack, runtime-only"
|
|
97
|
-
).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip snipara-sandbox installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--github", "Open GitHub repository automation setup when a git remote is detected").option("--skip-github", "Skip the GitHub automation prompt").option("--github-path <path>", "Optional GitHub path filter for the initial repository sync").option("--runtime-only", "Install only Snipara Sandbox").option("-y, --yes", "Accept defaults without prompting").action(async (options) => {
|
|
99
|
+
).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip snipara-sandbox installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--with-orchestrator", "Install optional snipara-orchestrator package").option("--github", "Open GitHub repository automation setup when a git remote is detected").option("--skip-github", "Skip the GitHub automation prompt").option("--github-path <path>", "Optional GitHub path filter for the initial repository sync").option("--runtime-only", "Install only Snipara Sandbox").option("-y, --yes", "Accept defaults without prompting").action(async (options) => {
|
|
98
100
|
printBanner();
|
|
99
101
|
await runInit(options);
|
|
100
102
|
});
|
|
@@ -102,11 +104,11 @@ function buildProgram() {
|
|
|
102
104
|
printBanner();
|
|
103
105
|
await runDoctor(options);
|
|
104
106
|
});
|
|
105
|
-
program.command("repair").description("Rebuild local Snipara config and re-run validation").option("--api-key <key>", "Snipara API key override").option("--slug <slug>", "Project slug override").option("--project-id <id>", "Project ID override").option("--profile <profile>", "Target install profile").option("--with-hooks", "Force hook generation").option("--with-runtime", "Force Snipara Sandbox server/config").option("--with-mcp", "Force MCP config").option("--with-companion", "Force companion pack generation").action(async (options) => {
|
|
107
|
+
program.command("repair").description("Rebuild local Snipara config and re-run validation").option("--api-key <key>", "Snipara API key override").option("--slug <slug>", "Project slug override").option("--project-id <id>", "Project ID override").option("--profile <profile>", "Target install profile").option("--with-hooks", "Force hook generation").option("--with-runtime", "Force Snipara Sandbox server/config").option("--with-mcp", "Force MCP config").option("--with-companion", "Force companion pack generation").option("--with-orchestrator", "Install optional snipara-orchestrator package").action(async (options) => {
|
|
106
108
|
printBanner();
|
|
107
109
|
await runRepair(options);
|
|
108
110
|
});
|
|
109
|
-
program.command("upgrade").description("Upgrade installed Snipara local components").option("--with-hooks", "Refresh hooks after upgrade").option("--with-runtime", "Upgrade Snipara Sandbox even if not detected").option("--with-mcp", "Upgrade snipara-mcp even if not detected").option("--with-companion", "Upgrade companion even if not detected").action(async (options) => {
|
|
111
|
+
program.command("upgrade").description("Upgrade installed Snipara local components").option("--with-hooks", "Refresh hooks after upgrade").option("--with-runtime", "Upgrade Snipara Sandbox even if not detected").option("--with-mcp", "Upgrade snipara-mcp even if not detected").option("--with-companion", "Upgrade companion even if not detected").option("--with-orchestrator", "Upgrade snipara-orchestrator even if not detected").action(async (options) => {
|
|
110
112
|
printBanner();
|
|
111
113
|
await runUpgrade(options);
|
|
112
114
|
});
|
|
@@ -125,7 +127,7 @@ function addSharedRootOptions(program) {
|
|
|
125
127
|
program.option("--api-key <key>", "Snipara API key").option("--slug <slug>", "Project slug").option("--project-id <id>", "Project ID").option("--advanced", "Show advanced profile, project id, hooks, GitHub, and sandbox prompts").option(
|
|
126
128
|
"--profile <profile>",
|
|
127
129
|
"Install profile: hosted-only, hosted-companion, full-stack, runtime-only"
|
|
128
|
-
).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip snipara-sandbox installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--github", "Open GitHub repository automation setup when a git remote is detected").option("--skip-github", "Skip the GitHub automation prompt").option("--github-path <path>", "Optional GitHub path filter for the initial repository sync").option("--runtime-only", "Install only Snipara Sandbox").option("-y, --yes", "Accept defaults without prompting");
|
|
130
|
+
).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip snipara-sandbox installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--with-orchestrator", "Install optional snipara-orchestrator package").option("--github", "Open GitHub repository automation setup when a git remote is detected").option("--skip-github", "Skip the GitHub automation prompt").option("--github-path <path>", "Optional GitHub path filter for the initial repository sync").option("--runtime-only", "Install only Snipara Sandbox").option("-y, --yes", "Accept defaults without prompting");
|
|
129
131
|
}
|
|
130
132
|
async function main() {
|
|
131
133
|
const program = buildProgram();
|
|
@@ -157,6 +159,7 @@ function parseInitOptionsFromArgv(args) {
|
|
|
157
159
|
"--skip-runtime": "skipRuntime",
|
|
158
160
|
"--skip-hooks": "skipHooks",
|
|
159
161
|
"--skip-test": "skipTest",
|
|
162
|
+
"--with-orchestrator": "withOrchestrator",
|
|
160
163
|
"--runtime-only": "runtimeOnly",
|
|
161
164
|
"--github": "github",
|
|
162
165
|
"--skip-github": "skipGithub",
|
|
@@ -187,7 +190,7 @@ function parseInitOptionsFromArgv(args) {
|
|
|
187
190
|
}
|
|
188
191
|
async function runInit(options) {
|
|
189
192
|
const answers = await gatherConfiguration(normalizeInitOptions(options));
|
|
190
|
-
if (answers.installMcp || answers.installRuntime) {
|
|
193
|
+
if (answers.installMcp || answers.installRuntime || answers.installOrchestrator) {
|
|
191
194
|
await installPythonPackages(answers, false);
|
|
192
195
|
}
|
|
193
196
|
if (answers.installCompanion) {
|
|
@@ -225,7 +228,7 @@ async function runDoctor(options) {
|
|
|
225
228
|
async function runRepair(options) {
|
|
226
229
|
const answers = loadExistingAnswers(options);
|
|
227
230
|
console.log(chalk.bold("\n\u{1F6E0}\uFE0F Repairing Local Setup\n"));
|
|
228
|
-
if (answers.installMcp || answers.installRuntime) {
|
|
231
|
+
if (answers.installMcp || answers.installRuntime || answers.installOrchestrator) {
|
|
229
232
|
await installPythonPackages(answers, true);
|
|
230
233
|
}
|
|
231
234
|
if (answers.installCompanion) {
|
|
@@ -248,10 +251,11 @@ async function runUpgrade(options) {
|
|
|
248
251
|
const upgradedAnswers = {
|
|
249
252
|
...answers,
|
|
250
253
|
installMcp: options.withMcp || answers.installMcp,
|
|
251
|
-
installRuntime: options.withRuntime || answers.installRuntime
|
|
254
|
+
installRuntime: options.withRuntime || answers.installRuntime,
|
|
255
|
+
installOrchestrator: options.withOrchestrator || answers.installOrchestrator
|
|
252
256
|
};
|
|
253
257
|
console.log(chalk.bold("\n\u2B06\uFE0F Upgrading Local Components\n"));
|
|
254
|
-
if (options.withMcp || options.withRuntime || detection.existingConfig.hasRuntimeServer) {
|
|
258
|
+
if (options.withMcp || options.withRuntime || options.withOrchestrator || detection.existingConfig.hasRuntimeServer || detection.tooling.orchestratorCli) {
|
|
255
259
|
await installPythonPackages(upgradedAnswers, true);
|
|
256
260
|
}
|
|
257
261
|
if (options.withCompanion || detection.tooling.companionCli || answers.installCompanion) {
|
|
@@ -264,8 +268,8 @@ async function runUpgrade(options) {
|
|
|
264
268
|
if (options.withHooks || answers.installHooks) {
|
|
265
269
|
await installClaudeCodeHooks({ ...answers, installHooks: true });
|
|
266
270
|
}
|
|
267
|
-
await createCompanionPack(
|
|
268
|
-
const report = await runValidation(
|
|
271
|
+
await createCompanionPack(upgradedAnswers);
|
|
272
|
+
const report = await runValidation(upgradedAnswers, true);
|
|
269
273
|
writeDoctorReport(report);
|
|
270
274
|
printDoctorReport(detectEnvironment(), report);
|
|
271
275
|
}
|
|
@@ -302,6 +306,7 @@ async function runPrintConfig(options) {
|
|
|
302
306
|
);
|
|
303
307
|
console.log(` Local snipara-mcp package: ${answers.installMcp ? "enabled" : "disabled"}`);
|
|
304
308
|
console.log(` Snipara Sandbox: ${answers.installRuntime ? "enabled" : "disabled"}`);
|
|
309
|
+
console.log(` Snipara Orchestrator: ${answers.installOrchestrator ? "enabled" : "disabled"}`);
|
|
305
310
|
console.log(` Hooks: ${answers.installHooks ? "enabled" : "disabled"}`);
|
|
306
311
|
console.log(` GitHub repo: ${githubRepo ? githubRepo.fullName : "not detected"}`);
|
|
307
312
|
console.log(` ${GITHUB_ANSWER_PACKS_LABEL}: ${githubAnswerPacks}`);
|
|
@@ -362,6 +367,7 @@ async function gatherConfiguration(options) {
|
|
|
362
367
|
skipCompanion: !!options.skipCompanion,
|
|
363
368
|
skipMcp: !!options.skipMcp,
|
|
364
369
|
skipRuntime: !!options.skipRuntime,
|
|
370
|
+
withOrchestrator: !!options.withOrchestrator,
|
|
365
371
|
skipHooks: !!options.skipHooks,
|
|
366
372
|
configureGitHub: Boolean(options.github && detectedGitRepo && !options.skipGithub),
|
|
367
373
|
githubRepo: detectedGitRepo || void 0,
|
|
@@ -426,6 +432,12 @@ async function gatherConfiguration(options) {
|
|
|
426
432
|
),
|
|
427
433
|
choices: AI_CLIENT_CHOICES
|
|
428
434
|
},
|
|
435
|
+
{
|
|
436
|
+
type: showAdvancedPrompts ? "confirm" : null,
|
|
437
|
+
name: "installOrchestrator",
|
|
438
|
+
message: "Install snipara-orchestrator for production gates, drift checks, or htask workflows?",
|
|
439
|
+
initial: Boolean(options.withOrchestrator)
|
|
440
|
+
},
|
|
429
441
|
{
|
|
430
442
|
type: showAdvancedPrompts ? "confirm" : null,
|
|
431
443
|
name: "installHooks",
|
|
@@ -471,6 +483,7 @@ async function gatherConfiguration(options) {
|
|
|
471
483
|
skipCompanion: !!options.skipCompanion,
|
|
472
484
|
skipMcp: !!options.skipMcp,
|
|
473
485
|
skipRuntime: !!options.skipRuntime,
|
|
486
|
+
withOrchestrator: Boolean(options.withOrchestrator || response.installOrchestrator),
|
|
474
487
|
skipHooks: !!options.skipHooks || !response.installHooks,
|
|
475
488
|
configureGitHub: Boolean(
|
|
476
489
|
(response.configureGitHub || options.github) && detectedGitRepo && !options.skipGithub
|
|
@@ -602,6 +615,7 @@ function buildAnswersFromProfile(input) {
|
|
|
602
615
|
installCompanion: selected.installCompanion && !input.skipCompanion,
|
|
603
616
|
installMcp: selected.installMcp && !input.skipMcp,
|
|
604
617
|
installRuntime: selected.installRuntime && !input.skipRuntime,
|
|
618
|
+
installOrchestrator: input.withOrchestrator,
|
|
605
619
|
installHooks: selected.installHooks && !input.skipHooks,
|
|
606
620
|
aiClient: input.aiClient,
|
|
607
621
|
configureGitHub: Boolean(input.configureGitHub && input.githubRepo),
|
|
@@ -756,6 +770,9 @@ function detectSandboxCommand() {
|
|
|
756
770
|
}
|
|
757
771
|
return null;
|
|
758
772
|
}
|
|
773
|
+
function detectOrchestratorCommand() {
|
|
774
|
+
return commandExists(ORCHESTRATOR_COMMAND_NAME) ? ORCHESTRATOR_COMMAND_NAME : null;
|
|
775
|
+
}
|
|
759
776
|
async function installPythonPackages(answers, upgrade) {
|
|
760
777
|
console.log(chalk.bold(`
|
|
761
778
|
\u{1F4E6} ${upgrade ? "Upgrading" : "Installing"} Python Packages
|
|
@@ -769,6 +786,11 @@ async function installPythonPackages(answers, upgrade) {
|
|
|
769
786
|
if (answers.installRuntime) {
|
|
770
787
|
console.log(chalk.gray(` pip install ${upgrade ? "-U " : ""}${SANDBOX_PACKAGE_NAME}`));
|
|
771
788
|
}
|
|
789
|
+
if (answers.installOrchestrator) {
|
|
790
|
+
console.log(
|
|
791
|
+
chalk.gray(` pip install ${upgrade ? "-U " : ""}${ORCHESTRATOR_PACKAGE_NAME}`)
|
|
792
|
+
);
|
|
793
|
+
}
|
|
772
794
|
console.log("");
|
|
773
795
|
return;
|
|
774
796
|
}
|
|
@@ -779,6 +801,9 @@ async function installPythonPackages(answers, upgrade) {
|
|
|
779
801
|
if (answers.installRuntime) {
|
|
780
802
|
packages.push(SANDBOX_PACKAGE_NAME);
|
|
781
803
|
}
|
|
804
|
+
if (answers.installOrchestrator) {
|
|
805
|
+
packages.push(ORCHESTRATOR_PACKAGE_NAME);
|
|
806
|
+
}
|
|
782
807
|
if (packages.length === 0) return;
|
|
783
808
|
const spinner = ora(
|
|
784
809
|
`${upgrade ? "Upgrading" : "Installing"} ${packages.map(stripExtras).join(", ")}...`
|
|
@@ -1538,6 +1563,11 @@ function getCompanionCommands(answers) {
|
|
|
1538
1563
|
command: `${COMPANION_COMMAND_NAME} code impact --changed-files src/api/webhooks.ts tests/webhooks.test.ts --diff-summary "webhook retry hardening"`,
|
|
1539
1564
|
purpose: "Use paid Context code impact analysis to surface likely tests, docs, routes, config, and risks."
|
|
1540
1565
|
},
|
|
1566
|
+
{
|
|
1567
|
+
title: answers.installOrchestrator ? "Run an explicit production orchestration gate" : "Enable explicit production orchestration",
|
|
1568
|
+
command: answers.installOrchestrator ? `${ORCHESTRATOR_COMMAND_NAME} check-drift --route /api/health` : "npx create-snipara repair --with-orchestrator",
|
|
1569
|
+
purpose: answers.installOrchestrator ? "Use snipara-orchestrator only for proof-based validation, drift checks, htasks, or multi-agent coordination." : "Install snipara-orchestrator only when production gates, drift checks, htasks, or multi-agent coordination are required."
|
|
1570
|
+
},
|
|
1541
1571
|
githubAnswerPacksCommand,
|
|
1542
1572
|
{
|
|
1543
1573
|
title: "Upload or refresh a doc",
|
|
@@ -1715,6 +1745,7 @@ This project uses Snipara as a hosted-first context and memory layer with local
|
|
|
1715
1745
|
- Generated hosted MCP config: \`${answers.profile !== "runtime-only" ? "yes" : "no"}\`
|
|
1716
1746
|
- Installed local snipara-mcp package: \`${answers.installMcp ? "yes" : "no"}\`
|
|
1717
1747
|
- Installed Snipara Sandbox: \`${answers.installRuntime ? "yes" : "no"}\`
|
|
1748
|
+
- Installed Snipara Orchestrator: \`${answers.installOrchestrator ? "yes" : "no"}\`
|
|
1718
1749
|
- Generated hooks: \`${answers.installHooks ? "yes" : "no"}\`
|
|
1719
1750
|
- GitHub repository: \`${answers.githubRepo ? answers.githubRepo.fullName : "not-detected"}\`
|
|
1720
1751
|
|
|
@@ -1725,6 +1756,7 @@ This project uses Snipara as a hosted-first context and memory layer with local
|
|
|
1725
1756
|
- .env.local present: \`${detection.files.envLocal ? "yes" : "no"}\`
|
|
1726
1757
|
- Companion CLI on PATH: \`${detection.tooling.companionCli ? "yes" : "no"}\`
|
|
1727
1758
|
- Snipara Sandbox CLI on PATH: \`${detection.tooling.runtimeCli ? "yes" : "no"}\`
|
|
1759
|
+
- Snipara Orchestrator CLI on PATH: \`${detection.tooling.orchestratorCli ? "yes" : "no"}\`
|
|
1728
1760
|
|
|
1729
1761
|
## Client Guidance
|
|
1730
1762
|
|
|
@@ -1790,6 +1822,7 @@ ${item.purpose}`
|
|
|
1790
1822
|
ai_client: answers.aiClient,
|
|
1791
1823
|
profile: answers.profile,
|
|
1792
1824
|
llm_provider: answers.llmProvider || null,
|
|
1825
|
+
install_orchestrator: answers.installOrchestrator,
|
|
1793
1826
|
github_repository: answers.githubRepo || null,
|
|
1794
1827
|
github_automation_url: answers.githubRepo ? buildGitHubAutomationUrl(answers) : null,
|
|
1795
1828
|
client_pack: clientPackFilename,
|
|
@@ -1895,6 +1928,11 @@ async function runValidation(answers, includeHostedCheck) {
|
|
|
1895
1928
|
status: answers.installRuntime ? detection.tooling.runtimeCli ? "pass" : "warn" : "pass",
|
|
1896
1929
|
detail: answers.installRuntime && !detection.tooling.runtimeCli ? `${SANDBOX_COMMAND_NAME} CLI not found on PATH` : "Snipara Sandbox CLI ready or not requested"
|
|
1897
1930
|
});
|
|
1931
|
+
checks.push({
|
|
1932
|
+
name: "orchestrator_cli",
|
|
1933
|
+
status: answers.installOrchestrator ? detection.tooling.orchestratorCli ? "pass" : "warn" : "pass",
|
|
1934
|
+
detail: answers.installOrchestrator && !detection.tooling.orchestratorCli ? `${ORCHESTRATOR_COMMAND_NAME} CLI not found on PATH` : "Snipara Orchestrator ready or not requested"
|
|
1935
|
+
});
|
|
1898
1936
|
checks.push({
|
|
1899
1937
|
name: "companion_pack",
|
|
1900
1938
|
status: detection.files.sniparaCompanionPack ? "pass" : "warn",
|
|
@@ -2096,6 +2134,11 @@ function printSuccess(answers, report) {
|
|
|
2096
2134
|
chalk.green(` \u2713 ${stripExtras(SANDBOX_PACKAGE_NAME)}`) + chalk.dim(" - Safe code execution")
|
|
2097
2135
|
);
|
|
2098
2136
|
}
|
|
2137
|
+
if (answers.installOrchestrator) {
|
|
2138
|
+
console.log(
|
|
2139
|
+
chalk.green(` \u2713 ${ORCHESTRATOR_PACKAGE_NAME}`) + chalk.dim(" - Production gates, drift checks, and htask workflows")
|
|
2140
|
+
);
|
|
2141
|
+
}
|
|
2099
2142
|
if (answers.installCompanion) {
|
|
2100
2143
|
console.log(
|
|
2101
2144
|
chalk.green(` \u2713 ${COMPANION_PACKAGE_NAME}`) + chalk.dim(" - Local companion workflows and hook bootstrap")
|
|
@@ -2147,6 +2190,11 @@ function printSuccess(answers, report) {
|
|
|
2147
2190
|
`Run ${SANDBOX_COMMAND_NAME} init when you want to choose sandbox/docker/local execution.`
|
|
2148
2191
|
);
|
|
2149
2192
|
}
|
|
2193
|
+
if (answers.installOrchestrator) {
|
|
2194
|
+
printNextStep(
|
|
2195
|
+
`Use ${ORCHESTRATOR_COMMAND_NAME} explicitly for production proof gates, drift checks, or htask coordination.`
|
|
2196
|
+
);
|
|
2197
|
+
}
|
|
2150
2198
|
if (answers.githubRepo) {
|
|
2151
2199
|
printNextStep(
|
|
2152
2200
|
`Connect GitHub automation for ${answers.githubRepo.fullName} from the generated Snipara link.`
|
|
@@ -2213,7 +2261,8 @@ function detectEnvironment() {
|
|
|
2213
2261
|
docker: commandExists("docker"),
|
|
2214
2262
|
git: commandExists("git"),
|
|
2215
2263
|
companionCli: Boolean(detectCompanionCommand()),
|
|
2216
|
-
runtimeCli: Boolean(detectSandboxCommand())
|
|
2264
|
+
runtimeCli: Boolean(detectSandboxCommand()),
|
|
2265
|
+
orchestratorCli: Boolean(detectOrchestratorCommand())
|
|
2217
2266
|
},
|
|
2218
2267
|
existingConfig: {
|
|
2219
2268
|
slug: existingConfig?.slug,
|
|
@@ -2243,6 +2292,7 @@ function loadExistingAnswers(options) {
|
|
|
2243
2292
|
skipCompanion: options.withCompanion === true ? false : !detection.tooling.companionCli && effectiveProfile !== "hosted-companion" && effectiveProfile !== "full-stack",
|
|
2244
2293
|
skipMcp: options.withMcp === true ? false : !detection.existingConfig.hasSniparaServer && effectiveProfile === "runtime-only",
|
|
2245
2294
|
skipRuntime: options.withRuntime === true ? false : !detection.existingConfig.hasRuntimeServer && effectiveProfile !== "full-stack" && effectiveProfile !== "runtime-only",
|
|
2295
|
+
withOrchestrator: Boolean(options.withOrchestrator || detection.tooling.orchestratorCli),
|
|
2246
2296
|
skipHooks: options.withHooks ? false : detection.aiClient !== "claude-code"
|
|
2247
2297
|
});
|
|
2248
2298
|
}
|
package/package.json
CHANGED