create-snipara 1.3.1 → 1.3.3

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.
Files changed (3) hide show
  1. package/README.md +51 -21
  2. package/dist/index.js +105 -36
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,36 +1,42 @@
1
1
  # create-snipara
2
2
 
3
- One-command setup and maintenance CLI for **Snipara MCP + snipara-companion + optional RLM-Runtime**.
3
+ One-command scaffolding and maintenance CLI for **Hosted MCP config + optional snipara-companion + optional RLM-Runtime**.
4
4
 
5
5
  ```bash
6
6
  npx create-snipara
7
7
  ```
8
8
 
9
- `create-snipara` is the entry point. It bootstraps and maintains a complete local Snipara setup for one project. It does not replace the runtime packages. Instead, it installs and wires them together:
9
+ `create-snipara` is onboarding and scaffolding. It is not a product connection surface. The product surfaces remain:
10
10
 
11
- - `snipara-mcp` for hosted MCP access
12
- - `snipara-companion` for local `rlm-hook` workflows
11
+ - Hosted MCP for LLM agents
12
+ - HTTP API / SDK for apps, integrators, backends, and pipelines
13
+
14
+ The CLI can wire local helpers around those surfaces:
15
+
16
+ - `snipara-companion` for local `rlm-hook` workflows when you want them
13
17
  - `rlm-runtime` for optional local code execution
14
18
  - local config, env files, hook scripts, and a project companion pack
19
+ - `snipara-mcp` only for local stdio compatibility, development, or testing
15
20
 
16
21
  ## Install Profiles
17
22
 
18
23
  The CLI now works around explicit install profiles:
19
24
 
20
- | Profile | What it installs | Best for |
21
- | ------------------ | ----------------------------------------- | ----------------------------------------- |
22
- | `hosted-only` | MCP config only | SaaS-first setups without local workflows |
23
- | `hosted-companion` | MCP + `snipara-companion` | Recommended default |
24
- | `full-stack` | MCP + `snipara-companion` + `rlm-runtime` | Hosted context plus local execution |
25
- | `runtime-only` | `rlm-runtime` only | Local execution without hosted API |
25
+ | Profile | What it installs | Best for |
26
+ | ------------------ | ----------------------------------------- | --------------------------------------------------- |
27
+ | `hosted-only` | Hosted MCP config only | Default: agents without local helper workflows |
28
+ | `hosted-companion` | MCP + `snipara-companion` | Hook-heavy clients that want local helper workflows |
29
+ | `full-stack` | MCP + `snipara-companion` + `rlm-runtime` | Hosted context plus local execution |
30
+ | `runtime-only` | `rlm-runtime` only | Local execution without hosted API |
26
31
 
27
- Default profile: `hosted-companion`
32
+ Default profile: `hosted-only`
28
33
 
29
34
  ## What It Does
30
35
 
31
36
  - detects local environment and project state
32
- - installs `snipara-companion` by default for local workflows
33
- - installs `snipara-mcp` and optional `rlm-runtime`
37
+ - writes Hosted MCP configuration
38
+ - installs `snipara-companion` when the selected profile needs local helper workflows
39
+ - installs optional `rlm-runtime`
34
40
  - configures `.mcp.json`
35
41
  - updates `.env`, `.env.local`, and `.env.example`
36
42
  - generates `.snipara/companion/README.md`
@@ -110,6 +116,7 @@ npx create-snipara print-config --json
110
116
 
