loadout-ai 0.9.3 → 0.9.4

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/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.9.4 - 2026-09-07
6
+
7
+ ### Changed
8
+
9
+ - Updated the Stable first-run flow to show detailed safety findings before
10
+ applying and require explicit acknowledgement of the currently reported
11
+ instruction-like files.
12
+
13
+ ### Fixed
14
+
15
+ - Serialized coordination lock recovery within a process so competing
16
+ recoverers cannot enter the same critical section simultaneously.
17
+
5
18
  ## 0.9.3 - 2026-09-07
6
19
 
7
20
  ### Changed
package/README.md CHANGED
@@ -29,21 +29,23 @@ You need Node.js 20 or newer and Git.
29
29
 
30
30
  ```bash
31
31
  npm install --global loadout-ai
32
- loadout setup --mode stable
32
+ loadout setup --mode stable --details
33
33
  ```
34
34
 
35
35
  The second command detects your coding agents and previews the 30-skill Stable
36
36
  loadout. It does not change agent files. Review the plan, then apply it:
37
37
 
38
38
  ```bash
39
- loadout setup --mode stable --yes
39
+ loadout setup --mode stable --yes --approve-risk
40
40
  loadout status
41
41
  ```
42
42
 
43
43
  Loadout saves a rollback snapshot before applying changes. Run
44
44
  `loadout rollback` to restore the previous managed state.
45
45
 
46
- > `Preview complete; nothing was changed. Re-run with --yes to install this exact screened plan.`
46
+ `--approve-risk` acknowledges the instruction-like files reported by the current
47
+ Stable preview. Use it only after reading those findings; it does not replace the
48
+ preview or the pinned-source checks.
47
49
 
48
50
  A later `--yes` invocation recomputes the plan from pinned sources and current agent and filesystem state; it does not persist or prove identity with the earlier preview.
49
51
 
@@ -123,9 +125,9 @@ and coordination without making you relay every command.
123
125
  For a reproducible install, pin the current release:
124
126
 
125
127
  ```bash
126
- npm install --global loadout-ai@0.9.3
127
- loadout setup --mode stable
128
- loadout setup --mode stable --yes
128
+ npm install --global loadout-ai@0.9.4
129
+ loadout setup --mode stable --details
130
+ loadout setup --mode stable --yes --approve-risk
129
131
  loadout status
130
132
  ```
131
133
 
@@ -269,25 +271,25 @@ Configured CI platforms describe a manually triggered workflow, not evidence tha
269
271
 
270
272
  ## Command reference
271
273
 
272
- | Goal | Command |
273
- | ---------------------------------- | ---------------------------------------------------------- |
274
- | Guided first run | `loadout guide` |
275
- | Preview or apply Stable | `loadout setup --mode stable` · add `--yes` to apply |
276
- | Inspect managed skills | `loadout status` · `loadout library` |
277
- | Recommend for this repository | `loadout recommend --project .` |
278
- | Activate a project-specific set | `loadout optimize --project . --limit 30` |
279
- | Scan or update | `loadout scan` · `loadout update` |
280
- | Send a task | `loadout handoff codex "write tests"` |
281
- | Use a handoff template | `loadout handoff codex src/auth.ts --template write-tests` |
282
- | Preview two-agent ownership | `loadout coord start --agents claude-code,codex` |
283
- | Inspect coordination state | `loadout coord snapshot codex` |
284
- | Detect shared contract candidates | `loadout coord detect` |
285
- | Turn a decision into tasks | `loadout coord discuss implement <thread-id>` |
286
- | Start the coordination MCP server | `loadout serve` |
287
- | Health check | `loadout doctor` |
288
- | Restore the previous managed state | `loadout rollback` |
289
- | Preview complete removal | `loadout uninstall` |
290
- | Full CLI reference | `loadout --help` · `loadout advanced` |
274
+ | Goal | Command |
275
+ | ---------------------------------- | ---------------------------------------------------------------------------------- |
276
+ | Guided first run | `loadout guide` |
277
+ | Preview or apply Stable | `loadout setup --mode stable --details` · then `--yes --approve-risk` after review |
278
+ | Inspect managed skills | `loadout status` · `loadout library` |
279
+ | Recommend for this repository | `loadout recommend --project .` |
280
+ | Activate a project-specific set | `loadout optimize --project . --limit 30` |
281
+ | Scan or update | `loadout scan` · `loadout update` |
282
+ | Send a task | `loadout handoff codex "write tests"` |
283
+ | Use a handoff template | `loadout handoff codex src/auth.ts --template write-tests` |
284
+ | Preview two-agent ownership | `loadout coord start --agents claude-code,codex` |
285
+ | Inspect coordination state | `loadout coord snapshot codex` |
286
+ | Detect shared contract candidates | `loadout coord detect` |
287
+ | Turn a decision into tasks | `loadout coord discuss implement <thread-id>` |
288
+ | Start the coordination MCP server | `loadout serve` |
289
+ | Health check | `loadout doctor` |
290
+ | Restore the previous managed state | `loadout rollback` |
291
+ | Preview complete removal | `loadout uninstall` |
292
+ | Full CLI reference | `loadout --help` · `loadout advanced` |
291
293
 
