novahiz 0.7.1 → 0.8.1
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 +54 -0
- package/README.md +11 -7
- package/adapters/opencode/commands/novahiz-skills-update.md +29 -0
- package/catalog/categories.json +158 -5
- package/dist/commands/doctor.js +15 -1
- package/dist/commands/upgrade.js +7 -3
- package/package.json +1 -1
- package/src/commands/doctor.ts +16 -1
- package/src/commands/upgrade.ts +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,60 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.8.1] - 2026-10-10
|
|
9
|
+
|
|
10
|
+
Patch: `novahiz upgrade` always reported "up to date" on the npm channel.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **`novahiz upgrade` reads the published version again**
|
|
15
|
+
(`src/commands/upgrade.ts`): the `npm view` call ran with `stdio: "ignore"`,
|
|
16
|
+
which makes `spawnSync` return `stdout: null` — `latest` was always empty,
|
|
17
|
+
`compareVersions(local, "")` always won, and the command printed
|
|
18
|
+
`up to date (npm latest: )` even when a newer release existed, so `--apply`
|
|
19
|
+
could never trigger. The call now captures stdout (`"pipe"`), with a
|
|
20
|
+
regression test spawning `npm --version` locally (no network). Inherited
|
|
21
|
+
since 0.7.1.
|
|
22
|
+
|
|
23
|
+
## [0.8.0] - 2026-10-09
|
|
24
|
+
|
|
25
|
+
Minor release: total Impeccable coverage on the design roadmap, a repair
|
|
26
|
+
command for the optional skill packs, and an honest diagnosis of why packs go
|
|
27
|
+
missing on fresh installs.
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
|
|
31
|
+
- **Design-ui roadmap: total Impeccable coverage** (`catalog/categories.json`):
|
|
32
|
+
23 `kind: skill` steps carry the whole official playbook — init, document,
|
|
33
|
+
shape, critique, then the targeted fixes (layout, typeset, colorize,
|
|
34
|
+
animate, adapt, bolder, quieter, clarify, delight, distill, extract,
|
|
35
|
+
onboard, optimize, overdrive, generate), then audit, harden, polish and the
|
|
36
|
+
detect → verify loop. Labels match the official descriptions published on
|
|
37
|
+
https://impeccable.style/cheatsheet. Every step is `optional: true` (a
|
|
38
|
+
checklist the agent follows, gate enforcement stays with R14);
|
|
39
|
+
`impeccable-live` is excluded on purpose (live browser session, not a
|
|
40
|
+
code path) and the deprecated `craft` alias is dropped. Rollback:
|
|
41
|
+
`categories.json.pre-impeccable-full.bak`.
|
|
42
|
+
- **`/novahiz-skills-update` command**
|
|
43
|
+
(`adapters/opencode/commands/novahiz-skills-update.md`): reinstalls every
|
|
44
|
+
optional skill pack — dart, flutter, expo, impeccable — cleanly from their
|
|
45
|
+
official providers (`novahiz deps --install --yes`), refreshes the
|
|
46
|
+
Impeccable CLI/engine from npm, resyncs the skill index and verifies with
|
|
47
|
+
doctor. The one command a community member runs when packs are missing.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- **`doctor` now names the git root cause** (`src/commands/doctor.ts`): a new
|
|
52
|
+
non-blocking `git (skill packs)` row — the official skills CLI behind every
|
|
53
|
+
`providers.json` `kind: skill` entry (dart-lang/skills, flutter/agent-plugins,
|
|
54
|
+
expo/skills, pbakaus/impeccable) requires git; without it those installs fail
|
|
55
|
+
silently on a fresh setup, which is exactly how a machine ends up with 33
|
|
56
|
+
pack skills missing and no explanation. Present → "installable"; missing →
|
|
57
|
+
install hint pointing at `/novahiz-skills-update`.
|
|
58
|
+
- **`Referenced skills` hint** (`src/commands/doctor.ts`): the
|
|
59
|
+
"novahiz-install --dart-skills --flutter-skills" hint now points at
|
|
60
|
+
`/novahiz-skills-update, or novahiz deps --install`, the actual repair path.
|
|
61
|
+
|
|
8
62
|
## [0.7.1] - 2026-10-08
|
|
9
63
|
|
|
10
64
|
Patch release: two installation-level repairs found while cutting 0.7.0 — the
|
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
> **Couche d'application sans dépendance pour les agents de code IA** — classe les prompts, attribue des roadmaps d'exécution, bloque les éditions non sûres tant que les bonnes skills ne sont pas chargées, et persiste les décisions d'une session à l'autre — tout cela de façon déterministe, sans appel de modèle.
|
|
4
4
|
|
|
5
|
-
17 catégories,
|
|
5
|
+
17 catégories, 94 skills, 13 gate rules, 8 MCP providers — tout déterministe, tout local, tout JSON.
|
|
6
6
|
|
|
7
|
-
> **Version 0.
|
|
7
|
+
> **Version 0.8.0** — publiée sur npm (`npm install -g --allow-scripts=novahiz novahiz` installe et configure tout : core, plugin, agent, skills packs et Playwright MCP). `CHANGELOG.md` et `scripts/` sont dans le tarball.
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
┌──────────────────────────────────────────────────────────────────────────┐
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
└─ tier, skills ──────│ └─ block : charger les skills nommées, retry une fois
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
**17 catégories**, **
|
|
38
|
+
**17 catégories**, **94 skills**, **13 gate rules**, **8 MCP providers** — tout déterministe, tout local, tout JSON.
|
|
39
39
|
|
|
40
40
|
---
|
|
41
41
|
|
|
@@ -66,7 +66,7 @@ npm antérieur à 11.16 exécute les scripts par défaut : `npm install -g novah
|
|
|
66
66
|
Puis vérifiez :
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
novahiz doctor # Santé :
|
|
69
|
+
novahiz doctor # Santé : 17 checks (22 avec --deep)
|
|
70
70
|
novahiz classify "fix the auth bug"
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -197,6 +197,8 @@ Huit catégories (`code`, `debug`, `browser`, `design-ui`, `database-supabase`,
|
|
|
197
197
|
|
|
198
198
|
Clarify renvoie le travail au plan quand une réponse change l'architecture ; converge le renvoie aux tâches quand il trouve un écart. `flutter` et `expo` gardent les six mêmes étapes et insèrent leurs skills qualité autour d'implement. Le **tier** du classifier filtre la suite : `trivial` n'exécute presque rien, `lite` garde implement et converge, `full` parcourt toute la roadmap. Référence complète : [docs/ROADMAPS.md](docs/ROADMAPS.md).
|
|
199
199
|
|
|
200
|
+
La roadmap `design-ui` porte en plus la couverture totale du playbook Impeccable : 23 étapes `skill` optionnelles couvrant l'intégralité des commandes officielles (`init`, `document`, `shape`, `critique`, ciblées `layout` → `generate`, `audit`, `harden`, `polish`, boucle `detect → verify`), avec les libellés des descriptions publiées sur [impeccable.style/cheatsheet](https://impeccable.style/cheatsheet). Elles forment une checklist pour l'agent ; l'application des règles design reste portée par `R14-impeccable`. `impeccable-live` est volontairement hors roadmap (session navigateur en direct, pas un chemin de code).
|
|
201
|
+
|
|
200
202
|
```mermaid
|
|
201
203
|
flowchart LR
|
|
202
204
|
subgraph "Fonctionnalité (code)"
|
|
@@ -310,7 +312,7 @@ Deux pièces complémentaires : la session consomme moins sans perdre en puissan
|
|
|
310
312
|
|
|
311
313
|
## Skills installées
|
|
312
314
|
|
|
313
|
-
Novahiz livre
|
|
315
|
+
Novahiz livre 94 skills couvrant toutes les catégories — 46 dans le cœur du dépôt, les autres dans les packs officiels installés par défaut au setup :
|
|
314
316
|
|
|
315
317
|
| Catégorie | Skills | Objectif |
|
|
316
318
|
|-----------|--------|----------|
|
|
@@ -344,7 +346,9 @@ Novahiz auto-enregistre les serveurs MCP externes selon la catégorie du prompt
|
|
|
344
346
|
| novahiz-scheduler | `mcp/clepsydre/index.mjs` (local, zéro dépendance) | Apache-2.0 | devops |
|
|
345
347
|
| dart | `dart mcp-server` (Dart SDK) | BSD-3-Clause | code, debug, design-ui, flutter |
|
|
346
348
|
|
|
347
|
-
Packs de skills (installés depuis les dépôts officiels, jamais vendorés) : `flutter/agent-plugins` (
|
|
349
|
+
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/agent-plugins` (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`).
|
|
350
|
+
|
|
351
|
+
**`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)`), et **`/novahiz-skills-update`** — ou `novahiz deps --install` — réinstalle proprement tous les packs depuis leurs providers officiels. Voir [docs/PROVIDERS.md](docs/PROVIDERS.md).
|
|
348
352
|
|
|
349
353
|
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).
|
|
350
354
|
|
|
@@ -374,7 +378,7 @@ Voir [docs/CONFIGURATION.md](docs/CONFIGURATION.md) pour toutes les options.
|
|
|
374
378
|
| Commande | Objectif |
|
|
375
379
|
|----------|----------|
|
|
376
380
|
| `novahiz init` | Installation en une passe |
|
|
377
|
-
| `novahiz doctor` | Diagnostic de santé
|
|
381
|
+
| `novahiz doctor` | Diagnostic de santé 17-check (22 avec `--deep`) |
|
|
378
382
|
| `novahiz status` | Classification + état du gate actuels |
|
|
379
383
|
| `novahiz classify <text>` | Classer un prompt |
|
|
380
384
|
| `novahiz gate` | Vérifier si une édition est autorisée |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Reinstall every optional skill pack (dart, flutter, expo, impeccable) cleanly from their official providers. Arguments: $ARGUMENTS
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
1. Locate the Novahiz home: `NOVAHIZ_HOME` if set, otherwise `~/.config/novahiz`.
|
|
6
|
+
|
|
7
|
+
2. Confirm `git` is on the PATH (`git --version`). The official skills CLI
|
|
8
|
+
behind every skill provider needs it; without it the install fails
|
|
9
|
+
silently. If git is missing, tell the user to install it first
|
|
10
|
+
(Windows: `winget install Git.Git`) and stop.
|
|
11
|
+
|
|
12
|
+
3. Reinstall/update every provider from the official registry
|
|
13
|
+
(`catalog/providers.json` - dart-lang/skills, flutter/agent-plugins,
|
|
14
|
+
expo/skills, pbakaus/impeccable, plus the provider MCP servers):
|
|
15
|
+
|
|
16
|
+
`node <home>/src/cli.ts deps --install --yes`
|
|
17
|
+
|
|
18
|
+
4. Refresh the Impeccable CLI and engine from npm (official package):
|
|
19
|
+
|
|
20
|
+
`npm install -g impeccable`
|
|
21
|
+
`impeccable install --global --yes --force`
|
|
22
|
+
|
|
23
|
+
5. Realign the skill index:
|
|
24
|
+
|
|
25
|
+
`node <home>/src/cli.ts sync`
|
|
26
|
+
|
|
27
|
+
6. Verify with `node <home>/src/cli.ts doctor`: the `Referenced skills` row
|
|
28
|
+
must show every pack present (the 7 `eas-*` paid-service skills stay
|
|
29
|
+
excluded by design). Report what was reinstalled.
|
package/catalog/categories.json
CHANGED
|
@@ -832,9 +832,27 @@
|
|
|
832
832
|
],
|
|
833
833
|
"optional": true
|
|
834
834
|
},
|
|
835
|
+
{
|
|
836
|
+
"id": "impeccable-init",
|
|
837
|
+
"label": "Impeccable init (give Impeccable the project context: PRODUCT.md audience and goals)",
|
|
838
|
+
"kind": "skill",
|
|
839
|
+
"requireSkills": [
|
|
840
|
+
"impeccable"
|
|
841
|
+
],
|
|
842
|
+
"optional": true
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"id": "impeccable-document",
|
|
846
|
+
"label": "Impeccable document (record your visual system in DESIGN.md so future work can follow it)",
|
|
847
|
+
"kind": "skill",
|
|
848
|
+
"requireSkills": [
|
|
849
|
+
"impeccable"
|
|
850
|
+
],
|
|
851
|
+
"optional": true
|
|
852
|
+
},
|
|
835
853
|
{
|
|
836
854
|
"id": "impeccable-shape",
|
|
837
|
-
"label": "Impeccable shape (
|
|
855
|
+
"label": "Impeccable shape (turn an idea into a design brief you can build from)",
|
|
838
856
|
"kind": "skill",
|
|
839
857
|
"requireSkills": [
|
|
840
858
|
"impeccable"
|
|
@@ -851,7 +869,142 @@
|
|
|
851
869
|
},
|
|
852
870
|
{
|
|
853
871
|
"id": "impeccable-critique",
|
|
854
|
-
"label": "Impeccable critique (
|
|
872
|
+
"label": "Impeccable critique (find what holds the design back and what to improve first)",
|
|
873
|
+
"kind": "skill",
|
|
874
|
+
"requireSkills": [
|
|
875
|
+
"impeccable"
|
|
876
|
+
],
|
|
877
|
+
"optional": true
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
"id": "impeccable-layout",
|
|
881
|
+
"label": "Impeccable layout (arrange the page so people know where to look and what belongs together)",
|
|
882
|
+
"kind": "skill",
|
|
883
|
+
"requireSkills": [
|
|
884
|
+
"impeccable"
|
|
885
|
+
],
|
|
886
|
+
"optional": true
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"id": "impeccable-typeset",
|
|
890
|
+
"label": "Impeccable typeset (make text easier to read, scan and recognize)",
|
|
891
|
+
"kind": "skill",
|
|
892
|
+
"requireSkills": [
|
|
893
|
+
"impeccable"
|
|
894
|
+
],
|
|
895
|
+
"optional": true
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
"id": "impeccable-colorize",
|
|
899
|
+
"label": "Impeccable colorize (color clarifies actions, states and the design's character)",
|
|
900
|
+
"kind": "skill",
|
|
901
|
+
"requireSkills": [
|
|
902
|
+
"impeccable"
|
|
903
|
+
],
|
|
904
|
+
"optional": true
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
"id": "impeccable-animate",
|
|
908
|
+
"label": "Impeccable animate (motion clarifies changes, relationships and feedback)",
|
|
909
|
+
"kind": "skill",
|
|
910
|
+
"requireSkills": [
|
|
911
|
+
"impeccable"
|
|
912
|
+
],
|
|
913
|
+
"optional": true
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"id": "impeccable-adapt",
|
|
917
|
+
"label": "Impeccable adapt (make the design work on a different screen, device or platform)",
|
|
918
|
+
"kind": "skill",
|
|
919
|
+
"requireSkills": [
|
|
920
|
+
"impeccable"
|
|
921
|
+
],
|
|
922
|
+
"optional": true
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
"id": "impeccable-bolder",
|
|
926
|
+
"label": "Impeccable bolder (more presence, still true to the design)",
|
|
927
|
+
"kind": "skill",
|
|
928
|
+
"requireSkills": [
|
|
929
|
+
"impeccable"
|
|
930
|
+
],
|
|
931
|
+
"optional": true
|
|
932
|
+
},
|
|
933
|
+
{
|
|
934
|
+
"id": "impeccable-quieter",
|
|
935
|
+
"label": "Impeccable quieter (reduce visual noise, keep the personality)",
|
|
936
|
+
"kind": "skill",
|
|
937
|
+
"requireSkills": [
|
|
938
|
+
"impeccable"
|
|
939
|
+
],
|
|
940
|
+
"optional": true
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"id": "impeccable-clarify",
|
|
944
|
+
"label": "Impeccable clarify (help people understand what happened and what to do next)",
|
|
945
|
+
"kind": "skill",
|
|
946
|
+
"requireSkills": [
|
|
947
|
+
"impeccable"
|
|
948
|
+
],
|
|
949
|
+
"optional": true
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"id": "impeccable-delight",
|
|
953
|
+
"label": "Impeccable delight (meaningful moments: surprising, satisfying, unmistakably yours)",
|
|
954
|
+
"kind": "skill",
|
|
955
|
+
"requireSkills": [
|
|
956
|
+
"impeccable"
|
|
957
|
+
],
|
|
958
|
+
"optional": true
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
"id": "impeccable-distill",
|
|
962
|
+
"label": "Impeccable distill (reduce clutter so the important things are easier to find)",
|
|
963
|
+
"kind": "skill",
|
|
964
|
+
"requireSkills": [
|
|
965
|
+
"impeccable"
|
|
966
|
+
],
|
|
967
|
+
"optional": true
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"id": "impeccable-extract",
|
|
971
|
+
"label": "Impeccable extract (turn repeated patterns into shared components and styles)",
|
|
972
|
+
"kind": "skill",
|
|
973
|
+
"requireSkills": [
|
|
974
|
+
"impeccable"
|
|
975
|
+
],
|
|
976
|
+
"optional": true
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
"id": "impeccable-onboard",
|
|
980
|
+
"label": "Impeccable onboard (help new users reach their first useful result)",
|
|
981
|
+
"kind": "skill",
|
|
982
|
+
"requireSkills": [
|
|
983
|
+
"impeccable"
|
|
984
|
+
],
|
|
985
|
+
"optional": true
|
|
986
|
+
},
|
|
987
|
+
{
|
|
988
|
+
"id": "impeccable-optimize",
|
|
989
|
+
"label": "Impeccable optimize (find what slows the interface, fix it, measure the result)",
|
|
990
|
+
"kind": "skill",
|
|
991
|
+
"requireSkills": [
|
|
992
|
+
"impeccable"
|
|
993
|
+
],
|
|
994
|
+
"optional": true
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
"id": "impeccable-overdrive",
|
|
998
|
+
"label": "Impeccable overdrive (push past the expected, make it feel extraordinary)",
|
|
999
|
+
"kind": "skill",
|
|
1000
|
+
"requireSkills": [
|
|
1001
|
+
"impeccable"
|
|
1002
|
+
],
|
|
1003
|
+
"optional": true
|
|
1004
|
+
},
|
|
1005
|
+
{
|
|
1006
|
+
"id": "impeccable-generate",
|
|
1007
|
+
"label": "Impeccable generate (name an element, compare variations, keep the favorite)",
|
|
855
1008
|
"kind": "skill",
|
|
856
1009
|
"requireSkills": [
|
|
857
1010
|
"impeccable"
|
|
@@ -860,7 +1013,7 @@
|
|
|
860
1013
|
},
|
|
861
1014
|
{
|
|
862
1015
|
"id": "impeccable-audit",
|
|
863
|
-
"label": "Impeccable audit (
|
|
1016
|
+
"label": "Impeccable audit (find implementation problems and prioritize the fixes)",
|
|
864
1017
|
"kind": "skill",
|
|
865
1018
|
"requireSkills": [
|
|
866
1019
|
"impeccable"
|
|
@@ -869,7 +1022,7 @@
|
|
|
869
1022
|
},
|
|
870
1023
|
{
|
|
871
1024
|
"id": "impeccable-harden",
|
|
872
|
-
"label": "Impeccable harden (
|
|
1025
|
+
"label": "Impeccable harden (keep the interface usable when data, connections or actions go wrong)",
|
|
873
1026
|
"kind": "skill",
|
|
874
1027
|
"requireSkills": [
|
|
875
1028
|
"impeccable"
|
|
@@ -878,7 +1031,7 @@
|
|
|
878
1031
|
},
|
|
879
1032
|
{
|
|
880
1033
|
"id": "impeccable-polish",
|
|
881
|
-
"label": "Impeccable polish (
|
|
1034
|
+
"label": "Impeccable polish (make the page feel finished and work better)",
|
|
882
1035
|
"kind": "skill",
|
|
883
1036
|
"requireSkills": [
|
|
884
1037
|
"impeccable"
|
package/dist/commands/doctor.js
CHANGED
|
@@ -469,7 +469,7 @@ export function referencedSkillsCheck(spec, indexSkills, packageRootDir) {
|
|
|
469
469
|
? `${referenced.length} present`
|
|
470
470
|
: absentShipped.length > 0
|
|
471
471
|
? `missing from index: ${absent.join(", ")}`
|
|
472
|
-
: `${referenced.length - absent.length} present, ${absentPack} pack skills not installed (novahiz-
|
|
472
|
+
: `${referenced.length - absent.length} present, ${absentPack} pack skills not installed (run /novahiz-skills-update, or novahiz deps --install)`,
|
|
473
473
|
blocking: absentShipped.length > 0
|
|
474
474
|
};
|
|
475
475
|
}
|
|
@@ -537,6 +537,20 @@ export async function commandDoctor(parsed) {
|
|
|
537
537
|
: "all present",
|
|
538
538
|
blocking: missingCli.length > 0
|
|
539
539
|
});
|
|
540
|
+
// git backs the official skills CLI behind every providers.json kind:skill
|
|
541
|
+
// entry (dart, flutter, expo, impeccable). Without git those installs fail
|
|
542
|
+
// silently on a fresh setup, leaving the pack skills missing with no
|
|
543
|
+
// explanation - surface the root cause here as a non-blocking warning.
|
|
544
|
+
const hasGit = hasCommand("git");
|
|
545
|
+
checks.push({
|
|
546
|
+
id: "git",
|
|
547
|
+
label: "git (skill packs)",
|
|
548
|
+
ok: hasGit,
|
|
549
|
+
detail: hasGit
|
|
550
|
+
? "present - provider skill packs (dart, flutter, expo, impeccable) installable"
|
|
551
|
+
: "missing - provider skill packs cannot install; run: winget install Git.Git (or install git, then rerun /novahiz-skills-update)",
|
|
552
|
+
blocking: false
|
|
553
|
+
});
|
|
540
554
|
// Two probes, one per live enforcement layer, both deterministic against the
|
|
541
555
|
// current ruleset (the old single probe fed README.md with empty categories,
|
|
542
556
|
// which matches no rule since the prose content rules were removed):
|
package/dist/commands/upgrade.js
CHANGED
|
@@ -64,8 +64,12 @@ function readLocalVersion(root) {
|
|
|
64
64
|
return "unknown";
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
/** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
|
|
68
|
-
|
|
67
|
+
/** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
|
|
68
|
+
* `pipe` capture stdout/stderr (obligatoire pour `npm view` : `ignore`
|
|
69
|
+
* retourne stdout=null et `latest` restait toujours vide), `inherit` pour
|
|
70
|
+
* les sorties visibles de l'utilisateur (installation). Exporte pour le
|
|
71
|
+
* test de regression. */
|
|
72
|
+
export function runNpm(args, stdio) {
|
|
69
73
|
const result = spawnSync("npm", args, {
|
|
70
74
|
encoding: "utf8",
|
|
71
75
|
stdio,
|
|
@@ -79,7 +83,7 @@ function runNpm(args, stdio) {
|
|
|
79
83
|
}
|
|
80
84
|
function npmFlow(parsed, root) {
|
|
81
85
|
const local = readLocalVersion(root);
|
|
82
|
-
const view = runNpm(["view", "novahiz", "version"], "
|
|
86
|
+
const view = runNpm(["view", "novahiz", "version"], "pipe");
|
|
83
87
|
if (view.status !== 0) {
|
|
84
88
|
process.stderr.write(`novahiz upgrade: npm view failed (${view.stderr.trim() || `exit ${view.status}`}).\n`);
|
|
85
89
|
process.exitCode = 1;
|
package/package.json
CHANGED
package/src/commands/doctor.ts
CHANGED
|
@@ -469,7 +469,7 @@ export function referencedSkillsCheck(
|
|
|
469
469
|
? `${referenced.length} present`
|
|
470
470
|
: absentShipped.length > 0
|
|
471
471
|
? `missing from index: ${absent.join(", ")}`
|
|
472
|
-
: `${referenced.length - absent.length} present, ${absentPack} pack skills not installed (novahiz-
|
|
472
|
+
: `${referenced.length - absent.length} present, ${absentPack} pack skills not installed (run /novahiz-skills-update, or novahiz deps --install)`,
|
|
473
473
|
blocking: absentShipped.length > 0
|
|
474
474
|
};
|
|
475
475
|
}
|
|
@@ -544,6 +544,21 @@ export async function commandDoctor(parsed: Parsed): Promise<void> {
|
|
|
544
544
|
blocking: missingCli.length > 0
|
|
545
545
|
});
|
|
546
546
|
|
|
547
|
+
// git backs the official skills CLI behind every providers.json kind:skill
|
|
548
|
+
// entry (dart, flutter, expo, impeccable). Without git those installs fail
|
|
549
|
+
// silently on a fresh setup, leaving the pack skills missing with no
|
|
550
|
+
// explanation - surface the root cause here as a non-blocking warning.
|
|
551
|
+
const hasGit = hasCommand("git");
|
|
552
|
+
checks.push({
|
|
553
|
+
id: "git",
|
|
554
|
+
label: "git (skill packs)",
|
|
555
|
+
ok: hasGit,
|
|
556
|
+
detail: hasGit
|
|
557
|
+
? "present - provider skill packs (dart, flutter, expo, impeccable) installable"
|
|
558
|
+
: "missing - provider skill packs cannot install; run: winget install Git.Git (or install git, then rerun /novahiz-skills-update)",
|
|
559
|
+
blocking: false
|
|
560
|
+
});
|
|
561
|
+
|
|
547
562
|
// Two probes, one per live enforcement layer, both deterministic against the
|
|
548
563
|
// current ruleset (the old single probe fed README.md with empty categories,
|
|
549
564
|
// which matches no rule since the prose content rules were removed):
|
package/src/commands/upgrade.ts
CHANGED
|
@@ -71,8 +71,12 @@ function readLocalVersion(root: string): string {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
/** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
|
|
75
|
-
|
|
74
|
+
/** npm sous Windows est npm.cmd : spawnSync a besoin du shell, sinon ENOENT.
|
|
75
|
+
* `pipe` capture stdout/stderr (obligatoire pour `npm view` : `ignore`
|
|
76
|
+
* retourne stdout=null et `latest` restait toujours vide), `inherit` pour
|
|
77
|
+
* les sorties visibles de l'utilisateur (installation). Exporte pour le
|
|
78
|
+
* test de regression. */
|
|
79
|
+
export function runNpm(args: string[], stdio: "inherit" | "pipe"): { status: number; stdout: string; stderr: string } {
|
|
76
80
|
const result = spawnSync("npm", args, {
|
|
77
81
|
encoding: "utf8",
|
|
78
82
|
stdio,
|
|
@@ -87,7 +91,7 @@ function runNpm(args: string[], stdio: "inherit" | "ignore"): { status: number;
|
|
|
87
91
|
|
|
88
92
|
function npmFlow(parsed: Parsed, root: string): void {
|
|
89
93
|
const local = readLocalVersion(root);
|
|
90
|
-
const view = runNpm(["view", "novahiz", "version"], "
|
|
94
|
+
const view = runNpm(["view", "novahiz", "version"], "pipe");
|
|
91
95
|
if (view.status !== 0) {
|
|
92
96
|
process.stderr.write(`novahiz upgrade: npm view failed (${view.stderr.trim() || `exit ${view.status}`}).\n`);
|
|
93
97
|
process.exitCode = 1;
|