@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/rules",
34
- commandsPath: ".cursor/commands",
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/rules",
51
- format: "markdown",
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/rules",
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/rules",
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
- instructionsFile: ".gemini/styleguide.md",
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: ".nvaid/skills",
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-compatible tool (catch-all)",
88
- skillsPath: ".nvaid/skills",
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, format) {
128
- if (format === "mdc") {
129
- return `${DO_NOT_EDIT}
130
- ${body}`;
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, agent.format);
149
+ return withHeader(substituted);
148
150
  }
149
151
  function skillTarget(projectRoot, agent, skill) {
150
- const ext = agent.format === "mdc" ? "mdc" : "md";
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}.${ext}`);
157
+ return join(projectRoot, agent.commandsPath, "nvaid", `${base}.md`);
158
158
  }
159
- return join(projectRoot, agent.skillsPath, "nvaid-commands", `nvaid-${base}.${ext}`);
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
- const commandsDir = agent.commandsPath ? join(projectRoot, agent.commandsPath, "nvaid") : join(projectRoot, agent.skillsPath, "nvaid-commands");
216
- if (existsSync(commandsDir)) await rm(commandsDir, { recursive: true, force: true });
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.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": {
@@ -84,4 +84,4 @@ context: ""
84
84
 
85
85
  # nvaid version this repo was last generated against. `nvaid validate` compares the
86
86
  # installed CLI version to this and flags drift.
87
- generated_with: "0.2.2"
87
+ generated_with: "0.2.4"
@@ -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 `aidlc-docs/` artifacts never disagree about what was decided.
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](./PROJECT-RULES.md) §7 rule 11 is the operating
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 `aidlc-docs/` artifact. Pasting it into
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](./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 read
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