111
117
  ```bash
112
118
  # Use an explicit install profile
119
+ npx create-snipara --profile hosted-only
113
120
  npx create-snipara --profile hosted-companion
114
121
  npx create-snipara --profile full-stack
115
122
 
@@ -121,7 +128,7 @@ npx create-snipara -y --api-key rlm_xxx --slug my-project
121
128
 
122
129
  # Skip selected layers
123
130
  npx create-snipara --skip-companion
124
- npx create-snipara --skip-mcp
131
+ npx create-snipara --skip-mcp # Skip local snipara-mcp package if explicitly requested
125
132
  npx create-snipara --skip-runtime
126
133
  npx create-snipara --skip-hooks
127
134
 
@@ -135,10 +142,22 @@ npx create-snipara upgrade --with-runtime
135
142
  The intended split is:
136
143
 
137
144
  - `create-snipara`: install, inspect, repair, and upgrade the local project setup
138
- - `snipara-companion`: ongoing local runtime workflows through `rlm-hook`
139
- - `snipara-mcp`: hosted MCP bridge
145
+ - `snipara-companion`: optional ongoing local runtime workflows through `rlm-hook`
146
+ - `snipara-mcp`: local stdio bridge, client-package development, compatibility, and testing
140
147
  - `rlm-runtime`: optional local execution engine
141
148
 
149
+ ## Codex Setup
150
+
151
+ For Codex, keep the setup minimal:
152
+
153
+ - use Hosted MCP as the core Snipara surface
154
+ - use `AGENTS.md` for project instructions
155
+ - choose `hosted-only` if you do not need local helper workflows
156
+ - add `snipara-companion` only if you explicitly want the local helper CLI
157
+ - use local `snipara-mcp` only for stdio compatibility, development, or tests
158
+
159
+ Codex does not require hook presets to use Snipara successfully.
160
+
142
161
  This keeps setup and runtime separated while still giving the user one obvious command to start from.
143
162
 
144
163
  ## Generated Local Pack
@@ -149,7 +168,18 @@ After setup, the project gets a local pack at `.snipara/companion/`:
149
168
  - `commands.json`: starter commands for the current project
150
169
  - `doctor.json`: most recent validation report
151
170
 
152
- This pack is meant to be the local source of truth for machine-level setup.
171
+ This pack is meant to be the local source of truth for machine-level setup. When
172
+ `snipara-companion` is installed, it includes business-folder onboarding commands
173
+ such as:
174
+
175
+ ```bash
176
+ rlm-hook onboard-folder ./client-export --source-provider local_folder --write-manifest ./snipara-onboard.json
177
+ rlm-hook onboard-folder ./client-export --source-provider local_folder --apply
178
+ ```
179
+
180
+ Use this for dashboardless business-context imports after an LLM client has
181
+ materialized Drive, Notion, Gmail, or local files into a folder. For source-code
182
+ repositories, use the GitHub OAuth/code onboarding path instead.
153
183
 
154
184
  ## API Key Requirements
155
185
 
@@ -157,16 +187,16 @@ This pack is meant to be the local source of truth for machine-level setup.
157
187
  | ------------------------------------ | -------------------- | ----------- |
158
188
  | Hosted MCP queries | Required | Not needed |
159
189
  | Memory / planning tools | Required | Not needed |
160
- | `snipara-companion` hosted workflows | Required | Not needed |
190
+ | `snipara-companion` hosted workflows | Optional | Not needed |
161
191
  | `rlm-runtime` `execute_python` MCP | Not needed | Not needed |
162
192
  | `rlm run` / `rlm agent` CLI | Optional for context | Required |
163
193
 
164
194
  ## Example Flows
165
195
 
166
- ### Default recommended setup
196
+ ### Default hosted setup
167
197
 
168
198
  ```bash
169
- npx create-snipara --profile hosted-companion
199
+ npx create-snipara --profile hosted-only
170
200
  ```
171
201
 
172
202
  ### Full local stack
@@ -193,7 +223,7 @@ npx create-snipara print-config --json
193
223
  When testing a locally packed tarball, use `npm exec --package` instead of `npx`, for example:
194
224
 
195
225
  ```bash