292
294
  Most mutating commands are previews first. Add `--yes` only after reviewing the plan.
293
295
 
@@ -4,6 +4,7 @@ import { join } from "node:path";
4
4
  const LOCK_FILE = "coordination.lock";
5
5
  const DEFAULT_TIMEOUT_MS = 10_000;
6
6
  const MALFORMED_LOCK_STALE_MS = 30_000;
7
+ const localLockTails = new Map();
7
8
  export class CoordinationLockTimeoutError extends Error {
8
9
  constructor(timeoutMs) {
9
10
  super(`Timed out waiting ${timeoutMs}ms for the coordination lock`);
@@ -64,9 +65,25 @@ async function releaseOwnedLock(path, token) {
64
65
  function wait(delayMs) {
65
66
  return new Promise((resolve) => setTimeout(resolve, delayMs));
66
67
  }
67
- /** Serialize coordination mutations across Node processes sharing a project. */
68
- export async function withCoordinationLock(coordinationDir, operation, timeoutMs = DEFAULT_TIMEOUT_MS) {
69
- const path = join(coordinationDir, LOCK_FILE);
68
+ async function withLocalLock(path, operation) {
69
+ const previous = localLockTails.get(path) ?? Promise.resolve();
70
+ let release = () => undefined;
71
+ const current = new Promise((resolve) => {
72
+ release = resolve;
73
+ });
74
+ const tail = previous.then(() => current);
75
+ localLockTails.set(path, tail);
76
+ await previous;
77
+ try {
78
+ return await operation();
79
+ }
80
+ finally {
81
+ release();
82
+ if (localLockTails.get(path) === tail)
83
+ localLockTails.delete(path);
84
+ }
85
+ }
86
+ async function withFileLock(path, operation, timeoutMs) {
70
87
  const deadline = Date.now() + timeoutMs;
71
88
  const token = randomUUID();
72
89
  const owner = {
@@ -138,3 +155,8 @@ export async function withCoordinationLock(coordinationDir, operation, timeoutMs
138
155
  await releaseOwnedLock(path, token);
139
156
  }
140
157
  }
158
+ /** Serialize coordination mutations within this process and across processes. */
159
+ export async function withCoordinationLock(coordinationDir, operation, timeoutMs = DEFAULT_TIMEOUT_MS) {
160
+ const path = join(coordinationDir, LOCK_FILE);
161
+ return withLocalLock(path, () => withFileLock(path, operation, timeoutMs));
162
+ }
@@ -5,8 +5,10 @@ Loadout — manage the skills, tools, and MCP servers your AI agents use.
5
5
  FIRST TIME
6
6
 
7
7
  loadout doctor which agents you have, and whether they are healthy
8
- loadout setup --mode stable preview 30 reviewed skills (nothing changes)
9
- loadout setup --mode stable --yes install them
8
+ loadout setup --mode stable --details
9
+ preview 30 reviewed skills and findings
10
+ loadout setup --mode stable --yes --approve-risk
11
+ install only after reviewing those findings
10
12
 
11
13
  IN A PROJECT
12
14
 
package/docs/REFERENCE.md CHANGED
@@ -42,10 +42,14 @@ pinned public sources**, installed into each agent you choose.
42
42
  | [Agent Skills Marketplace](https://github.com/wshobson/agents) | Architecture, review, error handling, JavaScript, Python | [![GitHub stars](https://img.shields.io/github/stars/wshobson/agents?style=flat&label=stars)](https://github.com/wshobson/agents) |
43
43
 
44
44
  ```bash
45
- loadout setup --mode stable
46
- loadout setup --mode stable --yes
45
+ loadout setup --mode stable --details
46
+ loadout setup --mode stable --yes --approve-risk
47
47
  ```
48
48
 
49
+ The current Stable selection reports instruction-like files in reviewed skill
50
+ sources. Read the detailed preview before acknowledging those findings with
51
+ `--approve-risk`.
52
+
49
53
  ### Power: a larger cross-project toolkit
50
54
 
51
55
  Power draws a skill-level allowlist from eight major collections.
@@ -107,11 +107,12 @@ explicit.
107
107
  For unattended use only after reviewing a preview, the equivalent is:
108
108
 
109
109
  ```bash
110
- loadout setup --mode stable --agents codex,claude-code --yes
110
+ loadout setup --mode stable --agents codex,claude-code --yes --approve-risk
111
111
  ```
112
112
 
113
- Do not add `--approve-risk` unless the displayed preview identifies a specific
114
- reviewed finding and you understand it.
113
+ The current Stable preview identifies instruction-like files in reviewed skill
114
+ sources, so unattended apply requires `--approve-risk`. Add it only after reading
115
+ and accepting the displayed findings.
115
116
 
116
117
  ## 5. Test a change and recover
117
118
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loadout-ai",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "The package manager for AI coding agent extensions",