overlord-cli 0.2605241101.0 → 0.2605241431.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.
@@ -3,7 +3,7 @@
3
3
  // `ovld add-cwd` — interactively add the current working directory as a
4
4
  // project resource. Lists the user's projects, prompts for a selection,
5
5
  // registers cwd as a primary resource for this device, and writes the
6
- // project entry into the directory's overlord.json file.
6
+ // project entry into the directory's .overlord/project.json file.
7
7
 
8
8
  import os from 'node:os';
9
9
  import path from 'node:path';
@@ -100,7 +100,7 @@ export async function runAddCwdCommand(args) {
100
100
 
101
101
  Registers a directory (defaulting to the current working directory) as a
102
102
  project resource for this device, and writes the project entry into the
103
- directory's overlord.json file.
103
+ directory's .overlord/project.json file.
104
104
 
105
105
  When --project-id is omitted, the command lists your projects and prompts
106
106
  you to pick one.
@@ -160,7 +160,7 @@ By default the registered resource is marked primary for this device. Pass
160
160
  if (!res.ok) {
161
161
  if (res.status === 409) {
162
162
  output.write(
163
- `\nDirectory is already registered for "${project.name}" on this device. Updating overlord.json only.\n`
163
+ `\nDirectory is already registered for "${project.name}" on this device. Updating .overlord/project.json only.\n`
164
164
  );
165
165
  } else {
166
166
  console.error(
@@ -178,7 +178,7 @@ By default the registered resource is marked primary for this device. Pass
178
178
  output.write(`\nWrote ${result.filePath} (${result.action}).\n`);
179
179
  } catch (err) {
180
180
  output.write(
181
- `\nWarning: could not update overlord.json: ${err instanceof Error ? err.message : err}\n`
181
+ `\nWarning: could not update .overlord/project.json: ${err instanceof Error ? err.message : err}\n`
182
182
  );
183
183
  }
184
184
 
@@ -1,18 +1,60 @@
1
- // Read/merge/write logic for the per-folder `overlord.json` file.
1
+ // Read/merge/write logic for the per-folder `.overlord/project.json` file.
2
2
  // Mirrors lib/overlord-config/local-config.ts for CLI use.
3
3
 
4
4
  import { promises as fs } from 'node:fs';
5
5
  import path from 'node:path';
6
6
 
7
- export const OVERLORD_CONFIG_FILENAME = 'overlord.json';
7
+ export const OVERLORD_CONFIG_DIRNAME = '.overlord';
8
+ export const OVERLORD_CONFIG_FILENAME = 'project.json';
9
+ export const OVERLORD_SCRATCH_DIRNAME = 'tmp';
10
+ export const OVERLORD_LOG_DIRNAME = 'logs';
8
11
 
9
12
  const FILE_COMMENT =
10
13
  'This file lets Overlord (https://www.ovld.ai) identify which project this folder belongs to. It is created automatically when the folder is added as a project resource. DO NOT EDIT MANUALLY.';
14
+ const GITIGNORE_ENTRIES = ['.overlord/tmp/', '.overlord/logs/'];
11
15
 
12
16
  function buildConfig(projects) {
13
17
  return { _comment: FILE_COMMENT, projects };
14
18
  }
15
19
 
20
+ function configDirPath(directoryPath) {
21
+ return path.join(directoryPath, OVERLORD_CONFIG_DIRNAME);
22
+ }
23
+
24
+ function configFilePath(directoryPath) {
25
+ return path.join(configDirPath(directoryPath), OVERLORD_CONFIG_FILENAME);
26
+ }
27
+
28
+ function scratchDirPath(directoryPath) {
29
+ return path.join(configDirPath(directoryPath), OVERLORD_SCRATCH_DIRNAME);
30
+ }
31
+
32
+ async function ensureProjectLocalWorkspace(directoryPath) {
33
+ await fs.mkdir(configDirPath(directoryPath), { recursive: true });
34
+ await fs.mkdir(scratchDirPath(directoryPath), { recursive: true });
35
+ await ensureGitignoreEntries(directoryPath);
36
+ }
37
+
38
+ async function ensureGitignoreEntries(directoryPath) {
39
+ const gitignorePath = path.join(directoryPath, '.gitignore');
40
+ let raw = '';
41
+ try {
42
+ raw = await fs.readFile(gitignorePath, 'utf8');
43
+ } catch (error) {
44
+ if (!error || error.code !== 'ENOENT') throw error;
45
+ }
46
+
47
+ const lines = raw.split(/\r?\n/);
48
+ const existing = new Set(lines.map(line => line.trim()));
49
+ const missing = GITIGNORE_ENTRIES.filter(entry => !existing.has(entry));
50
+ if (missing.length === 0) return;
51
+
52
+ const next = raw.trimEnd()
53
+ ? `${raw.trimEnd()}\n\n# Overlord local scratch\n${missing.join('\n')}\n`
54
+ : `# Overlord local scratch\n${missing.join('\n')}\n`;
55
+ await fs.writeFile(gitignorePath, next, 'utf8');
56
+ }
57
+
16
58
  function isProjectArray(value) {
17
59
  return (
18
60
  Array.isArray(value) &&
@@ -41,11 +83,12 @@ async function readExistingProjects(filePath) {
41
83
  }
42
84
 
43
85
  /**
44
- * Ensures `directoryPath/overlord.json` lists the project. Returns
86
+ * Ensures `directoryPath/.overlord/project.json` lists the project. Returns
45
87
  * `{ filePath, action: 'created' | 'added-project' | 'unchanged' }`.
46
88
  */
47
89
  export async function upsertLocalOverlordConfig({ directoryPath, project }) {
48
- const filePath = path.join(directoryPath, OVERLORD_CONFIG_FILENAME);
90
+ const filePath = configFilePath(directoryPath);
91
+ await ensureProjectLocalWorkspace(directoryPath);
49
92
  const existing = await readExistingProjects(filePath);
50
93
 
51
94
  if (existing === null) {
@@ -68,12 +111,12 @@ export async function upsertLocalOverlordConfig({ directoryPath, project }) {
68
111
  }
69
112
 
70
113
  /**
71
- * Removes `projectId` from `directoryPath/overlord.json`. Deletes the file
114
+ * Removes `projectId` from `directoryPath/.overlord/project.json`. Deletes the file
72
115
  * when the resulting projects list is empty. Returns
73
116
  * `{ filePath, action: 'removed-project' | 'deleted-file' | 'not-found' | 'unchanged' }`.
74
117
  */
75
118
  export async function removeProjectFromLocalOverlordConfig({ directoryPath, projectId }) {
76
- const filePath = path.join(directoryPath, OVERLORD_CONFIG_FILENAME);
119
+ const filePath = configFilePath(directoryPath);
77
120
  const existing = await readExistingProjects(filePath);
78
121
 
79
122
  if (existing === null) return { filePath, action: 'not-found' };
@@ -1839,7 +1839,7 @@ async function protocolAddProjectResource(args) {
1839
1839
  process.stderr.write(`OVERLORD_CONFIG=${result.filePath} (${result.action})\n`);
1840
1840
  } catch (configError) {
1841
1841
  process.stderr.write(
1842
- `\nWarning: could not write overlord.json: ${configError instanceof Error ? configError.message : configError}\n`
1842
+ `\nWarning: could not write .overlord/project.json: ${configError instanceof Error ? configError.message : configError}\n`
1843
1843
  );
1844
1844
  }
1845
1845
  }
@@ -3097,7 +3097,7 @@ Examples:
3097
3097
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --summary "Done"
3098
3098
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --summary "Done" --artifacts-file ./artifacts.json
3099
3099
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --payload-json '{"summary":"Done","artifacts":[{"type":"note","label":"Delivery","content":"..."}]}'
3100
- ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --payload-file ./deliver.json
3100
+ ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --payload-file .overlord/tmp/deliver.json
3101
3101
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --payload-file -
3102
3102
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --summary "Done" --skip-file-change-check
3103
3103
  ovld protocol deliver --session-key <key> --ticket-id <ticket_id> --summary "Done" --timeout 60000
@@ -208,7 +208,7 @@ If you receive a prompt with a specified ticket ID, adhere to the following. If
208
208
  \`\`\`bash
209
209
  ovld protocol deliver --session-key <sessionKey> --ticket-id $TICKET_ID --payload-file -
210
210
  \`\`\`
211
- This avoids creating a scratch delivery file that needs cleanup. If your runtime cannot provide stdin directly, \`--payload-file ./deliver.json\` remains supported; treat that file as ephemeral scratch data, never commit it, and remove it after delivery.
211
+ This avoids creating a scratch delivery file that needs cleanup. If your runtime cannot provide stdin directly, \`--payload-file .overlord/tmp/deliver.json\` remains supported; treat that file as ephemeral scratch data under \`.overlord/tmp\`, never commit it, and remove it after delivery.
212
212
 
213
213
  ## Change Rationales
214
214
 
@@ -295,7 +295,7 @@ If you receive a prompt with a specified ticket ID, adhere to the following. If
295
295
  --artifacts-json '[{"type":"next_steps","label":"Next steps","content":"..."}]' \\\\
296
296
  --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
297
297
  \`\`\`
298
- For larger delivery JSON, prefer \`--payload-file -\` and stream the full payload on stdin so no scratch file needs to be created or removed. If you use \`--payload-file\`, \`--artifacts-file\`, or \`--change-rationales-file\` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery. Do not leave delivery JSON checked into the worktree.
298
+ For larger delivery JSON, prefer \`--payload-file -\` and stream the full payload on stdin so no scratch file needs to be created or removed. If you use \`--payload-file\`, \`--artifacts-file\`, or \`--change-rationales-file\` with a real path, treat that file as ephemeral scratch data under \`.overlord/tmp\` and remove it after delivery. Do not leave delivery JSON checked into the worktree.
299
299
 
300
300
  ## Change Rationales
301
301
 
@@ -381,7 +381,7 @@ When done, deliver with artifacts and change rationales:
381
381
  \`\`\`bash
382
382
  ovld protocol deliver --session-key <sessionKey> --ticket-id $TICKET_ID --summary "Narrative: what you did, next steps." --artifacts-json '[{"type":"next_steps","label":"Next steps","content":"..."}]' --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
383
383
  \`\`\`
384
- Use \`--payload-json\` for compact inline delivery objects. For larger delivery JSON, prefer \`--payload-file -\` with stdin so no scratch file needs to be created or removed. If you use a JSON file for delivery transport, keep it ephemeral scratch data outside the repository and remove it after the protocol call.
384
+ Use \`--payload-json\` for compact inline delivery objects. For larger delivery JSON, prefer \`--payload-file -\` with stdin so no scratch file needs to be created or removed. If you use a JSON file for delivery transport, keep it under \`.overlord/tmp\` and remove it after the protocol call.
385
385
 
386
386
  Rules:
387
387
  - Always attach first and deliver last.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "overlord-cli",
3
- "version": "0.2605241101.0",
3
+ "version": "0.2605241431.0",
4
4
  "description": "Overlord CLI — launch AI agents on tickets from anywhere",
5
5
  "homepage": "https://www.ovld.ai/docs/",
6
6
  "type": "module",
@@ -85,7 +85,7 @@ ovld protocol deliver --session-key <sessionKey> \
85
85
  --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
86
86
  ```
87
87
 
88
- Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If the summary contains special characters, use `--summary-file -` and pipe via a single-quoted heredoc (`<<'EOF'`) to prevent shell expansion. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
88
+ Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If the summary contains special characters, use `--summary-file -` and pipe via a single-quoted heredoc (`<<'EOF'`) to prevent shell expansion. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
89
89
 
90
90
  Revert an objective:
91
91
 
@@ -198,15 +198,15 @@ When you need a project ID for a protocol command and the ticket prompt did not
198
198
 
199
199
  1. `--project-id` if explicitly provided.
200
200
  2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
201
- 3. If working-directory resolution returns nothing, read `overlord.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
201
+ 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
202
202
 
203
203
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
204
204
 
205
205
  1. `projectId` (hosted MCP) or `project_id` (local shim) if explicitly provided or found in the ticket/context.
206
- 2. Read `overlord.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
206
+ 2. Read `.overlord/project.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
207
207
  3. As a last resort, try `workingDirectory` / `working_directory` resolution. If a device fingerprint is available, include `deviceFingerprint` / `device_fingerprint`.
208
208
 
209
- If `overlord.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
209
+ If `.overlord/project.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
210
210
 
211
211
  ### Devices and checkout paths
212
212
 
@@ -276,4 +276,4 @@ This keeps the ticket feed readable while preserving the full document in versio
276
276
  - Do not add or commit changes unless the user explicitly asks you to commit.
277
277
  - Delivery is the concluding step. After delivering, stop implementation work unless the user explicitly asks for follow-up execution; once follow-up execution is complete, deliver again.
278
278
 
279
- <!-- version: 0.1.4 -->
279
+ <!-- version: 0.1.5 -->
@@ -56,7 +56,7 @@ ovld protocol deliver --session-key <sessionKey> \
56
56
  --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
57
57
  ```
58
58
 
59
- Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
59
+ Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
60
60
 
61
61
  Ordinary deliver artifacts should use `next_steps`, `test_results`, `migration`, `note`, `url`, or `decision`.
62
62
 
@@ -140,13 +140,13 @@ When you need a project ID for a protocol command and the ticket prompt did not
140
140
 
141
141
  1. `--project-id` if explicitly provided.
142
142
  2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
143
- 3. If working-directory resolution returns nothing, read `overlord.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
143
+ 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
144
144
 
145
145
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
146
146
 
147
147
  1. `projectId` (hosted MCP) or `project_id` (local shim) if explicitly provided or found in the ticket/context.
148
- 2. Read `overlord.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
148
+ 2. Read `.overlord/project.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
149
149
  3. As a last resort, try `workingDirectory` / `working_directory` resolution. If a device fingerprint is available, include `deviceFingerprint` / `device_fingerprint`.
150
150
 
151
- If `overlord.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
151
+ If `.overlord/project.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
152
152
 
@@ -12,5 +12,5 @@ Use `--payload-json` when the full delivery object fits comfortably inline. For
12
12
 
13
13
  If the summary contains special characters, use `--summary-file -` and pipe via a single-quoted heredoc (`<<'EOF'`) to prevent shell expansion.
14
14
 
15
- If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
15
+ If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
16
16
 
@@ -56,7 +56,7 @@ ovld protocol deliver --session-key <sessionKey> \
56
56
  --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
57
57
  ```
58
58
 
59
- Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
59
+ Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
60
60
 
61
61
  Ordinary deliver artifacts should use `next_steps`, `test_results`, `migration`, `note`, `url`, or `decision`.
62
62
 
@@ -140,13 +140,13 @@ When you need a project ID for a protocol command and the ticket prompt did not
140
140
 
141
141
  1. `--project-id` if explicitly provided.
142
142
  2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
143
- 3. If working-directory resolution returns nothing, read `overlord.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
143
+ 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
144
144
 
145
145
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
146
146
 
147
147
  1. `projectId` (hosted MCP) or `project_id` (local shim) if explicitly provided or found in the ticket/context.
148
- 2. Read `overlord.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
148
+ 2. Read `.overlord/project.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
149
149
  3. As a last resort, try `workingDirectory` / `working_directory` resolution. If a device fingerprint is available, include `deviceFingerprint` / `device_fingerprint`.
150
150
 
151
- If `overlord.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
151
+ If `.overlord/project.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
152
152
 
@@ -12,5 +12,5 @@ Use `--payload-json` when the full delivery object fits comfortably inline. For
12
12
 
13
13
  If the summary contains special characters, use `--summary-file -` and pipe via a single-quoted heredoc (`<<'EOF'`) to prevent shell expansion.
14
14
 
15
- If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
15
+ If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
16
16
 
Binary file
Binary file
@@ -56,7 +56,7 @@ ovld protocol deliver --session-key <sessionKey> \
56
56
  --change-rationales-json '[{"label":"Short reviewer title","file_path":"path/to/file.ts","summary":"What changed.","why":"Why it changed.","impact":"Behavioral impact.","hunks":[{"header":"@@ -10,6 +10,14 @@"}]}]'
57
57
  ```
58
58
 
59
- Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
59
+ Use `--payload-json` when the full delivery object fits comfortably inline. For larger delivery payloads, prefer `--payload-file -` and stream the full JSON on stdin so no scratch file needs to be created or removed. If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
60
60
 
61
61
  Ordinary deliver artifacts should use `next_steps`, `test_results`, `migration`, `note`, `url`, or `decision`.
62
62
 
@@ -140,13 +140,13 @@ When you need a project ID for a protocol command and the ticket prompt did not
140
140
 
141
141
  1. `--project-id` if explicitly provided.
142
142
  2. Otherwise, let the CLI match the current working directory (the default behavior of `create`, `prompt`, `discover-project`).
143
- 3. If working-directory resolution returns nothing, read `overlord.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
143
+ 3. If working-directory resolution returns nothing, read `.overlord/project.json` from the cwd (or any ancestor you have access to) and pass its project id via `--project-id`.
144
144
 
145
145
  **Over MCP (web agents and hosted tools, where the server cannot see the agent's cwd):**
146
146
 
147
147
  1. `projectId` (hosted MCP) or `project_id` (local shim) if explicitly provided or found in the ticket/context.
148
- 2. Read `overlord.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
148
+ 2. Read `.overlord/project.json` from the directory the user is accessing and pass its project id as `projectId` / `project_id`.
149
149
  3. As a last resort, try `workingDirectory` / `working_directory` resolution. If a device fingerprint is available, include `deviceFingerprint` / `device_fingerprint`.
150
150
 
151
- If `overlord.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
151
+ If `.overlord/project.json` contains more than one project, show the user the project **names** from that file and ask which one to use before calling any protocol command — never silently pick one.
152
152
 
@@ -12,5 +12,5 @@ Use `--payload-json` when the full delivery object fits comfortably inline. For
12
12
 
13
13
  If the summary contains special characters, use `--summary-file -` and pipe via a single-quoted heredoc (`<<'EOF'`) to prevent shell expansion.
14
14
 
15
- If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data outside the repository and remove it after delivery.
15
+ If you use `--payload-file`, `--artifacts-file`, or `--change-rationales-file` with a real path, treat that file as ephemeral scratch data under `.overlord/tmp` and remove it after delivery.
16
16