recess-cli 1.3.0 → 1.3.2

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
@@ -96,6 +96,7 @@ MAP uploads accept one PDF up to 15 MB. The preview includes the resolved path,
96
96
 
97
97
  ```bash
98
98
  recess --json skills get os-v2-goal-template-builder --all-references
99
+ recess --json content-library search "fractions through visual puzzles" --limit 8
99
100
  recess --json goal-templates validate-spec --file ./template.json # iterate; writes nothing
100
101
  recess --json goal-templates create --file ./template.json # preview, exit 2
101
102
  recess --json goal-templates create --file ./template.json --confirm
package/dist/cli.js CHANGED
@@ -113,6 +113,7 @@ Usage:
113
113
  recess [--json] village models remove <placement-id> [--world village-1] [--confirm]
114
114
  recess [--json] village render --min-x N --min-z N --max-x N --max-z N
115
115
  [--world village-1]
116
+ recess [--json] content-library search <query> [--limit 8]
116
117
  recess [--json] skills list [--query TEXT] [--category TEXT]
117
118
  recess [--json] skills get <skill-name> [--reference NAME | --all-references]
118
119
  [--refresh]
@@ -128,7 +129,7 @@ Usage:
128
129
  recess [--json] goal-templates set-metadata <template-id> --expected-version N
129
130
  [--title TEXT] [--description TEXT] [--emoji X] [--category TEXT] [--tags A,B]
130
131
  [--sort-order N] [--kind SIMPLE|BLUEPRINT] [--agent-instructions-file <path>]
131
- [--confirm]
132
+ [--output-template-file <path>] [--confirm]
132
133
  recess [--json] goal-templates delete <template-id> --expected-version N [--confirm]
133
134
  recess [--json] goal-templates snapshot-files <template-id> [--path P]
134
135
  recess [--json] goal-templates capture-snapshot <template-id|slug>
@@ -2072,6 +2073,19 @@ export async function runCommand(argv) {
2072
2073
  }
2073
2074
  throw new CliError("invalid_arguments", "Use skills list|get.");
2074
2075
  }
2076
+ if (noun === "content-library") {
2077
+ if (verb === "search") {
2078
+ const query = positional(parsed, 2, "search query");
2079
+ const limit = flagNumber(parsed, "limit") ?? 8;
2080
+ if (!Number.isInteger(limit) || limit < 1 || limit > 40) {
2081
+ throw new CliError("invalid_arguments", "--limit must be an integer between 1 and 40.");
2082
+ }
2083
+ return unwrap(await api.client.GET("/admin/content-library/search", {
2084
+ params: { query: { q: query, limit } },
2085
+ }));
2086
+ }
2087
+ throw new CliError("invalid_arguments", "Use content-library search.");
2088
+ }
2075
2089
  if (noun === "goal-templates") {
2076
2090
  if (verb === "list") {
2077
2091
  const query = flagString(parsed, "query")?.toLowerCase();
@@ -2281,6 +2295,7 @@ export async function runCommand(argv) {
2281
2295
  const id = await resolveGoalTemplateId(api, positional(parsed, 2, "template ID or slug"));
2282
2296
  const expectedVersion = requiredExpectedVersion(parsed);
2283
2297
  const agentInstructionsFile = flagString(parsed, "agent-instructions-file");
2298
+ const outputTemplateFile = flagString(parsed, "output-template-file");
2284
2299
  const tags = flagString(parsed, "tags");
2285
2300
  const kind = flagString(parsed, "kind");
2286
2301
  const sortOrder = flagNumber(parsed, "sort-order");
@@ -2315,13 +2330,18 @@ export async function runCommand(argv) {
2315
2330
  agentInstructions: await fs.readFile(path.resolve(agentInstructionsFile), "utf8"),
2316
2331
  }
2317
2332
  : {}),
2333
+ ...(outputTemplateFile
2334
+ ? {
2335
+ outputTemplate: await fs.readFile(path.resolve(outputTemplateFile), "utf8"),
2336
+ }
2337
+ : {}),
2318
2338
  };
2319
2339
  // `setupWorkflowSpec` is unreachable from this command by construction.
2320
2340
  // The route still accepts one, but a wholesale spec replacement is the
2321
2341
  // shape that caused the template incident; editing an existing spec goes
2322
2342
  // through the guarded /ai patch path with its destructive-change token.
2323
2343
  if (Object.keys(body).length === 1) {
2324
- throw new CliError("invalid_arguments", "Pass at least one field to change (--title, --description, --emoji, --category, --tags, --sort-order, --kind, --agent-instructions-file).");
2344
+ throw new CliError("invalid_arguments", "Pass at least one field to change (--title, --description, --emoji, --category, --tags, --sort-order, --kind, --agent-instructions-file, --output-template-file).");
2325
2345
  }
2326
2346
  return writeCommand(parsed, {
2327
2347
  action: "update goal template metadata (never its setupWorkflowSpec)",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "recess-cli",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "description": "Safe Recess staff administration from the command line, for humans and coding agents.",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  name: recess-cli
3
- description: Safely perform Recess staff administration through the recess CLI. Use when a Recess admin asks Codex to find a kid, parent, family, enrollment, subscription, invoice, or cohort; inspect or change a school kid's tier and capability gates; upload a kid's MAP Growth report; pause or resume billing; refund or credit an invoice item; extend a trial; cancel or restore a subscription; register or unregister a cohort against an enrollment; switch or move kids from one cohort to another; manage guide payout invoices (biweekly pay-cycle line-item changes, invoice status moves, payout recipient lookups); run class operations (take attendance, cancel or reschedule a class session, add a one-off session, end a cohort, pause cohort billing, email a cohort's families, approve or deny pending registrations); process class-cancellation credits (the "Please credit these students accordingly" Slack message — credit every registered kid for a guide-canceled session); or author learning content — build, validate, publish, and loss-safely patch a deterministic GoalTemplate, apply a template to a kid or a roster, create a goal directly on a kid, write a Mesa draft or goal workspace, capture a template snapshot, and read Mesa workspace or snapshot files.
3
+ description: Safely perform Recess staff administration through the recess CLI. Use when a Recess admin asks Codex to find a kid, parent, family, enrollment, subscription, invoice, or cohort; search the curated Content Library; inspect or change a school kid's tier and capability gates; upload a kid's MAP Growth report; pause or resume billing; refund or credit an invoice item; extend a trial; cancel or restore a subscription; register or unregister a cohort against an enrollment; switch or move kids from one cohort to another; manage guide payout invoices (biweekly pay-cycle line-item changes, invoice status moves, payout recipient lookups); run class operations (take attendance, cancel or reschedule a class session, add a one-off session, end a cohort, pause cohort billing, email a cohort's families, approve or deny pending registrations); process class-cancellation credits (the "Please credit these students accordingly" Slack message — credit every registered kid for a guide-canceled session); or author learning content — build, validate, publish, and loss-safely patch a deterministic GoalTemplate, apply a template to a kid or a roster, create a goal directly on a kid, write a Mesa draft or goal workspace, capture a template snapshot, and read Mesa workspace or snapshot files.
4
4
  # Bundle version. Bump on every substantive edit; the CLI reports it and `doctor`
5
5
  # compares it against the served copy to tell an operator a refresh is available.
6
- version: 1.4.0
6
+ version: 1.4.3
7
7
  # The lowest `recess` version this bundle is safe to install onto. Raise it ONLY
8
8
  # when the bundle documents a command, flag, or changed semantic that an older
9
9
  # binary does not have — an older CLI keeps its bundled copy instead of taking
10
10
  # this one. Prose, formatting, and Gotcha edits must NOT raise it; that is the
11
11
  # whole point of serving the bundle.
12
- minCliVersion: 1.3.0
12
+ minCliVersion: 1.3.2
13
13
  ---
14
14
 
15
15
  # Recess CLI (`recess`)
@@ -213,6 +213,9 @@ recess --json onboarding extract <family-id> --session <id> (--transcript-file <
213
213
  recess --json skills list [--query TEXT] [--category TEXT]
214
214
  recess --json skills get <skill-name> [--reference NAME | --all-references] [--refresh]
215
215
 
216
+ # Curated learning-resource research (read-only)
217
+ recess --json content-library search <query> [--limit 8]
218
+
216
219
  # Learning content (reference/goal-authoring.md)
217
220
  recess --json goal-templates list [--query TEXT] [--kind SIMPLE|BLUEPRINT] [--starter-only]
218
221
  recess --json goal-templates get <id-or-slug> [--spec-only]
@@ -220,7 +223,7 @@ recess --json goal-templates versions <id-or-slug> [--version N]
220
223
  recess --json goal-templates validate-spec --file <path/template.json>
221
224
  recess --json goal-templates create --file <path/template.json> [--confirm]
222
225
  recess --json goal-templates patch-spec <id-or-slug> --expected-version N --patches-file <path/patches.json> [--confirm] [--confirm-destructive-changes --destructive-change-token TOKEN]
223
- recess --json goal-templates set-metadata <id-or-slug> --expected-version N [--title …] [--confirm]
226
+ recess --json goal-templates set-metadata <id-or-slug> --expected-version N [--title …] [--agent-instructions-file <path>] [--output-template-file <path>] [--confirm]
224
227
  recess --json goal-templates delete <id-or-slug> --expected-version N [--confirm]
225
228
  recess --json goal-templates snapshot-files <id-or-slug> [--path P]
226
229
  recess --json goal-templates capture-snapshot <id-or-slug> (--source-goal <goal-id> | --source-draft <draft-slug> --student <kid-id>) [--dry-run] [--confirm]
@@ -318,7 +321,8 @@ the tool names do not:
318
321
  | `search_web`, `fetch_webpage` | your own web search / page fetch |
319
322
  | `spawn_subagents` | your own subagents. The five researcher prompts in `goal-creation`'s `subagent-tasks.md` (curriculum-map, platforms, resources, learning-paths, prerequisites) are usable almost verbatim — they are prompts, not tool calls |
320
323
  | `validate_urls` | check the URLs yourself before baking them into a spec. Do not skip this: a rotted queue URL is invisible until a kid clicks it |
321
- | `search_videos`, `search_books`, `recommend_videos`, `search_gem_library` | your own search. There is no CLI command for the gem library |
324
+ | `search_gem_library` | `content-library search <query>` (same hybrid/vector + rerank funnel; no content or Pipeline writes) |
325
+ | `search_videos`, `search_books`, `recommend_videos` | your own search |
322
326
  | `get_student_profile`, `read_memory`, `query_student_activity_sql` | **partial.** `users search`/`users get` give account context, `goals list` what is already authored, `mesa files` the workspace. There is **no** command for kid memory or activity SQL — for those, the separate `query-db` skill's read-only production access is the honest route, not a guess |
323
327
  | `search_standards`, `navigate_standards` | no CLI command |
324
328
  | `save_platform_research` | **no CLI command** — a researched platform profile can only be persisted from `recess.gg/ai`. Your research still informs the spec you write; it just does not get saved as a reusable profile |
@@ -479,3 +483,6 @@ Dated, newest last. Add an entry every time reality surprises you.
479
483
  - 2026-08-04 — A `Makefile install-persistent` copy is NOT the npm package: it synthesizes its own `package.json`. If that manifest lacks `version`, or `skill/` is not copied alongside `dist/`, then `--version` reports `0.0.0` and the `minCliVersion` fence **fails closed** — every served skill upgrade is silently refused with `cli_too_old`. Both are now copied; if you add another packaged artifact the CLI reads at runtime, add it to that target too.
480
484
  - 2026-08-04 — **`goal-templates patch-spec` performs a server preview even on a confirmed run.** The first POST is `dryRun:true`, never a write; it binds the current template version, before/after hashes, and protected removals. A destructive second POST is impossible without `--confirm-destructive-changes` and that fresh preview token. If the template or patch file changes, preview again and obtain new approval.
481
485
  - 2026-08-05 — **A deterministic MODULE_BACKED spec is not the course content.** `goal-templates create` can create a valid BLUEPRINT while `snapshot` remains null; Goal Preview stays empty and apply correctly says there is no valid snapshot. Build the complete tree locally, `mesa files write --draft … --source-dir …`, then `goal-templates capture-snapshot --source-draft … --student …`. Both writes server-preview first. Mesa writes are fenced to the previewed repo change; capture is fenced to that source change and the template version. Direct live-goal `modules/`/`state/` writes are deliberately blocked because those paths have DB projections.
486
+ - 2026-08-05 — **The goal-audit GET cannot investigate an already-soft-deleted goal.** `request get /admin/browser/students/goals/<goal-id>/audit/` returns 404 because the handler's `ensureGoalAccess` calls `canManageGoal`, which requires `Goal.deletedAt: null` before it loads `GoalAuditLog`. The 404 is not evidence that the audit row is absent. Use the `query-db` skill's guarded read-only production query for deletion forensics.
487
+ - 2026-08-05 — **`set-metadata --output-template-file` edits an AI_CHAT template's `outputTemplate`** (the goal-description payload DailyTodoGeneration consumes for description-only goals). Like `--agent-instructions-file`, it reads a local file and the server bumps the version + freezes a `GoalTemplateVersion` row. Editing a template never rewrites goals already created from it — the description was copied at goal-creation time; re-apply or edit live goals separately.
488
+ - 2026-08-05 — **Content Library search now has a content/Pipeline-read-only CLI command.** `content-library search <query> [--limit 8]` calls the same hybrid/vector + rerank `/agent/search` funnel as Rocky's `search_gem_library`, returns the full fit/gist/coverage payload, and attributes the funnel's standard `offered` telemetry to `admin-cli`. It cannot inspect, ingest, file requests, curate, or edit the Pipeline; the permanent library token stays on the web server.