196
- npm exec --package ./create-snipara-1.3.1.tgz create-snipara -- --help
226
+ npm exec --package ./create-snipara-1.3.3.tgz create-snipara -- --help
197
227
  ```
198
228
 
199
229
  This avoids `npx` resolution issues with unpublished tarballs.
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.1";
12
+ var VERSION = "1.3.3";
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";
@@ -23,11 +23,11 @@ function getCompanionInitClientFlag(aiClient) {
23
23
  }
24
24
  function buildProgram() {
25
25
  const program = new Command();
26
- program.name("create-snipara").description("Initialize and maintain Snipara MCP + local companion workflows").version(VERSION);
26
+ program.name("create-snipara").description("Scaffold hosted Snipara MCP config plus optional local helper workflows").version(VERSION);
27
27
  program.command("init").description("Install and configure Snipara for this project").option("--api-key <key>", "Snipara project API key").option("--team-key <key>", "Snipara team API key").option("--slug <slug>", "Project slug").option("--project-id <id>", "Project ID").option(
28
28
  "--profile <profile>",
29
29
  "Install profile: hosted-only, hosted-companion, full-stack, runtime-only"
30
- ).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip snipara-mcp installation").option("--skip-runtime", "Skip rlm-runtime installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--runtime-only", "Install only RLM-Runtime").option("-y, --yes", "Accept defaults without prompting").action(async (options) => {
30
+ ).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip rlm-runtime installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--runtime-only", "Install only RLM-Runtime").option("-y, --yes", "Accept defaults without prompting").action(async (options) => {
31
31
  printBanner();
32
32
  await runInit(options);
33
33
  });
@@ -58,7 +58,7 @@ function addSharedRootOptions(program) {
58
58
  program.option("--api-key <key>", "Snipara project API key").option("--team-key <key>", "Snipara team API key").option("--slug <slug>", "Project slug").option("--project-id <id>", "Project ID").option(
59
59
  "--profile <profile>",
60
60
  "Install profile: hosted-only, hosted-companion, full-stack, runtime-only"
61
- ).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip snipara-mcp installation").option("--skip-runtime", "Skip rlm-runtime installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--runtime-only", "Install only RLM-Runtime").option("-y, --yes", "Accept defaults without prompting");
61
+ ).option("--skip-companion", "Skip local companion CLI installation").option("--skip-mcp", "Skip local snipara-mcp package installation").option("--skip-runtime", "Skip rlm-runtime installation").option("--skip-hooks", "Skip hook generation").option("--skip-test", "Skip hosted connection test").option("--runtime-only", "Install only RLM-Runtime").option("-y, --yes", "Accept defaults without prompting");
62
62
  }
63
63
  async function main() {
64
64
  const program = buildProgram();
@@ -72,7 +72,7 @@ async function runInit(options) {
72
72
  if (answers.installCompanion) {
73
73
  await installNodeCompanion(false);
74
74
  }
75
- if (answers.apiKeyType !== "none" || answers.installRuntime || answers.installMcp) {
75
+ if (answers.profile !== "runtime-only" || answers.installRuntime) {
76
76
  await createMcpConfig(answers);
77
77
  }
78
78
  if (answers.installHooks && answers.aiClient === "claude-code") {
@@ -154,7 +154,10 @@ async function runPrintConfig(options) {
154
154
  console.log(` Profile: ${answers.profile}`);
155
155
  console.log(` AI client: ${answers.aiClient}`);
156
156
  console.log(` Companion: ${answers.installCompanion ? "enabled" : "disabled"}`);
157
- console.log(` Hosted MCP: ${answers.installMcp ? "enabled" : "disabled"}`);
157
+ console.log(
158
+ ` Hosted MCP config: ${answers.profile !== "runtime-only" ? "enabled" : "disabled"}`
159
+ );
160
+ console.log(` Local snipara-mcp package: ${answers.installMcp ? "enabled" : "disabled"}`);
158
161
  console.log(` Runtime: ${answers.installRuntime ? "enabled" : "disabled"}`);
159
162
  console.log(` Hooks: ${answers.installHooks ? "enabled" : "disabled"}`);
160
163
  console.log(` Existing .mcp.json: ${detection.files.mcpConfig ? "yes" : "no"}`);
@@ -166,12 +169,12 @@ function printBanner() {
166
169
  chalk.cyan(`
167
170
  \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
168
171
  \u2551 \u2551
