novahiz 0.9.3 → 0.9.6
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 +251 -0
- package/README.md +21 -5
- package/adapters/opencode/agent/novahiz.md +2 -2
- package/adapters/opencode/commands/novahiz-obsidian-audit.md +28 -0
- package/adapters/opencode/commands/novahiz-obsidian.md +27 -0
- package/adapters/opencode/commands/novahiz-skills-update.md +24 -7
- package/adapters/opencode/instructions.md +2 -2
- package/adapters/opencode/novahiz-plugin.ts +164 -4
- package/bin/veille-mensuelle.ps1 +26 -0
- package/catalog/categories.json +13 -11
- package/catalog/providers.json +14 -6
- package/catalog/rules.json +44 -4
- package/dist/cli.js +8 -3
- package/dist/commands/context.js +10 -0
- package/dist/commands/doctor.js +70 -9
- package/dist/commands/gate.js +10 -4
- package/dist/commands/inspect.js +110 -39
- package/dist/commands/second-memory.js +6 -1
- package/dist/commands/upgrade.js +8 -1
- package/dist/complexity.js +18 -0
- package/dist/deps.js +127 -0
- package/dist/gate-daemon.js +126 -0
- package/dist/gate.js +64 -6
- package/dist/ledger.js +29 -5
- package/dist/providers.js +47 -5
- package/dist/spec.js +5 -1
- package/dist/wireframe.js +595 -0
- package/docs/INSTALL.md +1 -1
- package/docs/PROVIDERS.md +26 -7
- package/docs/TOKENS.md +1 -1
- package/install/install.mjs +40 -8
- package/install/lib.mjs +3 -1
- package/mcp/argus/IMPLEMENTATION-SUMMARY.md +1 -1
- package/mcp/novahiz-tools/index.mjs +92 -4
- package/mcp/stitch-template/recommandation.md +1 -1
- package/package.json +1 -1
- package/skills/browser-session/SKILL.md +1 -1
- package/skills/novahiz-browser/SKILL.md +1 -1
- package/skills/novahiz-prd/SKILL.md +116 -0
- package/skills/novahiz-prd/references/prd-template.md +101 -0
- package/skills/novahiz-skill-craft/SKILL.md +213 -0
- package/skills/novahiz-skill-craft/assets/evals-template.json +39 -0
- package/skills/novahiz-skill-craft/assets/frontmatter-checklist.md +75 -0
- package/skills/novahiz-skill-craft/assets/skill-template.md +91 -0
- package/skills/novahiz-skill-craft/evals.json +58 -0
- package/skills/novahiz-skill-craft/references/evals-spec.md +136 -0
- package/skills/novahiz-skill-craft/references/frontmatter-spec.md +75 -0
- package/skills/novahiz-skill-craft/references/progressive-disclosure.md +81 -0
- package/skills/novahiz-skill-craft/references/schemas.md +163 -0
- package/skills/novahiz-skill-craft/scripts/check-memory.py +256 -0
- package/skills/novahiz-skill-craft/scripts/extract-description.py +243 -0
- package/skills/novahiz-skill-craft/scripts/generate-comparison.py +179 -0
- package/skills/novahiz-skill-craft/scripts/generate-grading.py +223 -0
- package/skills/novahiz-skill-craft/scripts/run-eval.py +265 -0
- package/skills/novahiz-skill-craft/scripts/scan-skill.py +213 -0
- package/skills/novahiz-skill-craft/scripts/validate-frontmatter.py +176 -0
- package/skills/novahiz-wireframe/SKILL.md +278 -0
- package/skills/novahiz-wireframe/references/format.md +190 -0
- package/skills/novahiz-wireframe/references/shape-handoff.md +92 -0
- package/src/cli.ts +8 -5
- package/src/commands/context.ts +11 -0
- package/src/commands/doctor.ts +67 -10
- package/src/commands/gate.ts +10 -4
- package/src/commands/inspect.ts +113 -39
- package/src/commands/second-memory.ts +6 -1
- package/src/commands/upgrade.ts +8 -1
- package/src/complexity.ts +19 -0
- package/src/deps.ts +149 -1
- package/src/gate-daemon.ts +140 -0
- package/src/gate.ts +71 -6
- package/src/ledger.ts +30 -5
- package/src/providers.ts +51 -6
- package/src/spec.ts +32 -1
- package/src/wireframe.ts +751 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,257 @@
|
|
|
3
3
|
All notable changes to Novahiz are documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
5
5
|
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [0.9.6] - 2026-10-15
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`PRODUCT.md` and `DESIGN.md`** - the product context and the visual-system
|
|
13
|
+
record `impeccable` asks for, both written from sources in the repository
|
|
14
|
+
(`README.md`, `docs/CONSTITUTION.md`, `src/render.ts`) with anything they do
|
|
15
|
+
not settle marked "not determined" instead of guessed. `novahiz doctor` runs
|
|
16
|
+
from a project now finds both instead of two `fail` rows; when doctor runs
|
|
17
|
+
from the Novahiz home both rows are skipped by design
|
|
18
|
+
(`impeccableChecks` returns early when `cwd === home`).
|
|
19
|
+
|
|
20
|
+
- **`when.pathExcludes`** - a rule-level *negative* selector, the counterpart of
|
|
21
|
+
`pathGlobs`. A rule carrying it never applies to a matching path, whatever the
|
|
22
|
+
other selectors say. With `match: "any"` a prompt category alone fired on any
|
|
23
|
+
file, so `design-ui` demanded the frontend design skills on unit tests, and
|
|
24
|
+
inclusion-only selectors could not express "never on tests" (`**/*.tsx` also
|
|
25
|
+
matches `tests/Foo.test.tsx`). Applied to the five design-scoped rules
|
|
26
|
+
(R11-accessibility, R13-design-craft, R14-impeccable, R16-stitch-fidelity,
|
|
27
|
+
R17-wireframe), which now skip `**/tests/**`, `**/__tests__/**`,
|
|
28
|
+
`**/*.test.*` and `**/*.spec.*`. R9-code-review and R10-security are
|
|
29
|
+
untouched — a test is still code — and R15-token-economy keeps its own
|
|
30
|
+
`**/tests/token-economy.test.ts` target.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- **The installer states its own limit** - `install.mjs` now prints that
|
|
35
|
+
`deps --install` is an install-only pass: packs already present are left
|
|
36
|
+
untouched, and `/novahiz-skills-update` (`deps --install --update`) is what
|
|
37
|
+
refreshes them. Installation and update stay separate commands by choice — a
|
|
38
|
+
reinstall must not overwrite local skill edits — but the choice was previously
|
|
39
|
+
only written down in `docs/PROVIDERS.md`, not shown to the person installing.
|
|
40
|
+
|
|
41
|
+
### Fixed
|
|
42
|
+
|
|
43
|
+
- **`doctor` no longer advises a command that cannot help** - the "Referenced
|
|
44
|
+
skills" row counted every absent non-shipped skill as a pack skill and
|
|
45
|
+
answered "run /novahiz-skills-update, or novahiz deps --install". Measured on
|
|
46
|
+
the 0.9.5 install: the 7 skills it named are `eas-app-stores`, `eas-hosting`,
|
|
47
|
+
`eas-observe`, `eas-simulator`, `eas-update`, `eas-update-insights`,
|
|
48
|
+
`eas-workflows`, referenced as `defaultSkills` by the `test` and `devops`
|
|
49
|
+
categories, while `catalog/providers.json` ships four skill packs only
|
|
50
|
+
(`flutter-skills`, `dart-skills`, `expo-skills`, `impeccable`) and the expo
|
|
51
|
+
command names 20 `expo-*` skills, no `eas-*`. `deps --install` accordingly
|
|
52
|
+
returned `install: []` and exited 0 - nothing to install. The row now reads
|
|
53
|
+
each pack's `install` argv (`--skill` list, or `--skill *` resolved to the
|
|
54
|
+
repo's leading segment, so `dart-lang/skills` covers `dart-*`), and skills no
|
|
55
|
+
pack can deliver are named as such instead of being sent after a command that
|
|
56
|
+
installs nothing. New `tests/doctor-referenced-skills.test.ts` pins the
|
|
57
|
+
contract - eight cases, none existed before.
|
|
58
|
+
|
|
59
|
+
## [0.9.5] - 2026-10-15
|
|
60
|
+
|
|
61
|
+
> 0.9.4 was prepared on 2026-10-14 but never tagged nor published to npm
|
|
62
|
+
> (the registry went straight from 0.9.3 to 0.9.5). Its changes are included
|
|
63
|
+
> here and remain described under their own heading below.
|
|
64
|
+
|
|
65
|
+
### Added
|
|
66
|
+
|
|
67
|
+
- **Wireframe-first design pipeline** - new `novahiz_wireframe` MCP tool and
|
|
68
|
+
`src/wireframe.ts` module
|
|
69
|
+
(`init/screen/section/sections/plan/review/index/attach/mark/status`).
|
|
70
|
+
Each screen gets a subfolder of ordered, annotated sections plus a
|
|
71
|
+
regenerated `INDEX.md`; `attach` returns the whole wireframe as the
|
|
72
|
+
attachment block fed to `impeccable shape`. `sections` creates a whole
|
|
73
|
+
batch in one call (one `INDEX` rebuild instead of one per section, existing
|
|
74
|
+
names skipped); `plan` classifies the screen and says whether it needs
|
|
75
|
+
several sections and why; `review` reports the sections that were
|
|
76
|
+
forgotten and gates approval (`mark` refuses while `verdict != pass`).
|
|
77
|
+
Sections are renumbered from the highest existing index instead of
|
|
78
|
+
`length + 1`. Gate rule `R17-wireframe` and the `wireframe` roadmap step
|
|
79
|
+
(before `impeccable-shape`) make the sequence mandatory on `design-ui`
|
|
80
|
+
work and on screen/page/component paths. New skill `novahiz-wireframe`,
|
|
81
|
+
tested by `tests/wireframe.test.ts`.
|
|
82
|
+
- **`novahiz deps` reports real dependency health** - the single provider
|
|
83
|
+
check is replaced by a four-part `dependencyReport`: toolchain probing
|
|
84
|
+
(node, npm, npx, uv, python), local MCP entrypoint `existsSync`, npm home
|
|
85
|
+
health (declared deps resolved + lockfile present), and provider
|
|
86
|
+
prerequisites. `novahiz_deps` returns the same shape.
|
|
87
|
+
- **Core toolchain bootstrap** - `deps --install` can now install `uv` and
|
|
88
|
+
Python on win32 / darwin / linux. The argv lives in `src/deps.ts`
|
|
89
|
+
(`coreBootstrap`), not in the catalog, and runs through a plain spawn:
|
|
90
|
+
`runScript`'s allowlist deliberately refuses shells and package managers,
|
|
91
|
+
so catalog data can never widen it. `--core-only` installs only toolchain
|
|
92
|
+
and npm health; the installer uses it when providers are declined.
|
|
93
|
+
- **Idempotent provider installs** - a new `installedWhen` field on a
|
|
94
|
+
provider lists skill ids whose combined presence marks the pack already
|
|
95
|
+
installed; when all of them are on disk the install command is skipped, so
|
|
96
|
+
a second `deps --install --yes` runs nothing. Providers without the field
|
|
97
|
+
keep the historical always-run behaviour.
|
|
98
|
+
- **Gate rule `R18-skill-craft`** - `novahiz-skill-craft` is now actually
|
|
99
|
+
required on any `SKILL.md` edit, matching what its own description
|
|
100
|
+
already promised.
|
|
101
|
+
- **Skills `novahiz-prd` and `novahiz-skill-craft`** ship in the package.
|
|
102
|
+
- **Commands `novahiz-obsidian` and `novahiz-obsidian-audit`**, plus
|
|
103
|
+
`bin/veille-mensuelle.ps1`.
|
|
104
|
+
- **A real refresh path for the provider skill packs** - `deps --install
|
|
105
|
+
--update` and a per-provider `update` command in `catalog/providers.json`.
|
|
106
|
+
`deps --install` drops every pack whose `installedWhen` markers are all on
|
|
107
|
+
disk, so it could only fill gaps: `/novahiz-skills-update` called it and
|
|
108
|
+
therefore refreshed nothing, which is why flutter/dart/expo were never
|
|
109
|
+
actually updated. `updateCommands()` reads the provider's `update` command
|
|
110
|
+
instead and applies no `installedWhen` gate. For the skills CLI that command
|
|
111
|
+
is the upstream `skills update -g -y`, already present in the pinned
|
|
112
|
+
`skills@1.7.0`. An identical argv shared by several providers is deduplicated
|
|
113
|
+
and records the packs it covers under `covers`, in the dry-run plan and in
|
|
114
|
+
the result, so a skipped pack can no longer be mistaken for an updated one.
|
|
115
|
+
`/novahiz-skills-update` gained an explicit step 4 running it.
|
|
116
|
+
- **The Flutter skill pack is installed from its official repository** -
|
|
117
|
+
`flutter/agent-plugins` is now recorded as `flutter/skills`, the name used by
|
|
118
|
+
the Flutter blog post *Introducing Skills for Dart and Flutter*. The two
|
|
119
|
+
resolve to the same repository (identical `main` HEAD `0ef3972` and branch
|
|
120
|
+
list), so this is a provenance correction, not a source change.
|
|
121
|
+
|
|
122
|
+
### Fixed
|
|
123
|
+
|
|
124
|
+
- **`tests/plugin-warmstart.test.ts` failed `tsc --noEmit`** with three real
|
|
125
|
+
type errors: the `editor` parameter shadowed the `editor` binding, making
|
|
126
|
+
`typeof editor` self-referential (TS2502), and `await cleanup()` was called
|
|
127
|
+
on the `void | Cleanup` union without a guard (TS2349, twice). The previous
|
|
128
|
+
session reported this file as type-clean; that report was wrong.
|
|
129
|
+
- **`Agent harness copy outdated`** — the last non-blocking `doctor` failure —
|
|
130
|
+
is repaired by `node install/install.mjs --yes` alone. Only the rewrite of
|
|
131
|
+
`novahiz.config.json` is gated on `--force`; the plugin, agent and command
|
|
132
|
+
copies are not, so a plain run refreshes them while the config reports
|
|
133
|
+
`Existing config preserved`.
|
|
134
|
+
|
|
135
|
+
### Changed
|
|
136
|
+
|
|
137
|
+
- **`novahiz sync` is now listed in `--help`** - the command existed
|
|
138
|
+
(`case "sync"` → `commandSync()`), and both `gate.ts:498` and
|
|
139
|
+
`gate-repair.ts:87` pointed users at it, but it was missing from the help
|
|
140
|
+
output.
|
|
141
|
+
- **The installer no longer backs up the published package inside its own
|
|
142
|
+
home** - the home is a copy of what npm already holds, so preserving its
|
|
143
|
+
previous version only accumulated `*.novahiz-bak` (235 of the 320 found by
|
|
144
|
+
the audit). Backups are kept only where they carry something that exists
|
|
145
|
+
nowhere else: `catalog/` (user-edited configuration) and the files written
|
|
146
|
+
into the opencode config dir, which are exactly what `novahiz uninstall`
|
|
147
|
+
restores (`uninstall.mjs:53`).
|
|
148
|
+
- **`scripts` is part of `CORE_ITEMS`** - `package.json` copied into the home
|
|
149
|
+
declares `ci:local = node scripts/ci-local.mjs`, but the directory was
|
|
150
|
+
never copied, so `npm run ci:local` failed there.
|
|
151
|
+
- **Windows PATH staleness is no longer reported as a missing dependency** -
|
|
152
|
+
the parent process may predate the install (opencode started before uv or
|
|
153
|
+
Python landed), so its inherited PATH hides binaries that ARE on disk.
|
|
154
|
+
`toolchainStatus` reloads PATH from the registry (Machine + User) once and
|
|
155
|
+
re-probes. `python` is probed with `--version` rather than `where python`,
|
|
156
|
+
because the `WindowsApps` execution alias answers on machines without any
|
|
157
|
+
Python.
|
|
158
|
+
- **The installer asks about providers by default** (`true` instead of
|
|
159
|
+
`false`) and adds a `--no-deps-install` flag. Automatic dependency
|
|
160
|
+
installation now defaults to on (`autoInstall !== false`); when providers
|
|
161
|
+
are declined the toolchain and npm health still install, being system
|
|
162
|
+
dependencies rather than optional providers.
|
|
163
|
+
- **`npm install` runs with `--ignore-scripts`** and `npm_config_global=false`,
|
|
164
|
+
scoped to the Novahiz home, so nothing in the home re-enters the
|
|
165
|
+
installer.
|
|
166
|
+
|
|
167
|
+
### Notes
|
|
168
|
+
|
|
169
|
+
- `novahiz deps` and the `novahiz_deps` tool change their JSON contract:
|
|
170
|
+
`{node, platform, dependencies}` becomes
|
|
171
|
+
`{node, platform, toolchain, dependencies, entrypoints, npm}`, and the
|
|
172
|
+
dry-run `plan` becomes `{core, npm, bootstrap, install}`. Anything parsing
|
|
173
|
+
the old shape must be updated.
|
|
174
|
+
|
|
175
|
+
## [0.9.4] - 2026-10-14
|
|
176
|
+
|
|
177
|
+
### Fixed
|
|
178
|
+
|
|
179
|
+
- **No absolute machine path is shipped any more** - the tree handed to every
|
|
180
|
+
member of the community carried the drive letters, the folders and the
|
|
181
|
+
account name of the machine Novahiz was developed on, so the system was
|
|
182
|
+
broken on arrival for anyone else.
|
|
183
|
+
- `adapters/opencode/instructions.md` (the system prompt injected into every
|
|
184
|
+
session), `skills/novahiz-browser/SKILL.md` and
|
|
185
|
+
`skills/browser-session/SKILL.md` pointed the Playwright profile at a
|
|
186
|
+
hardcoded `C:\Users\<account>\.opencode\playwright-profile`. The profile
|
|
187
|
+
rule was unusable and the browser profile wrong for every other user. All
|
|
188
|
+
three now use `~/.opencode/playwright-profile`.
|
|
189
|
+
- `docs/TOKENS.md`, `docs/audit-2026-09-25.md`,
|
|
190
|
+
`mcp/argus/IMPLEMENTATION-SUMMARY.md` and
|
|
191
|
+
`mcp/stitch-template/recommandation.md` presented absolute paths as
|
|
192
|
+
instructions to run. They now use `~` or `<NOVAHIZ_HOME>`.
|
|
193
|
+
- The placeholders shipped to the agent were corrupted:
|
|
194
|
+
`node NNovahiz-home>/src/cli.ts classify "Nrequest>"` and
|
|
195
|
+
`skill({ name: "Nskill>" })` in `adapters/opencode/agent/novahiz.md`. They
|
|
196
|
+
are restored to `<Novahiz-home>`, `<request>` and `<skill>`, so the first
|
|
197
|
+
step of the pipeline is executable as written.
|
|
198
|
+
|
|
199
|
+
- **Home resolution no longer yields a ghost home** - `src/cli.ts`,
|
|
200
|
+
`src/commands/upgrade.ts` and `src/commands/second-memory.ts` built the home
|
|
201
|
+
from `process.env.HOME || process.env.USERPROFILE || ""`. When both are
|
|
202
|
+
absent - a Windows service, the gate daemon child, a container - the joined
|
|
203
|
+
result was a path relative to the cwd, so `detectTarget`, `runSync` and the
|
|
204
|
+
Stitch recommendation all operated silently on a directory that does not
|
|
205
|
+
exist. All three now resolve through `NovahizHome()` or `homedir()`.
|
|
206
|
+
|
|
207
|
+
- **The C3 index guard fires on Windows** - `src/gate.ts` compared the
|
|
208
|
+
protected `build/installed-skills.json` and `build/catalog.json` suffixes
|
|
209
|
+
spelled with `/` against a path carrying the platform separator, so the guard
|
|
210
|
+
never triggered on Windows. Those two files define what the gate requires and
|
|
211
|
+
were editable like ordinary build output on the platform most of the
|
|
212
|
+
community installs on. The path is now normalised before comparison.
|
|
213
|
+
|
|
214
|
+
- **The gate daemon stops flashing a console window on Windows** -
|
|
215
|
+
`adapters/opencode/novahiz-plugin.ts` spawned it without `windowsHide: true`,
|
|
216
|
+
the only spawn site in the file missing it.
|
|
217
|
+
|
|
218
|
+
- **Duplicated `NOVAHIZ_HOME` reads** in `src/spec.ts` and `install/lib.mjs`
|
|
219
|
+
collapse into one canonical read. A user who exported the older variable name
|
|
220
|
+
silently kept the default home while believing they had redirected it.
|
|
221
|
+
|
|
222
|
+
- **`novahiz doctor` stops failing at home root on project context** -
|
|
223
|
+
`src/commands/doctor.ts` resolved `PRODUCT.md` and `DESIGN.md` against the
|
|
224
|
+
novahiz home, producing two permanent rows no command could close. The rows
|
|
225
|
+
are scoped to a project directory and remain unchanged inside one.
|
|
226
|
+
|
|
227
|
+
- **A plan that declares its dependencies by label no longer wedges** -
|
|
228
|
+
`src/ledger.ts` resolved each dependency by todo id only, while
|
|
229
|
+
`novahiz task plan` accepts labels ("T2", "P5"). Every label-declared
|
|
230
|
+
dependency read as unfinished and blocked its dependent step for the whole
|
|
231
|
+
life of the task. Resolution now accepts both, and fails closed on an
|
|
232
|
+
unknown or ambiguous reference.
|
|
233
|
+
|
|
234
|
+
### Added
|
|
235
|
+
|
|
236
|
+
- **A persistent gate daemon** (`src/gate-daemon.ts`, wired in
|
|
237
|
+
`adapters/opencode/novahiz-plugin.ts`) replaces one Node process spawn per
|
|
238
|
+
gate call. Every request re-executes `commandGate`, which re-reads
|
|
239
|
+
`rules.json`, `categories.json` and the skill index from disk, so no verdict
|
|
240
|
+
can go stale; any daemon failure returns as `spawnError` and the existing
|
|
241
|
+
deny path applies unchanged. Measured on this machine: one-shot median 331 ms
|
|
242
|
+
against 8.1 ms warm.
|
|
243
|
+
|
|
244
|
+
### Changed
|
|
245
|
+
|
|
246
|
+
- **Portability is enforced by a test** - `tests/portability-paths.test.ts`
|
|
247
|
+
fails the build on an absolute machine path, a machine account name, an MCP
|
|
248
|
+
command the catalog cannot resolve to an absolute path, or a regression of
|
|
249
|
+
the C3 guard. It ships a negative proof: an injected path makes it fail by
|
|
250
|
+
file and line.
|
|
251
|
+
|
|
252
|
+
- **`.novahiz-install.json` and `novahiz.config.json` are no longer tracked** -
|
|
253
|
+
the install manifest embedded the absolute paths and the account name of the
|
|
254
|
+
machine that ran the installer, and was published with them. Both are
|
|
255
|
+
machine-local state regenerated on demand, and are now ignored.
|
|
256
|
+
|
|
6
257
|
## [0.9.3] - 2026-10-11
|
|
7
258
|
|
|
8
259
|
### Changed
|
package/README.md
CHANGED
|
@@ -314,7 +314,7 @@ Deux pièces complémentaires : la session consomme moins sans perdre en puissan
|
|
|
314
314
|
|
|
315
315
|
## Skills installées
|
|
316
316
|
|
|
317
|
-
Novahiz livre
|
|
317
|
+
Novahiz livre 95 skills au total — le cœur du dépôt, plus les packs officiels installés par défaut au setup :
|
|
318
318
|
|
|
319
319
|
| Catégorie | Skills | Objectif |
|
|
320
320
|
|-----------|--------|----------|
|
|
@@ -327,9 +327,11 @@ Novahiz livre 94 skills couvrant toutes les catégories — 46 dans le cœur du
|
|
|
327
327
|
| `browser` | novahiz-browser, browser-session, novahiz-web-extract, ... | Automatisation web, captures, extraction |
|
|
328
328
|
| `audit` | novahiz-security, package-risk-audit, llm-threat-review, ... | Sécurité, conformité, vulnérabilités |
|
|
329
329
|
| `expo` | expo-overview, expo-router, expo-module, expo-dev-client, ... | Expo / React Native : routes, modules natifs, builds |
|
|
330
|
-
| `devops` |
|
|
330
|
+
| `devops` | novahiz-release, novahiz-init, ... | Releases versionnées, onboarding, installation |
|
|
331
331
|
|
|
332
|
-
|
|
332
|
+
Le décompte exact se relit à tout moment : `novahiz sync` (index) et `novahiz doctor` (ligne `Referenced skills`). `npx novahiz skills --all` donne la liste complète.
|
|
333
|
+
|
|
334
|
+
> Les skills `eas-*` (workflows, stores, hosting, observe, update) sont des packs **payants** upstream : elles ne sont pas installées par défaut et `novahiz doctor` les exclut de `Referenced skills` par conception.
|
|
333
335
|
|
|
334
336
|
---
|
|
335
337
|
|
|
@@ -348,9 +350,22 @@ Novahiz auto-enregistre les serveurs MCP externes selon la catégorie du prompt
|
|
|
348
350
|
| novahiz-scheduler | `mcp/clepsydre/index.mjs` (local, zéro dépendance) | Apache-2.0 | devops |
|
|
349
351
|
| dart | `dart mcp-server` (Dart SDK) | BSD-3-Clause | code, debug, design-ui, flutter |
|
|
350
352
|
|
|
351
|
-
Packs de skills (installés depuis les dépôts officiels, jamais vendorés, et livrés **par défaut** au setup via `providers.autoInstall`) : `flutter/
|
|
353
|
+
Packs de skills (installés depuis les dépôts officiels, jamais vendorés, et livrés **par défaut** au setup via `providers.autoInstall`) : [`flutter/skills`](https://github.com/flutter/skills) (10 skills), `dart-lang/skills` (15 skills), `expo/skills` (19 skills, le groupe `expo-*` seulement ; les services payants `eas-*` exclus), `pbakaus/impeccable` (1 skill, la skill design upstream `impeccable`).
|
|
354
|
+
|
|
355
|
+
**`git` est requis** par le CLI officiel des skills : sans lui, l'installation des packs échoue silencieusement et les skills manquent au premier lancement. `novahiz doctor` le nomme (ligne `git (skill packs)`).
|
|
356
|
+
|
|
357
|
+
### Installer, puis mettre à jour : deux étapes distinctes
|
|
358
|
+
|
|
359
|
+
`deps --install` ne **remplit que les trous**. Dès qu'un pack est présent, sa commande d'installation est écartée (marqueur `installedWhen` satisfait) — sinon une seconde passe réinstallerait inutilement 45 skills. Conséquence directe : **cette même commande ne peut jamais rafraîchir un pack déjà installé.**
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
novahiz deps --install # installe ce qui manque (packs absents)
|
|
363
|
+
novahiz deps --install --update # rafraîchit tout depuis upstream
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
`--update` exécute la commande `update` déclarée par chaque provider — pour le CLI des skills, la sous-commande officielle `skills update -g -y`, qui parcourt les quatre sources (dart, flutter, expo, impeccable) en une passe. Contrairement à l'installation, **elle n'est jamais écartée** : rafraîchir un pack à jour est exactement le travail demandé.
|
|
352
367
|
|
|
353
|
-
|
|
368
|
+
`/novahiz-skills-update` enchaîne les deux. Chaque plan porte `step: "update"` et, quand une même commande couvre plusieurs packs, la liste `covers` — on ne peut donc pas confondre un pack écarté et un pack mis à jour. Voir [docs/PROVIDERS.md](docs/PROVIDERS.md).
|
|
354
369
|
|
|
355
370
|
Dépôts upstream et provenance complète des providers MCP et plugins opencode : [docs/PROVIDERS.md](docs/PROVIDERS.md), [docs/HARNESSES.md](docs/HARNESSES.md), [NOTICE.md](NOTICE.md).
|
|
356
371
|
|
|
@@ -396,6 +411,7 @@ Voir [docs/CONFIGURATION.md](docs/CONFIGURATION.md) pour toutes les options.
|
|
|
396
411
|
| `novahiz roadmap` | Afficher la roadmap d'exécution |
|
|
397
412
|
| `novahiz dispatch` | Générer des work packets |
|
|
398
413
|
| `novahiz sync` | Reconstruire l'index des skills installées |
|
|
414
|
+
| `novahiz deps --install [--update]` | Installer les packs de skills manquants, ou les rafraîchir tous avec `--update` (voir [Providers](#providers)) |
|
|
399
415
|
| `novahiz clean` | Supprimer les vieux logs |
|
|
400
416
|
| `novahiz upgrade` | Pull du dernier + rebuild |
|
|
401
417
|
| `novahiz version` | Afficher la version |
|
|
@@ -16,8 +16,8 @@ Clarification questions must be asked in the same language as the user's input p
|
|
|
16
16
|
|
|
17
17
|
Work in this order for every request:
|
|
18
18
|
|
|
19
|
-
1. Classify. Call the `novahiz_classify` MCP tool with the user request, or run `node
|
|
20
|
-
2. Load skills. Load every required skill with `skill({ name: "
|
|
19
|
+
1. Classify. Call the `novahiz_classify` MCP tool with the user request, or run `node <Novahiz-home>/src/cli.ts classify "<request>"`. Read the returned categories and required skills.
|
|
20
|
+
2. Load skills. Load every required skill with `skill({ name: "<skill>" })` before touching any file. The gate enforces this: `edit`, `write`, `patch`, `apply_patch`, and shell writes are blocked until the required skills are loaded.
|
|
21
21
|
3. Plan. For anything beyond a trivial change, write a short todo list with acceptance criteria.
|
|
22
22
|
4. Execute. Make the change. Prefer small, reversible edits. Keep architecture modular, scalable, and maintainable.
|
|
23
23
|
5. Verify. Run the relevant tests or commands. Report what you ran and what it returned. Never claim a result you did not observe.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Audit AND auto-fix the whole Obsidian data arborescence: structure, links, coherence. Runs doctor --apply (category by category), then sync --apply, then lint. Arguments: $ARGUMENTS
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`. The CLI is `<home>/src/cli.ts`.
|
|
6
|
+
|
|
7
|
+
2. Run `node src/cli.ts second-memory doctor --apply $ARGUMENTS` from the Novahiz home. This **auto-fixes** everything category by category: missing folders created, MOCs created, links repaired, root notes relocated, naming fixed. Every moved file is backed up first. Pass `--no-plugins` to skip the mandatory plugin check, `--json` for structured output.
|
|
8
|
+
|
|
9
|
+
3. The command exits 1 while issues remain and 0 when the vault is clean. For each `[fail]` check:
|
|
10
|
+
- `skeleton` — the vault is missing `INDEX.md`, `STRUCTURE.md` or a system folder: auto-recreated by `doctor --apply`.
|
|
11
|
+
- `arborescence` — a note sits at the vault root, a folder has no `_MOC.md`, a child MOC is not linked from its parent, a domain is only partially materialised, or `INDEX.md → ## Categories` does not list exactly the active domains. Auto-fixed by `doctor --apply`.
|
|
12
|
+
- `links` — broken wikilinks or orphans: auto-fixed by `doctor --apply` (runs the `fix` repairs).
|
|
13
|
+
- `plugins` — a mandatory community plugin is missing or disabled: auto-fixed by `doctor --apply`.
|
|
14
|
+
- `outside-tree folders` (warn) — a top-level folder is not in `catalog/vault-structure.json`. Doctor does not move folders: report them and migrate their notes by hand.
|
|
15
|
+
- `memory` (warn) — project memory has pending changes: auto-fixed by `sync --apply` below.
|
|
16
|
+
|
|
17
|
+
4. Then the **global coherence pass** — from the project directory, beyond what doctor checks structurally:
|
|
18
|
+
- `node src/cli.ts second-memory sync --apply`: pending slot pulls/pushes AND `novahiz-docs/` mirror drift are auto-applied. Mirror drift means the repo docs moved ahead of the vault.
|
|
19
|
+
- Verify the active project's binding exists (`vault.json` at the memory root `sync` uses —
|
|
20
|
+
`project-memory/vault.json` or `~/.config/project-memory/vault.json`) and its chain is
|
|
21
|
+
materialised (`Code/<branch>/<project>/{docs,journal,decisions}/`). A memory root without a binding
|
|
22
|
+
means `project-init` never ran: notes then fall back to content-keyword routing and may
|
|
23
|
+
land in `Inbox` or a wrong branch. Report every note found outside the bound chain, but
|
|
24
|
+
NEVER move a note automatically — propose the move and wait for consent.
|
|
25
|
+
- Consistency across the three layers (repo `novahiz-docs/` ↔ vault `docs/` chain ↔ vault `memory/` chain): same project folder spelling everywhere, no duplicate project folders (a leftover `general/` or old-chain folder next to the real one), no empty bound folder left after a rebind.
|
|
26
|
+
- When doctor passes but something still looks off, run the strict pass: `node src/cli.ts second-memory lint`.
|
|
27
|
+
|
|
28
|
+
5. Report what the audit found, what was actually repaired (with the backup location), what remains — including coherence suggestions you did not apply. Never claim a repair you did not run.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Initialize Obsidian vault structure for the active project. Arguments: $ARGUMENTS
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`. The CLI is `<home>/src/cli.ts`.
|
|
6
|
+
|
|
7
|
+
2. If `$ARGUMENTS` is `init` (or empty), first run the preview from the project directory (the active project — its cwd gives the name, its dependencies the routing):
|
|
8
|
+
|
|
9
|
+
`node src/cli.ts second-memory project-init --dry-run --json`
|
|
10
|
+
|
|
11
|
+
Show the routed chain and the mirrored files. Unless the user only wanted the preview, run it for real:
|
|
12
|
+
|
|
13
|
+
`node src/cli.ts second-memory project-init --json`
|
|
14
|
+
|
|
15
|
+
Extra flags when the routing must be forced: `--project <name>`, `--domain <Domain> --branch <Branch>` (both together).
|
|
16
|
+
|
|
17
|
+
3. What it does — additive and idempotent, nothing existing is overwritten:
|
|
18
|
+
- creates the project chain `Code/<branch>/{memory,docs}/<project>/` (folders, `_MOC.md` links at every level, `INDEX.md` entry, domain activated whole);
|
|
19
|
+
- writes the routing binding in a `vault.json` sidecar at the memory root `sync` uses
|
|
20
|
+
(`project-memory/vault.json` in the project, or `~/.config/project-memory/` when that
|
|
21
|
+
global root exists — future `second-memory sync` runs send this project's slots and doc
|
|
22
|
+
mirror to the bound chain instead of guessing by content keywords);
|
|
23
|
+
- mirrors `novahiz-docs/*.md` into the docs chain (source of truth stays the repo).
|
|
24
|
+
|
|
25
|
+
4. Exit codes: 0 created or nothing to do; 1 when the vault is absent (run `node src/cli.ts second-memory init` first), when routing is impossible from the project signal (rerun with `--domain`/`--branch`), or on an unknown flag.
|
|
26
|
+
|
|
27
|
+
5. Report the bound chain (`Code/.../<project>/`), the binding line, and every file created or mirrored. If the branch picked by the keywords looks wrong, rerun with `--domain <D> --branch <B>` before any note exists. Never claim a folder you did not create.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: Install any missing skill pack and refresh every installed pack (dart, flutter, expo, impeccable) from their official providers. Arguments: $ARGUMENTS
|
|
3
3
|
---
|
|
4
4
|
|
|
5
5
|
1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`.
|
|
@@ -9,21 +9,38 @@ description: Reinstall every optional skill pack (dart, flutter, expo, impeccabl
|
|
|
9
9
|
silently. If git is missing, tell the user to install it first
|
|
10
10
|
(Windows: `winget install Git.Git`) and stop.
|
|
11
11
|
|
|
12
|
-
3.
|
|
13
|
-
(`catalog/providers.json` - dart-lang/skills, flutter/
|
|
12
|
+
3. Install whatever pack is missing from the official registry
|
|
13
|
+
(`catalog/providers.json` - dart-lang/skills, flutter/skills,
|
|
14
14
|
expo/skills, pbakaus/impeccable, plus the provider MCP servers):
|
|
15
15
|
|
|
16
16
|
`node <home>/src/cli.ts deps --install --yes`
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
This step only *fills gaps*. Every pack already on disk is skipped by
|
|
19
|
+
design (`installedWhen` satisfied), so it can never bring an installed
|
|
20
|
+
pack up to date — that is what step 4 is for.
|
|
21
|
+
|
|
22
|
+
4. Refresh the installed packs from upstream. This is the real update: it
|
|
23
|
+
runs each provider's `update` command, which for the skills CLI is the
|
|
24
|
+
upstream `skills update -g -y` subcommand and covers dart, flutter, expo
|
|
25
|
+
and impeccable in one pass:
|
|
26
|
+
|
|
27
|
+
`node <home>/src/cli.ts deps --install --update --yes`
|
|
28
|
+
|
|
29
|
+
Confirm the JSON reports `"step": "update"` with `"ok": true` (a shared
|
|
30
|
+
command lists every provider under `covers`). If it reports
|
|
31
|
+
`"step": "install"` instead, the `--update` flag did not reach the CLI —
|
|
32
|
+
stop and say so rather than reporting an update that never ran.
|
|
33
|
+
|
|
34
|
+
5. Refresh the Impeccable CLI and engine from npm (official package):
|
|
19
35
|
|
|
20
36
|
`npm install -g impeccable`
|
|
21
37
|
`impeccable install --global --yes --force`
|
|
22
38
|
|
|
23
|
-
|
|
39
|
+
6. Realign the skill index:
|
|
24
40
|
|
|
25
41
|
`node <home>/src/cli.ts sync`
|
|
26
42
|
|
|
27
|
-
|
|
43
|
+
7. Verify with `node <home>/src/cli.ts doctor`: the `Referenced skills` row
|
|
28
44
|
must show every pack present (the 7 `eas-*` paid-service skills stay
|
|
29
|
-
excluded by design). Report what was
|
|
45
|
+
excluded by design). Report what was installed and what was updated,
|
|
46
|
+
separately — never call a skipped pack an update.
|
|
@@ -30,11 +30,11 @@ Do **not** consult it for trivial edits, unrelated questions, or when the prompt
|
|
|
30
30
|
|
|
31
31
|
Playwright uses a **persistent profile** that preserves data across sessions (cookies, localStorage, sessionStorage, history, logged-in sessions).
|
|
32
32
|
|
|
33
|
-
**Profile folder:**
|
|
33
|
+
**Profile folder:** `~/.opencode/playwright-profile`
|
|
34
34
|
|
|
35
35
|
### Rules
|
|
36
36
|
1. **NEVER use Chrome or Chromium** — Use only Microsoft Edge via the Playwright MCP server (`--browser=msedge`). Never launch `chrome.exe`, `chromium`, or any Chromium-based process manually or programmatically. All browser automation goes through the MCP tools (`playwright_browser_*`). If Edge is not installed, fall back to another non-Chromium browser (Firefox, WebKit) via the Playwright MCP server.
|
|
37
|
-
2. Never disable `--user-data-dir` in the Playwright MCP config. The profile must always point to
|
|
37
|
+
2. Never disable `--user-data-dir` in the Playwright MCP config. The profile must always point to `~/.opencode/playwright-profile`.
|
|
38
38
|
3. Never purge this folder without explicit user consent.
|
|
39
39
|
4. Never launch Playwright with an ephemeral context (without user-data-dir) for tasks requiring persistence.
|
|
40
40
|
5. If the profile is corrupted or causes issues, inform the user and propose a backup before any reset.
|