mvc-kit 2.13.1 → 2.13.2

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.
Files changed (22) hide show
  1. package/agent-config/claude-code/agents/mvc-kit-architect.md +2 -2
  2. package/agent-config/claude-code/skills/{guide → mvc-kit}/SKILL.md +1 -1
  3. package/agent-config/lib/install-claude.mjs +39 -116
  4. package/package.json +1 -1
  5. /package/agent-config/claude-code/skills/{guide → mvc-kit}/anti-patterns.md +0 -0
  6. /package/agent-config/claude-code/skills/{guide → mvc-kit}/api-reference.md +0 -0
  7. /package/agent-config/claude-code/skills/{guide → mvc-kit}/patterns.md +0 -0
  8. /package/agent-config/claude-code/skills/{guide → mvc-kit}/recipes.md +0 -0
  9. /package/agent-config/claude-code/skills/{guide → mvc-kit}/testing.md +0 -0
  10. /package/agent-config/claude-code/skills/{review → mvc-kit-review}/SKILL.md +0 -0
  11. /package/agent-config/claude-code/skills/{review → mvc-kit-review}/checklist.md +0 -0
  12. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/SKILL.md +0 -0
  13. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/channel.md +0 -0
  14. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/collection.md +0 -0
  15. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/controller.md +0 -0
  16. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/eventbus.md +0 -0
  17. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/model.md +0 -0
  18. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/page-component.md +0 -0
  19. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/persistent-collection.md +0 -0
  20. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/resource.md +0 -0
  21. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/service.md +0 -0
  22. /package/agent-config/claude-code/skills/{scaffold → mvc-kit-scaffold}/templates/viewmodel.md +0 -0
@@ -6,14 +6,14 @@ tools: Read, Grep, Glob, Bash
6
6
  memory: project
7
7
  color: blue
8
8
  skills:
9
- - mvc-kit-guide
9
+ - mvc-kit
10
10
  ---
11
11
 
12
12
  You are an architecture planning agent for applications built with **mvc-kit**, a TypeScript-first reactive state management library for React. You help developers plan features by deciding which classes to create, designing state shapes, and selecting sharing patterns.
13
13
 
14
14
  ## Documentation
15
15
 
16
- The mvc-kit framework reference skill is preloaded into this agent's context. For deeper reference, read the supporting files in the mvc-kit skill directory (search for `.claude/skills/mvc-kit/` or `node_modules/mvc-kit/agent-config/claude-code/skills/guide/`):
16
+ The mvc-kit framework reference skill is preloaded into this agent's context. For deeper reference, read the supporting files in the mvc-kit skill directory (search for `.claude/skills/mvc-kit/` or `node_modules/mvc-kit/agent-config/claude-code/skills/mvc-kit/`):
17
17
 
18
18
  - `api-reference.md` — Full API reference for all classes and hooks
19
19
  - `patterns.md` — Prescribed patterns with code examples
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: mvc-kit-guide
2
+ name: mvc-kit
3
3
  description: "mvc-kit framework reference — class roles, architecture rules, React hooks, and decision framework. Use when working with mvc-kit imports or planning mvc-kit features."
4
4
  user-invocable: false
5
5
  ---
@@ -1,37 +1,36 @@
1
- import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, copyFileSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
1
+ import { cpSync, mkdirSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, dirname, relative } from 'node:path';
3
3
  import { fileURLToPath } from 'node:url';
4
4
 
5
5
  const __filename = fileURLToPath(import.meta.url);
6
6
  const __dirname = dirname(__filename);
