@orkestrel/scaffold 0.0.74 → 0.0.75
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/dist/host/agents/skills/orkestrel-prove-journey/SKILL.md +50 -13
- package/dist/host/agents/skills/orkestrel-prove-journey/references/captures.md +3 -5
- package/dist/host/codex/config.toml +4 -7
- package/dist/host/guides/scaffold.md +7 -1
- package/dist/host/manifest.json +5 -5
- package/dist/src/core/index.cjs +8 -5
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.d.cts +2 -2
- package/dist/src/core/index.d.ts +2 -2
- package/dist/src/core/index.js +8 -5
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/server/index.cjs +6 -4
- package/dist/src/server/index.cjs.map +1 -1
- package/dist/src/server/index.d.cts +9 -7
- package/dist/src/server/index.d.ts +9 -7
- package/dist/src/server/index.js +6 -4
- package/dist/src/server/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -95,11 +95,8 @@ start, and let it choose the capture destination, the matrix row, and the statec
|
|
|
95
95
|
repair.
|
|
96
96
|
- Name each variant for the theme and the viewport it renders, such as `dark-390`. Never split the
|
|
97
97
|
theme from the viewport; a split writes a filename naming a combination the run did not render.
|
|
98
|
-
-
|
|
99
|
-
|
|
100
|
-
does not.
|
|
101
|
-
- Apply the theme through the application's own interface wherever the application ships a theme
|
|
102
|
-
control, and through the attribute the surface reads where it does not.
|
|
98
|
+
- Keep the provided variants as serializable `JourneyVariant` data: `name`, `width`, and `height`.
|
|
99
|
+
Compose no callback merely to pass that data to a capture.
|
|
103
100
|
- Run the axis with `npm run test:journey`, which runs that wrapper and joins the `test` chain. Set
|
|
104
101
|
`CAPTURE` to `1` in your own shell and run `npm run test:journey` again to write the frames; the
|
|
105
102
|
root configuration reads that variable and provides it as `capture`.
|
|
@@ -124,12 +121,28 @@ Settle the one it reports before trusting a green run.
|
|
|
124
121
|
intermediate script raises none. It reports the configuration question only for a `test:*` script
|
|
125
122
|
whose text names `vitest`, so a script naming another runner's configuration raises none either.
|
|
126
123
|
|
|
124
|
+
### Prepare the capture theme
|
|
125
|
+
|
|
126
|
+
- Where the application ships a theme control, await the theme action through that interface
|
|
127
|
+
before driving the state the journey captures. Pass the provided `JourneyVariant` list directly
|
|
128
|
+
to `createPortfolio` when capture needs no additional synchronous document change. Never attach
|
|
129
|
+
an asynchronous action to `CaptureVariant.apply` or re-resolve a covered theme control at capture
|
|
130
|
+
time.
|
|
131
|
+
- Where the surface has no theme control, prepare the theme through the attribute the surface
|
|
132
|
+
reads. Use the optional `CaptureVariant.apply` hook only for a synchronous document change,
|
|
133
|
+
such as setting that attribute. Treat its `() => void` contract as synchronous: `createPortfolio`
|
|
134
|
+
invokes the hook without awaiting a returned promise.
|
|
135
|
+
- Keep `applyTheme` as the workspace's own browser setup helper. Make it drive the theme control
|
|
136
|
+
through the published journey verbs and await the announced theme state and settled paint.
|
|
137
|
+
- Put the provided-context declaration in the browser test setup module, and consume the injected
|
|
138
|
+
data in `tests/app/browser/integration.test.ts` through the following portfolio configuration.
|
|
139
|
+
Mount the shipped application entry with its real provisions before the acceptance journey runs.
|
|
140
|
+
- From `tests/app/browser/integration.test.ts`, pass `../../../tmp/capture/states` as the capture
|
|
141
|
+
directory to write into the workspace's `tmp/capture/states` directory. The browser provider
|
|
142
|
+
resolves a custom screenshot path relative to the test file's directory.
|
|
143
|
+
|
|
127
144
|
```ts
|
|
128
145
|
import type { JourneyVariant } from '@orkestrel/test'
|
|
129
|
-
import type { CaptureVariant } from '@orkestrel/test/browser'
|
|
130
|
-
import { inject } from 'vitest'
|
|
131
|
-
// `applyTheme` is the workspace's own setup-module export, named for the act it performs.
|
|
132
|
-
import { applyTheme } from '../../setupBrowser.js'
|
|
133
146
|
|
|
134
147
|
declare module 'vitest' {
|
|
135
148
|
interface ProvidedContext {
|
|
@@ -138,13 +151,37 @@ declare module 'vitest' {
|
|
|
138
151
|
readonly capture: boolean
|
|
139
152
|
}
|
|
140
153
|
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
import { createPortfolio } from '@orkestrel/test/browser'
|
|
158
|
+
import { inject } from 'vitest'
|
|
159
|
+
import { applyTheme } from '../../setupBrowser.js'
|
|
141
160
|
|
|
142
161
|
const VARIANT = inject('variant')
|
|
143
162
|
const CAPTURE = inject('capture')
|
|
144
|
-
const VARIANTS
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
163
|
+
const VARIANTS = inject('variants')
|
|
164
|
+
const PORTFOLIO = createPortfolio({
|
|
165
|
+
states: ['home'],
|
|
166
|
+
variants: VARIANTS,
|
|
167
|
+
variant: VARIANT,
|
|
168
|
+
directory: '../../../tmp/capture/states',
|
|
169
|
+
enabled: CAPTURE,
|
|
170
|
+
})
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
At the start of the existing home acceptance journey, insert the following theme preparation before
|
|
174
|
+
that journey's actions.
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
await applyTheme(VARIANT)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Immediately after that journey's actual rendered-home assertion, insert the following placement.
|
|
181
|
+
Keep the existing journey and its assertions as the consumer; add no screenshot-only test.
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
await PORTFOLIO.place('home')
|
|
148
185
|
```
|
|
149
186
|
|
|
150
187
|
## Apply the journey laws
|
|
@@ -68,14 +68,12 @@ these.
|
|
|
68
68
|
- Declare the viewport list in the birth-owned `configs/app/vite.journey.config.ts` wrapper, as
|
|
69
69
|
`readonly JourneyVariant[]`. That file is the adopter's, so its names and its viewports are the
|
|
70
70
|
application's to set, and the presence of that file is the journey axis.
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
`width`, and the `height` that cross Vitest's `provide` channel; `CaptureVariant` adds the `apply`
|
|
74
|
-
that does not.
|
|
71
|
+
- Prepare the theme under [SKILL.md](../SKILL.md#prepare-the-capture-theme) before driving the
|
|
72
|
+
captured state, and use the variant list that preparation requires.
|
|
75
73
|
- Name each variant for the theme and the viewport it renders, such as `dark-390`. The name is the
|
|
76
74
|
second half of every filename the run writes, so a variant named for one alone produces a
|
|
77
75
|
portfolio nobody can tell apart.
|
|
78
|
-
- Pass the whole
|
|
76
|
+
- Pass the whole declared list as `variants` and `inject('variant')` as `variant`.
|
|
79
77
|
`createPortfolio` refuses a `variant` no declared variant carries, and `files` expands the
|
|
80
78
|
registry across the whole list rather than across the one being rendered.
|
|
81
79
|
- Produce the portfolio — the registry times the variants — by running the axis once per variant,
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
# Codex bridge. AGENTS.md governs code. .agents/orchestration.md governs agent operation and is
|
|
2
|
-
# shared by every harness. This layer adds only what a Codex session does differently.
|
|
3
|
-
#
|
|
4
|
-
# One-time machine setup, so this session can reach Opus 5 as an MCP tool:
|
|
5
|
-
# codex mcp add claude -- claude mcp serve
|
|
6
|
-
|
|
7
1
|
approval_policy = "never"
|
|
8
2
|
sandbox_mode = "danger-full-access"
|
|
9
3
|
model = "gpt-5.6-sol"
|
|
10
4
|
model_reasoning_effort = "high"
|
|
11
5
|
review_model = "gpt-5.6-sol"
|
|
12
|
-
|
|
13
6
|
developer_instructions = """
|
|
14
7
|
Read AGENTS.md, .agents/orchestration.md, every applicable .claude/rules/*.md file, the
|
|
15
8
|
dispatch-named .agents/skills workflow and its required references, and the governing
|
|
@@ -41,3 +34,7 @@ interrupt_message = true
|
|
|
41
34
|
[mcp_servers.probe]
|
|
42
35
|
command = "node"
|
|
43
36
|
args = ["node_modules/@orkestrel/probe/dist/bin/main.js"]
|
|
37
|
+
|
|
38
|
+
[mcp_servers.codex]
|
|
39
|
+
command = "codex"
|
|
40
|
+
args = ["mcp-server"]
|
|
@@ -408,7 +408,7 @@ The inventory contracts carry these data members.
|
|
|
408
408
|
| `listCanonPaths` | function | Lists the canon paths a target holds, filtered to a plan's groups. |
|
|
409
409
|
| `listDirectories` | function | Lists a directory's descendant directories as sorted root-relative paths. |
|
|
410
410
|
| `listFiles` | function | Lists a directory's files as sorted root-relative paths. |
|
|
411
|
-
| `matchesAnchor` | function | Tests whether a
|
|
411
|
+
| `matchesAnchor` | function | Tests whether a path still holds the captured directory identity. |
|
|
412
412
|
| `matchesExecutablePath` | function | Tests whether a vendored path is one a target receives executable. |
|
|
413
413
|
| `matchesExpectation` | function | Tests whether a destination still holds what was captured of it. |
|
|
414
414
|
| `matchesGitPath` | function | Tests whether a path addresses a target's own repository metadata. |
|
|
@@ -921,6 +921,11 @@ only that browser proof and loads `tests/setup.ts` and `tests/setupBrowser.ts` t
|
|
|
921
921
|
Chromium. The generated manifest emits the selected `test:setup` and `test:setup:browser` scripts
|
|
922
922
|
and invokes them from `test`. Scaffold generates no setup proof for an empty setup seed.
|
|
923
923
|
|
|
924
|
+
When the `app` axis selects `browser`, the browser setup project also applies the Vue
|
|
925
|
+
single-file-component transform. Your `tests/setupBrowser.ts` module and its paired proof can
|
|
926
|
+
import and render application Vue components. A browser setup proof without `app/browser` keeps
|
|
927
|
+
the non-Vue pipeline; selecting `src/browser` alone adds no Vue plugin or dependency.
|
|
928
|
+
|
|
924
929
|
A structural fact is read when a verb runs, not when the file appears. Writing
|
|
925
930
|
`tests/integration.test.ts` into a workspace sets the fact, but the root configuration on disk was
|
|
926
931
|
generated before that file existed and still registers no `integration` project, so `test:config`
|
|
@@ -1856,6 +1861,7 @@ A transaction owns a private root beside the target on the same volume, so every
|
|
|
1856
1861
|
rename rather than a copy. A failure part way through commit restores every destination it already
|
|
1857
1862
|
promoted and removes every directory it created. No destination ever receives half-written bytes.
|
|
1858
1863
|
It is not a journal: a process killed between promotions leaves a mixed target.
|
|
1864
|
+
Directory anchors capture native bigint device and inode values without numeric rounding.
|
|
1859
1865
|
The transaction binds each directory's location rather than its lifetime, so an ancestor swapped
|
|
1860
1866
|
for another path, a file, a symlink, or nothing is refused, and one deleted and recreated in place
|
|
1861
1867
|
may not be.
|
package/dist/host/manifest.json
CHANGED
|
@@ -232,7 +232,7 @@
|
|
|
232
232
|
"storage": "agents/skills/orkestrel-prove-journey/SKILL.md",
|
|
233
233
|
"destination": ".agents/skills/orkestrel-prove-journey/SKILL.md",
|
|
234
234
|
"executable": false,
|
|
235
|
-
"digest": "
|
|
235
|
+
"digest": "c558fb0abcbad2b264c509fc6f82edba4fd9a1cede95a6185eec89056df4361e"
|
|
236
236
|
},
|
|
237
237
|
{
|
|
238
238
|
"storage": "agents/skills/orkestrel-prove-journey/agents/openai.yaml",
|
|
@@ -244,7 +244,7 @@
|
|
|
244
244
|
"storage": "agents/skills/orkestrel-prove-journey/references/captures.md",
|
|
245
245
|
"destination": ".agents/skills/orkestrel-prove-journey/references/captures.md",
|
|
246
246
|
"executable": false,
|
|
247
|
-
"digest": "
|
|
247
|
+
"digest": "e36b56406d3e8643f253196d915ea1f265aae3169e810769171f75a8ab4461f5"
|
|
248
248
|
},
|
|
249
249
|
{
|
|
250
250
|
"storage": "agents/skills/orkestrel-prove-journey/references/decide.md",
|
|
@@ -628,7 +628,7 @@
|
|
|
628
628
|
"storage": "codex/config.toml",
|
|
629
629
|
"destination": ".codex/config.toml",
|
|
630
630
|
"executable": false,
|
|
631
|
-
"digest": "
|
|
631
|
+
"digest": "c8364a20fca401e65f3c092968b1f6b4d4e025a1efd91e22beb01b3fcd39e076"
|
|
632
632
|
},
|
|
633
633
|
{
|
|
634
634
|
"storage": "configs/helpers.ts",
|
|
@@ -910,7 +910,7 @@
|
|
|
910
910
|
"storage": "guides/scaffold.md",
|
|
911
911
|
"destination": "guides/scaffold.md",
|
|
912
912
|
"executable": false,
|
|
913
|
-
"digest": "
|
|
913
|
+
"digest": "7c89a20cba178e493d6cb46e517742cf31d12836eb24481a0eb7c96a2f20acad"
|
|
914
914
|
},
|
|
915
915
|
{
|
|
916
916
|
"storage": "guides/sea.md",
|
|
@@ -2001,5 +2001,5 @@
|
|
|
2001
2001
|
]
|
|
2002
2002
|
}
|
|
2003
2003
|
],
|
|
2004
|
-
"digest": "
|
|
2004
|
+
"digest": "6e8e2b0524717bfc2b648acba0de5901c7c267a9c189155b45e3cb681b14bf6d"
|
|
2005
2005
|
}
|
package/dist/src/core/index.cjs
CHANGED
|
@@ -4,7 +4,7 @@ let _orkestrel_template = require("@orkestrel/template");
|
|
|
4
4
|
let _orkestrel_emitter = require("@orkestrel/emitter");
|
|
5
5
|
var package_default = {
|
|
6
6
|
name: "@orkestrel/scaffold",
|
|
7
|
-
version: "0.0.
|
|
7
|
+
version: "0.0.75",
|
|
8
8
|
description: "Scaffold workspaces with commands: new, audit, repair, catalog, and overwrite.",
|
|
9
9
|
keywords: [
|
|
10
10
|
"audit",
|
|
@@ -102,7 +102,7 @@ var package_default = {
|
|
|
102
102
|
"@orkestrel/guide": "^0.0.20",
|
|
103
103
|
"@orkestrel/html": "^0.0.10",
|
|
104
104
|
"@orkestrel/probe": "^0.0.16",
|
|
105
|
-
"@orkestrel/test": "^0.0.
|
|
105
|
+
"@orkestrel/test": "^0.0.18",
|
|
106
106
|
"@types/node": "^26.5.1",
|
|
107
107
|
"@vitest/browser-playwright": "^4.1.11",
|
|
108
108
|
"oxfmt": "^0.68.0",
|
|
@@ -962,7 +962,10 @@ function isNamedPlugin(plugin: PluginOption): plugin is { name: string } {
|
|
|
962
962
|
journey: `
|
|
963
963
|
// Replace the journey fields directly: merging would concatenate the ordinary include
|
|
964
964
|
// and retain the exclusion of the journey suite.
|
|
965
|
-
export function appJourney(
|
|
965
|
+
export function appJourney(
|
|
966
|
+
variant: JourneyVariant,
|
|
967
|
+
variants: readonly JourneyVariant[],
|
|
968
|
+
): UserConfig {
|
|
966
969
|
const browser = appBrowser()
|
|
967
970
|
return {
|
|
968
971
|
...browser,
|
|
@@ -1104,7 +1107,7 @@ export function appShowcase(override?: UserConfig): UserConfig {
|
|
|
1104
1107
|
browser: `export function setupBrowser(override?: UserConfig): UserConfig {
|
|
1105
1108
|
const project: UserConfig = {
|
|
1106
1109
|
resolve,
|
|
1107
|
-
test: {
|
|
1110
|
+
{{plugins}} test: {
|
|
1108
1111
|
name: { label: 'setup:browser', color: 'blue' },
|
|
1109
1112
|
include: ['tests/setupBrowser.test.ts'],
|
|
1110
1113
|
setupFiles: ['./tests/setup.ts', './tests/setupBrowser.ts'],
|
|
@@ -5283,7 +5286,7 @@ function blueprintToRootVite(blueprint) {
|
|
|
5283
5286
|
projects.push("setup");
|
|
5284
5287
|
}
|
|
5285
5288
|
if (blueprint.setup.includes("browser")) {
|
|
5286
|
-
factories.push(CONFIG_TEMPLATES.factories.browser);
|
|
5289
|
+
factories.push((0, _orkestrel_template.fillTemplate)(CONFIG_TEMPLATES.factories.browser, { plugins: machinery.vue ? " plugins: [vue()],\n" : "" }));
|
|
5287
5290
|
projects.push("setupBrowser");
|
|
5288
5291
|
}
|
|
5289
5292
|
if (blueprint.guides) {
|