@mnstry/atelier 0.2.0-alpha.8 → 0.2.0-alpha.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0-alpha.9
4
+
5
+ ### Fixed
6
+
7
+ - The maintenance service process could not start from the shipped package:
8
+ its entry awaits the command contributions at top level, and the selection
9
+ contribution shipped in 0.2.0-alpha.8 reaches the entry again through
10
+ `opening.mjs` → `lifecycle.mjs`, so the process deadlocked on its own await
11
+ and exited 13 before it listened. `SERVICE_ENTRY_PATH` now lives in its own
12
+ module that nothing else depends on, and a test spawns the real entry.
13
+
3
14
  ## 0.2.0-alpha.8
4
15
 
5
16
  ### Added
package/README.md CHANGED
@@ -54,7 +54,7 @@ governed projections
54
54
  You can see the complete loop in a disposable sample workspace:
55
55
 
56
56
  ```bash
57
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
57
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.9
58
58
  npx mnstry-atelier init --fixture=sample-workspace --target ./sample
59
59
  npx mnstry-atelier graph --project ./sample/atelier.project.json
60
60
  npx mnstry-atelier project --project ./sample/atelier.project.json
@@ -378,7 +378,7 @@ Node.js `>=22.18.0 <23` is required. Pin the prerelease while the package
378
378
  remains in alpha:
379
379
 
380
380
  ```bash
381
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
381
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.9
382
382
  ```
383
383
 
384
384
  Then choose the path that matches what you are building:
@@ -397,7 +397,7 @@ Then choose the path that matches what you are building:
397
397
 
398
398
  ## Status and command reference
399
399
 
400
- Current package: `@mnstry/atelier@0.2.0-alpha.8`.
400
+ Current package: `@mnstry/atelier@0.2.0-alpha.9`.
401
401
 
402
402
  The alpha package is usable and contract-tested, but its library API may still
403
403
  change before a stable release. Pin the exact version in production toolchains.
package/docs/install.md CHANGED
@@ -34,19 +34,19 @@ The registry is the distribution channel of record, as `docs/continuity.md`
34
34
  commits:
35
35
 
36
36
  ```bash
37
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
37
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.9
38
38
  ```
39
39
 
40
40
  Installing from the matching Git tag resolves to the same reviewed commit:
41
41
 
42
42
  ```bash
43
- npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.8"
43
+ npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.9"
44
44
  ```
45
45
 
46
46
  Or over SSH:
47
47
 
48
48
  ```bash
49
- npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.8"
49
+ npm install --save-dev "git+ssh://git@github.com/MNSTRY/atelier.git#v0.2.0-alpha.9"
50
50
  ```
51
51
 
52
52
  Keep the `@mnstry/` scope — see the command-form note above for why the
package/docs/upgrade.md CHANGED
@@ -9,6 +9,14 @@ workspace between Atelier package releases. The flow is local-only: it does not
9
9
  provision repositories, contact a Git host, mutate the MNSTRY runtime, or write
10
10
  through a browser view.
11
11
 
12
+ ## Upgrading to 0.2.0-alpha.9
13
+
14
+ This release fixes a defect in 0.2.0-alpha.8: the Obsidian maintenance service
15
+ could not start from the published package (`atelier obsidian service start`
16
+ reported `start-failed` with `service-exited-13`). Upgrade from 0.2.0-alpha.8
17
+ directly; nothing else changes and no project or machine setting needs to be
18
+ touched. 0.2.0-alpha.8 is deprecated.
19
+
12
20
  ## Upgrading to 0.2.0-alpha.8
13
21
 
14
22
  This release adds typed advisory decision contracts and an experimental,
@@ -158,7 +166,7 @@ For registry installs, pin the exact version and record the resolved version
158
166
  in the lockfile:
159
167
 
160
168
  ```bash
161
- npm install --save-dev @mnstry/atelier@0.2.0-alpha.8
169
+ npm install --save-dev @mnstry/atelier@0.2.0-alpha.9
162
170
  npx mnstry-atelier lock write --project ./atelier.project.json
163
171
  ```
164
172
 
@@ -166,7 +174,7 @@ For Git installs, pin the release tag rather than a branch, so the lock file
166
174
  records exactly what was reviewed:
167
175
 
168
176
  ```bash
169
- npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.8"
177
+ npm install --save-dev "git+https://github.com/MNSTRY/atelier.git#v0.2.0-alpha.9"
170
178
  npx mnstry-atelier lock write --project ./atelier.project.json
