@orkestrel/scaffold 0.0.84 → 0.0.85
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/bin/main.js +1 -1
- package/dist/bin/main.js.map +1 -1
- package/dist/host/AGENTS.md +1 -1
- package/dist/host/agents/skills/orkestrel-publish/references/wave.md +11 -0
- package/dist/host/claude/agents/orkestrel.md +1 -1
- package/dist/host/claude/rules/architecture.md +2 -2
- package/dist/host/claude/rules/styles.md +18 -9
- package/dist/host/claude/rules/workspace.md +1 -1
- package/dist/host/dotfiles/prettierignore +3 -0
- package/dist/host/manifest.json +9 -9
- package/dist/host/tests/setupPolicy.ts +23 -7
- package/dist/src/core/index.cjs +1 -1
- package/dist/src/core/index.cjs.map +1 -1
- package/dist/src/core/index.js +1 -1
- package/dist/src/core/index.js.map +1 -1
- package/package.json +1 -1
package/dist/host/AGENTS.md
CHANGED
|
@@ -34,7 +34,7 @@ configs/ thin target wrappers around root Vite/TypeScript configuration
|
|
|
34
34
|
|
|
35
35
|
- **NEVER** use `any`; accept `unknown` and narrow with guards.
|
|
36
36
|
- **NEVER** use non-null assertions (`!`) or type assertions (`as`); narrow or validate.
|
|
37
|
-
- **NEVER** use `@ts-nocheck`, `@ts-ignore`, `@ts-expect-error`,
|
|
37
|
+
- **NEVER** use `@ts-nocheck`, `@ts-ignore`, `@ts-expect-error`, a lint-disable directive, or a formatter-ignore directive, and never exclude a source file from a gate; fix the cause.
|
|
38
38
|
- **NEVER** add an npm package unless the user explicitly requests it; prefer native APIs.
|
|
39
39
|
- **NEVER** remove a symbol to silence lint. Implement it or annotate `// TODO: [Feature] Brief purpose`.
|
|
40
40
|
- **NEVER** write `public`, `protected`, `private`, or a parameter property; use `#` fields.
|
|
@@ -107,6 +107,10 @@ Prepare a published package's layer in this order, after the visit has ruled the
|
|
|
107
107
|
bumped manifest.
|
|
108
108
|
3. **Sweep the self-pins**, per the following section: the bump moves the version class.
|
|
109
109
|
4. **Run each package's own `prepublishOnly` script to green.**
|
|
110
|
+
When the host npm is below the `MINIMUM_NPM_VERSION` floor a generated workspace declares in
|
|
111
|
+
`devEngines`, prepend a local npm 11 install's `node_modules/.bin` to `PATH` for the visit and
|
|
112
|
+
this script; a distribution proof that installs a generated workspace under an older npm fails
|
|
113
|
+
`EBADDEVENGINES`.
|
|
110
114
|
5. **Write the release commit and push before the window opens.** The preparation commit inside
|
|
111
115
|
the visit is a different commit at a different moment.
|
|
112
116
|
|
|
@@ -152,3 +156,10 @@ Refresh the registry evidence between layers and derive each round's pins from i
|
|
|
152
156
|
name a version the registry already serves, so a dependency shipping in the same window keeps the
|
|
153
157
|
resolvable previous pin and takes its development-only re-pin after the window closes. That re-pin
|
|
154
158
|
takes the self-pin sweep too, because the snapshot class moves with no bump.
|
|
159
|
+
|
|
160
|
+
- After a window confirms a release, poll its tarball URL, read with
|
|
161
|
+
`npm view NAME@VERSION dist.tarball`, until it answers `200` before an install names that
|
|
162
|
+
version. The registry lists a version in the packument minutes before it serves the tarball, and
|
|
163
|
+
an install in that gap fails `E404`.
|
|
164
|
+
- Run every visit and install that follows a publish with `npm_config_prefer_online=true`. A
|
|
165
|
+
cached packument answers `notarget` for a version the registry already serves.
|
|
@@ -78,7 +78,7 @@ so network-controlled descriptions never enter agent instruction context.
|
|
|
78
78
|
| `@orkestrel/reason` | `0.0.12` | L2 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
|
|
79
79
|
| `@orkestrel/relation` | `0.0.14` | L3 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18`, `@orkestrel/database` `^0.0.16` | |
|
|
80
80
|
| `@orkestrel/router` | `0.0.16` | L2 | `@orkestrel/abort` `^0.0.12`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/contract` `^0.0.18` | |
|
|
81
|
-
| `@orkestrel/scaffold` | `0.0.
|
|
81
|
+
| `@orkestrel/scaffold` | `0.0.84` | L3 | `@orkestrel/console` `^0.0.15`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/process` `^0.0.14`, `@orkestrel/contract` `^0.0.19`, `@orkestrel/markdown` `^0.0.17`, `@orkestrel/template` `^0.0.9` | |
|
|
82
82
|
| `@orkestrel/sea` | `0.0.18` | L3 | `@orkestrel/emitter` `^0.0.11`, `@orkestrel/process` `^0.0.14`, `@orkestrel/contract` `^0.0.18` | |
|
|
83
83
|
| `@orkestrel/server` | `0.0.22` | L3 | `@orkestrel/abort` `^0.0.12`, `@orkestrel/codec` `^0.0.5`, `@orkestrel/router` `^0.0.16`, `@orkestrel/emitter` `^0.0.11`, `@orkestrel/timeout` `^0.0.12`, `@orkestrel/contract` `^0.0.19` | |
|
|
84
84
|
| `@orkestrel/sqlite` | `0.0.13` | L1 | `@orkestrel/contract` `^0.0.18` | |
|
|
@@ -108,8 +108,8 @@ neither reads meaning.
|
|
|
108
108
|
data-kind file, that every centralized declaration is exported, that a class sits in its matching
|
|
109
109
|
implementation or errors file, and that `constants.ts` declares only UPPER_SNAKE_CASE consts with
|
|
110
110
|
no bare collection literal.
|
|
111
|
-
- The sweep proves that no source, test, config, or
|
|
112
|
-
`oxlint-disable` directive.
|
|
111
|
+
- The sweep proves that no source, test, config, script, or sheet file carries an `eslint-disable`,
|
|
112
|
+
`oxlint-disable`, or `prettier-ignore` directive.
|
|
113
113
|
- The sweep proves that every `.claude/rules/*.md` file has a rule-map row in `AGENTS.md` and that
|
|
114
114
|
every row resolves to a file.
|
|
115
115
|
- The sweep proves the host portability rules that are path- or text-shaped over the population
|
|
@@ -14,14 +14,15 @@ SCSS mirrors TypeScript centralization. Concrete token prefixes are project-spec
|
|
|
14
14
|
|
|
15
15
|
## Centralized files
|
|
16
16
|
|
|
17
|
-
| File | Sole responsibility
|
|
18
|
-
| ------------------- |
|
|
19
|
-
| `_mixins.scss` | `@function` values
|
|
20
|
-
| `_tokens.scss` | `:root` public custom-property tokens and cascade-layer order
|
|
21
|
-
| `_theme.scss` | Token overrides under theme selectors
|
|
22
|
-
| `_reset.scss` | The face's reset declarations, when that face owns a reset
|
|
23
|
-
| `
|
|
24
|
-
| `index.scss`
|
|
17
|
+
| File | Sole responsibility |
|
|
18
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
+
| `_mixins.scss` | `@function` values, `@mixin` declaration emitters, and the `!default` switch an emitter reads, which `_tokens.scss` configures through `@use … with` |
|
|
20
|
+
| `_tokens.scss` | `:root` public custom-property tokens and cascade-layer order |
|
|
21
|
+
| `_theme.scss` | Token overrides under theme selectors |
|
|
22
|
+
| `_reset.scss` | The face's reset declarations, when that face owns a reset |
|
|
23
|
+
| `_utilities.scss` | The utility map and its emission schedule, on a face that generates its utilities from data; that face has no `utilities/` folder, and the one emitter the schedule calls lives in `_mixins.scss` |
|
|
24
|
+
| `themes/index.scss` | Barrel of named theme packs, compiled into its own sheet |
|
|
25
|
+
| `index.scss` | Sole compilation barrel |
|
|
25
26
|
|
|
26
27
|
- Apply this table and the folder barrels in § Folders to every sheet face: `src/styles` and each
|
|
27
28
|
`src/<name>` styles extension. `.claude/rules/workspace.md` § Environments fixes the `sheet.ts`
|
|
@@ -51,6 +52,14 @@ SCSS mirrors TypeScript centralization. Concrete token prefixes are project-spec
|
|
|
51
52
|
declared. A face whose contract is the exact recreation of a pinned external artifact keeps
|
|
52
53
|
the literals, declarations, and order the pin declares, and records tokenization and
|
|
53
54
|
accessibility additions in its separate authored face.
|
|
55
|
+
- Format a pinned recreation face like every other file: never a `prettier-ignore` directive and
|
|
56
|
+
never a `.prettierignore` entry for a source file. Sass re-emits every value and selector it
|
|
57
|
+
parses in its own form, so the formatter's canonicalisation of those vanishes at compile; a
|
|
58
|
+
custom-property value is the one text Sass emits verbatim, so write every custom-property
|
|
59
|
+
declaration in a literal partial as a Sass string interpolation (`--name: #{'VALUE'};`), which the
|
|
60
|
+
formatter reads as a string and Sass emits byte for byte. Keep a pinned expected output in a JSON
|
|
61
|
+
fixture, never in a CSS file the formatter would canonicalise. The face's byte proofs (link 1, the
|
|
62
|
+
per-module region cases, the sample cases) hold under `npm run format`.
|
|
54
63
|
- Never repeat per-color/per-variant blocks; drive shared structure with one `@each` over a shared list.
|
|
55
64
|
- If a pattern appears in at least two partials, move it to `_mixins.scss`.
|
|
56
65
|
- Treat a declaration block two partials share because each records an external value as a
|
|
@@ -69,7 +78,7 @@ SCSS mirrors TypeScript centralization. Concrete token prefixes are project-spec
|
|
|
69
78
|
## Folders
|
|
70
79
|
|
|
71
80
|
- Give each folder an `_index.scss` barrel that loads its partials with `@use`; keep the barrel when the folder is empty.
|
|
72
|
-
- Put a rule that styles one element in `elements/`, a class skin that applies with no script running in `components/`, and a class that sets one property in `utilities/`.
|
|
81
|
+
- Put a rule that styles one element in `elements/`, a class skin that applies with no script running in `components/`, and a class that sets one property in `utilities/`. A face that generates its utilities from a map keeps that map and its emission schedule in `_utilities.scss` instead of a `utilities/` folder; never keep both, because `@use 'utilities'` resolves to either.
|
|
73
82
|
- Add another folder only for a job `elements/`, `components/`, and `utilities/` do not hold, and give it its own barrel and its own layer.
|
|
74
83
|
|
|
75
84
|
## Proofs
|
|
@@ -287,7 +287,7 @@ Build/check config alignment:
|
|
|
287
287
|
|
|
288
288
|
- In a publishing workspace, `prepublishOnly` runs `build:showcase` and every
|
|
289
289
|
`build:showcase:<framework>` script after `npm run build`.
|
|
290
|
-
- List `showcase/` in `.prettierignore`, so formatting never rewrites a committed page.
|
|
290
|
+
- List `showcase/` and `*.min.*` in `.prettierignore`, so formatting never rewrites a committed page or a minified generated record. Give the `.min` suffix only to a record an instrument writes from an installed package in compact form (a JSON inventory over 1 MB, for example), never to authored source, and read such a record through a guarded reader. Never list a source file there; `.claude/rules/styles.md` § Prohibitions states how a pinned recreation stays formatter-stable.
|
|
291
291
|
|
|
292
292
|
## Tooling
|
|
293
293
|
|
|
@@ -15,3 +15,6 @@ tests/mirrors/
|
|
|
15
15
|
|
|
16
16
|
# The vendored host inventory: `npm run build` regenerates it (`stageInventory`), so its bytes are the generator's, not the formatter's.
|
|
17
17
|
host.json
|
|
18
|
+
|
|
19
|
+
# A minified generated record (`*.min.*`, such as a compact JSON inventory an instrument writes from an installed package) keeps its compact bytes: nothing in it is authored, and a formatted copy would be a second artifact of the same bytes. Authored source never takes the suffix.
|
|
20
|
+
*.min.*
|
package/dist/host/manifest.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"storage": "AGENTS.md",
|
|
5
5
|
"destination": "AGENTS.md",
|
|
6
6
|
"executable": false,
|
|
7
|
-
"digest": "
|
|
7
|
+
"digest": "357cfbe336a026543ec68f3eb999f1094c3139d33331b0ba5f153352cef75fde"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"storage": "LICENSE",
|
|
@@ -370,7 +370,7 @@
|
|
|
370
370
|
"storage": "agents/skills/orkestrel-publish/references/wave.md",
|
|
371
371
|
"destination": ".agents/skills/orkestrel-publish/references/wave.md",
|
|
372
372
|
"executable": false,
|
|
373
|
-
"digest": "
|
|
373
|
+
"digest": "e519a148a47dbf3271bf3f8a57428a4182afedf9230b56774a97ba5449208325"
|
|
374
374
|
},
|
|
375
375
|
{
|
|
376
376
|
"storage": "agents/skills/orkestrel-publish/references/window.md",
|
|
@@ -496,7 +496,7 @@
|
|
|
496
496
|
"storage": "claude/agents/orkestrel.md",
|
|
497
497
|
"destination": ".claude/agents/orkestrel.md",
|
|
498
498
|
"executable": false,
|
|
499
|
-
"digest": "
|
|
499
|
+
"digest": "9a093f83f23cc1f0d1fe1ba139e97afa0d1a38ab45522cc3e150fffc796c3ae3"
|
|
500
500
|
},
|
|
501
501
|
{
|
|
502
502
|
"storage": "claude/agents/planner.md",
|
|
@@ -538,7 +538,7 @@
|
|
|
538
538
|
"storage": "claude/rules/architecture.md",
|
|
539
539
|
"destination": ".claude/rules/architecture.md",
|
|
540
540
|
"executable": false,
|
|
541
|
-
"digest": "
|
|
541
|
+
"digest": "e30f034c8de38ce7c86506dfaa51844201d745181caed45ef427d0325e80afd3"
|
|
542
542
|
},
|
|
543
543
|
{
|
|
544
544
|
"storage": "claude/rules/browser.md",
|
|
@@ -580,7 +580,7 @@
|
|
|
580
580
|
"storage": "claude/rules/styles.md",
|
|
581
581
|
"destination": ".claude/rules/styles.md",
|
|
582
582
|
"executable": false,
|
|
583
|
-
"digest": "
|
|
583
|
+
"digest": "869f88c392b4795e47af881d668f4dc591e0c419229a843eb4105e38dfb6f831"
|
|
584
584
|
},
|
|
585
585
|
{
|
|
586
586
|
"storage": "claude/rules/tests.md",
|
|
@@ -598,7 +598,7 @@
|
|
|
598
598
|
"storage": "claude/rules/workspace.md",
|
|
599
599
|
"destination": ".claude/rules/workspace.md",
|
|
600
600
|
"executable": false,
|
|
601
|
-
"digest": "
|
|
601
|
+
"digest": "3c9e269acd88935ee6c4f34dd07784f09f45bb6bfd1e27c6a183da3420da4fcc"
|
|
602
602
|
},
|
|
603
603
|
{
|
|
604
604
|
"storage": "claude/rules/writing.md",
|
|
@@ -832,7 +832,7 @@
|
|
|
832
832
|
"storage": "dotfiles/prettierignore",
|
|
833
833
|
"destination": ".prettierignore",
|
|
834
834
|
"executable": false,
|
|
835
|
-
"digest": "
|
|
835
|
+
"digest": "abd137ce9568994c74d4473765a70ba04554548b840e4a3275ab749e397ab69b"
|
|
836
836
|
},
|
|
837
837
|
{
|
|
838
838
|
"storage": "guides/README.md",
|
|
@@ -1180,7 +1180,7 @@
|
|
|
1180
1180
|
"storage": "tests/setupPolicy.ts",
|
|
1181
1181
|
"destination": "tests/setupPolicy.ts",
|
|
1182
1182
|
"executable": false,
|
|
1183
|
-
"digest": "
|
|
1183
|
+
"digest": "2571274f92e75e6caffa86b2703ef9a38828db4ec8f51a7b38510f8bc48c6aee"
|
|
1184
1184
|
}
|
|
1185
1185
|
],
|
|
1186
1186
|
"roots": [
|
|
@@ -2144,5 +2144,5 @@
|
|
|
2144
2144
|
]
|
|
2145
2145
|
}
|
|
2146
2146
|
],
|
|
2147
|
-
"digest": "
|
|
2147
|
+
"digest": "f8711433145a8b302c5c8c626c1be5ddbdd2e5a44c1f971fb6fce1ed4f5703b6"
|
|
2148
2148
|
}
|
|
@@ -281,10 +281,13 @@ export const POLICY_TEST_GLOB = 'tests/{app,src}/**/*.test.ts'
|
|
|
281
281
|
// Compose suppression tokens so the instrument does not report its own definitions or controls.
|
|
282
282
|
export const POLICY_SUPPRESSION_DIRECTIVE = ['oxlint', '-disable'].join('')
|
|
283
283
|
|
|
284
|
-
/**
|
|
284
|
+
/** Names the formatter directive the text sweep refuses, composed so the instrument does not report itself. */
|
|
285
|
+
export const POLICY_FORMATTER_DIRECTIVE = ['prettier', '-ignore'].join('')
|
|
286
|
+
|
|
287
|
+
/** Matches the source, test, config, script, and sheet files inspected for lint and formatter suppression directives. */
|
|
285
288
|
export const POLICY_SUPPRESSION_GLOB: readonly string[] = Object.freeze([
|
|
286
|
-
'{src,app,tests,configs,scripts}/**/*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}',
|
|
287
|
-
'*.{cjs,cts,js,jsx,mjs,mts,ts,tsx,vue}',
|
|
289
|
+
'{src,app,tests,configs,scripts}/**/*.{cjs,css,cts,js,jsx,mjs,mts,scss,ts,tsx,vue}',
|
|
290
|
+
'*.{cjs,css,cts,js,jsx,mjs,mts,scss,ts,tsx,vue}',
|
|
288
291
|
])
|
|
289
292
|
|
|
290
293
|
/** Lists the rules whose workspace-wide lint wiring must not be weakened by configuration. */
|
|
@@ -305,9 +308,11 @@ export const POLICY_WIRING_ROOTS: readonly string[] = Object.freeze([
|
|
|
305
308
|
'configs',
|
|
306
309
|
])
|
|
307
310
|
|
|
308
|
-
/** Matches either lint suppression token the text sweep refuses. */
|
|
311
|
+
/** Matches either lint suppression token or the formatter directive the text sweep refuses. */
|
|
309
312
|
export const POLICY_SUPPRESSION_PATTERN = new RegExp(
|
|
310
|
-
[['eslint', '-disable'].join(''), POLICY_SUPPRESSION_DIRECTIVE].join(
|
|
313
|
+
[['eslint', '-disable'].join(''), POLICY_SUPPRESSION_DIRECTIVE, POLICY_FORMATTER_DIRECTIVE].join(
|
|
314
|
+
'|',
|
|
315
|
+
),
|
|
311
316
|
'u',
|
|
312
317
|
)
|
|
313
318
|
|
|
@@ -577,7 +582,7 @@ export function inspectPolicySetup(root: string): readonly PolicyViolation[] {
|
|
|
577
582
|
}
|
|
578
583
|
|
|
579
584
|
/**
|
|
580
|
-
* Inspects code-shaped workspace files for lint suppression directives.
|
|
585
|
+
* Inspects code-shaped and sheet workspace files for lint and formatter suppression directives.
|
|
581
586
|
*
|
|
582
587
|
* @param root - The workspace root to inspect.
|
|
583
588
|
* @returns Every suppression occurrence in path and line order.
|
|
@@ -594,7 +599,7 @@ export function inspectPolicySuppressions(root: string): readonly PolicyViolatio
|
|
|
594
599
|
createPolicyViolation(
|
|
595
600
|
'suppression',
|
|
596
601
|
path,
|
|
597
|
-
'file carries a lint suppression directive',
|
|
602
|
+
'file carries a lint or formatter suppression directive',
|
|
598
603
|
index + 1,
|
|
599
604
|
),
|
|
600
605
|
)
|
|
@@ -2687,6 +2692,17 @@ export const POLICY_CONTROLS: readonly PolicyControl[] = Object.freeze([
|
|
|
2687
2692
|
},
|
|
2688
2693
|
],
|
|
2689
2694
|
},
|
|
2695
|
+
{
|
|
2696
|
+
label: 'rejects a formatter directive in a sheet partial',
|
|
2697
|
+
membership: 'sheet files in the suppression population',
|
|
2698
|
+
rule: 'suppression',
|
|
2699
|
+
files: [
|
|
2700
|
+
{
|
|
2701
|
+
path: 'src/styles/_control.scss',
|
|
2702
|
+
content: `// ${POLICY_FORMATTER_DIRECTIVE}\n.control {\n\tcolor: red;\n}\n`,
|
|
2703
|
+
},
|
|
2704
|
+
],
|
|
2705
|
+
},
|
|
2690
2706
|
{
|
|
2691
2707
|
label: 'rejects an unmirrored module test',
|
|
2692
2708
|
membership: 'module tests below tests/src or tests/app except integration.test.ts',
|
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.85",
|
|
8
8
|
description: "Scaffold workspaces with commands: new, audit, repair, catalog, and overwrite.",
|
|
9
9
|
keywords: [
|
|
10
10
|
"audit",
|