@horiastanxd/claude-init 0.7.0 → 0.9.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/README.md +25 -2
- package/dist/analyzer/tech-stack.js +76 -12
- package/dist/analyzer/tech-stack.js.map +1 -1
- package/dist/cli.js +19 -0
- package/dist/cli.js.map +1 -1
- package/dist/enrich.d.ts +18 -0
- package/dist/enrich.js +61 -0
- package/dist/enrich.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ npx @horiastanxd/claude-init
|
|
|
14
14
|
[](https://github.com/horiastanxd/claude-init/actions/workflows/ci.yml)
|
|
15
15
|
[](./LICENSE)
|
|
16
16
|
[](https://nodejs.org)
|
|
17
|
+
[](https://glama.ai/mcp/servers/horiastanxd/claude-init)
|
|
17
18
|
|
|
18
19
|
</div>
|
|
19
20
|
|
|
@@ -85,6 +86,7 @@ npx @horiastanxd/claude-init -t claude,cursor # only specific tools
|
|
|
85
86
|
npx @horiastanxd/claude-init --overwrite # refresh files that already exist
|
|
86
87
|
npx @horiastanxd/claude-init --dry-run # print the analysis as JSON, write nothing
|
|
87
88
|
npx @horiastanxd/claude-init --recurse # also generate into each workspace package (monorepo)
|
|
89
|
+
npx @horiastanxd/claude-init --enrich # opt-in: sharpen the description with an LLM (needs ANTHROPIC_API_KEY)
|
|
88
90
|
npx @horiastanxd/claude-init list # show all targets and their paths
|
|
89
91
|
```
|
|
90
92
|
|
|
@@ -103,8 +105,15 @@ Options:
|
|
|
103
105
|
--overwrite overwrite existing files
|
|
104
106
|
--dry-run print the analysis as JSON, write nothing
|
|
105
107
|
--recurse also generate into each workspace package (monorepo)
|
|
108
|
+
--enrich use an LLM to enrich the project description (opt-in)
|
|
109
|
+
--enrich-model <model> model for --enrich (default: claude-opus-4-8)
|
|
106
110
|
```
|
|
107
111
|
|
|
112
|
+
`--enrich` is the one feature that leaves your machine, and it is off by default -
|
|
113
|
+
everything else is 100% local. It needs `ANTHROPIC_API_KEY` and the Anthropic SDK
|
|
114
|
+
(`npm install @anthropic-ai/sdk`); if either is missing, generation continues without
|
|
115
|
+
enrichment, so nothing breaks.
|
|
116
|
+
|
|
108
117
|
For a monorepo, `--recurse` reads the workspaces from `package.json`
|
|
109
118
|
(`workspaces`) or `pnpm-workspace.yaml`, then generates context files in the root
|
|
110
119
|
and in each package, analyzing every package on its own. It works for both
|
|
@@ -124,12 +133,22 @@ npx @horiastanxd/claude-init check || {
|
|
|
124
133
|
}
|
|
125
134
|
```
|
|
126
135
|
|
|
127
|
-
**GitHub Actions
|
|
136
|
+
**GitHub Actions** - run the CLI directly:
|
|
128
137
|
|
|
129
138
|
```yaml
|
|
130
139
|
- run: npx @horiastanxd/claude-init check
|
|
131
140
|
```
|
|
132
141
|
|
|
142
|
+
or use the action:
|
|
143
|
+
|
|
144
|
+
```yaml
|
|
145
|
+
- uses: horiastanxd/claude-init@v1
|
|
146
|
+
with:
|
|
147
|
+
command: check # or "generate"
|
|
148
|
+
targets: all # comma-separated ids, or "all"
|
|
149
|
+
# args: --overwrite --recurse
|
|
150
|
+
```
|
|
151
|
+
|
|
133
152
|
## Example output
|
|
134
153
|
|
|
135
154
|
<details>
|
|
@@ -191,6 +210,11 @@ Tools exposed: `analyze_project`, `generate_context_files`, `check_context_files
|
|
|
191
210
|
Languages: JS/TS (npm, pnpm, yarn, bun), Python (pip, uv, poetry), Rust (cargo),
|
|
192
211
|
Go (modules), Java (Maven, Gradle), Ruby (Bundler), and PHP (Composer).
|
|
193
212
|
|
|
213
|
+
Frameworks detected include Next.js, Remix, Astro, Angular, Gatsby, NestJS,
|
|
214
|
+
Express, Fastify, Hono, SvelteKit, Nuxt, Vue, Svelte, React (JS/TS); FastAPI,
|
|
215
|
+
Django, Flask (Python); Axum, Actix, Rocket (Rust); Gin, Fiber, Echo (Go);
|
|
216
|
+
Spring Boot (Java); Rails, Sinatra (Ruby); and Laravel, Symfony (PHP).
|
|
217
|
+
|
|
194
218
|
## Use as a library
|
|
195
219
|
|
|
196
220
|
```ts
|
|
@@ -220,7 +244,6 @@ Contributions welcome - adding a new tool is usually a single entry in
|
|
|
220
244
|
|
|
221
245
|
## Roadmap
|
|
222
246
|
|
|
223
|
-
- Optional LLM pass to enrich descriptions (opt-in, off by default)
|
|
224
247
|
- More tools as their formats stabilize
|
|
225
248
|
|
|
226
249
|
Ideas and PRs welcome.
|
|
@@ -16,11 +16,11 @@ export async function detectTechStack(projectDir) {
|
|
|
16
16
|
['Cargo.toml', parseCargoToml],
|
|
17
17
|
['go.mod', parseGoMod],
|
|
18
18
|
['pyproject.toml', parsePyproject],
|
|
19
|
-
['requirements.txt',
|
|
20
|
-
['pom.xml',
|
|
21
|
-
['build.gradle',
|
|
22
|
-
['Gemfile',
|
|
23
|
-
['composer.json',
|
|
19
|
+
['requirements.txt', parseRequirementsTxt],
|
|
20
|
+
['pom.xml', parsePomXml],
|
|
21
|
+
['build.gradle', parseGradle],
|
|
22
|
+
['Gemfile', parseGemfile],
|
|
23
|
+
['composer.json', parseComposerJson],
|
|
24
24
|
];
|
|
25
25
|
for (const [file, parser] of manifest) {
|
|
26
26
|
if (await pathExists(join(projectDir, file))) {
|
|
@@ -44,6 +44,12 @@ async function parsePackageJson(dir) {
|
|
|
44
44
|
result.framework = 'Next.js';
|
|
45
45
|
else if (has('@remix-run/node') || has('@remix-run/react'))
|
|
46
46
|
result.framework = 'Remix';
|
|
47
|
+
else if (has('astro'))
|
|
48
|
+
result.framework = 'Astro';
|
|
49
|
+
else if (has('@angular/core'))
|
|
50
|
+
result.framework = 'Angular';
|
|
51
|
+
else if (has('gatsby'))
|
|
52
|
+
result.framework = 'Gatsby';
|
|
47
53
|
else if (has('@nestjs/core'))
|
|
48
54
|
result.framework = 'NestJS';
|
|
49
55
|
else if (has('express'))
|
|
@@ -128,14 +134,72 @@ async function parsePyproject(dir) {
|
|
|
128
134
|
return {
|
|
129
135
|
language: 'Python',
|
|
130
136
|
packageManager: hasUv ? 'uv' : hasPoetry ? 'poetry' : 'pip',
|
|
131
|
-
framework: content
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
137
|
+
framework: pythonFramework(content),
|
|
138
|
+
testing: content.includes('pytest') ? 'pytest' : null,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async function parseRequirementsTxt(dir) {
|
|
142
|
+
const content = ((await readText(join(dir, 'requirements.txt'))) ?? '').toLowerCase();
|
|
143
|
+
return {
|
|
144
|
+
language: 'Python',
|
|
145
|
+
packageManager: 'pip',
|
|
146
|
+
framework: pythonFramework(content),
|
|
138
147
|
testing: content.includes('pytest') ? 'pytest' : null,
|
|
139
148
|
};
|
|
140
149
|
}
|
|
150
|
+
function pythonFramework(content) {
|
|
151
|
+
const c = content.toLowerCase();
|
|
152
|
+
if (c.includes('fastapi'))
|
|
153
|
+
return 'FastAPI';
|
|
154
|
+
if (c.includes('django'))
|
|
155
|
+
return 'Django';
|
|
156
|
+
if (c.includes('flask'))
|
|
157
|
+
return 'Flask';
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
async function parsePomXml(dir) {
|
|
161
|
+
const content = (await readText(join(dir, 'pom.xml'))) ?? '';
|
|
162
|
+
return {
|
|
163
|
+
language: 'Java',
|
|
164
|
+
packageManager: 'maven',
|
|
165
|
+
framework: content.includes('spring-boot') ? 'Spring Boot' : null,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
async function parseGradle(dir) {
|
|
169
|
+
const content = (await readText(join(dir, 'build.gradle'))) ?? '';
|
|
170
|
+
return {
|
|
171
|
+
language: 'Java/Kotlin',
|
|
172
|
+
packageManager: 'gradle',
|
|
173
|
+
framework: content.includes('spring-boot') ? 'Spring Boot' : null,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
async function parseGemfile(dir) {
|
|
177
|
+
const content = ((await readText(join(dir, 'Gemfile'))) ?? '').toLowerCase();
|
|
178
|
+
return {
|
|
179
|
+
language: 'Ruby',
|
|
180
|
+
packageManager: 'bundler',
|
|
181
|
+
framework: content.includes('rails')
|
|
182
|
+
? 'Rails'
|
|
183
|
+
: content.includes('sinatra')
|
|
184
|
+
? 'Sinatra'
|
|
185
|
+
: null,
|
|
186
|
+
testing: content.includes('rspec') ? 'RSpec' : content.includes('minitest') ? 'Minitest' : null,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async function parseComposerJson(dir) {
|
|
190
|
+
const pkg = await readJson(join(dir, 'composer.json'));
|
|
191
|
+
const deps = { ...pkg?.require, ...pkg?.['require-dev'] };
|
|
192
|
+
const has = (name) => name in deps;
|
|
193
|
+
const hasPrefix = (prefix) => Object.keys(deps).some((k) => k.startsWith(prefix));
|
|
194
|
+
return {
|
|
195
|
+
language: 'PHP',
|
|
196
|
+
packageManager: 'composer',
|
|
197
|
+
framework: has('laravel/framework')
|
|
198
|
+
? 'Laravel'
|
|
199
|
+
: hasPrefix('symfony/')
|
|
200
|
+
? 'Symfony'
|
|
201
|
+
: null,
|
|
202
|
+
testing: has('phpunit/phpunit') ? 'PHPUnit' : has('pestphp/pest') ? 'Pest' : null,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
141
205
|
//# sourceMappingURL=tech-stack.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/analyzer/tech-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnF,MAAM,KAAK,GAAc;IACvB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,EAAE;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,QAAQ,GAAkE;QAC9E,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAClC,CAAC,YAAY,EAAE,cAAc,CAAC;QAC9B,CAAC,QAAQ,EAAE,UAAU,CAAC;QACtB,CAAC,gBAAgB,EAAE,cAAc,CAAC;QAClC,CAAC,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"tech-stack.js","sourceRoot":"","sources":["../../src/analyzer/tech-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnF,MAAM,KAAK,GAAc;IACvB,QAAQ,EAAE,SAAS;IACnB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,SAAS;IACzB,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,EAAE;CACnB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB;IACtD,MAAM,QAAQ,GAAkE;QAC9E,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAClC,CAAC,YAAY,EAAE,cAAc,CAAC;QAC9B,CAAC,QAAQ,EAAE,UAAU,CAAC;QACtB,CAAC,gBAAgB,EAAE,cAAc,CAAC;QAClC,CAAC,kBAAkB,EAAE,oBAAoB,CAAC;QAC1C,CAAC,SAAS,EAAE,WAAW,CAAC;QACxB,CAAC,cAAc,EAAE,WAAW,CAAC;QAC7B,CAAC,SAAS,EAAE,YAAY,CAAC;QACzB,CAAC,eAAe,EAAE,iBAAiB,CAAC;KACrC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAGvB,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC;IAE3C,MAAM,MAAM,GAAuB;QACjC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;QACzF,cAAc,EAAE,MAAM,oBAAoB,CAAC,GAAG,CAAC;QAC/C,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACxC,CAAC;IAEF,IAAI,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SACzC,IAAI,GAAG,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;SAClF,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;SAC7C,IAAI,GAAG,CAAC,eAAe,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SACvD,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;SAC/C,IAAI,GAAG,CAAC,cAAc,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;SACrD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SACjD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SACjD,IAAI,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;SAC3C,IAAI,GAAG,CAAC,eAAe,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;SACzD,IAAI,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;SAC3C,IAAI,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;SACzC,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC;SAC/C,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC;IAElD,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;SACtE,IAAI,GAAG,CAAC,aAAa,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,aAAa,CAAC;SACxD,IAAI,GAAG,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CAAC;SAC1D,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,YAAY,CAAC;SACjE,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC;IAElD,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC;SACxC,IAAI,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;SACzC,IAAI,GAAG,CAAC,kBAAkB,CAAC;QAAE,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC;SAC3D,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAEhD,IAAI,GAAG,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;SACtC,IAAI,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC;SACjD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;SACjD,IAAI,GAAG,CAAC,SAAS,CAAC;QAAE,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAEtD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACvG,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE5C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM;QAC7D,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAC7B,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC1B,CAAC,CAAC,QAAQ;oBACV,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,OAAO;QACL,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,YAAY;QAC5B,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC1C,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACjC,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;oBACjC,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW;IACvC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpD,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;QAC3D,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;KACtD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtF,OAAO;QACL,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,KAAK;QACrB,SAAS,EAAE,eAAe,CAAC,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,OAAO;QACvB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;KAClE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,OAAO;QACL,QAAQ,EAAE,aAAa;QACvB,cAAc,EAAE,QAAQ;QACxB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;KAClE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7E,OAAO;QACL,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,SAAS;QACzB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC3B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI;QACV,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;KAChG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAGvB,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC;IAC3C,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1F,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,cAAc,EAAE,UAAU;QAC1B,SAAS,EAAE,GAAG,CAAC,mBAAmB,CAAC;YACjC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;gBACrB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI;QACV,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;KAClF,CAAC;AACJ,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -6,6 +6,7 @@ import ora from 'ora';
|
|
|
6
6
|
import { analyzeProject } from './analyzer/index.js';
|
|
7
7
|
import { generateAll, checkAll } from './generators/index.js';
|
|
8
8
|
import { generateWorkspacePackages, checkWorkspacePackages } from './generate-recursive.js';
|
|
9
|
+
import { enrichAnalysis, createAnthropicCompleter } from './enrich.js';
|
|
9
10
|
import { TARGETS, TARGET_IDS, invalidTargets } from './generators/registry.js';
|
|
10
11
|
import { getVersion } from './version.js';
|
|
11
12
|
function parseTargets(raw) {
|
|
@@ -34,6 +35,22 @@ async function runGenerate(dir, opts) {
|
|
|
34
35
|
}
|
|
35
36
|
spinner.succeed(`Analyzed ${chalk.bold(analysis.name)} ` +
|
|
36
37
|
chalk.dim(`(${analysis.techStack.language}${analysis.techStack.framework ? `, ${analysis.techStack.framework}` : ''})`));
|
|
38
|
+
if (opts.enrich) {
|
|
39
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
console.log(chalk.yellow(' --enrich set but ANTHROPIC_API_KEY is not set; skipping enrichment.'));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
try {
|
|
45
|
+
const complete = await createAnthropicCompleter({ model: opts.enrichModel, apiKey });
|
|
46
|
+
analysis = await enrichAnalysis(analysis, complete);
|
|
47
|
+
console.log(chalk.dim(` enriched description via ${opts.enrichModel}`));
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.log(chalk.yellow(` Enrichment skipped: ${err.message}`));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
37
54
|
if (opts.dryRun) {
|
|
38
55
|
console.log(JSON.stringify(analysis, null, 2));
|
|
39
56
|
return;
|
|
@@ -126,6 +143,8 @@ async function main() {
|
|
|
126
143
|
.option('--overwrite', 'overwrite existing files', false)
|
|
127
144
|
.option('--dry-run', 'print the analysis as JSON without writing files', false)
|
|
128
145
|
.option('--recurse', 'also generate into each workspace package (monorepo)', false)
|
|
146
|
+
.option('--enrich', 'use an LLM to enrich the project description (opt-in; needs ANTHROPIC_API_KEY)', false)
|
|
147
|
+
.option('--enrich-model <model>', 'model to use for --enrich', 'claude-opus-4-8')
|
|
129
148
|
.action(runGenerate);
|
|
130
149
|
program
|
|
131
150
|
.command('check')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,GAAuB,EACvB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/enrich.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ProjectAnalysis } from './types.js';
|
|
2
|
+
/** Produces a completion from a system + user prompt. Injected so the network call is testable. */
|
|
3
|
+
export type CompleteFn = (system: string, user: string) => Promise<string>;
|
|
4
|
+
export interface EnrichOptions {
|
|
5
|
+
model: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Enrich the project description with an LLM. Pure given `complete` - the network
|
|
10
|
+
* dependency is injected, so this is fully testable without hitting the API.
|
|
11
|
+
*/
|
|
12
|
+
export declare function enrichAnalysis(analysis: ProjectAnalysis, complete: CompleteFn): Promise<ProjectAnalysis>;
|
|
13
|
+
/**
|
|
14
|
+
* Build a completer backed by the official Anthropic SDK. The SDK is loaded
|
|
15
|
+
* dynamically and is NOT a dependency of this package - enrichment is opt-in, so
|
|
16
|
+
* default installs stay network-free. Install it with `npm install @anthropic-ai/sdk`.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createAnthropicCompleter(opts: EnrichOptions): Promise<CompleteFn>;
|
package/dist/enrich.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const SYSTEM_PROMPT = 'You write a single concise sentence describing what a software project does, for a ' +
|
|
2
|
+
'README-style context file. Output only the sentence: no preamble, no markdown, no quotes, ' +
|
|
3
|
+
'present tense, third person.';
|
|
4
|
+
function buildEnrichPrompt(a) {
|
|
5
|
+
const { techStack: t } = a;
|
|
6
|
+
const stack = [t.language, t.framework, t.runtime, t.database, t.testing]
|
|
7
|
+
.filter(Boolean)
|
|
8
|
+
.join(', ');
|
|
9
|
+
const lines = [
|
|
10
|
+
`Project name: ${a.name}`,
|
|
11
|
+
`Stack: ${stack}`,
|
|
12
|
+
a.description ? `Existing description: ${a.description}` : '',
|
|
13
|
+
'File tree:',
|
|
14
|
+
a.structure.tree,
|
|
15
|
+
].filter(Boolean);
|
|
16
|
+
return lines.join('\n');
|
|
17
|
+
}
|
|
18
|
+
/** Collapse a model reply to a single trimmed sentence. */
|
|
19
|
+
function toOneSentence(text) {
|
|
20
|
+
const clean = text.trim().replace(/\s+/g, ' ');
|
|
21
|
+
const end = clean.search(/[.!?](\s|$)/);
|
|
22
|
+
return end === -1 ? clean : clean.slice(0, end + 1);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Enrich the project description with an LLM. Pure given `complete` - the network
|
|
26
|
+
* dependency is injected, so this is fully testable without hitting the API.
|
|
27
|
+
*/
|
|
28
|
+
export async function enrichAnalysis(analysis, complete) {
|
|
29
|
+
const reply = (await complete(SYSTEM_PROMPT, buildEnrichPrompt(analysis))).trim();
|
|
30
|
+
if (!reply)
|
|
31
|
+
return analysis;
|
|
32
|
+
return { ...analysis, description: toOneSentence(reply) };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build a completer backed by the official Anthropic SDK. The SDK is loaded
|
|
36
|
+
* dynamically and is NOT a dependency of this package - enrichment is opt-in, so
|
|
37
|
+
* default installs stay network-free. Install it with `npm install @anthropic-ai/sdk`.
|
|
38
|
+
*/
|
|
39
|
+
export async function createAnthropicCompleter(opts) {
|
|
40
|
+
const specifier = '@anthropic-ai/sdk';
|
|
41
|
+
let mod;
|
|
42
|
+
try {
|
|
43
|
+
mod = await import(specifier);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new Error('Enrichment needs the Anthropic SDK. Install it with: npm install @anthropic-ai/sdk');
|
|
47
|
+
}
|
|
48
|
+
const Anthropic = mod.default;
|
|
49
|
+
const client = new Anthropic({ apiKey: opts.apiKey });
|
|
50
|
+
return async (system, user) => {
|
|
51
|
+
const message = await client.messages.create({
|
|
52
|
+
model: opts.model,
|
|
53
|
+
max_tokens: 1024,
|
|
54
|
+
system,
|
|
55
|
+
messages: [{ role: 'user', content: user }],
|
|
56
|
+
});
|
|
57
|
+
const block = message.content.find((b) => b.type === 'text');
|
|
58
|
+
return block?.text ?? '';
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=enrich.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../src/enrich.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@horiastanxd/claude-init",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "One command generates AI context files - CLAUDE.md, AGENTS.md, Cursor/Windsurf/Cline/Continue/Kilo Code/Trae rules, GEMINI.md, Copilot, Aider, Junie, Warp - for any repository. CLI + MCP server, 100% local.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|