@lifeaitools/rdc-skills 0.37.8 → 0.37.9

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rdc",
3
- "version": "0.37.8",
3
+ "version": "0.37.9",
4
4
  "description": "RDC typed-agent dispatch skill suite for Claude Code — plan, build, review, overnight unattended builds with work-item tracking and TDD enforcement.",
5
5
  "author": {
6
6
  "name": "LIFEAI",
@@ -2120,6 +2120,78 @@
2120
2120
  "enabled_default": true,
2121
2121
  "codeflow_required": false,
2122
2122
  "purpose": "orient before working: position, target from the registry, and the harness shape"
2123
+ },
2124
+ "new": {
2125
+ "name": "new",
2126
+ "slash": "rdc:new",
2127
+ "category": "dev-loop",
2128
+ "usage": "rdc:new <slug> --product-type <t> [--environment <e> --host-type <t> --url <u>]",
2129
+ "args": {
2130
+ "positional": [
2131
+ {
2132
+ "name": "slug",
2133
+ "required": true,
2134
+ "description": "the new product's registry slug",
2135
+ "accepts": "string"
2136
+ }
2137
+ ],
2138
+ "flags": [
2139
+ {
2140
+ "name": "product-type",
2141
+ "required": true,
2142
+ "description": "one of the 11 declared product classes (app, site-ts, site-html, package, share-app, prototype, model, mcp, documentation, corpus, artifact)",
2143
+ "accepts": "string"
2144
+ },
2145
+ {
2146
+ "name": "environment",
2147
+ "required": false,
2148
+ "description": "deployment environment to also register (dev, prod, ...) — dev-only is the normal outcome",
2149
+ "accepts": "string"
2150
+ },
2151
+ {
2152
+ "name": "host-type",
2153
+ "required": false,
2154
+ "description": "runtime for the registered environment (coolify, pm2, ...)",
2155
+ "accepts": "string"
2156
+ },
2157
+ {
2158
+ "name": "url",
2159
+ "required": false,
2160
+ "description": "the registered environment's URL",
2161
+ "accepts": "string"
2162
+ }
2163
+ ]
2164
+ },
2165
+ "requires": [
2166
+ "supabase",
2167
+ "git"
2168
+ ],
2169
+ "produces": [
2170
+ "repo_registry_writes",
2171
+ "app_deployments_writes"
2172
+ ],
2173
+ "default_model": "haiku",
2174
+ "triggers": [
2175
+ "create a new app",
2176
+ "scaffold a new site",
2177
+ "register a new package",
2178
+ "rdc:new",
2179
+ "new product",
2180
+ "start a new repo",
2181
+ "add a new deployment environment"
2182
+ ],
2183
+ "follows": [],
2184
+ "leads_to": [
2185
+ "open",
2186
+ "plan",
2187
+ "build",
2188
+ "deploy"
2189
+ ],
2190
+ "sandbox_aware": false,
2191
+ "output_contract": "guides/output-contract.md",
2192
+ "enabled_default": true,
2193
+ "codeflow_required": false,
2194
+ "purpose": "scaffold and register a new product (rdc-harness create), then its deployment environment(s) (rdc-harness new) -- the create-time gap /rdc:open's gate-only design left unwrapped"
2123
2195
  }
2124
2196
  },
