@withone/cli 1.43.6 → 1.43.8

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 CHANGED
@@ -140,6 +140,8 @@ Supports Claude Code, Claude Desktop, Cursor, Windsurf, Codex, and Kiro.
140
140
 
141
141
  When you run `one` in a project, it uses the project config if one exists and falls back to the global config otherwise. Use `one config path` to see which config is active and the full resolution order.
142
142
 
143
+ In a monorepo, the project root is the nearest ancestor with `.one/`, `.git`, or `package.json` — checked in that order. Run `mkdir .one` in a nested subproject to make it its own project root (so the config is keyed by the nested dir's slug instead of the monorepo's).
144
+
143
145
  If you've already set up, `one init` shows your current status for the active scope and lets you update your key, install to more agents, or reconfigure.
144
146
 
145
147
  | Flag | What it does |
@@ -154,11 +156,11 @@ Connect a new platform via OAuth.
154
156
 
155
157
  ```bash
156
158
  one add shopify
157
- one add hub-spot
159
+ one add hubspot
158
160
  one add gmail
159
161
  ```
160
162
 
161
- Opens your browser, you authorize, done. The CLI polls until the connection is live. Platform names are kebab-case - run `one platforms` to see them all.
163
+ Opens your browser, you authorize, done. The CLI polls until the connection is live. Platform names are lowercase (with dashes for multi-word names) - run `one platforms` to see them all.
162
164
 
163
165
  ### `one list`
164
166
 
@@ -207,7 +209,7 @@ Search for API actions on a connected platform using natural language.
207
209
 
208
210
  ```bash
209
211
  one actions search shopify "list products"
210
- one actions search hub-spot "create contact" -t execute
212
+ one actions search hubspot "create contact" -t execute
211
213
  one actions search gmail "send email"
212
214
  ```
213
215
 
@@ -232,7 +234,7 @@ Execute an API action on a connected platform.
232
234
  one actions execute shopify <actionId> <connectionKey>
233
235
 
234
236
  # POST with data
235
- one actions execute hub-spot <actionId> <connectionKey> \
237
+ one actions execute hubspot <actionId> <connectionKey> \
236
238
  -d '{"properties": {"email": "jane@example.com", "firstname": "Jane"}}'
237
239
 
238
240
  # With path variables
@@ -3,10 +3,10 @@ import {
3
3
  isAgentMode,
4
4
  json,
5
5
  requireMemoryInit
6
- } from "./chunk-MRGKKO54.js";
6
+ } from "./chunk-MNNKOQ6V.js";
7
7
  import {
8
8
  getBackend
9
- } from "./chunk-IAFQVFCB.js";
9
+ } from "./chunk-YBEVCY4D.js";
10
10
 
11
11
  // src/commands/mem/sql.ts
12
12
  async function memSqlCommand(sql) {
@@ -2,7 +2,7 @@ import {
2
2
  getMemoryConfigOrDefault,
3
3
  getOpenAiApiKey,
4
4
  readConfig
5
- } from "./chunk-AU2ZEEMS.js";
5
+ } from "./chunk-ZD5S4IWT.js";
6
6
 
7
7
  // src/lib/output.ts
8
8
  import * as p from "@clack/prompts";
@@ -6,11 +6,11 @@ import {
6
6
  note,
7
7
  okJson,
8
8
  requireMemoryInit
9
- } from "./chunk-MRGKKO54.js";
9
+ } from "./chunk-MNNKOQ6V.js";
10
10
  import {
11
11
  getBackend,
12
12
  upsertRecord
13
- } from "./chunk-IAFQVFCB.js";
13
+ } from "./chunk-YBEVCY4D.js";
14
14
 
15
15
  // src/commands/mem/migrate.ts
16
16
  import fs4 from "fs";
@@ -6,7 +6,7 @@ import {
6
6
  getMemoryConfigOrDefault,
7
7
  getOpenAiApiKey,
8
8
  updateMemoryConfig
9
- } from "./chunk-AU2ZEEMS.js";
9
+ } from "./chunk-ZD5S4IWT.js";
10
10
 
11
11
  // src/lib/memory/schema.ts
12
12
  var SCHEMA_VERSION = "2.1.0";