7
- const SKILLS_DIR = join(__dirname, '..', 'claude-code', 'skills');
8
- const AGENTS_DIR = join(__dirname, '..', 'claude-code', 'agents');
9
-
10
- const AUTO_HEADER = '<!-- Auto-generated by mvc-kit. Updated on npm install/update. Do not edit. -->';
11
-
12
- function stripFrontmatter(content) {
13
- const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
14
- return match ? match[1].trim() : content.trim();
15
- }
16
-
17
- /** Insert auto-generated header after YAML frontmatter (preserves parsing). */
18
- function addHeader(content) {
19
- const match = content.match(/^(---\n[\s\S]*?\n---\n)([\s\S]*)$/);
20
- if (match) {
21
- return match[1] + '\n' + AUTO_HEADER + '\n\n' + match[2].trim() + '\n';
22
- }
23
- return AUTO_HEADER + '\n\n' + content;
24
- }
25
-
26
- function ensureDir(dir) {
27
- if (!existsSync(dir)) {
28
- mkdirSync(dir, { recursive: true });
7
+ const SOURCE_DIR = join(__dirname, '..', 'claude-code');
8
+
9
+ const SKILL_NAMES = ['mvc-kit', 'mvc-kit-review', 'mvc-kit-scaffold'];
10
+ const AGENT_FILES = ['mvc-kit-architect.md'];
11
+
12
+ function listFilesRecursive(dir) {
13
+ const out = [];
14
+ for (const entry of readdirSync(dir)) {
15
+ const full = join(dir, entry);
16
+ if (statSync(full).isDirectory()) {
17
+ for (const nested of listFilesRecursive(full)) {
18
+ out.push(join(entry, nested));
19
+ }
20
+ } else {
21
+ out.push(entry);
22
+ }
29
23
  }
24
+ return out;
30
25
  }
31
26
 
32
27
  /**
33
28
  * Install Claude Code integration files into a project's .claude/ directory.
34
29
  *
30
+ * Source directories under `agent-config/claude-code/` are copied verbatim —
31
+ * no frontmatter rewriting, no header injection. Source files are authored
32
+ * in their final installed form.
33
+ *
35
34
  * Creates:
36
35
  * .claude/skills/mvc-kit/ — Framework reference skill + supporting docs
37
36
  * .claude/skills/mvc-kit-review/ — Code review skill + checklist
@@ -39,109 +38,33 @@ function ensureDir(dir) {
39
38
  * .claude/agents/mvc-kit-architect.md — Architecture planning agent
40
39
  *
41
40
  * @param {string} projectRoot — Absolute path to the consuming project's root
42
- * @returns {{ files: string[] }} — List of created/updated file paths (relative to projectRoot)
41
+ * @returns {{ files: string[] }} — List of installed file paths (relative to projectRoot)
43
42
  */
44
43
  export function installClaude(projectRoot) {
45
44
  const claudeDir = join(projectRoot, '.claude');
46
- const guideDir = join(claudeDir, 'skills', 'mvc-kit');
47
- const reviewDir = join(claudeDir, 'skills', 'mvc-kit-review');
48
- const scaffoldDir = join(claudeDir, 'skills', 'mvc-kit-scaffold');
49
- const templatesDir = join(scaffoldDir, 'templates');
50
- const agentsDir = join(claudeDir, 'agents');
45
+ const skillsDest = join(claudeDir, 'skills');
46
+ const agentsDest = join(claudeDir, 'agents');
51
47
 
52
- ensureDir(guideDir);
53
- ensureDir(reviewDir);
54
- ensureDir(scaffoldDir);
55
- ensureDir(templatesDir);
56
- ensureDir(agentsDir);
48
+ mkdirSync(skillsDest, { recursive: true });
49
+ mkdirSync(agentsDest, { recursive: true });
57
50
 
58
51
  const files = [];
59
52
 
60
- // ─── 1. Guide skill framework reference (model-invocable, auto-loaded) ───
61
-
62
- const guideSkill = readFileSync(join(SKILLS_DIR, 'guide', 'SKILL.md'), 'utf-8');
63
- const guideBody = stripFrontmatter(guideSkill)
64
- // Remove the "Supporting Files" section — replaced with colocated file references below
65
- .replace(/\n## Supporting Files[\s\S]*$/, '');
66
-
67
- const GUIDE_FRONTMATTER = `---
68
- name: mvc-kit
69
- description: "mvc-kit framework reference — class roles, architecture rules, React hooks, and decision framework. Loaded on-demand when working with mvc-kit code."
70
- user-invocable: false
71
- ---`;
72
-
73
- const skillContent = GUIDE_FRONTMATTER + '\n\n' + AUTO_HEADER + '\n\n' + guideBody + `
74
-
75
- ## Supporting Files
76
-
77
- - [api-reference.md](api-reference.md) — Full API reference for all classes and hooks
78
- - [patterns.md](patterns.md) — Prescribed patterns with code examples
79
- - [anti-patterns.md](anti-patterns.md) — Anti-patterns to reject with fixes
80
- - [recipes.md](recipes.md) — Composition recipes for real-world features
81
- - [testing.md](testing.md) — Testing patterns (teardownAll, async assertions, memoization verification)
82
-
83
- ### Per-Class Documentation (in \`node_modules/mvc-kit/src/\`)
84
-
85
- For deep dives on any specific class or hook, search for the \`.md\` file by name:
86
-
87
- - **Core:** \`ViewModel.md\`, \`Model.md\`, \`Collection.md\`, \`PersistentCollection.md\`, \`Resource.md\`, \`Service.md\`, \`EventBus.md\`, \`Channel.md\`, \`Controller.md\`, \`Trackable.md\`, \`singleton.md\`
88
- - **Helpers:** \`Sorting.md\`, \`Pagination.md\`, \`Selection.md\`, \`Feed.md\`, \`Pending.md\`, \`produceDraft.md\`
89
- - **React hooks:** \`react/use-local.md\`, \`react/use-instance.md\`, \`react/use-singleton.md\`, \`react/use-model.md\`, \`react/use-event-bus.md\`, \`react/use-teardown.md\`
90
- - **Components:** \`react/components/DataTable.md\`, \`react/components/CardList.md\`, \`react/components/InfiniteScroll.md\`
91
- `;
92
-
93
- writeFileSync(join(guideDir, 'SKILL.md'), skillContent, 'utf-8');
94
- files.push('.claude/skills/mvc-kit/SKILL.md');
95
-
96
- // Copy supporting files alongside SKILL.md
97
- const guideSupportFiles = ['api-reference.md', 'patterns.md', 'anti-patterns.md', 'recipes.md', 'testing.md'];
98
- for (const file of guideSupportFiles) {
99
- const src = join(SKILLS_DIR, 'guide', file);
100
- if (existsSync(src)) {
101
- copyFileSync(src, join(guideDir, file));
102
- files.push(`.claude/skills/mvc-kit/${file}`);
53
+ for (const skill of SKILL_NAMES) {
54
+ const src = join(SOURCE_DIR, 'skills', skill);
55
+ const dest = join(skillsDest, skill);
56
+ cpSync(src, dest, { recursive: true, force: true });
57
+ for (const rel of listFilesRecursive(src)) {
58
+ files.push(`.claude/skills/${skill}/${rel}`);
103
59
  }
104
60
  }
105
61
 
106
- // ─── 2. Review skill — code review with checklist ──────────────────────────
107
-
108
- const reviewSkill = readFileSync(join(SKILLS_DIR, 'review', 'SKILL.md'), 'utf-8');
109
- writeFileSync(join(reviewDir, 'SKILL.md'), addHeader(reviewSkill), 'utf-8');
110
- files.push('.claude/skills/mvc-kit-review/SKILL.md');
111
-
112
- copyFileSync(
113
- join(SKILLS_DIR, 'review', 'checklist.md'),
114
- join(reviewDir, 'checklist.md'),
115
- );
116
- files.push('.claude/skills/mvc-kit-review/checklist.md');
117
-
118
- // ─── 3. Scaffold skill — code generation with templates ────────────────────
119
-
120
- const scaffoldSkill = readFileSync(join(SKILLS_DIR, 'scaffold', 'SKILL.md'), 'utf-8');
121
- writeFileSync(join(scaffoldDir, 'SKILL.md'), addHeader(scaffoldSkill), 'utf-8');
122
- files.push('.claude/skills/mvc-kit-scaffold/SKILL.md');
123
-
124
- const templatesSrc = join(SKILLS_DIR, 'scaffold', 'templates');
125
- if (existsSync(templatesSrc)) {
126
- for (const file of readdirSync(templatesSrc)) {
127
- if (file.endsWith('.md')) {
128
- copyFileSync(join(templatesSrc, file), join(templatesDir, file));
129
- files.push(`.claude/skills/mvc-kit-scaffold/templates/${file}`);
130
- }
131
- }
62
+ for (const agent of AGENT_FILES) {
63
+ const src = join(SOURCE_DIR, 'agents', agent);
64
+ const dest = join(agentsDest, agent);
65
+ cpSync(src, dest, { force: true });
66
+ files.push(`.claude/agents/${agent}`);
132
67
  }
133
68
 
134
- // ─── 4. Architect agent ────────────────────────────────────────────────────
135
-
136
- let architectAgent = readFileSync(join(AGENTS_DIR, 'mvc-kit-architect.md'), 'utf-8');
137
- // The source agent preloads "mvc-kit-guide" (the source skill name).
138
- // In the installed context the guide skill is named "mvc-kit", so fix the reference.
139
- architectAgent = architectAgent.replace(
140
- /^(\s*- )mvc-kit-guide$/m,
141
- '$1mvc-kit',
142
- );
143
- writeFileSync(join(agentsDir, 'mvc-kit-architect.md'), addHeader(architectAgent), 'utf-8');
144
- files.push('.claude/agents/mvc-kit-architect.md');
145
-
146
69
  return { files };
147
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mvc-kit",
3
- "version": "2.13.1",
3
+ "version": "2.13.2",
4
4
  "description": "Zero-magic, class-based reactive ViewModel library",
5
5
  "type": "module",
6
6
  "main": "./dist/mvc-kit.cjs",