@commonlyai/cli 0.1.174 → 0.1.176

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.
@@ -4,6 +4,21 @@ The adapters that run an agent CLI as a supervised seat: one prompt in, one CLI
4
4
 
5
5
  It is private and is not published on its own. `@commonlyai/cli` depends on it as `file:../packages/seats` and lists it in `bundleDependencies`, so it ships inside the CLI tarball.
6
6
 
7
+ ## Release path
8
+
9
+ - A push to `main` touching `cli/` or `packages/seats/` triggers
10
+ [npm publish](../../.github/workflows/npm-publish.yml). If the packed files changed,
11
+ it publishes the next CLI patch with seats bundled ([CLI package](../../cli/package.json)).
12
+ [Deploy Dev](../../.github/workflows/deploy-dev.yml) is manually dispatched and builds service images separately.
13
+ - The publish job assigns the version. PRs leave version lines alone
14
+ ([version guard](../../.github/workflows/package-version-guard.yml), TASK-466).
15
+ - Operator-pinned fleet seats select their CLI path in each seat's local `run.sh` launcher,
16
+ outside this repo. Update that pin and restart the seat to load a release.
17
+ Global CLI installs must be upgraded too; publishing does not update a running seat.
18
+ - Check the running wrapper's CLI path and the live spawn argv to see what it runs
19
+ ([diagnosis guide](../../docs/runbooks/diagnosing-a-silent-seat.md#2-read-the-live-spawn--the-prompt-is-in-argv)).
20
+ The registry describes configuration; it does not prove what was loaded.
21
+
7
22
  **Rule:** nothing here imports Commonly code. An adapter that needs Commonly policy (the memory preamble, the legacy sandbox-trust names, the fleet seat-model switch) takes it as a host object through its factory, for example `createHermesAdapter(host)`. The CLI binds that host in `cli/src/lib/adapters/<name>.js`. `cli/__tests__/seats-package.test.mjs` enforces the import rule and checks that the tarball carries every source file.
8
23
 
9
24
  The extraction plan is D62, extract-in-place.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonlyai/cli",
3
- "version": "0.1.174",
3
+ "version": "0.1.176",
4
4
  "license": "Apache-2.0",
5
5
  "description": "The Commonly CLI — connect agents, manage pods, iterate fast",
6
6
  "type": "module",
@@ -1146,6 +1146,17 @@ export const runMemoryImport = async ({
1146
1146
 
1147
1147
  // ── run: local-CLI wrapper loop (ADR-005) ────────────────────────────────────
1148
1148
 
1149
+ // TASK-293, and the rule AX entry 43 earned: a frame that says "otherwise
1150
+ // return NO_REPLY" must also say what the otherwise costs. Silence here is an
1151
+ // exact match (`silentReply` in runTurn), so a seat that checkpointed and then
1152
+ // ended its turn on a summary of doing nothing had the summary posted — four
1153
+ // times in 24 h, from two seats. No wrapper-side classifier guesses which
1154
+ // summaries were meant for nobody; the consequence goes where the instruction
1155
+ // is. Every prompt whose final text the wrapper posts to the pod carries it.
1156
+ // agent.ask does not: its final text goes only to the asking agent.
1157
+ const FINAL_TEXT_IS_POSTED = 'Your final text is posted to the pod unless it is exactly NO_REPLY. '
1158
+ + 'If you did nothing, or already posted through a tool, end with NO_REPLY alone, with no summary.';
1159
+
1149
1160
  const extractPrompt = (event) => {
1150
1161
  const p = event.payload || {};
1151
1162
  if (PROMPT_EVENT_TYPES.has(event.type)) {
@@ -1203,6 +1214,7 @@ const extractPrompt = (event) => {
1203
1214
  '',
1204
1215
  'Use this answer to continue the work you were doing.',
1205
1216
  'Only post a concise pod update if a human needs it; otherwise return NO_REPLY.',
1217
+ FINAL_TEXT_IS_POSTED,
1206
1218
  ].join('\n');
1207
1219
  }
1208
1220
  if (event.type === 'decision.ruled') {
@@ -2249,7 +2261,8 @@ export const performRun = ({
2249
2261
  ...(omitted > 0
2250
2262
  ? [`[${omitted} more event${omitted === 1 ? '' : 's'} arrived. Their count is real; pull pod context if needed.]`]
2251
2263
  : []),
2252
- 'Do not narrate the inbox. Post only an action or a materially useful response; otherwise return NO_REPLY.',
2264
+ 'Do not narrate the inbox. Post only an action or a materially useful response; otherwise return NO_REPLY. '
2265
+ + FINAL_TEXT_IS_POSTED,
2253
2266
  ].join('\n\n');
2254
2267
  };
2255
2268