169
- \u2551 ${chalk.bold("Snipara")} - Context Optimization + RLM-Runtime \u2551
172
+ \u2551 ${chalk.bold("Snipara")} - Hosted MCP + API / SDK setup \u2551
170
173
  \u2551 \u2551
171
- \u2551 \u2022 Hosted MCP, memory, and orchestration \u2551
172
- \u2551 \u2022 Optional local companion workflows \u2551
173
- \u2551 \u2022 Safe code execution with Docker isolation \u2551
174
- \u2551 \u2022 One CLI for install, doctor, repair, and upgrade \u2551
174
+ \u2551 \u2022 Hosted MCP for LLM agents \u2551
175
+ \u2551 \u2022 API / SDK for product integrations \u2551
176
+ \u2551 \u2022 Optional local companion and runtime helpers \u2551
177
+ \u2551 \u2022 One CLI for scaffolding, doctor, repair, and upgrade \u2551
175
178
  \u2551 \u2551
176
179
  \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
177
180
  `)
@@ -370,7 +373,7 @@ function resolveRequestedProfile(options) {
370
373
  if (options.profile && isInstallProfile(options.profile)) {
371
374
  return options.profile;
372
375
  }
373
- return "hosted-companion";
376
+ return "hosted-only";
374
377
  }
375
378
  function isInstallProfile(value) {
376
379
  return ["hosted-only", "hosted-companion", "full-stack", "runtime-only"].includes(value);
@@ -380,12 +383,12 @@ function installProfileChoices() {
380
383
  {
381
384
  title: "Hosted only",
382
385
  value: "hosted-only",
383
- description: "Snipara MCP only, no local companion or runtime"
386
+ description: "Default: hosted MCP config, no local companion or runtime"
384
387
  },
385
388
  {
386
389
  title: "Hosted + Companion",
387
390
  value: "hosted-companion",
388
- description: "Recommended default: hosted MCP plus snipara-companion"
391
+ description: "Hosted MCP config plus optional local companion workflows"
389
392
  },
390
393
  {
391
394
  title: "Hosted + Companion + Runtime",
@@ -403,19 +406,19 @@ function buildAnswersFromProfile(input) {
403
406
  const defaults = {
404
407
  "hosted-only": {
405
408
  installCompanion: false,
406
- installMcp: true,
409
+ installMcp: false,
407
410
  installRuntime: false,
408
411
  installHooks: false
409
412
  },
410
413
  "hosted-companion": {
411
414
  installCompanion: true,
412
- installMcp: true,
415
+ installMcp: false,
413
416
  installRuntime: false,
414
417
  installHooks: input.aiClient === "claude-code"
415
418
  },
416
419
  "full-stack": {
417
420
  installCompanion: true,
418
- installMcp: true,
421
+ installMcp: false,
419
422
  installRuntime: true,
420
423
  installHooks: input.aiClient === "claude-code"
421
424
  },
@@ -584,7 +587,7 @@ async function createMcpConfig(answers) {
584
587
  console.log(chalk.yellow(" Could not parse existing .mcp.json, creating new..."));
585
588
  }
586
589
  }
587
- if (answers.apiKeyType !== "none" || answers.installMcp) {
590
+ if (answers.profile !== "runtime-only") {
588
591
  mcpConfig.mcpServers.snipara = {
589
592
  type: "http",
590
593
  url: `${API_URL}/mcp/${answers.projectSlug}`,
@@ -838,24 +841,42 @@ function getClientGuidance(client) {
838
841
  if (client === "cursor") {
839
842
  return [
840
843
  "Cursor reads the generated .mcp.json directly, so the hosted Snipara MCP surface is available after restart.",
841
- "Use the companion CLI for explicit upload, planning, chunk lookup, doctor, and task commit workflows outside the editor UI."
844
+ "Use the companion CLI only for explicit upload, planning, chunk lookup, doctor, and task commit workflows outside the editor UI."
842
845
  ];
843
846
  }
844
847
  if (client === "claude-desktop") {
845
848
  return [
846
849
  "Claude Desktop uses the generated desktop MCP config plus the same hosted Snipara tool contract.",
847
- "Keep the companion CLI nearby for bootstrap, upload, and task summaries that are easier to run from a terminal."
850
+ "Use companion only for bootstrap, upload, and task summaries that are easier to run from a terminal."
848
851
  ];
849
852
  }
850
853
  return [
851
- "The generated pack assumes a hosted-first Snipara setup with optional local companion workflows.",
852
- "Use the companion CLI whenever your client does not expose an equivalent UX for planning, upload, doctor, or task commit flows."
854
+ "The generated pack assumes Hosted MCP for agents and API / SDK for product integrations.",
855
+ "Use the companion CLI only when local planning, upload, doctor, or task commit flows help."
853
856
  ];
854
857
  }
855
858
  function getCompanionCommands(answers) {
856
859
  const projectIdFlag = answers.projectId ? ` --project-id ${answers.projectId}` : "";
857
860
  const apiKeyFlag = answers.apiKeyType === "none" || answers.apiKey.includes("YOUR_") ? " --api-key <rlm_key>" : ` --api-key ${answers.apiKey}`;
858
861
  const clientFlag = getCompanionInitClientFlag(answers.aiClient);
862
+ const businessOnboardingCommands = answers.installCompanion ? [
863
+ {
864
+ title: "Preview a business folder import",
865
+ command: "rlm-hook onboard-folder ./client-export --source-provider local_folder --write-manifest ./snipara-onboard.json",
866
+ purpose: "Classify a local or LLM-materialized business folder and review the Snipara sync manifest before upload."
867
+ },
868
+ {
869
+ title: "Apply a business folder import",
870
+ command: "rlm-hook onboard-folder ./client-export --source-provider local_folder --apply",
871
+ purpose: "Upload approved business-context documents to hosted Snipara and trigger document reindexing."
872
+ }
873
+ ] : [
874
+ {
875
+ title: "Enable business folder onboarding",
876
+ command: "npx create-snipara repair --with-companion",
877
+ purpose: "Install snipara-companion so this project can run rlm-hook onboard-folder without using the dashboard."
878
+ }
879
+ ];
859
880
  return [
860
881
  {
861
882
  title: "Bootstrap local companion",
@@ -874,8 +895,13 @@ function getCompanionCommands(answers) {
874
895
  },
875
896
  {
876
897
  title: "Run a focused hosted query",
877
- command: 'rlm-hook query --query "recent auth decisions" --max-tokens 4000',
878
- purpose: "Pull ranked context before editing or reviewing code."
898
+ command: 'rlm-hook query --query "how does auth middleware work?" --max-tokens 4000',
899
+ purpose: "Pull ranked source context before editing, reviewing, or drafting."
900
+ },
901
+ {
902
+ title: "Load linked standards only when needed",
903
+ command: "rlm-hook shared-context --categories MANDATORY BEST_PRACTICES",
904
+ purpose: "Fetch project-linked team or workspace guidance without treating it as memory."
879
905
  },
880
906
  {
881
907
  title: "Generate a hosted plan",
@@ -887,6 +913,7 @@ function getCompanionCommands(answers) {
887
913
  command: "rlm-hook upload --path docs/local-playbook.md --file ./docs/local-playbook.md",
888
914
  purpose: "Push local notes or docs into hosted Snipara context."
889
915
  },
916
+ ...businessOnboardingCommands,
890
917
  {
891
918
  title: "Inspect a specific chunk",
892
919
  command: "rlm-hook chunk get --chunk-id <chunk_id>",
@@ -895,12 +922,17 @@ function getCompanionCommands(answers) {
895
922
  {
896
923
  title: "Bootstrap the session memory view",
897
924
  command: "rlm-hook session-bootstrap",
898
- purpose: "Load critical and daily memories at session start."
925
+ purpose: "Load durable decisions, learnings, and optional short-lived carryover at session start."
926
+ },
927
+ {
928
+ title: "Ask memory about past decisions",
929
+ command: 'rlm-hook recall --query "What did we decide about auth retries?" --type decision',
930
+ purpose: "Query durable memory for past decisions, preferences, or validated learnings."
899
931
  },
900
932
  {
901
933
  title: "Commit durable task memory",
902
934
  command: 'rlm-hook task-commit --summary "Hardened webhook retries and updated tests" --category engineering --outcome completed --files src/api/webhooks.ts tests/webhooks.test.ts',
903
- purpose: "Persist reusable task outcomes back into hosted memory."
935
+ purpose: "Persist reusable outcomes back into hosted memory after the work is done."
904
936
  }
905
937
  ];
906
938
  }
@@ -922,7 +954,8 @@ This project uses Snipara as a hosted-first context and memory layer with an opt
922
954
  - Project id: \`${answers.projectId || "not-set"}\`
923
955
  - AI client: \`${answers.aiClient}\`
924
956
  - Installed local companion: \`${answers.installCompanion ? "yes" : "no"}\`
925
- - Installed MCP server: \`${answers.installMcp ? "yes" : "no"}\`
957
+ - Generated hosted MCP config: \`${answers.profile !== "runtime-only" ? "yes" : "no"}\`
958
+ - Installed local snipara-mcp package: \`${answers.installMcp ? "yes" : "no"}\`
926
959
  - Installed runtime: \`${answers.installRuntime ? "yes" : "no"}\`
927
960
  - Generated hooks: \`${answers.installHooks ? "yes" : "no"}\`
928
961
 
@@ -938,6 +971,22 @@ This project uses Snipara as a hosted-first context and memory layer with an opt
938
971
 
939
972
  ${guidance.map((line) => `- ${line}`).join("\n")}
940
973
 
974
+ ## Business Folder Onboarding
975
+
976
+ Use this when Claude, ChatGPT, Codex, or another LLM client has already materialized Drive, Notion, Gmail, or local business files into a folder.
977
+
978
+ ${answers.installCompanion ? `Preview first:
979
+
980
+ \`rlm-hook onboard-folder ./client-export --source-provider local_folder --write-manifest ./snipara-onboard.json\`
981
+
982
+ Apply only after reviewing the manifest:
983
+
984
+ \`rlm-hook onboard-folder ./client-export --source-provider local_folder --apply\`` : `This setup did not install snipara-companion. Enable it before business folder imports:
985
+
986
+ \`npx create-snipara repair --with-companion\``}
987
+
988
+ For source-code repositories, use the GitHub OAuth/code onboarding path instead of \`onboard-folder\`.
989
+
941
990
  ## Suggested Commands
942
991
 
943
992
  ${commands.map(
@@ -950,8 +999,10 @@ ${item.purpose}`
950
999
 