2125
2197
  "commands_meta": {
package/README.md CHANGED
@@ -333,6 +333,7 @@ skills/
333
333
  help/SKILL.md (manifest-driven skill index)
334
334
  housekeeping/SKILL.md (weekly maintenance audit)
335
335
  lifeai-brochure-author/SKILL.md (brochure JSX authoring)
336
+ new/SKILL.md (product scaffolding and registration)
336
337
  new-model/SKILL.md (reference model registration gate)
337
338
  onramp/SKILL.md (Place Fund phase-1 enrollment)
338
339
  open/SKILL.md (orient first: position, target, harness shape)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema": "lifeai.plugin.v1",
3
3
  "id": "rdc-skills",
4
- "version": "0.37.8",
4
+ "version": "0.37.9",
5
5
  "publisher": "LIFEAI",
6
6
  "core": false,
7
7
  "documentation": {
package/commands/flow.md CHANGED
@@ -45,44 +45,44 @@ rdc:flow normal # clear — back to no flow declared
45
45
 
46
46
  ## Steps
47
47
 
48
+ **One direct script call, nothing more.** `$LIFEAI_ENV/bin/rdc-flow.mjs` is the CLI over
49
+ `hooks/lib/rdc-flow.mjs` — run it, read its printed JSON, done. There is no research step:
50
+ do not read this file's own source or reconstruct the call by hand, and do not fall back to
51
+ an inline `node -e "import(...)"` — the CLI already does the right sequence internally. The
52
+ call itself is fast (~0.1–0.2s measured live); if a turn spends more than a few seconds on
53
+ this, that time is the agent reading docs, not the script running.
54
+
48
55
  ### 1. Read the current state
49
56
 
50
57
  ```bash
51
- node -e "import(require('url').pathToFileURL(process.env.LIFEAI_ENV + '/hooks/lib/rdc-flow.mjs').href).then(m=>console.log(JSON.stringify(m.currentState(),null,2)))"
58
+ node $LIFEAI_ENV/bin/rdc-flow.mjs status
52
59
  ```
53
60
 
54
- `currentState()` reads BOTH axes at once — the declared flow AND any live `rdc-mode.mjs` hotfix/maintenance window — because a relaxed mode overrides a required flow (loosest state wins) and a status check that only showed flow would miss that override entirely. Report `flow` (or `null` if nothing declared — the fail-closed default), `flowReason`/`flowSetBy`/`flowSetAt` when set, and `mode` (`normal` unless a hotfix/maintenance window is open), with `modeReason`/`modeMinutesLeft` when it isn't.
61
+ Prints BOTH axes at once — the declared flow AND any live `rdc-mode.mjs` hotfix/maintenance window — because a relaxed mode overrides a required flow (loosest state wins) and a status check that only showed flow would miss that override entirely. Report `flow` (or `null` if nothing declared — the fail-closed default), `flowReason`/`flowSetBy`/`flowSetAt` when set, and `mode` (`normal` unless a hotfix/maintenance window is open), with `modeReason`/`modeMinutesLeft` when it isn't.
55
62
 
56
63
  ### 2. Setting a plain work-shape flow — no reason required
57
64
 
58
65
  ```bash
59
- node -e "import(require('url').pathToFileURL(process.env.LIFEAI_ENV + '/hooks/lib/rdc-flow.mjs').href).then(m=>console.log(JSON.stringify(m.setFlow(process.argv[1],{setBy:process.argv[2]}),null,2)))" "<flow>" "<session-id>"
66
+ node $LIFEAI_ENV/bin/rdc-flow.mjs <flow>
60
67
  ```
61
68
 
62
69
  ### 3. Setting hotfix or maintenance — a reason is REQUIRED
63
70
 
64
- Refuse to proceed without one — both setters throw on an empty reason for these two values, by design: an unexplained disarm is how a temporary state becomes permanent.
65
-
66
- Guard relaxation reads the **mode** store (`rdc-mode.mjs` `isRelaxedFor()`); the work-item
67
- exemption reads the **flow** store. `setFlow` alone relaxes no guard, so this one command
68
- writes both — `setFlowOrMode` routes `hotfix`/`maintenance` to `setMode`, then `setFlow`
69
- records the flow:
70
-
71
71
  ```bash
72
- node -e "import(require('url').pathToFileURL(process.env.LIFEAI_ENV + '/hooks/lib/rdc-flow.mjs').href).then(m=>{const [n,reason,setBy]=process.argv.slice(1);const o={reason,setBy};m.setFlowOrMode(n,o);m.setFlow(n,o);console.log(JSON.stringify(m.currentState(),null,2))})" "<hotfix|maintenance>" "<reason>" "<session-id>"
72
+ node $LIFEAI_ENV/bin/rdc-flow.mjs <hotfix|maintenance> "<reason>"
73
73
  ```
74
74
 
75
- Read the printed state: `flow` and `mode` must both show the name. If `mode` is still `normal`, no guard is relaxed — stop and say so.
75
+ The CLI refuses (exit 1, no state written) without one — an unexplained disarm is how a temporary state becomes permanent. It also writes both stores itself: guard relaxation reads the **mode** store (`rdc-mode.mjs` `isRelaxedFor()`); the work-item exemption reads the **flow** store; a bare `setFlow` would relax no guard, so the CLI calls `setFlowOrMode` then `setFlow` internally and prints the merged result of both.
76
76
 
77
- Then state plainly, in the checklist: **which guards are now relaxed, that the safety set is still armed, and that this stays active until explicitly cleared (no TTL — active management, not a silent timer).**
77
+ Read the printed state: `flow` and `mode` must both show the name — the CLI itself throws if they disagree, so a clean exit already proves this. Then state plainly, in the checklist: **which guards are now relaxed, that the safety set is still armed, and that this stays active until explicitly cleared (no TTL — active management, not a silent timer).**
78
78
 
79
79
  ### 4. Returning to normal
80
80
 
81
81
  ```bash
82
- node -e "import(require('url').pathToFileURL(process.env.LIFEAI_ENV + '/hooks/lib/rdc-flow.mjs').href).then(m=>{m.clearFlow();m.setFlowOrMode('normal');console.log(JSON.stringify(m.currentState(),null,2))})"
82
+ node $LIFEAI_ENV/bin/rdc-flow.mjs normal
83
83
  ```
84
84
 
85
- This clears both stores; a hotfix mode left open after the flow is cleared would keep guards relaxed.
85
+ Clears both stores in one call; a hotfix mode left open after the flow is cleared would keep guards relaxed.
86
86
 
87
87
  Do this **as soon as the incident is over**, or the moment the declared work-shape changes.
88
88
 
@@ -98,5 +98,6 @@ Do this **as soon as the incident is over**, or the moment the declared work-sha
98
98
 
99
99
  ```bash
100
100
  node --test $LIFEAI_ENV/tests/rdc-flow.test.mjs
101
+ node --test $LIFEAI_ENV/tests/rdc-flow-cli.test.mjs
101
102
  node --test C:/Dev/rdc-harness/fsm-daemon/tests/matrix.test.js
102
103
  ```
package/commands/mode.md CHANGED
@@ -12,6 +12,12 @@ description: rdc:mode [status|hotfix "<reason>" [minutes]|normal] — show or se
12
12
  > default) — one FSM surface instead of two. This skill's underlying code
13
13
  > (`rdc-mode.mjs`) is untouched and still works; new work should use
14
14
  > `rdc:flow hotfix "<reason>"` instead of `rdc:mode hotfix ...`.
15
+ >
16
+ > **And `rdc:flow` itself is now a direct script call, not a doc to read:**
17
+ > `node $LIFEAI_ENV/bin/rdc-flow.mjs hotfix "<reason>"` — no inline `node -e`,
18
+ > no TTL/minutes option (flow-routed hotfix/maintenance never carries one, by
19
+ > design). This page's own `node -e` steps below are the legacy `rdc:mode`
20
+ > path (the only one with a `minutes` window) and stay as documented.
15
21
 
16
22
  # rdc:mode — operating mode
17
23