@horiastanxd/claude-init 0.1.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.
- package/LICENSE +21 -0
- package/README.md +223 -0
- package/dist/analyzer/code-patterns.d.ts +2 -0
- package/dist/analyzer/code-patterns.js +71 -0
- package/dist/analyzer/code-patterns.js.map +1 -0
- package/dist/analyzer/commands.d.ts +2 -0
- package/dist/analyzer/commands.js +86 -0
- package/dist/analyzer/commands.js.map +1 -0
- package/dist/analyzer/env-vars.d.ts +3 -0
- package/dist/analyzer/env-vars.js +42 -0
- package/dist/analyzer/env-vars.js.map +1 -0
- package/dist/analyzer/git-history.d.ts +2 -0
- package/dist/analyzer/git-history.js +41 -0
- package/dist/analyzer/git-history.js.map +1 -0
- package/dist/analyzer/index.d.ts +3 -0
- package/dist/analyzer/index.js +44 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/analyzer/project-structure.d.ts +2 -0
- package/dist/analyzer/project-structure.js +95 -0
- package/dist/analyzer/project-structure.js.map +1 -0
- package/dist/analyzer/tech-stack.d.ts +2 -0
- package/dist/analyzer/tech-stack.js +141 -0
- package/dist/analyzer/tech-stack.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +129 -0
- package/dist/cli.js.map +1 -0
- package/dist/generators/agents-md.d.ts +6 -0
- package/dist/generators/agents-md.js +12 -0
- package/dist/generators/agents-md.js.map +1 -0
- package/dist/generators/claude-md.d.ts +2 -0
- package/dist/generators/claude-md.js +5 -0
- package/dist/generators/claude-md.js.map +1 -0
- package/dist/generators/copilot-instructions.d.ts +2 -0
- package/dist/generators/copilot-instructions.js +5 -0
- package/dist/generators/copilot-instructions.js.map +1 -0
- package/dist/generators/cursor-rules.d.ts +2 -0
- package/dist/generators/cursor-rules.js +5 -0
- package/dist/generators/cursor-rules.js.map +1 -0
- package/dist/generators/gemini-md.d.ts +2 -0
- package/dist/generators/gemini-md.js +5 -0
- package/dist/generators/gemini-md.js.map +1 -0
- package/dist/generators/index.d.ts +11 -0
- package/dist/generators/index.js +43 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/registry.d.ts +21 -0
- package/dist/generators/registry.js +108 -0
- package/dist/generators/registry.js.map +1 -0
- package/dist/generators/render.d.ts +19 -0
- package/dist/generators/render.js +58 -0
- package/dist/generators/render.js.map +1 -0
- package/dist/generators/sections.d.ts +9 -0
- package/dist/generators/sections.js +96 -0
- package/dist/generators/sections.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +98 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +53 -0
- package/dist/utils.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +13 -0
- package/dist/version.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { renderFull, renderRules, withCursorFrontmatter } from './render.js';
|
|
3
|
+
export const TARGETS = [
|
|
4
|
+
{
|
|
5
|
+
id: 'claude',
|
|
6
|
+
label: 'Claude Code',
|
|
7
|
+
tools: 'Claude Code',
|
|
8
|
+
files: [{ path: 'CLAUDE.md', render: (a) => renderFull(a, { title: a.name }) }],
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
id: 'agents',
|
|
12
|
+
label: 'AGENTS.md (open standard)',
|
|
13
|
+
tools: 'OpenAI Codex, Jules, Amp, Zed, Devin, RooCode, Factory, and 20+ agents',
|
|
14
|
+
files: [
|
|
15
|
+
{
|
|
16
|
+
path: 'AGENTS.md',
|
|
17
|
+
render: (a) => renderFull(a, {
|
|
18
|
+
title: 'AGENTS.md',
|
|
19
|
+
intro: `Instructions for AI coding agents working in **${a.name}**.`,
|
|
20
|
+
}),
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 'cursor',
|
|
26
|
+
label: 'Cursor',
|
|
27
|
+
tools: 'Cursor (modern .mdc project rules)',
|
|
28
|
+
files: [
|
|
29
|
+
{
|
|
30
|
+
path: join('.cursor', 'rules', 'project.mdc'),
|
|
31
|
+
render: (a) => withCursorFrontmatter(renderRules(a, { title: a.name }), a.name),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: 'windsurf',
|
|
37
|
+
label: 'Windsurf',
|
|
38
|
+
tools: 'Windsurf / Codeium',
|
|
39
|
+
files: [
|
|
40
|
+
{
|
|
41
|
+
path: join('.windsurf', 'rules', 'project.md'),
|
|
42
|
+
render: (a) => renderRules(a, { title: a.name }),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'cline',
|
|
48
|
+
label: 'Cline',
|
|
49
|
+
tools: 'Cline, Roo Code',
|
|
50
|
+
files: [
|
|
51
|
+
{ path: join('.clinerules', 'project.md'), render: (a) => renderRules(a, { title: a.name }) },
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 'copilot',
|
|
56
|
+
label: 'GitHub Copilot',
|
|
57
|
+
tools: 'GitHub Copilot',
|
|
58
|
+
files: [
|
|
59
|
+
{
|
|
60
|
+
path: join('.github', 'copilot-instructions.md'),
|
|
61
|
+
render: (a) => renderRules(a, { title: `Copilot instructions for ${a.name}` }),
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'gemini',
|
|
67
|
+
label: 'Gemini CLI',
|
|
68
|
+
tools: 'Gemini CLI',
|
|
69
|
+
files: [{ path: 'GEMINI.md', render: (a) => renderFull(a, { title: a.name }) }],
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
id: 'aider',
|
|
73
|
+
label: 'Aider',
|
|
74
|
+
tools: 'Aider (CONVENTIONS.md)',
|
|
75
|
+
files: [{ path: 'CONVENTIONS.md', render: (a) => renderFull(a, { title: a.name }) }],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'junie',
|
|
79
|
+
label: 'JetBrains Junie',
|
|
80
|
+
tools: 'JetBrains Junie',
|
|
81
|
+
files: [
|
|
82
|
+
{
|
|
83
|
+
path: join('.junie', 'guidelines.md'),
|
|
84
|
+
render: (a) => renderFull(a, { title: a.name }),
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'warp',
|
|
90
|
+
label: 'Warp',
|
|
91
|
+
tools: 'Warp terminal',
|
|
92
|
+
files: [{ path: 'WARP.md', render: (a) => renderFull(a, { title: a.name }) }],
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
export const TARGET_IDS = TARGETS.map((t) => t.id);
|
|
96
|
+
/** Resolve requested ids (supports "all") into Target objects, preserving registry order. */
|
|
97
|
+
export function resolveTargets(requested) {
|
|
98
|
+
if (requested.length === 0 || requested.includes('all'))
|
|
99
|
+
return TARGETS;
|
|
100
|
+
const wanted = new Set(requested);
|
|
101
|
+
return TARGETS.filter((t) => wanted.has(t.id));
|
|
102
|
+
}
|
|
103
|
+
/** Returns the invalid ids from a request, if any. */
|
|
104
|
+
export function invalidTargets(requested) {
|
|
105
|
+
const valid = new Set([...TARGET_IDS, 'all']);
|
|
106
|
+
return requested.filter((r) => !valid.has(r));
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/generators/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAiB7E,MAAM,CAAC,MAAM,OAAO,GAAa;IAC/B;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;KAChF;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,wEAAwE;QAC/E,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CACZ,UAAU,CAAC,CAAC,EAAE;oBACZ,KAAK,EAAE,WAAW;oBAClB,KAAK,EAAE,kDAAkD,CAAC,CAAC,IAAI,KAAK;iBACrE,CAAC;aACL;SACF;KACF;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,oCAAoC;QAC3C,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC;gBAC7C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;aAChF;SACF;KACF;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,oBAAoB;QAC3B,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,CAAC;gBAC9C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aACjD;SACF;KACF;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;SAC9F;KACF;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,yBAAyB,CAAC;gBAChD,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,4BAA4B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;aAC/E;SACF;KACF;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;KAChF;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,wBAAwB;QAC/B,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;KACrF;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE,iBAAiB;QACxB,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;gBACrC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aAChD;SACF;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,eAAe;QACtB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;KAC9E;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE7D,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,SAAmB;IAChD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAAC,SAAmB;IAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProjectAnalysis } from '../types.js';
|
|
2
|
+
export interface RenderOpts {
|
|
3
|
+
/** Top-level heading, e.g. "demo-app" or "AGENTS.md". */
|
|
4
|
+
title: string;
|
|
5
|
+
/** Optional paragraph placed under the heading, before the description. */
|
|
6
|
+
intro?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Full reference document: stack, commands, structure, conventions, env, testing.
|
|
10
|
+
* Used by file-based context formats (CLAUDE.md, GEMINI.md, AGENTS.md, ...).
|
|
11
|
+
*/
|
|
12
|
+
export declare function renderFull(a: ProjectAnalysis, opts: RenderOpts): string;
|
|
13
|
+
/**
|
|
14
|
+
* Concise, imperative "rules" document. Editors like Cursor, Windsurf, Cline and
|
|
15
|
+
* Copilot work better with short directives than with a long reference doc.
|
|
16
|
+
*/
|
|
17
|
+
export declare function renderRules(a: ProjectAnalysis, opts: RenderOpts): string;
|
|
18
|
+
/** Wrap rules body in Cursor's modern `.mdc` frontmatter. */
|
|
19
|
+
export declare function withCursorFrontmatter(body: string, projectName: string): string;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { compose, stackSection, commandsSection, structureSection, conventionsSection, envSection, testingSection, } from './sections.js';
|
|
2
|
+
/**
|
|
3
|
+
* Full reference document: stack, commands, structure, conventions, env, testing.
|
|
4
|
+
* Used by file-based context formats (CLAUDE.md, GEMINI.md, AGENTS.md, ...).
|
|
5
|
+
*/
|
|
6
|
+
export function renderFull(a, opts) {
|
|
7
|
+
const parts = [`# ${opts.title}`];
|
|
8
|
+
if (opts.intro)
|
|
9
|
+
parts.push('', opts.intro);
|
|
10
|
+
if (a.description)
|
|
11
|
+
parts.push('', a.description);
|
|
12
|
+
const body = compose([
|
|
13
|
+
['Stack', stackSection(a)],
|
|
14
|
+
['Commands', commandsSection(a)],
|
|
15
|
+
['Project structure', structureSection(a)],
|
|
16
|
+
['Code conventions', conventionsSection(a)],
|
|
17
|
+
['Environment variables', envSection(a)],
|
|
18
|
+
['Testing', testingSection(a)],
|
|
19
|
+
]);
|
|
20
|
+
return `${parts.join('\n')}\n\n${body}`;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Concise, imperative "rules" document. Editors like Cursor, Windsurf, Cline and
|
|
24
|
+
* Copilot work better with short directives than with a long reference doc.
|
|
25
|
+
*/
|
|
26
|
+
export function renderRules(a, opts) {
|
|
27
|
+
const { techStack: t, commands: c } = a;
|
|
28
|
+
const lines = [
|
|
29
|
+
`# ${opts.title}`,
|
|
30
|
+
'',
|
|
31
|
+
`You are working in a ${t.language} project${t.framework ? ` using ${t.framework}` : ''}.`,
|
|
32
|
+
`Package manager: ${t.packageManager}.`,
|
|
33
|
+
];
|
|
34
|
+
const conv = conventionsSection(a);
|
|
35
|
+
if (conv)
|
|
36
|
+
lines.push('', '## Code style', conv);
|
|
37
|
+
const cmdLines = [];
|
|
38
|
+
if (c.dev)
|
|
39
|
+
cmdLines.push(`- Dev: \`${c.dev}\``);
|
|
40
|
+
if (c.test)
|
|
41
|
+
cmdLines.push(`- Test: \`${c.test}\``);
|
|
42
|
+
if (c.build)
|
|
43
|
+
cmdLines.push(`- Build: \`${c.build}\``);
|
|
44
|
+
if (c.lint)
|
|
45
|
+
cmdLines.push(`- Lint: \`${c.lint}\``);
|
|
46
|
+
if (cmdLines.length)
|
|
47
|
+
lines.push('', '## Commands', ...cmdLines);
|
|
48
|
+
if (a.envVars.length) {
|
|
49
|
+
lines.push('', '## Environment', `Config lives in \`.env.example\` (${a.envVars.length} variable(s)). Never hardcode secrets.`);
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n') + '\n';
|
|
52
|
+
}
|
|
53
|
+
/** Wrap rules body in Cursor's modern `.mdc` frontmatter. */
|
|
54
|
+
export function withCursorFrontmatter(body, projectName) {
|
|
55
|
+
const fm = ['---', `description: Project rules for ${projectName}`, 'alwaysApply: true', '---', ''];
|
|
56
|
+
return fm.join('\n') + body;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/generators/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProjectAnalysis } from '../types.js';
|
|
2
|
+
export declare function stackSection(a: ProjectAnalysis): string;
|
|
3
|
+
export declare function commandsSection(a: ProjectAnalysis): string;
|
|
4
|
+
export declare function structureSection(a: ProjectAnalysis): string;
|
|
5
|
+
export declare function conventionsSection(a: ProjectAnalysis): string;
|
|
6
|
+
export declare function envSection(a: ProjectAnalysis): string;
|
|
7
|
+
export declare function testingSection(a: ProjectAnalysis): string;
|
|
8
|
+
/** Join titled sections, dropping empty ones. */
|
|
9
|
+
export declare function compose(blocks: Array<[string, string]>): string;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export function stackSection(a) {
|
|
2
|
+
const { techStack: t } = a;
|
|
3
|
+
const lines = [`- Language: ${t.language}`];
|
|
4
|
+
if (t.framework)
|
|
5
|
+
lines.push(`- Framework: ${t.framework}`);
|
|
6
|
+
if (t.runtime)
|
|
7
|
+
lines.push(`- Runtime: ${t.runtime}`);
|
|
8
|
+
lines.push(`- Package manager: ${t.packageManager}`);
|
|
9
|
+
if (t.database)
|
|
10
|
+
lines.push(`- Database: ${t.database}`);
|
|
11
|
+
if (t.testing)
|
|
12
|
+
lines.push(`- Testing: ${t.testing}`);
|
|
13
|
+
if (t.buildTool)
|
|
14
|
+
lines.push(`- Build tool: ${t.buildTool}`);
|
|
15
|
+
if (t.extraLibraries.length)
|
|
16
|
+
lines.push(`- Notable libraries: ${t.extraLibraries.join(', ')}`);
|
|
17
|
+
return lines.join('\n');
|
|
18
|
+
}
|
|
19
|
+
export function commandsSection(a) {
|
|
20
|
+
const { commands: c } = a;
|
|
21
|
+
const pairs = [
|
|
22
|
+
['Install', c.install],
|
|
23
|
+
['Dev', c.dev],
|
|
24
|
+
['Build', c.build],
|
|
25
|
+
['Test', c.test],
|
|
26
|
+
['Lint', c.lint],
|
|
27
|
+
['Format', c.format],
|
|
28
|
+
];
|
|
29
|
+
const present = pairs.filter((p) => Boolean(p[1]));
|
|
30
|
+
if (!present.length)
|
|
31
|
+
return '';
|
|
32
|
+
const width = Math.max(...present.map(([, cmd]) => cmd.length));
|
|
33
|
+
const block = [
|
|
34
|
+
'```bash',
|
|
35
|
+
...present.map(([label, cmd]) => `${cmd.padEnd(width)} # ${label.toLowerCase()}`),
|
|
36
|
+
'```',
|
|
37
|
+
];
|
|
38
|
+
const extraKeys = Object.keys(c.extra);
|
|
39
|
+
if (extraKeys.length) {
|
|
40
|
+
block.push('', 'Other scripts:');
|
|
41
|
+
for (const key of extraKeys)
|
|
42
|
+
block.push(`- \`${c.extra[key]}\``);
|
|
43
|
+
}
|
|
44
|
+
return block.join('\n');
|
|
45
|
+
}
|
|
46
|
+
export function structureSection(a) {
|
|
47
|
+
if (!a.structure.tree)
|
|
48
|
+
return '';
|
|
49
|
+
return ['```', a.structure.tree, '```'].join('\n');
|
|
50
|
+
}
|
|
51
|
+
export function conventionsSection(a) {
|
|
52
|
+
const { codePatterns: p } = a;
|
|
53
|
+
const lines = [];
|
|
54
|
+
if (p.strict)
|
|
55
|
+
lines.push('- TypeScript strict mode is enabled - keep full type safety, avoid `any`.');
|
|
56
|
+
if (p.linter)
|
|
57
|
+
lines.push(`- Linter: ${p.linter}. Run it before committing.`);
|
|
58
|
+
if (p.formatter)
|
|
59
|
+
lines.push(`- Formatter: ${p.formatter}. Do not hand-format against it.`);
|
|
60
|
+
if (p.importStyle)
|
|
61
|
+
lines.push(`- Import style: ${p.importStyle}.`);
|
|
62
|
+
if (p.commitConvention)
|
|
63
|
+
lines.push(`- Commit convention: ${p.commitConvention}.`);
|
|
64
|
+
return lines.join('\n');
|
|
65
|
+
}
|
|
66
|
+
export function envSection(a) {
|
|
67
|
+
if (!a.envVars.length)
|
|
68
|
+
return '';
|
|
69
|
+
const lines = ['Copy `.env.example` to `.env` and set:'];
|
|
70
|
+
for (const v of a.envVars) {
|
|
71
|
+
const req = v.required ? '**required**' : 'optional';
|
|
72
|
+
const desc = v.description ? ` - ${v.description}` : '';
|
|
73
|
+
lines.push(`- \`${v.name}\` (${req})${desc}`);
|
|
74
|
+
}
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
export function testingSection(a) {
|
|
78
|
+
if (!a.tests.command)
|
|
79
|
+
return '';
|
|
80
|
+
const lines = ['```bash', a.tests.command, '```'];
|
|
81
|
+
if (a.tests.framework)
|
|
82
|
+
lines.unshift(`Framework: ${a.tests.framework}.`, '');
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
/** Join titled sections, dropping empty ones. */
|
|
86
|
+
export function compose(blocks) {
|
|
87
|
+
const out = [];
|
|
88
|
+
for (const [title, body] of blocks) {
|
|
89
|
+
if (!body.trim())
|
|
90
|
+
continue;
|
|
91
|
+
out.push(title ? `## ${title}` : '');
|
|
92
|
+
out.push(body, '');
|
|
93
|
+
}
|
|
94
|
+
return out.join('\n').replace(/\n{3,}/g, '\n\n').trimEnd() + '\n';
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/generators/sections.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { analyzeProject } from './analyzer/index.js';
|
|
2
|
+
export { generateAll, buildFiles, checkAll } from './generators/index.js';
|
|
3
|
+
export type { PlannedFile } from './generators/index.js';
|
|
4
|
+
export { TARGETS, TARGET_IDS, resolveTargets, invalidTargets } from './generators/registry.js';
|
|
5
|
+
export type { Target } from './generators/registry.js';
|
|
6
|
+
export { renderFull, renderRules } from './generators/render.js';
|
|
7
|
+
export { generateClaudeMd } from './generators/claude-md.js';
|
|
8
|
+
export { generateCursorRules } from './generators/cursor-rules.js';
|
|
9
|
+
export { generateGeminiMd } from './generators/gemini-md.js';
|
|
10
|
+
export { generateAgentsMd } from './generators/agents-md.js';
|
|
11
|
+
export { generateCopilotInstructions } from './generators/copilot-instructions.js';
|
|
12
|
+
export * from './types.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { analyzeProject } from './analyzer/index.js';
|
|
2
|
+
export { generateAll, buildFiles, checkAll } from './generators/index.js';
|
|
3
|
+
export { TARGETS, TARGET_IDS, resolveTargets, invalidTargets } from './generators/registry.js';
|
|
4
|
+
export { renderFull, renderRules } from './generators/render.js';
|
|
5
|
+
export { generateClaudeMd } from './generators/claude-md.js';
|
|
6
|
+
export { generateCursorRules } from './generators/cursor-rules.js';
|
|
7
|
+
export { generateGeminiMd } from './generators/gemini-md.js';
|
|
8
|
+
export { generateAgentsMd } from './generators/agents-md.js';
|
|
9
|
+
export { generateCopilotInstructions } from './generators/copilot-instructions.js';
|
|
10
|
+
export * from './types.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/F,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startMcpServer(): Promise<void>;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { analyzeProject } from './analyzer/index.js';
|
|
5
|
+
import { generateAll, checkAll } from './generators/index.js';
|
|
6
|
+
import { TARGET_IDS } from './generators/registry.js';
|
|
7
|
+
import { getVersion } from './version.js';
|
|
8
|
+
export async function startMcpServer() {
|
|
9
|
+
const server = new Server({ name: 'claude-init', version: getVersion() }, { capabilities: { tools: {} } });
|
|
10
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
11
|
+
tools: [
|
|
12
|
+
{
|
|
13
|
+
name: 'analyze_project',
|
|
14
|
+
description: 'Analyze a repository (tech stack, commands, structure, env vars, git) and return structured JSON.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
path: { type: 'string', description: 'Absolute path to the project directory' },
|
|
19
|
+
},
|
|
20
|
+
required: ['path'],
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'generate_context_files',
|
|
25
|
+
description: 'Generate AI context files (CLAUDE.md, AGENTS.md, Cursor/Windsurf/Cline rules, GEMINI.md, Copilot, and more) for a repository.',
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: 'object',
|
|
28
|
+
properties: {
|
|
29
|
+
path: { type: 'string', description: 'Absolute path to the project directory' },
|
|
30
|
+
targets: {
|
|
31
|
+
type: 'array',
|
|
32
|
+
items: { type: 'string', enum: [...TARGET_IDS, 'all'] },
|
|
33
|
+
description: 'Which targets to generate (default: all)',
|
|
34
|
+
},
|
|
35
|
+
outputDir: { type: 'string', description: 'Output directory (default: the project path)' },
|
|
36
|
+
overwrite: { type: 'boolean', description: 'Overwrite existing files (default: false)' },
|
|
37
|
+
},
|
|
38
|
+
required: ['path'],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'check_context_files',
|
|
43
|
+
description: 'Check whether the existing AI context files match the current repository. Reports per-file ok/stale/missing.',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {
|
|
47
|
+
path: { type: 'string', description: 'Absolute path to the project directory' },
|
|
48
|
+
targets: {
|
|
49
|
+
type: 'array',
|
|
50
|
+
items: { type: 'string', enum: [...TARGET_IDS, 'all'] },
|
|
51
|
+
},
|
|
52
|
+
outputDir: { type: 'string', description: 'Directory holding the files (default: the project path)' },
|
|
53
|
+
},
|
|
54
|
+
required: ['path'],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
}));
|
|
59
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
60
|
+
const { name, arguments: rawArgs } = request.params;
|
|
61
|
+
const args = (rawArgs ?? {});
|
|
62
|
+
const path = String(args.path);
|
|
63
|
+
if (name === 'analyze_project') {
|
|
64
|
+
const analysis = await analyzeProject(path);
|
|
65
|
+
return { content: [{ type: 'text', text: JSON.stringify(analysis, null, 2) }] };
|
|
66
|
+
}
|
|
67
|
+
if (name === 'generate_context_files') {
|
|
68
|
+
const analysis = await analyzeProject(path);
|
|
69
|
+
const { written, skipped } = await generateAll(analysis, {
|
|
70
|
+
outputDir: args.outputDir ?? path,
|
|
71
|
+
targets: args.targets ?? ['all'],
|
|
72
|
+
overwrite: args.overwrite === true,
|
|
73
|
+
minimal: false,
|
|
74
|
+
});
|
|
75
|
+
const lines = [
|
|
76
|
+
written.length
|
|
77
|
+
? `Generated:\n${written.map((f) => ` + ${f}`).join('\n')}`
|
|
78
|
+
: 'No files generated.',
|
|
79
|
+
skipped.length ? `\nSkipped (already exist):\n${skipped.map((f) => ` - ${f}`).join('\n')}` : '',
|
|
80
|
+
].filter(Boolean);
|
|
81
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
82
|
+
}
|
|
83
|
+
if (name === 'check_context_files') {
|
|
84
|
+
const analysis = await analyzeProject(path);
|
|
85
|
+
const { entries, drifted } = await checkAll(analysis, args.outputDir ?? path, args.targets ?? ['all']);
|
|
86
|
+
const body = entries.map((e) => ` ${e.status.padEnd(7)} ${e.path}`).join('\n');
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{ type: 'text', text: `${body}\n\n${drifted ? 'Drift detected.' : 'All up to date.'}` },
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
94
|
+
});
|
|
95
|
+
const transport = new StdioServerTransport();
|
|
96
|
+
await server.connect(transport);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export interface ProjectAnalysis {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
techStack: TechStack;
|
|
5
|
+
structure: ProjectStructure;
|
|
6
|
+
commands: ProjectCommands;
|
|
7
|
+
tests: TestInfo;
|
|
8
|
+
envVars: EnvVar[];
|
|
9
|
+
codePatterns: CodePatterns;
|
|
10
|
+
gitInfo: GitInfo;
|
|
11
|
+
}
|
|
12
|
+
export interface TechStack {
|
|
13
|
+
language: string;
|
|
14
|
+
framework: string | null;
|
|
15
|
+
runtime: string | null;
|
|
16
|
+
packageManager: string;
|
|
17
|
+
database: string | null;
|
|
18
|
+
testing: string | null;
|
|
19
|
+
buildTool: string | null;
|
|
20
|
+
extraLibraries: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface ProjectStructure {
|
|
23
|
+
tree: string;
|
|
24
|
+
entryPoints: string[];
|
|
25
|
+
configFiles: string[];
|
|
26
|
+
srcDir: string | null;
|
|
27
|
+
testDir: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface ProjectCommands {
|
|
30
|
+
install: string | null;
|
|
31
|
+
dev: string | null;
|
|
32
|
+
build: string | null;
|
|
33
|
+
test: string | null;
|
|
34
|
+
lint: string | null;
|
|
35
|
+
format: string | null;
|
|
36
|
+
extra: Record<string, string>;
|
|
37
|
+
}
|
|
38
|
+
export interface TestInfo {
|
|
39
|
+
framework: string | null;
|
|
40
|
+
command: string | null;
|
|
41
|
+
coverage: boolean;
|
|
42
|
+
testDir: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface EnvVar {
|
|
45
|
+
name: string;
|
|
46
|
+
description: string;
|
|
47
|
+
required: boolean;
|
|
48
|
+
example: string | null;
|
|
49
|
+
}
|
|
50
|
+
export interface CodePatterns {
|
|
51
|
+
strict: boolean;
|
|
52
|
+
linter: string | null;
|
|
53
|
+
formatter: string | null;
|
|
54
|
+
commitConvention: string | null;
|
|
55
|
+
importStyle: string | null;
|
|
56
|
+
}
|
|
57
|
+
export interface GitInfo {
|
|
58
|
+
hasGit: boolean;
|
|
59
|
+
remoteName: string | null;
|
|
60
|
+
defaultBranch: string | null;
|
|
61
|
+
topAuthors: string[];
|
|
62
|
+
hotFiles: string[];
|
|
63
|
+
}
|
|
64
|
+
/** A target id (see the generator registry) or the special "all". */
|
|
65
|
+
export type TargetFile = string;
|
|
66
|
+
export interface GeneratorOptions {
|
|
67
|
+
outputDir: string;
|
|
68
|
+
targets: TargetFile[];
|
|
69
|
+
overwrite: boolean;
|
|
70
|
+
minimal: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface GenerateResult {
|
|
73
|
+
written: string[];
|
|
74
|
+
skipped: string[];
|
|
75
|
+
}
|
|
76
|
+
export type CheckStatus = 'ok' | 'stale' | 'missing';
|
|
77
|
+
export interface CheckEntry {
|
|
78
|
+
path: string;
|
|
79
|
+
status: CheckStatus;
|
|
80
|
+
}
|
|
81
|
+
export interface CheckResult {
|
|
82
|
+
entries: CheckEntry[];
|
|
83
|
+
drifted: boolean;
|
|
84
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
2
|
+
export declare function isDir(path: string): Promise<boolean>;
|
|
3
|
+
export declare function readText(path: string): Promise<string | null>;
|
|
4
|
+
export declare function readJson<T = Record<string, unknown>>(path: string): Promise<T | null>;
|
|
5
|
+
export declare function detectPackageManager(dir: string): Promise<string>;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { access, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export async function pathExists(path) {
|
|
4
|
+
try {
|
|
5
|
+
await access(path);
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function isDir(path) {
|
|
13
|
+
try {
|
|
14
|
+
return (await stat(path)).isDirectory();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function readText(path) {
|
|
21
|
+
try {
|
|
22
|
+
return await readFile(path, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function readJson(path) {
|
|
29
|
+
const raw = await readText(path);
|
|
30
|
+
if (raw === null)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const PM_LOCKFILES = [
|
|
40
|
+
['bun.lockb', 'bun'],
|
|
41
|
+
['bun.lock', 'bun'],
|
|
42
|
+
['pnpm-lock.yaml', 'pnpm'],
|
|
43
|
+
['yarn.lock', 'yarn'],
|
|
44
|
+
['package-lock.json', 'npm'],
|
|
45
|
+
];
|
|
46
|
+
export async function detectPackageManager(dir) {
|
|
47
|
+
for (const [lockfile, pm] of PM_LOCKFILES) {
|
|
48
|
+
if (await pathExists(join(dir, lockfile)))
|
|
49
|
+
return pm;
|
|
50
|
+
}
|
|
51
|
+
return 'npm';
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAA8B,IAAY;IACtE,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,CAAC,WAAW,EAAE,KAAK,CAAC;IACpB,CAAC,UAAU,EAAE,KAAK,CAAC;IACnB,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAC1B,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,mBAAmB,EAAE,KAAK,CAAC;CACpB,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;QAC1C,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
/** Read the package version at runtime so it never drifts from package.json. */
|
|
3
|
+
export function getVersion() {
|
|
4
|
+
try {
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const pkg = require('../package.json');
|
|
7
|
+
return pkg.version ?? '0.0.0';
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return '0.0.0';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,gFAAgF;AAChF,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAyB,CAAC;QAC/D,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|