@infinitedusky/indusk-mcp 1.2.8 → 1.3.0

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.
@@ -204,6 +204,10 @@ export async function extensionsAdd(projectRoot, name, from) {
204
204
  catch {
205
205
  // leave as-is if parsing fails
206
206
  }
207
+ // If source is npm, install the underlying package
208
+ if (from.startsWith("npm:")) {
209
+ installNpmPackage(projectRoot, name, from.slice(4));
210
+ }
207
211
  const targetPath = join(extensionsDir(projectRoot), `${name}.json`);
208
212
  writeFileSync(targetPath, manifestContent);
209
213
  console.info(` ${name}: added from ${from}`);
@@ -230,6 +234,31 @@ export async function extensionsAdd(projectRoot, name, from) {
230
234
  // ignore parse errors
231
235
  }
232
236
  }
237
+ function installNpmPackage(projectRoot, extName, pkg) {
238
+ const pm = existsSync(join(projectRoot, "pnpm-lock.yaml"))
239
+ ? "pnpm"
240
+ : existsSync(join(projectRoot, "yarn.lock"))
241
+ ? "yarn"
242
+ : "npm";
243
+ const isWorkspace = existsSync(join(projectRoot, "pnpm-workspace.yaml"));
244
+ const addCmd = pm === "pnpm"
245
+ ? `pnpm add -D ${isWorkspace ? "-w " : ""}${pkg}@latest`
246
+ : pm === "yarn"
247
+ ? `yarn add -D ${pkg}@latest`
248
+ : `npm install -D ${pkg}@latest`;
249
+ console.info(` ${extName}: running ${addCmd}...`);
250
+ try {
251
+ execSync(addCmd, {
252
+ cwd: projectRoot,
253
+ timeout: 60000,
254
+ encoding: "utf-8",
255
+ });
256
+ console.info(` ${extName}: package installed`);
257
+ }
258
+ catch {
259
+ console.info(` ${extName}: auto-install failed. Run manually: ${addCmd}`);
260
+ }
261
+ }
233
262
  export async function extensionsRemove(projectRoot, names) {
234
263
  for (const name of names) {
235
264
  const enPath = join(extensionsDir(projectRoot), `${name}.json`);
@@ -278,31 +307,7 @@ export async function extensionsUpdate(projectRoot, names) {
278
307
  console.info(` ${name}: updating from ${source}...`);
279
308
  // If source is npm, update the installed package FIRST so we get the latest
280
309
  if (source.startsWith("npm:")) {
281
- const pkg = source.slice(4);
282
- // Detect package manager
283
- const pm = existsSync(join(projectRoot, "pnpm-lock.yaml"))
284
- ? "pnpm"
285
- : existsSync(join(projectRoot, "yarn.lock"))
286
- ? "yarn"
287
- : "npm";
288
- const isWorkspace = existsSync(join(projectRoot, "pnpm-workspace.yaml"));
289
- const addCmd = pm === "pnpm"
290
- ? `pnpm add -D ${isWorkspace ? "-w " : ""}${pkg}@latest`
291
- : pm === "yarn"
292
- ? `yarn add -D ${pkg}@latest`
293
- : `npm install -D ${pkg}@latest`;
294
- console.info(` ${name}: running ${addCmd}...`);
295
- try {
296
- execSync(addCmd, {
297
- cwd: projectRoot,
298
- timeout: 60000,
299
- encoding: "utf-8",
300
- });
301
- console.info(` ${name}: package updated`);
302
- }
303
- catch {
304
- console.info(` ${name}: auto-update failed. Run manually: ${addCmd}`);
305
- }
310
+ installNpmPackage(projectRoot, name, source.slice(4));
306
311
  }
307
312
  // Then fetch the latest manifest (from the now-updated package)
308
313
  await extensionsAdd(projectRoot, name, source);
@@ -231,6 +231,12 @@ Architecture decision records for ${projectName}. Each decision documents what w
231
231
  writeFileSync(join(docsDir, "src/lessons/index.md"), `# Lessons Learned
232
232
 
233
233
  Insights from building ${projectName}. Each lesson captures what we learned, what surprised us, and what we'd do differently.
234
+ `);
235
+ writeFileSync(join(docsDir, "src/changelog.md"), `# Changelog
236
+
237
+ All notable changes to ${projectName} are documented here. Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
238
+
239
+ ## [Unreleased]
234
240
  `);
235
241
  // Dockerfile for local dev
236
242
  const dockerDir = join(projectRoot, "docker");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infinitedusky/indusk-mcp",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "description": "InDusk development system — skills, MCP tools, and CLI for structured AI-assisted development",
5
5
  "type": "module",
6
6
  "files": [
@@ -60,7 +60,8 @@ apps/indusk-docs/src/
60
60
  │ ├── skills/ # One page per skill
61
61
  │ └── tools/ # One page per tool (Biome, CGC, composable.env)
62
62
  ├── decisions/ # Distilled from ADRs during retrospective/archival
63
- └── lessons/ # Distilled from retrospective insights during archival
63
+ ├── lessons/ # Distilled from retrospective insights during archival
64
+ └── changelog.md # Version history — Added, Changed, Fixed, etc.
64
65
  ```
65
66
 
66
67
  **CRITICAL: Every new page must be added to the sidebar.** The sidebar is configured in a single file: `apps/indusk-docs/src/.vitepress/config.ts` under `themeConfig.sidebar`. If you create a page but don't add it to the sidebar, it is invisible — users cannot navigate to it. This is the most common documentation mistake.
@@ -79,11 +80,29 @@ Never consider a documentation item complete until the sidebar entry exists.
79
80
 
80
81
  | What changed | Where to document | Doc type |
81
82
  |---|---|---|
82
- | New feature or tool | `reference/` | Reference page |
83
- | New workflow or process | `guide/` | How-to guide |
84
- | Configuration change | `reference/` (update existing page) | Reference update |
85
- | Architecture change | `reference/` + diagram | Reference + diagram |
86
- | Nothing user-facing | Skip | |
83
+ | New feature or tool | `reference/` + changelog | Reference page + Added |
84
+ | New workflow or process | `guide/` + changelog | How-to guide + Added |
85
+ | Configuration change | `reference/` (update existing) + changelog | Reference update + Changed |
86
+ | Bug fix | Existing page (if relevant) + changelog | Fixed |
87
+ | Architecture change | `reference/` + diagram + changelog | Reference + diagram + Changed |
88
+ | Nothing user-facing | Skip changelog | — |
89
+
90
+ ### Changelog
91
+
92
+ The changelog lives at `changelog.md` in the docs site. It uses [Keep a Changelog](https://keepachangelog.com) categories:
93
+
94
+ - **Added** — new features (from `feature` workflow plans)
95
+ - **Changed** — changes to existing functionality (from `refactor` workflows)
96
+ - **Fixed** — bug fixes (from `bugfix` workflows)
97
+ - **Deprecated** — soon to be removed
98
+ - **Removed** — removed features
99
+ - **Security** — vulnerability fixes
100
+
101
+ **When to write:** During the Document gate of each phase that changes user-facing behavior. Add the entry under `## [Unreleased]`. At publish time, move Unreleased entries into a versioned section.
102
+
103
+ **What to write:** One line per change. Human-readable — what users gain, not what code changed. The workflow type from the impl frontmatter tells you the category (feature → Added, bugfix → Fixed, refactor → Changed).
104
+
105
+ **During planning:** The ADR's Documentation Plan section should include planned changelog entries. This forces you to think about user impact during planning, not after.
87
106
 
88
107
  ### Decisions and Lessons
89
108