@@ -15,7 +15,7 @@ function getProjectRoot(cwd = process.cwd()) {
15
15
  let dir = path.resolve(cwd);
16
16
  const root = path.parse(dir).root;
17
17
  while (dir !== root) {
18
- if (fs.existsSync(path.join(dir, ".git")) || fs.existsSync(path.join(dir, "package.json"))) {
18
+ if (fs.existsSync(path.join(dir, ".one")) || fs.existsSync(path.join(dir, ".git")) || fs.existsSync(path.join(dir, "package.json"))) {
19
19
  return dir;
20
20
  }
21
21
  dir = path.dirname(dir);
@@ -23,7 +23,7 @@ function getProjectRoot(cwd = process.cwd()) {
23
23
  return path.resolve(cwd);
24
24
  }
25
25
  function getProjectSlug(projectRoot = getProjectRoot()) {
26
- return projectRoot.replace(/[\\/]/g, "-");
26
+ return projectRoot.replace(/[\\/<>:"|?*]/g, "-");
27
27
  }
28
28
  function getProjectConfigDir(projectRoot = getProjectRoot()) {
29
29
  return path.join(projectsDir(), getProjectSlug(projectRoot));
@@ -35,19 +35,11 @@ function getGlobalConfigPath() {
35
35
  return configFile();
36
36
  }
37
37
  function resolveConfig() {
38
- const projectRoot = getProjectRoot();
39
- const projectSlug = getProjectSlug(projectRoot);
40
- const projectPath = getProjectConfigPath(projectRoot);
41
- if (fs.existsSync(projectPath)) {
42
- const config = readConfigFile(projectPath);
43
- if (config) {
44
- return { config, scope: "project", path: projectPath, projectRoot, projectSlug };
45
- }
46
- }
38
+ const detectedRoot = getProjectRoot();
39
+ const detectedSlug = getProjectSlug(detectedRoot);
47
40
  const root = path.parse(process.cwd()).root;
48
41
  let dir = path.resolve(process.cwd());
49
- while (dir !== root) {
50
- dir = path.dirname(dir);
42
+ while (true) {
51
43
  const slug = getProjectSlug(dir);
52
44
  const configPath = path.join(projectsDir(), slug, "config.json");
53
45
  if (fs.existsSync(configPath)) {
@@ -56,14 +48,16 @@ function resolveConfig() {
56
48
  return { config, scope: "project", path: configPath, projectRoot: dir, projectSlug: slug };
57
49
  }
58
50
  }
51
+ if (dir === root) break;
52
+ dir = path.dirname(dir);
59
53
  }
60
54
  if (fs.existsSync(configFile())) {
61
55
  const config = readConfigFile(configFile());
62
56
  if (config) {
63
- return { config, scope: "global", path: configFile(), projectRoot, projectSlug };
57
+ return { config, scope: "global", path: configFile(), projectRoot: detectedRoot, projectSlug: detectedSlug };
64
58
  }
65
59
  }
66
- return { config: null, scope: null, path: configFile(), projectRoot, projectSlug };
60
+ return { config: null, scope: null, path: configFile(), projectRoot: detectedRoot, projectSlug: detectedSlug };
67
61
  }
68
62
  function readConfigFile(filePath) {
69
63
  try {
@@ -2,7 +2,7 @@ import {
2
2
  defaultSearchableText,
3
3
  embed,
4
4
  embedBatch
5
- } from "./chunk-AU2ZEEMS.js";
5
+ } from "./chunk-ZD5S4IWT.js";
6
6
  export {
7
7
  defaultSearchableText,
8
8
  embed,
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-YGOS6KEC.js";
21
21
  import {
22
22
  memSqlCommand
23
- } from "./chunk-3ZJVO4GP.js";
23
+ } from "./chunk-7ZILTQQO.js";
24
24
  import {
25
25
  countRecords,
26
26
  deleteDatabase,
@@ -45,7 +45,7 @@ import {
45
45
  upsertRecords,
46
46
  writeDraftProfile,
47
47
  writeProfile
48
- } from "./chunk-C3ORS3RG.js";
48
+ } from "./chunk-VQPV5XET.js";
49
49
  import {
50
50
  getByDotPath
51
51
  } from "./chunk-44CV5IMX.js";
@@ -68,7 +68,7 @@ import {
68
68
  semanticSearchUpgradeHint,
69
69
  semanticSearchUpgradeLine,
70
70
  setAgentMode
71
- } from "./chunk-MRGKKO54.js";
71
+ } from "./chunk-MNNKOQ6V.js";
72
72
  import {
73
73
  SCHEMA_VERSION,
74
74
  addRecord,
@@ -78,7 +78,7 @@ import {
78
78
  listBackendPlugins,
79
79
  loadBackendFromConfig,
80
80
  upsertRecord
81
- } from "./chunk-IAFQVFCB.js";
81
+ } from "./chunk-YBEVCY4D.js";
82
82
  import {
83
83
  DEFAULT_MEMORY_CONFIG,
84
84
  configExists,
@@ -111,7 +111,7 @@ import {
111
111
  updateMemoryConfig,
112
112
  updateWhoAmI,
113
113
  writeConfig
114
- } from "./chunk-AU2ZEEMS.js";
114
+ } from "./chunk-ZD5S4IWT.js";
115
115
 
116
116
  // src/cli.ts
117
117
  import { createRequire as createRequire2 } from "module";
@@ -5694,7 +5694,7 @@ async function syncModel(api, profile, options) {
5694
5694
  updateModelState(platform, model, { status: "failed", pagesProcessed, lastCursor }),
5695
5695
  (async () => {
5696
5696
  try {
5697
- const { getBackend: getBackend2 } = await import("./runtime-NVC7KAJZ.js");
5697
+ const { getBackend: getBackend2 } = await import("./runtime-RVXAPQAZ.js");
5698
5698
  const backend = await getBackend2();
5699
5699
  await Promise.race([
5700
5700
  backend.close(),
@@ -6049,7 +6049,7 @@ async function syncModel(api, profile, options) {
6049
6049
  db.exec(`DROP TABLE IF EXISTS _seen_ids`);
6050
6050
  }
6051
6051
  if (options.toMemory !== false) {
6052
- const backend = await (await import("./runtime-NVC7KAJZ.js")).getBackend();
6052
+ const backend = await (await import("./runtime-RVXAPQAZ.js")).getBackend();
6053
6053
  const type = `${platform}/${model}`;
6054
6054
  const existing = await backend.listKeysByType(type);
6055
6055
  const sourcePrefix = `${type}:`;
@@ -6129,7 +6129,7 @@ async function syncModel(api, profile, options) {
6129
6129
  let statusCounts;
6130
6130
  if (options.toMemory !== false) {
6131
6131
  try {
6132
- const backend = await (await import("./runtime-NVC7KAJZ.js")).getBackend();
6132
+ const backend = await (await import("./runtime-RVXAPQAZ.js")).getBackend();
6133
6133
  const typeName = `${platform}/${model}`;
6134
6134
  const [active, archived] = await Promise.all([
6135
6135
  backend.count(typeName, { status: "active" }),
@@ -7748,7 +7748,7 @@ ${result.total} results`);
7748
7748
  }
7749
7749
  }
7750
7750
  async function syncSqlCommand(platformModel, sql) {
7751
- const { syncSqlCommand: runSyncSql } = await import("./sql-EGTWQIU5.js");
7751
+ const { syncSqlCommand: runSyncSql } = await import("./sql-V44IVBHX.js");
7752
7752
  await runSyncSql(platformModel, sql);
7753
7753
  }
7754
7754
  async function syncDeleteCommand(platformModel, options) {
@@ -7826,7 +7826,7 @@ async function syncDeleteCommand(platformModel, options) {
7826
7826
  async function maybeAutoMigrateLegacy(platform, models) {
7827
7827
  const dbSize = getDatabaseSize(platform);
7828
7828
  if (!dbSize || dbSize === "0 B") return;
7829
- const { getBackend: getBackend2 } = await import("./runtime-NVC7KAJZ.js");
7829
+ const { getBackend: getBackend2 } = await import("./runtime-RVXAPQAZ.js");
7830
7830
  const backend = await getBackend2();
7831
7831
  let memoryHasData = false;
7832
7832
  for (const model of models) {
@@ -7842,7 +7842,7 @@ async function maybeAutoMigrateLegacy(platform, models) {
7842
7842
  ` detected legacy .one/sync/data/${platform}.db (${dbSize}) \u2014 auto-migrating into memory before sync.
7843
7843
  `
7844
7844
  );
7845
- const { memMigrateCommand: memMigrateCommand3 } = await import("./migrate-BEARUBLO.js");
7845
+ const { memMigrateCommand: memMigrateCommand3 } = await import("./migrate-J2ZRDEFB.js");
7846
7846
  await memMigrateCommand3({ platform, yes: true });
7847
7847
  return;
7848
7848
  }
@@ -7851,7 +7851,7 @@ async function maybeAutoMigrateLegacy(platform, models) {
7851
7851
  initialValue: true
7852
7852
  });
7853
7853
  if (p7.isCancel(shouldMigrate) || !shouldMigrate) return;
7854
- const { memMigrateCommand: memMigrateCommand2 } = await import("./migrate-BEARUBLO.js");
7854
+ const { memMigrateCommand: memMigrateCommand2 } = await import("./migrate-J2ZRDEFB.js");
7855
7855
  await memMigrateCommand2({ platform, yes: true });
7856
7856
  }
7857
7857
  async function syncSuggestSearchableCommand(platformModel, options = {}) {
@@ -7912,7 +7912,7 @@ async function syncSuggestSearchableCommand(platformModel, options = {}) {
7912
7912
  async function syncListCommand(platform) {
7913
7913
  const profiles = listProfiles(platform);
7914
7914
  const state = await readSyncState();
7915
- const { getBackend: getBackend2 } = await import("./runtime-NVC7KAJZ.js");
7915
+ const { getBackend: getBackend2 } = await import("./runtime-RVXAPQAZ.js");
7916
7916
  const backend = await getBackend2();
7917
7917
  const syncs = await Promise.all(profiles.map(async (p10) => {
7918
7918
  const modelState = state[p10.platform]?.[p10.model];
@@ -8830,7 +8830,7 @@ async function memDoctorCommand() {
8830
8830
  }
8831
8831
  if (cfg.embedding.provider === "openai") {
8832
8832
  try {
8833
- const { embed: embed2 } = await import("./embedding-O4XWBL6T.js");
8833
+ const { embed: embed2 } = await import("./embedding-GZGDGIUA.js");
8834
8834
  const result = await embed2("connectivity check");
8835
8835
  checks.push({
8836
8836
  name: "OpenAI embedding provider reachable",
@@ -9335,7 +9335,7 @@ Request specific sections:
9335
9335
  ## Important Notes
9336
9336
 
9337
9337
  - **Always use \`--agent\` flag** for structured JSON output
9338
- - Platform names are always **kebab-case** (e.g., \`hub-spot\`, \`google-calendar\`)
9338
+ - Platform names are **lowercase**; multi-word names use dashes (e.g., \`hubspot\`, \`google-calendar\`)
9339
9339
  - Always use the **exact action ID** from search results \u2014 don't guess
9340
9340
  - Always read **knowledge** before executing any action
9341
9341
  - Connection keys come from \`one connection list\` \u2014 don't hardcode them
@@ -9434,7 +9434,7 @@ All errors return JSON: \`{"error": "message"}\`. Check the \`error\` key.
9434
9434
 
9435
9435
  ## Notes
9436
9436
 
9437
- - Platform names are **kebab-case** (e.g., \`hub-spot\`)
9437
+ - Platform names are **lowercase**; multi-word names use dashes (e.g., \`hubspot\`, \`ship-station\`)
9438
9438
  - JSON flags use single quotes around the JSON to avoid shell escaping
9439
9439
  - If search returns no results, try broader queries
9440
9440
  - Access control settings from \`one config\` may restrict execution
@@ -10201,7 +10201,7 @@ var PLATFORM_DEMO_ACTIONS = {
10201
10201
  "google-calendar": { query: "list events", description: "Check today's schedule" },
10202
10202
  slack: { query: "list channels", description: "List Slack channels" },
10203
10203
  shopify: { query: "list orders", description: "List recent orders" },
10204
- "hub-spot": { query: "list contacts", description: "Search CRM contacts" },
10204
+ hubspot: { query: "list contacts", description: "Search CRM contacts" },
10205
10205
  github: { query: "list repositories", description: "List repos" },
10206
10206
  notion: { query: "list pages", description: "List Notion pages" },
10207
10207
  stripe: { query: "list payments", description: "List recent payments" },
@@ -10217,10 +10217,10 @@ var PLATFORM_DEMO_ACTIONS = {
10217
10217
  var WORKFLOW_EXAMPLES = {
10218
10218
  "gmail+google-calendar": "Check my calendar for today and draft a summary email",
10219
10219
  "gmail+shopify": "Find unfulfilled orders and email each customer an update",
10220
- "hub-spot+slack": "Find deals closing this week and post a summary to Slack",
10220
+ "hubspot+slack": "Find deals closing this week and post a summary to Slack",
10221
10221
  "github+slack": "List open PRs and post a review reminder to #engineering",
10222
10222
  "gmail+stripe": "Find failed payments this week and send retry reminder emails",
10223
- "gmail+hub-spot": "Find new CRM contacts and send them a welcome email",
10223
+ "gmail+hubspot": "Find new CRM contacts and send them a welcome email",
10224
10224
  "notion+slack": "Summarize recent Notion updates and post to a Slack channel",
10225
10225
  "github+jira": "Link recent commits to Jira issues and update their status",
10226
10226
  "google-calendar+slack": "Post today's meeting schedule to a Slack channel",
@@ -10473,7 +10473,7 @@ function buildDemoActions(connections) {
10473
10473
  lines.push("");
10474
10474
  lines.push("Try these to prove it works:");
10475
10475
  const connectedPlatforms = connections.map((c) => c.platform.toLowerCase());
10476
- const popularPlatforms = ["gmail", "google-calendar", "slack", "shopify", "hub-spot", "github"];
10476
+ const popularPlatforms = ["gmail", "google-calendar", "slack", "shopify", "hubspot", "github"];
10477
10477
  const platformsToShow = [
10478
10478
  ...connectedPlatforms.filter((p10) => PLATFORM_DEMO_ACTIONS[p10]),
10479
10479
  ...popularPlatforms.filter((p10) => !connectedPlatforms.includes(p10))
@@ -10706,7 +10706,7 @@ program.name("one").option("--agent", "Machine-readable JSON output (no colors,
10706
10706
  $ one actions execute gmail conn_mod_def::xxx::yyy live::gmail::default::abc123 \\
10707
10707
  -d '{"to":"j@example.com","subject":"Hello","body":"Hi!","connectionKey":"live::gmail::default::abc123"}'
10708
10708
 
10709
- Platform names are always kebab-case (e.g. hub-spot, ship-station, google-calendar).
10709
+ Platform names are lowercase; multi-word names use dashes (e.g. hubspot, ship-station, google-calendar).
10710
10710
  Run 'one platforms' to browse all 250+ available platforms.`).version(version);
10711
10711
  var updateCheckPromise;
10712
10712
  program.hook("preAction", (thisCommand) => {
@@ -3,11 +3,11 @@ import {
3
3
  dotPathToJsonbExpr,
4
4
  memMigrateCommand,
5
5
  reviveStringifiedJson
6
- } from "./chunk-C3ORS3RG.js";
6
+ } from "./chunk-VQPV5XET.js";
7
7
  import "./chunk-44CV5IMX.js";
8
- import "./chunk-MRGKKO54.js";
9
- import "./chunk-IAFQVFCB.js";
10
- import "./chunk-AU2ZEEMS.js";
8
+ import "./chunk-MNNKOQ6V.js";
9
+ import "./chunk-YBEVCY4D.js";
10
+ import "./chunk-ZD5S4IWT.js";
11
11
  export {
12
12
  buildIdentityMap,
13
13
  dotPathToJsonbExpr,
@@ -4,8 +4,8 @@ import {
4
4
  getBackend,
5
5
  resetBackendSingleton,
6
6
  upsertRecord
7
- } from "./chunk-IAFQVFCB.js";
8
- import "./chunk-AU2ZEEMS.js";
7
+ } from "./chunk-YBEVCY4D.js";
8
+ import "./chunk-ZD5S4IWT.js";
9
9
  export {
10
10
  addRecord,
11
11
  closeBackendIfCached,
@@ -0,0 +1,11 @@
1
+ import {
2
+ memSqlCommand,
3
+ syncSqlCommand
4
+ } from "./chunk-7ZILTQQO.js";
5
+ import "./chunk-MNNKOQ6V.js";
6
+ import "./chunk-YBEVCY4D.js";
7
+ import "./chunk-ZD5S4IWT.js";
8
+ export {
9
+ memSqlCommand,
10
+ syncSqlCommand
11
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@withone/cli",
3
- "version": "1.43.6",
3
+ "version": "1.43.8",
4
4
  "description": "CLI for managing One",
5
5
  "type": "module",
6
6
  "files": [
@@ -53,4 +53,4 @@
53
53
  "engines": {
54
54
  "node": ">=18"
55
55
  }
56
- }
56
+ }
@@ -1,28 +1,28 @@
1
1
  ---
2
2
  name: one
3
3
  description: |
4
- Use the One CLI (`one`) to interact with 250+ third-party platforms — Gmail, Slack, Shopify, HubSpot, Stripe, GitHub, Notion, Salesforce, and more — through their APIs. One handles authentication, request building, and execution through a single unified interface.
4
+ Use the One CLI (`one`) to interact with 3rd-party platforms — Gmail, Slack, Stripe, Notion, etc. through their APIs. One handles auth, request building, and execution.
5
5
 
6
- TRIGGER when the user wants to:
7
- - Interact with ANY third-party platform or external service (e.g., "send an email", "create a Shopify order", "look up a HubSpot contact", "post to Slack")
8
- - List their connected platforms or check what integrations are available
9
- - Search for what they can do on a platform (e.g., "what can I do with Gmail")
10
- - Execute any API call against a connected platform
6
+ TRIGGER when:
7
+ - Interact with ANY 3rd-party platform or external service (e.g., "send an email", "create a Shopify order", "find a HubSpot contact", "post to Slack")
8
+ - List their connected platforms or check available ones
9
+ - Search for available actions (e.g., "what can I do with Gmail")
10
+ - Execute API calls with a connected platform
11
11
  - Set up webhook-driven automations between platforms (e.g., "when a Stripe payment comes in, notify Slack")
12
12
  - Build multi-step workflows that chain actions across platforms (e.g., "fetch Stripe customers and email each one")
13
- - Anything involving third-party APIs, integrations, or connected apps — even if they don't mention "One" by name
13
+ - Anything involving 3rd-party APIs, integrations, or connected apps — even if they don't mention "One" by name
14
14
 
15
15
  DO NOT TRIGGER for:
16
- - Setting up One or installing MCP (that's `one init`)
17
- - Adding new connections (that's `one add <platform>`)
18
- - Configuring access control (that's `one config`)
16
+ - Setting up One or installing MCP (use `one init`)
17
+ - Adding new connections (use `one add <platform>`)
18
+ - Configuring access control (use `one config`)
19
19
  ---
20
20
 
21
21
  # One CLI
22
22
 
23
23
  You have access to the One CLI which lets you interact with 250+ third-party platforms through their APIs. Always include the `--agent` flag right after `one` for structured JSON output.
24
24
 
25
- If the user wants a separate API key / connections for a specific project (vs. their default), walk them through running `one init` from that project folder and picking the "project" scope — see `references/scoping.md`.
25
+ If the user wants a separate API key / connections for a specific project (vs. their default), walk them through running `one init` from that project folder and picking the "project" scope — see `references/scoping.md`. For monorepo subprojects (where a parent already has `.git`/`package.json`), have them `mkdir .one` in the subproject first so the config is keyed to that dir, not the monorepo root.
26
26
 
27
27
  ## Authentication
28
28
 
@@ -59,7 +59,7 @@ Removes a connection. Returns `{"deleted": true, "platform": "...", "key": "..."
59
59
  one --agent actions search <platform> "<query>" -t execute
60
60
  ```
61
61
 
62
- - Platform names are always kebab-case: `gmail`, `hub-spot`, `ship-station`
62
+ - Platform names are lowercase; multi-word names use dashes: `gmail`, `hubspot`, `ship-station`, `google-calendar`
63
63
  - Use `-t execute` when performing actions, `-t knowledge` when researching or writing code
64
64
  - If no results, broaden the query (e.g., `"list"` instead of `"list active premium customers"`)
65
65
 
@@ -97,7 +97,7 @@ Examples:
97
97
  one --agent actions execute shopify <actionId> <connectionKey>
98
98
 
99
99
  # POST with body data
100
- one --agent actions execute hub-spot <actionId> <connectionKey> \
100
+ one --agent actions execute hubspot <actionId> <connectionKey> \
101
101
  -d '{"properties": {"email": "jane@example.com", "firstname": "Jane"}}'
102
102
 
103
103
  # Path variables + query params
@@ -130,7 +130,7 @@ All errors return JSON: `{"error": "message"}`. Parse output as JSON and check f
130
130
  ## Important Rules
131
131
 
132
132
  - Always use `--agent` flag for structured JSON output
133
- - Platform names are always kebab-case (`hub-spot` not `HubSpot`)
133
+ - Platform names are lowercase; multi-word names use dashes (`hubspot` not `HubSpot`, `google-calendar` not `googleCalendar`)
134
134
  - Always use the exact action ID from search results — never guess or construct them
135
135
  - Always read knowledge before executing — it has required params, validation rules, and caveats
136
136
  - JSON values passed to `-d`, `--path-vars`, `--query-params` must be valid JSON (use single quotes around JSON to avoid shell escaping)
@@ -3,9 +3,11 @@
3
3
  The One CLI can be configured at two scopes:
4
4
 
5
5
  - **Global** — `~/.one/config.json`. Applies everywhere the user runs `one`.
6
- - **Project** — `~/.one/projects/<slug>/config.json`, where `<slug>` is the project root path with slashes replaced by dashes (e.g. `/Users/jane/acme` → `-Users-jane-acme`). Only applies when running `one` from inside that project folder.
6
+ - **Project** — `~/.one/projects/<slug>/config.json`, where `<slug>` is the project root path with path separators (and any character Windows forbids in a path component) replaced by dashes (e.g. `/Users/jane/acme` → `-Users-jane-acme`; on Windows, `C:\Users\jane\acme` → `C--Users-jane-acme`). Only applies when running `one` from inside that project folder.
7
7
 
8
- **Resolution order:** env vars `.onerc` in cwd project config global config. Project config wins when present; otherwise the CLI falls back to the global config.
8
+ **Detecting the project root.** The CLI walks up from cwd looking for `.one`, `.git`, or `package.json` and treats the nearest hit as the project root `.one` is checked first so a monorepo subproject can opt into being its own root with `mkdir .one`. Without a `.one` opt-in, every cwd under a parent `.git`/`package.json` shares one project config keyed by that parent.
9
+
10
+ **Resolution order:** env vars → `.onerc` in cwd → project config → global config. The project lookup walks from cwd up — the nearest ancestor that has a config under `~/.one/projects/<slug>/config.json` wins, so cwd's own slug is checked before any parent's.
9
11
 
10
12
  ## When to suggest project scope
11
13
 
@@ -26,6 +28,8 @@ one init
26
28
 
27
29
  When `init` asks "Where should this setup live?", pick **"This project only"**. Init will write the config to `~/.one/projects/<slug>/config.json` and everything else (skill install, MCP) stays untouched.
28
30
 
31
+ **Monorepo / nested project.** If the target dir is *inside* another repo (i.e. a parent already has `.git` or `package.json`), the slug used by `init` would otherwise resolve to that parent. To scope a config to the nested dir specifically, run `mkdir .one` in that dir before `one init` — the empty `.one/` directory marks it as its own project root, and the config will be keyed by the nested dir's slug.
32
+
29
33
  To see which config is currently active and the full fallback chain:
30
34
 
31
35
  ```bash
@@ -1,11 +0,0 @@
1
- import {
2
- memSqlCommand,
3
- syncSqlCommand
4
- } from "./chunk-3ZJVO4GP.js";
5
- import "./chunk-MRGKKO54.js";
6
- import "./chunk-IAFQVFCB.js";
7
- import "./chunk-AU2ZEEMS.js";
8
- export {
9
- memSqlCommand,
10
- syncSqlCommand
11
- };