951
1000
  ## Design Rule
952
1001
 
1002
+ - Context first: use hosted queries, shared-context, and document loads for source truth.
1003
+ - Memory second: use session bootstrap and task commit for durable decisions, learnings, and preferences.
953
1004
  - Durable memory, policy, and orchestration stay hosted in Snipara.
954
- - The local companion is for capture, bootstrap, upload, exploration, doctor, repair, and explicit task summaries.
1005
+ - The local companion is optional tooling for capture, bootstrap, upload, exploration, doctor, repair, and explicit task summaries.
955
1006
  `;
956
1007
  const pack = {
957
1008
  generated_at: (/* @__PURE__ */ new Date()).toISOString(),
@@ -1132,7 +1183,9 @@ function printSuccess(answers, report) {
1132
1183
  console.log(` ${chalk.green("\u2713")} ${answers.profile}`);
1133
1184
  console.log(chalk.bold("\nWhat was installed:\n"));
1134
1185
  if (answers.installMcp) {
1135
- console.log(chalk.green(" \u2713 snipara-mcp") + chalk.dim(" - Hosted MCP server wiring"));
1186
+ console.log(
1187
+ chalk.green(" \u2713 snipara-mcp") + chalk.dim(" - Local stdio compatibility package")
1188
+ );
1136
1189
  }
1137
1190
  if (answers.installRuntime) {
1138
1191
  console.log(chalk.green(" \u2713 rlm-runtime") + chalk.dim(" - Safe code execution"));
@@ -1145,20 +1198,36 @@ function printSuccess(answers, report) {
1145
1198
  if (answers.installHooks) {
1146
1199
  console.log(chalk.green(" \u2713 hooks") + chalk.dim(" - Local session lifecycle scripts"));
1147
1200
  }
1201
+ if (answers.profile !== "runtime-only") {
1202
+ console.log(chalk.green(" \u2713 .mcp.json") + chalk.dim(" - Hosted MCP config"));
1203
+ }
1148
1204
  console.log(chalk.green(" \u2713 .snipara/companion") + chalk.dim(" - Local pack + doctor report"));
1149
1205
  const failedChecks = report.checks.filter((check) => check.status === "fail");
1150
1206
  const warnedChecks = report.checks.filter((check) => check.status === "warn");
1151
1207
  console.log(chalk.bold("\nNext steps:\n"));
1152
- console.log(" 1. Restart your AI client if you installed or changed MCP config.");
1153
- console.log(" 2. Open .snipara/companion/README.md for local commands and repair flow.");
1154
- console.log(" 3. Run create-snipara doctor anytime you want a fresh local validation report.");
1208
+ let nextStep = 1;
1209
+ const printNextStep = (message) => {
1210
+ console.log(` ${nextStep}. ${message}`);
1211
+ nextStep += 1;
1212
+ };
1213
+ printNextStep("Restart your AI client if you created or changed hosted MCP config.");
1214
+ printNextStep("Open .snipara/companion/README.md for local commands and repair flow.");
1215
+ printNextStep("Run create-snipara doctor anytime you want a fresh local validation report.");
1155
1216
  if (answers.installCompanion) {
1156
- console.log(
1157
- " 4. Use rlm-hook query / plan / upload / task-commit for explicit local workflows."
1217
+ printNextStep("Use rlm-hook query / plan / upload / task-commit for explicit local workflows.");
1218
+ printNextStep(
1219
+ "For business folders, preview with: rlm-hook onboard-folder ./client-export --source-provider local_folder --write-manifest ./snipara-onboard.json"
1220
+ );
1221
+ printNextStep(
1222
+ "Apply after review with: rlm-hook onboard-folder ./client-export --source-provider local_folder --apply"
1223
+ );
1224
+ } else if (answers.profile !== "runtime-only") {
1225
+ printNextStep(
1226
+ "For dashboardless business folder imports, enable companion with: npx create-snipara repair --with-companion"
1158
1227
  );
1159
1228
  }
1160
1229
  if (answers.installRuntime && !answers.runRlmInit) {
1161
- console.log(" 5. Run rlm init when you want to choose sandbox/docker/local execution.");
1230
+ printNextStep("Run rlm init when you want to choose sandbox/docker/local execution.");
1162
1231
  }
1163
1232
  if (failedChecks.length > 0 || warnedChecks.length > 0) {
1164
1233
  console.log(chalk.bold("\nValidation summary:\n"));
@@ -1257,7 +1326,7 @@ function resolveMaintenanceProfile(detection, explicitProfile) {
1257
1326
  if (detection.existingConfig.hasSniparaServer) {
1258
1327
  return "hosted-only";
1259
1328
  }
1260
- return detection.tooling.runtimeCli ? "runtime-only" : "hosted-companion";
1329
+ return detection.tooling.runtimeCli ? "runtime-only" : "hosted-only";
1261
1330
  }
1262
1331
  function readApiKeyFromEnvFiles() {
1263
1332
  const candidates = [".env.local", ".env"];
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-snipara",
3
- "version": "1.3.1",
4
- "description": "Initialize Snipara MCP + RLM-Runtime with a single command - context optimization, semantic memory, and safe code execution",
3
+ "version": "1.3.3",
4
+ "description": "Scaffold hosted Snipara MCP config plus optional local helper and runtime workflows",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "bin": {