171
179
  ```
172
180
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnstry/atelier",
3
- "version": "0.2.0-alpha.8",
3
+ "version": "0.2.0-alpha.9",
4
4
  "private": false,
5
5
  "description": "Local toolkit that turns a Git repository into an ontology-governed knowledge graph, enforcement layer, and runtime for people, agents, and tools. No telemetry or required hosted account; optional host-bound vault adapters.",
6
6
  "keywords": [
@@ -143,7 +143,7 @@ export async function runObsidianCommandForOracleTests(options = {}, rules = {})
143
143
  const serviceSeam = async () => {
144
144
  if (seams !== null) { if (typeof seams.service?.entryPath !== 'string') refuse('seams-required', 'the service seam names the entry this command may start'); return seams.service }
145
145
  if (flags.adapter !== PRODUCTION_ADAPTER) refuse('app-adapter-not-selected', 'no editor adapter was selected; a service that reaches the installed app is never a default')
146
- const { SERVICE_ENTRY_PATH } = await import('../runtime/obsidian/service-main.mjs')
146
+ const { SERVICE_ENTRY_PATH } = await import('../runtime/obsidian/service-entry-path.mjs')
147
147
  return { entryPath: SERVICE_ENTRY_PATH, entryArgs: [`--adapter=${PRODUCTION_ADAPTER}`] }
148
148
  }
149
149
  const appSeams = async () => {
@@ -8,7 +8,7 @@ import { ensureWorkspaceIdentity } from './machine-settings.mjs'
8
8
  import { acquirePrivateGenerationLock, createAbandonmentProof, isProcessAlive } from './private-lock.mjs'
9
9
  import { processRunsRecordedExecutable } from './process-identity.mjs'
10
10
  import { DEFAULT_PROBE_TIMEOUT_MS, LOOPBACK_HOSTS, probeHealth, requestLoopback } from './service-client.mjs'
11
- import { SERVICE_ENTRY_PATH } from './service-main.mjs'
11
+ import { SERVICE_ENTRY_PATH } from './service-entry-path.mjs'
12
12
  import {
13
13
  CONSENT_COVERAGES, SERVICE_SETTINGS_SCHEMA, executableIdentity, openServiceLog, publicRecord, readServiceRecord, readServiceSettings, removeServiceRecord,
14
14
  serviceNameFor, servicePaths, writeServiceSettings,
@@ -0,0 +1,9 @@
1
+ import { fileURLToPath } from 'node:url'
2
+
3
+ // The absolute path of the maintenance service entry, kept in its own module
4
+ // so that nothing which needs the path has to import the entry itself. The
5
+ // entry awaits at top level (it loads the command contributions before it
6
+ // serves), and a module that both reaches it through a static import and is
7
+ // itself reached by that load would deadlock the process: the contribution
8
+ // graph waits for the entry, the entry waits for the contribution graph.
9
+ export const SERVICE_ENTRY_PATH = fileURLToPath(new URL('./service-main.mjs', import.meta.url))
@@ -33,7 +33,9 @@ const ADAPTERS = Object.freeze({
33
33
  },
34
34
  })
35
35
 
36
- export const SERVICE_ENTRY_PATH = fileURLToPath(import.meta.url)
36
+ import { SERVICE_ENTRY_PATH } from './service-entry-path.mjs'
37
+
38
+ export { SERVICE_ENTRY_PATH }
37
39
  export const EXIT_REFUSED = 2
38
40
 
39
41
  const log = (entry) => { try { process.stdout.write(`${JSON.stringify(entry)}\n`) } catch { /* a closed log never ends the service */ } }
@@ -68,7 +70,7 @@ export function serviceOptionsFromArgv(argv, { env = process.env } = {}) {
68
70
  }
69
71
  }
70
72
 
71
- const invokedDirectly = (() => { try { return Boolean(process.argv[1]) && fs.realpathSync(process.argv[1]) === fs.realpathSync(SERVICE_ENTRY_PATH) } catch { return false } })()
73
+ const invokedDirectly = (() => { try { return Boolean(process.argv[1]) && fs.realpathSync(process.argv[1]) === fs.realpathSync(fileURLToPath(import.meta.url)) } catch { return false } })()
72
74
 
73
75
  if (invokedDirectly) {
74
76
  let options = null
@@ -6,7 +6,7 @@
6
6
  "version": "v1",
7
7
  "digest": "sha256:0eff795765e0bbd4c2510acda2e492201c23bc870df6c354eef623484643ab11",
8
8
  "compatibleRootVersions": [
9
- "0.2.0-alpha.8"
9
+ "0.2.0-alpha.9"
10
10
  ],
11
11
  "status": "active"
12
12
  }