@novare-technologies/nvaid 0.1.0 → 0.2.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/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/cli.js +95 -9
- package/package.json +7 -4
- package/templates/commands/apply.md +8 -0
- package/templates/commands/breakdown.md +8 -0
- package/templates/commands/contracts.md +8 -0
- package/templates/commands/install.md +63 -0
- package/templates/commands/intent.md +17 -3
- package/templates/nvaid/config.yml +14 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Novare SQE Armory
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -31,6 +31,27 @@ nvaid init --owning-repo frontend # preset the config's owning_repo
|
|
|
31
31
|
nvaid init --yes # non-interactive (defaults to the AGENTS.md catch-all)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
## Upgrading
|
|
35
|
+
|
|
36
|
+
Upgrading is **two steps**, because `nvaid update` re-syncs a repo to the version of the
|
|
37
|
+
tool installed on your machine — it does not upgrade the tool itself:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 1. upgrade the tool (once per machine, when a new version ships)
|
|
41
|
+
npm i -g @novare-technologies/nvaid@latest
|
|
42
|
+
|
|
43
|
+
# 2. re-sync each repo to the new version (run inside each repo)
|
|
44
|
+
nvaid update
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
nvaid checks npm (at most once a day, cached, non-blocking) and prints a one-line nudge
|
|
48
|
+
when a newer version is available — it never upgrades itself (the package manager owns the
|
|
49
|
+
tool's lifecycle). Silence the check with `NVAID_NO_UPDATE_CHECK=1`.
|
|
50
|
+
|
|
51
|
+
Note: `nvaid update` never touches hand-owned files (`config.yml`, `PROJECT-RULES.md`,
|
|
52
|
+
`DESIGN-CODE-DICTIONARY.md`, `intents/`). If a new version adds a config field, add it to
|
|
53
|
+
your `config.yml` by hand — the changelog will call these out.
|
|
54
|
+
|
|
34
55
|
## How it works
|
|
35
56
|
|
|
36
57
|
- **Full skill set, no profiles.** `init` injects every skill into each selected agent. A
|
package/dist/cli.js
CHANGED
|
@@ -109,8 +109,8 @@ var NVAID_DIR_NAME = "nvaid";
|
|
|
109
109
|
var CONFIG_FILE = "config.yml";
|
|
110
110
|
var AIDLC_ROOT_TOKEN = "{{AIDLC_ROOT}}";
|
|
111
111
|
async function nvaidVersion() {
|
|
112
|
-
const { readFile:
|
|
113
|
-
const pkg = JSON.parse(await
|
|
112
|
+
const { readFile: readFile4 } = await import("fs/promises");
|
|
113
|
+
const pkg = JSON.parse(await readFile4(resolve(TEMPLATES_DIR, "..", "package.json"), "utf8"));
|
|
114
114
|
return pkg.version;
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -270,8 +270,14 @@ function hasConfig(projectRoot) {
|
|
|
270
270
|
async function readConfig(projectRoot) {
|
|
271
271
|
const raw = await readFile2(configPath(projectRoot), "utf8");
|
|
272
272
|
const parsed = parse(raw) ?? {};
|
|
273
|
+
const install = parsed.install ?? {};
|
|
273
274
|
return {
|
|
274
275
|
schema: parsed.schema ?? "nvaid/v1",
|
|
276
|
+
install: {
|
|
277
|
+
config: install.config === true,
|
|
278
|
+
project_rules: install.project_rules === true,
|
|
279
|
+
design_code_dictionary: install.design_code_dictionary === true
|
|
280
|
+
},
|
|
275
281
|
project_name: parsed.project_name ?? "",
|
|
276
282
|
owning_repo: parsed.owning_repo ?? "",
|
|
277
283
|
tech_stack: { ...EMPTY_STACK, ...parsed.tech_stack ?? {} },
|
|
@@ -362,13 +368,14 @@ async function runInit(opts) {
|
|
|
362
368
|
);
|
|
363
369
|
p.outro(
|
|
364
370
|
[
|
|
365
|
-
"Next, in your AI chat:",
|
|
371
|
+
"Next, in your AI chat \u2014 run this FIRST:",
|
|
372
|
+
" /nvaid:install scan the project, fill config.yml + PROJECT-RULES + dictionary",
|
|
373
|
+
"",
|
|
374
|
+
"The workflow commands are blocked until /nvaid:install completes:",
|
|
366
375
|
' /nvaid:intent "..." draft the intent, then STOP for stakeholder approval',
|
|
367
376
|
" /nvaid:contracts after approval \u2014 draft the per-role contracts",
|
|
368
377
|
" /nvaid:breakdown cut into units (tagged by owning repo)",
|
|
369
|
-
" /nvaid:apply generate per-repo unit docs + branches"
|
|
370
|
-
"",
|
|
371
|
-
"Fill in nvaid/PROJECT-RULES.md and set owning_repo in nvaid/config.yml."
|
|
378
|
+
" /nvaid:apply generate per-repo unit docs + branches"
|
|
372
379
|
].join("\n")
|
|
373
380
|
);
|
|
374
381
|
}
|
|
@@ -453,9 +460,84 @@ async function runValidate() {
|
|
|
453
460
|
return 0;
|
|
454
461
|
}
|
|
455
462
|
|
|
463
|
+
// src/updateNotifier.ts
|
|
464
|
+
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3 } from "fs/promises";
|
|
465
|
+
import { homedir, tmpdir } from "os";
|
|
466
|
+
import { join as join4 } from "path";
|
|
467
|
+
import pc4 from "picocolors";
|
|
468
|
+
var PKG = "@novare-technologies/nvaid";
|
|
469
|
+
var CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
|
|
470
|
+
var FETCH_TIMEOUT_MS = 1500;
|
|
471
|
+
function cacheFile() {
|
|
472
|
+
const base = process.env.XDG_CACHE_HOME || join4(homedir(), ".cache");
|
|
473
|
+
return join4(base || tmpdir(), "nvaid", "update-check.json");
|
|
474
|
+
}
|
|
475
|
+
async function readCache() {
|
|
476
|
+
try {
|
|
477
|
+
return JSON.parse(await readFile3(cacheFile(), "utf8"));
|
|
478
|
+
} catch {
|
|
479
|
+
return null;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
async function writeCache(c) {
|
|
483
|
+
try {
|
|
484
|
+
const f = cacheFile();
|
|
485
|
+
await mkdir3(join4(f, ".."), { recursive: true });
|
|
486
|
+
await writeFile3(f, JSON.stringify(c), "utf8");
|
|
487
|
+
} catch {
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
async function fetchLatest() {
|
|
491
|
+
try {
|
|
492
|
+
const ctrl = new AbortController();
|
|
493
|
+
const timer = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
|
|
494
|
+
const res = await fetch(`https://registry.npmjs.org/${PKG}/latest`, {
|
|
495
|
+
signal: ctrl.signal
|
|
496
|
+
});
|
|
497
|
+
clearTimeout(timer);
|
|
498
|
+
if (!res.ok) return null;
|
|
499
|
+
const data = await res.json();
|
|
500
|
+
return data.version ?? null;
|
|
501
|
+
} catch {
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
function isNewer(a, b) {
|
|
506
|
+
const pa = a.split(".").map((n) => parseInt(n, 10));
|
|
507
|
+
const pb = b.split(".").map((n) => parseInt(n, 10));
|
|
508
|
+
for (let i = 0; i < 3; i++) {
|
|
509
|
+
const x = pa[i] ?? 0;
|
|
510
|
+
const y = pb[i] ?? 0;
|
|
511
|
+
if (x > y) return true;
|
|
512
|
+
if (x < y) return false;
|
|
513
|
+
}
|
|
514
|
+
return false;
|
|
515
|
+
}
|
|
516
|
+
async function notifyIfOutdated() {
|
|
517
|
+
if (process.env.NVAID_NO_UPDATE_CHECK) return;
|
|
518
|
+
const current = await nvaidVersion();
|
|
519
|
+
const cache = await readCache();
|
|
520
|
+
const now = Date.now();
|
|
521
|
+
let latest = null;
|
|
522
|
+
if (cache && now - cache.lastCheck < CHECK_INTERVAL_MS) {
|
|
523
|
+
latest = cache.latest;
|
|
524
|
+
} else {
|
|
525
|
+
latest = await fetchLatest();
|
|
526
|
+
if (latest) await writeCache({ lastCheck: now, latest });
|
|
527
|
+
}
|
|
528
|
+
if (!latest || !isNewer(latest, current)) return;
|
|
529
|
+
const line = (s) => process.stderr.write(s + "\n");
|
|
530
|
+
line("");
|
|
531
|
+
line(pc4.yellow(` \u250C\u2500 nvaid update available \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
|
|
532
|
+
line(pc4.yellow(" \u2502 ") + `${pc4.dim(current)} \u2192 ${pc4.green(latest)}`);
|
|
533
|
+
line(pc4.yellow(" \u2502 ") + `run: ${pc4.cyan(`npm i -g ${PKG}@latest`)}`);
|
|
534
|
+
line(pc4.yellow(" \u2502 ") + pc4.dim(`then re-sync your repo: nvaid update`));
|
|
535
|
+
line(pc4.yellow(` \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`));
|
|
536
|
+
}
|
|
537
|
+
|
|
456
538
|
// src/cli.ts
|
|
457
539
|
var program = new Command();
|
|
458
|
-
program.name("nvaid").description("nvaid \u2014 install an AI-DLC skills + workflow toolkit into any coding agent").version(
|
|
540
|
+
program.name("nvaid").description("nvaid \u2014 install an AI-DLC skills + workflow toolkit into any coding agent").version(await nvaidVersion());
|
|
459
541
|
program.command("init").description("Onboard this repo: select coding agents, inject skills, create the nvaid/ folder").option("--agents <ids>", "comma-separated agent ids (skips the prompt)", (v) => v.split(",")).option("--owning-repo <tier>", "owning_repo value written to config.yml").option("--project-name <name>", "project_name value written to config.yml").option("-y, --yes", "accept defaults, no prompts (CI)").action(async (opts) => {
|
|
460
542
|
await runInit({
|
|
461
543
|
agents: opts.agents,
|
|
@@ -468,9 +550,13 @@ program.command("update").description("Re-sync agent files to the installed nvai
|
|
|
468
550
|
await runUpdate();
|
|
469
551
|
});
|
|
470
552
|
program.command("validate").description("Fail if generated agent files are stale or hand-edited").action(async () => {
|
|
471
|
-
|
|
553
|
+
const code = await runValidate();
|
|
554
|
+
await notifyIfOutdated();
|
|
555
|
+
process.exit(code);
|
|
472
556
|
});
|
|
473
|
-
program.parseAsync().
|
|
557
|
+
program.parseAsync().then(async () => {
|
|
558
|
+
await notifyIfOutdated();
|
|
559
|
+
}).catch((err) => {
|
|
474
560
|
console.error(err instanceof Error ? err.message : err);
|
|
475
561
|
process.exit(1);
|
|
476
562
|
});
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@novare-technologies/nvaid",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "nvaid — one CLI that installs an AI-DLC skills-and-workflow toolkit into any coding agent, and houses intents, config, and the design-code dictionary in a single nvaid/ folder.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"nvaid": "
|
|
7
|
+
"nvaid": "dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"files": [
|
|
10
10
|
"dist",
|
|
@@ -39,10 +39,13 @@
|
|
|
39
39
|
"yaml": "^2.4.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@types/node": "^
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
43
|
"tsup": "^8.0.0",
|
|
44
44
|
"tsx": "^4.7.0",
|
|
45
45
|
"typescript": "^5.4.0",
|
|
46
|
-
"vitest": "^
|
|
46
|
+
"vitest": "^5.0.3"
|
|
47
|
+
},
|
|
48
|
+
"overrides": {
|
|
49
|
+
"esbuild": "^0.28.2"
|
|
47
50
|
}
|
|
48
51
|
}
|
|
@@ -7,6 +7,14 @@ precondition: unit-breakdown approved (Decomposition-Approved gate green)
|
|
|
7
7
|
|
|
8
8
|
# /nvaid:apply
|
|
9
9
|
|
|
10
|
+
## ⛔ Precondition: nvaid install must be complete
|
|
11
|
+
|
|
12
|
+
Read `nvaid/config.yml` and check the `install:` block. If `config`, `project_rules`, or
|
|
13
|
+
`design_code_dictionary` is not `true` (or the file is missing), **STOP** and tell the
|
|
14
|
+
user to run `/nvaid:install` first — name which flag(s) are false. Do not proceed until
|
|
15
|
+
all three are true.
|
|
16
|
+
|
|
17
|
+
|
|
10
18
|
Turn an **approved** unit-breakdown into construction-ready work: for each Unit, generate
|
|
11
19
|
its design doc in the Owning Repo named by the breakdown, and open the construction branch
|
|
12
20
|
per the `github` Skill.
|
|
@@ -7,6 +7,14 @@ precondition: Contracts drafted (/nvaid:contracts has run)
|
|
|
7
7
|
|
|
8
8
|
# /nvaid:breakdown
|
|
9
9
|
|
|
10
|
+
## ⛔ Precondition: nvaid install must be complete
|
|
11
|
+
|
|
12
|
+
Read `nvaid/config.yml` and check the `install:` block. If `config`, `project_rules`, or
|
|
13
|
+
`design_code_dictionary` is not `true` (or the file is missing), **STOP** and tell the
|
|
14
|
+
user to run `/nvaid:install` first — name which flag(s) are false. Do not proceed until
|
|
15
|
+
all three are true.
|
|
16
|
+
|
|
17
|
+
|
|
10
18
|
Produce `unit-breakdown.md` — the **Phase 5 output**, the decomposition of record,
|
|
11
19
|
informed by the contracts from `/nvaid:contracts`. This runs **after** contracts, not
|
|
12
20
|
before (the `unit-breakdown` Skill is Phase 5; the contract Skills are Phases 2–5).
|
|
@@ -7,6 +7,14 @@ precondition: Intent approved (Decomposition-Approved gate green)
|
|
|
7
7
|
|
|
8
8
|
# /nvaid:contracts
|
|
9
9
|
|
|
10
|
+
## ⛔ Precondition: nvaid install must be complete
|
|
11
|
+
|
|
12
|
+
Read `nvaid/config.yml` and check the `install:` block. If `config`, `project_rules`, or
|
|
13
|
+
`design_code_dictionary` is not `true` (or the file is missing), **STOP** and tell the
|
|
14
|
+
user to run `/nvaid:install` first — name which flag(s) are false. Do not proceed until
|
|
15
|
+
all three are true.
|
|
16
|
+
|
|
17
|
+
|
|
10
18
|
Draft the Architecture Contracts for an **already-approved** Intent, running each role's
|
|
11
19
|
contract Skill. The contracts are negotiated across Elaboration Phases 2–5 and **precede**
|
|
12
20
|
the unit-breakdown (which is the Phase 5 output) — run `/nvaid:breakdown` after this.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
command: nvaid:install
|
|
3
|
+
summary: Scan the project and fill in the three required nvaid documents (config.yml, PROJECT-RULES.md, DESIGN-CODE-DICTIONARY.md). Must run before /nvaid:intent.
|
|
4
|
+
stage: "nvaid onboarding — run once, first, before any workflow command"
|
|
5
|
+
blocks: [nvaid:intent, nvaid:contracts, nvaid:breakdown, nvaid:apply]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /nvaid:install
|
|
9
|
+
|
|
10
|
+
The **first** command to run after `nvaid init`. `init` only drops empty templates; this
|
|
11
|
+
skill makes nvaid actually usable by scanning the project and authoring the three required
|
|
12
|
+
documents. **Every other nvaid workflow command is blocked until this completes** — running
|
|
13
|
+
`/nvaid:intent` against unfilled templates would produce hollow, confidently-wrong output.
|
|
14
|
+
|
|
15
|
+
## Why this is a skill, not a CLI step
|
|
16
|
+
|
|
17
|
+
The CLI can detect facts (languages, frameworks from manifest files) but cannot author
|
|
18
|
+
*judgment*: a project's guardrails, its design patterns, what breaks if a given module
|
|
19
|
+
changes. That requires reading the actual code and reasoning about it — the agent's job,
|
|
20
|
+
not a file-scan's. This skill does that reading. A human reviews before it's marked done
|
|
21
|
+
(propose, don't dispose).
|
|
22
|
+
|
|
23
|
+
## Steps
|
|
24
|
+
|
|
25
|
+
1. **Scan the project.** Read manifest files (`package.json`, `pyproject.toml`, `go.mod`,
|
|
26
|
+
lockfiles), the directory structure, config, CI workflows, and a representative sample
|
|
27
|
+
of source to understand the stack, the architecture, and the conventions in use.
|
|
28
|
+
|
|
29
|
+
2. **Fill `nvaid/config.yml`** — replace every `<placeholder>`:
|
|
30
|
+
- `project_name`, `owning_repo` (frontend | backend | platform | other — infer from the
|
|
31
|
+
code, confirm with the user if ambiguous).
|
|
32
|
+
- `tech_stack` — fill from what you actually found in the manifests, not assumptions.
|
|
33
|
+
- `architects` — these are sign-off identities you cannot infer from code. **Ask the
|
|
34
|
+
user** for the names; leave a role blank only if the user confirms it doesn't apply.
|
|
35
|
+
- `context` — the short, always-on constraints worth repeating to every agent.
|
|
36
|
+
|
|
37
|
+
3. **Author `nvaid/PROJECT-RULES.md`** — replace the template skeleton with real content:
|
|
38
|
+
the approved stack and what's disallowed without an ADR, non-negotiable constraints,
|
|
39
|
+
data rules, coding standards, the quality gates CI actually runs, and known gaps.
|
|
40
|
+
Derive what you can from the code (e.g. the lint/test config that exists); for anything
|
|
41
|
+
that is a *decision* rather than a fact (what's allowed, what's off-limits), propose it
|
|
42
|
+
and flag it for the user to confirm — do not invent a guardrail the project hasn't made.
|
|
43
|
+
|
|
44
|
+
4. **Author `nvaid/DESIGN-CODE-DICTIONARY.md`** — the technical README for the code:
|
|
45
|
+
the design patterns and conventions in use (with real file examples), and the component
|
|
46
|
+
map (concept → where it lives → what it depends on → what breaks if changed). This is
|
|
47
|
+
narrative derived from reading the code; §1 references `config.yml`'s `tech_stack`
|
|
48
|
+
rather than repeating it. Be honest in the "not yet mapped" section about coverage.
|
|
49
|
+
|
|
50
|
+
5. **Human review.** Present all three for review. Per propose-don't-dispose, you draft;
|
|
51
|
+
a human confirms. Do not self-approve.
|
|
52
|
+
|
|
53
|
+
6. **Flip the gate.** Only after the user confirms each document is genuinely filled (not
|
|
54
|
+
placeholder text), set the matching flag in `config.yml`'s `install:` block to `true`:
|
|
55
|
+
`config`, `project_rules`, `design_code_dictionary`. When all three are true, the
|
|
56
|
+
workflow commands unblock.
|
|
57
|
+
|
|
58
|
+
## Boundaries
|
|
59
|
+
|
|
60
|
+
- Facts come from the code; **decisions and sign-off identities come from the user** — ask,
|
|
61
|
+
don't fabricate.
|
|
62
|
+
- Never set an `install:` flag to `true` on a document that still contains template
|
|
63
|
+
`<placeholder>` text or that the user hasn't confirmed.
|
|
@@ -6,6 +6,21 @@ stage: "Fig. 2 Stage 1 — Intent captured, pre-Elaboration"
|
|
|
6
6
|
|
|
7
7
|
# /nvaid:intent
|
|
8
8
|
|
|
9
|
+
## ⛔ Precondition: nvaid install must be complete
|
|
10
|
+
|
|
11
|
+
Before doing anything, read `nvaid/config.yml` and check the `install:` block. If
|
|
12
|
+
`config`, `project_rules`, or `design_code_dictionary` is **not** `true` — or
|
|
13
|
+
`nvaid/config.yml` doesn't exist — **STOP** and tell the user:
|
|
14
|
+
|
|
15
|
+
> nvaid isn't fully installed in this project yet. Run `/nvaid:install` first — it scans
|
|
16
|
+
> the project and fills in config.yml, PROJECT-RULES.md, and DESIGN-CODE-DICTIONARY.md.
|
|
17
|
+
> Those documents are what this command relies on; drafting an Intent without them would
|
|
18
|
+
> produce hollow output.
|
|
19
|
+
|
|
20
|
+
Name which flag(s) are false. Do not proceed with any step below until all three are true.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
9
24
|
Draft a new Intent from the user's description. Produce **only** `intent.md` — the
|
|
10
25
|
business need, who it's for, success criteria, and scope boundaries — then **stop**.
|
|
11
26
|
|
|
@@ -18,9 +33,8 @@ limitation — propose, don't dispose.
|
|
|
18
33
|
|
|
19
34
|
## Steps
|
|
20
35
|
|
|
21
|
-
1. Read this repo's `nvaid/PROJECT-RULES.md`
|
|
22
|
-
|
|
23
|
-
that the project rules are not yet defined.
|
|
36
|
+
1. Read this repo's `nvaid/PROJECT-RULES.md` for the project's operating guardrails and
|
|
37
|
+
approved stack (guaranteed authored, since the install gate above has passed).
|
|
24
38
|
2. Write `nvaid/intents/<INTENT-ID>-<slug>/intent.md`: business need, who it's for,
|
|
25
39
|
Intent-level success criteria (observable outcomes, not implementation), scope
|
|
26
40
|
boundaries (name what's out of scope, don't silently drop it), and open questions for
|
|
@@ -12,6 +12,19 @@
|
|
|
12
12
|
|
|
13
13
|
schema: nvaid/v1
|
|
14
14
|
|
|
15
|
+
# Installation gate. `nvaid init` scaffolds empty templates; the /nvaid:install SKILL
|
|
16
|
+
# then scans the project and fills in all three required documents. The workflow commands
|
|
17
|
+
# (/nvaid:intent, :contracts, :breakdown, :apply) are BLOCKED until install is complete —
|
|
18
|
+
# running them against unfilled templates would produce hollow, confidently-wrong output.
|
|
19
|
+
#
|
|
20
|
+
# Each flag is set to true by /nvaid:install only once that document is genuinely filled
|
|
21
|
+
# (not left as <placeholder> template text) and a human has confirmed it. The install is
|
|
22
|
+
# "complete" when all three are true.
|
|
23
|
+
install:
|
|
24
|
+
config: false # project_name, owning_repo, tech_stack, architects all set
|
|
25
|
+
project_rules: false # nvaid/PROJECT-RULES.md authored (not the template skeleton)
|
|
26
|
+
design_code_dictionary: false # nvaid/DESIGN-CODE-DICTIONARY.md authored (not the skeleton)
|
|
27
|
+
|
|
15
28
|
# A short name for this project/repo, used in generated artifact headers
|
|
16
29
|
# (replaces the {{PROJECT_NAME}} placeholder in PROJECT-RULES.md and the dictionary).
|
|
17
30
|
project_name: "<set-me>"
|
|
@@ -71,4 +84,4 @@ context: ""
|
|
|
71
84
|
|
|
72
85
|
# nvaid version this repo was last generated against. `nvaid validate` compares the
|
|
73
86
|
# installed CLI version to this and flags drift.
|
|
74
|
-
generated_with: "0.1
|
|
87
|
+
generated_with: "0.2.1"
|