@novare-technologies/nvaid 0.2.2 → 0.2.4
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/cli.js
CHANGED
|
@@ -16,7 +16,6 @@ var AGENTS = [
|
|
|
16
16
|
commandsPath: ".claude/commands",
|
|
17
17
|
// /nvaid:install resolves from .claude/commands/nvaid/install.md
|
|
18
18
|
instructionsFile: "CLAUDE.md",
|
|
19
|
-
format: "markdown",
|
|
20
19
|
bespoke: true
|
|
21
20
|
},
|
|
22
21
|
{
|
|
@@ -24,70 +23,65 @@ var AGENTS = [
|
|
|
24
23
|
label: "Kiro",
|
|
25
24
|
skillsPath: ".kiro/skills",
|
|
26
25
|
instructionsFile: ".kiro/steering/nvaid.md",
|
|
27
|
-
format: "markdown",
|
|
28
26
|
bespoke: true
|
|
29
27
|
},
|
|
30
28
|
{
|
|
31
29
|
id: "cursor",
|
|
32
30
|
label: "Cursor",
|
|
33
|
-
skillsPath: ".cursor/
|
|
34
|
-
|
|
35
|
-
// Cursor reads custom commands from .cursor/commands
|
|
36
|
-
format: "mdc",
|
|
31
|
+
skillsPath: ".cursor/skills",
|
|
32
|
+
// cursor.com/docs/skills
|
|
37
33
|
bespoke: true
|
|
38
34
|
},
|
|
39
35
|
{
|
|
40
36
|
id: "copilot",
|
|
41
37
|
label: "GitHub Copilot",
|
|
42
|
-
skillsPath: ".github",
|
|
38
|
+
skillsPath: ".github/skills",
|
|
39
|
+
// docs.github.com — project skills in .github/skills
|
|
43
40
|
instructionsFile: ".github/copilot-instructions.md",
|
|
44
|
-
format: "markdown",
|
|
45
41
|
bespoke: true
|
|
46
42
|
},
|
|
47
43
|
{
|
|
48
44
|
id: "windsurf",
|
|
49
45
|
label: "Windsurf",
|
|
50
|
-
skillsPath: ".windsurf/
|
|
51
|
-
|
|
46
|
+
skillsPath: ".windsurf/skills",
|
|
47
|
+
// docs.windsurf.com/windsurf/cascade/skills
|
|
52
48
|
bespoke: true
|
|
53
49
|
},
|
|
54
50
|
{
|
|
55
51
|
id: "amazonq",
|
|
56
52
|
label: "Amazon Q",
|
|
57
|
-
skillsPath: ".amazonq/
|
|
58
|
-
format: "markdown",
|
|
53
|
+
skillsPath: ".amazonq/skills",
|
|
59
54
|
bespoke: true
|
|
60
55
|
},
|
|
61
56
|
{
|
|
62
57
|
id: "cline",
|
|
63
58
|
label: "Cline",
|
|
64
|
-
skillsPath: ".cline/
|
|
59
|
+
skillsPath: ".cline/skills",
|
|
60
|
+
// docs.cline.bot/customization/skills
|
|
65
61
|
instructionsFile: ".clinerules",
|
|
66
|
-
format: "markdown",
|
|
67
62
|
bespoke: true
|
|
68
63
|
},
|
|
69
64
|
{
|
|
70
65
|
id: "gemini",
|
|
71
66
|
label: "Gemini Code Assist",
|
|
72
|
-
skillsPath: ".gemini",
|
|
73
|
-
|
|
74
|
-
format: "markdown",
|
|
67
|
+
skillsPath: ".gemini/skills",
|
|
68
|
+
// geminicli.com/docs/cli/skills
|
|
75
69
|
bespoke: true
|
|
76
70
|
},
|
|
77
71
|
{
|
|
78
72
|
id: "aider",
|
|
79
73
|
label: "Aider",
|
|
80
|
-
skillsPath: ".
|
|
74
|
+
skillsPath: ".agents/skills",
|
|
75
|
+
// neutral cross-tool skills location
|
|
81
76
|
instructionsFile: "AGENTS.md",
|
|
82
|
-
format: "markdown",
|
|
83
77
|
bespoke: true
|
|
84
78
|
},
|
|
85
79
|
{
|
|
86
80
|
id: "agents-md",
|
|
87
|
-
label: "Any AGENTS.md
|
|
88
|
-
skillsPath: ".
|
|
81
|
+
label: "Any Agent-Skills / AGENTS.md tool (catch-all)",
|
|
82
|
+
skillsPath: ".agents/skills",
|
|
83
|
+
// the emerging neutral standard (per GitHub Copilot docs)
|
|
89
84
|
instructionsFile: "AGENTS.md",
|
|
90
|
-
format: "markdown",
|
|
91
85
|
bespoke: false
|
|
92
86
|
}
|
|
93
87
|
];
|
|
@@ -124,10 +118,18 @@ function aidlcRootFor(agent) {
|
|
|
124
118
|
void agent;
|
|
125
119
|
return "nvaid/rules";
|
|
126
120
|
}
|
|
127
|
-
function withHeader(body
|
|
128
|
-
if (
|
|
129
|
-
|
|
130
|
-
|
|
121
|
+
function withHeader(body) {
|
|
122
|
+
if (body.startsWith("---\n")) {
|
|
123
|
+
const end = body.indexOf("\n---", 4);
|
|
124
|
+
if (end !== -1) {
|
|
125
|
+
const closeLineEnd = body.indexOf("\n", end + 1);
|
|
126
|
+
const cut = closeLineEnd === -1 ? body.length : closeLineEnd + 1;
|
|
127
|
+
const front = body.slice(0, cut);
|
|
128
|
+
const rest = body.slice(cut);
|
|
129
|
+
return `${front}
|
|
130
|
+
${DO_NOT_EDIT}
|
|
131
|
+
${rest}`;
|
|
132
|
+
}
|
|
131
133
|
}
|
|
132
134
|
return `${DO_NOT_EDIT}
|
|
133
135
|
|
|
@@ -144,19 +146,17 @@ async function listCommandFiles() {
|
|
|
144
146
|
async function renderTemplate(srcFile, agent) {
|
|
145
147
|
const raw = await readFile(srcFile, "utf8");
|
|
146
148
|
const substituted = raw.split(AIDLC_ROOT_TOKEN).join(aidlcRootFor(agent));
|
|
147
|
-
return withHeader(substituted
|
|
149
|
+
return withHeader(substituted);
|
|
148
150
|
}
|
|
149
151
|
function skillTarget(projectRoot, agent, skill) {
|
|
150
|
-
|
|
151
|
-
return join(projectRoot, agent.skillsPath, `${skill}.${ext}`);
|
|
152
|
+
return join(projectRoot, agent.skillsPath, skill, "SKILL.md");
|
|
152
153
|
}
|
|
153
154
|
function commandTarget(projectRoot, agent, cmdFile) {
|
|
154
155
|
const base = cmdFile.replace(/\.md$/, "");
|
|
155
|
-
const ext = agent.format === "mdc" ? "mdc" : "md";
|
|
156
156
|
if (agent.commandsPath) {
|
|
157
|
-
return join(projectRoot, agent.commandsPath, "nvaid", `${base}
|
|
157
|
+
return join(projectRoot, agent.commandsPath, "nvaid", `${base}.md`);
|
|
158
158
|
}
|
|
159
|
-
return join(projectRoot, agent.skillsPath,
|
|
159
|
+
return join(projectRoot, agent.skillsPath, `nvaid-${base}`, "SKILL.md");
|
|
160
160
|
}
|
|
161
161
|
async function writeFileEnsuringDir(path, body, force, result) {
|
|
162
162
|
if (!force && existsSync(path)) {
|
|
@@ -211,11 +211,22 @@ async function diffAgentFiles(opts) {
|
|
|
211
211
|
return drift;
|
|
212
212
|
}
|
|
213
213
|
async function cleanAgentDirs(projectRoot, agents) {
|
|
214
|
+
const skills = await listSkillDirs().catch(() => []);
|
|
214
215
|
for (const agent of agents) {
|
|
215
|
-
|
|
216
|
-
|
|
216
|
+
if (agent.commandsPath) {
|
|
217
|
+
await rmIfExists(join(projectRoot, agent.commandsPath, "nvaid"));
|
|
218
|
+
}
|
|
219
|
+
await rmIfExists(join(projectRoot, agent.skillsPath, "commands"));
|
|
220
|
+
await rmIfExists(join(projectRoot, agent.skillsPath, "nvaid-commands"));
|
|
221
|
+
for (const skill of skills) {
|
|
222
|
+
await rmIfExists(join(projectRoot, agent.skillsPath, `${skill}.md`));
|
|
223
|
+
await rmIfExists(join(projectRoot, agent.skillsPath, `${skill}.mdc`));
|
|
224
|
+
}
|
|
217
225
|
}
|
|
218
226
|
}
|
|
227
|
+
async function rmIfExists(path) {
|
|
228
|
+
if (existsSync(path)) await rm(path, { recursive: true, force: true });
|
|
229
|
+
}
|
|
219
230
|
|
|
220
231
|
// src/scaffold.ts
|
|
221
232
|
import { cp, mkdir as mkdir2, readdir as readdir2 } from "fs/promises";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@novare-technologies/nvaid",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
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": {
|
|
@@ -12,7 +12,7 @@ status: draft
|
|
|
12
12
|
**What this file is:** the field shape and creation rules for how Fig. 2's Intent-to-Release
|
|
13
13
|
artifacts show up in Jira or GitHub Projects — one Epic per Intent, one Story or Bug per
|
|
14
14
|
Unit of Work, bundled for shipping by Release Checkpoint rather than by sprint — so the
|
|
15
|
-
tracker and the `
|
|
15
|
+
tracker and the `nvaid/` artifacts never disagree about what was decided.
|
|
16
16
|
|
|
17
17
|
**What this file is not:** not a replacement for `intent.md`, `unit-breakdown.md`, or any
|
|
18
18
|
contract file. The tracker is the *tracking* layer — status, ownership, checkpoint
|
|
@@ -21,7 +21,7 @@ agreed, in full, versioned in git. A ticket field never carries content that onl
|
|
|
21
21
|
the ticket; if it's worth writing down, it's worth writing into the file the AI agent
|
|
22
22
|
actually reads, and the ticket links to it.
|
|
23
23
|
|
|
24
|
-
**Companion files:** [PROJECT-RULES.md](
|
|
24
|
+
**Companion files:** [PROJECT-RULES.md](../PROJECT-RULES.md) §7 rule 11 is the operating
|
|
25
25
|
rule this file implements. [unit-breakdown-rules.md](./unit-breakdown-rules.md) governs
|
|
26
26
|
*how* a Unit of Work is decided and classified before it ever becomes the ticket
|
|
27
27
|
described here. The worked example in `docs/templates/samples/` is what every link below
|
|
@@ -45,7 +45,7 @@ A ticket holds three kinds of information, and only two of them belong in ticket
|
|
|
45
45
|
2. **Links to content** (the Intent, the contracts, the design docs) — belongs in ticket
|
|
46
46
|
fields, as links, never as pasted text.
|
|
47
47
|
3. **The content itself** (what the API contract actually says, what the acceptance
|
|
48
|
-
criteria actually are) — belongs *only* in the `
|
|
48
|
+
criteria actually are) — belongs *only* in the `nvaid/` artifact. Pasting it into
|
|
49
49
|
a ticket description creates a second copy that drifts the first time either one is
|
|
50
50
|
edited without the other, and the AI agent isn't the one reading the ticket anyway — it
|
|
51
51
|
reads the file.
|
|
@@ -20,7 +20,7 @@ governs that), not the ceremony's choreography (the AI-Native Engineering Model'
|
|
|
20
20
|
one specific judgment call: given an approved Intent, what its Units of Work are.
|
|
21
21
|
|
|
22
22
|
**Companion files:** [ISSUE-TRACKER-TEMPLATE.md](./ISSUE-TRACKER-TEMPLATE.md) is where a
|
|
23
|
-
Unit of Work, once decided here, becomes a ticket. [PROJECT-RULES.md](
|
|
23
|
+
Unit of Work, once decided here, becomes a ticket. [PROJECT-RULES.md](../PROJECT-RULES.md)
|
|
24
24
|
§7 rule 12 is the operating rule this file implements.
|
|
25
25
|
|
|
26
26
|
---
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: r3-analytics
|
|
3
3
|
description: Gathers checkpoint-to-checkpoint performance indicators (lead time, gate pass rate, escaped defects, Known Gaps) for R3's Retrospective step. Use when asked to run the R3 Analytics Skill or prepare Retrospective data after a Release Checkpoint ships.
|
|
4
4
|
invoked_by: R3 (Ceremony 4), triggered by a Release Checkpoint shipping
|
|
5
|
-
output: file — process/retro-<checkpoint>.md
|
|
5
|
+
output: file — nvaid/process/retro-<checkpoint>.md
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# R3 Analytics Skill
|
|
@@ -17,8 +17,8 @@ looks at, so "what does the data actually say" has an answer ready the moment R3
|
|
|
17
17
|
escaped defects logged against this checkpoint's Units.
|
|
18
18
|
3. Roll up every Known Gap logged across this checkpoint's Quality Architecture
|
|
19
19
|
Contracts — a gap doesn't disappear just because the checkpoint shipped.
|
|
20
|
-
4. Draft `process/retro-<checkpoint>.md` with the above, structured for the room to
|
|
21
|
-
before proposing Regenerate edits.
|
|
20
|
+
4. Draft `nvaid/process/retro-<checkpoint>.md` with the above, structured for the room to
|
|
21
|
+
read before proposing Regenerate edits.
|
|
22
22
|
|
|
23
23
|
## Boundaries
|
|
24
24
|
|