@claudiv/vite-sdk 0.1.0 → 0.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.
- package/README.md +41 -405
- package/bin/dev.js +27 -0
- package/bin/gen.js +38 -0
- package/bin/init.js +31 -0
- package/bin/mode.js +12 -0
- package/bin/postinstall.js +31 -0
- package/dist/cache.d.ts +12 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +22 -0
- package/dist/cache.js.map +1 -0
- package/dist/detector.d.ts +13 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +68 -0
- package/dist/detector.js.map +1 -0
- package/dist/dev-runner.d.ts +8 -0
- package/dist/dev-runner.d.ts.map +1 -0
- package/dist/dev-runner.js +102 -0
- package/dist/dev-runner.js.map +1 -0
- package/dist/gen-runner.d.ts +6 -0
- package/dist/gen-runner.d.ts.map +1 -0
- package/dist/gen-runner.js +67 -0
- package/dist/gen-runner.js.map +1 -0
- package/dist/index.d.ts +11 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +9 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +72 -0
- package/dist/init.js.map +1 -0
- package/dist/mode-selector.d.ts +6 -0
- package/dist/mode-selector.d.ts.map +1 -0
- package/dist/mode-selector.js +40 -0
- package/dist/mode-selector.js.map +1 -0
- package/dist/package-json.d.ts +6 -0
- package/dist/package-json.d.ts.map +1 -0
- package/dist/package-json.js +25 -0
- package/dist/package-json.js.map +1 -0
- package/dist/plugin.d.ts +10 -11
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +25 -45
- package/dist/plugin.js.map +1 -1
- package/dist/sdk.d.ts +6 -0
- package/dist/sdk.d.ts.map +1 -0
- package/dist/sdk.js +6 -0
- package/dist/sdk.js.map +1 -0
- package/dist/types.d.ts +4 -30
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -1
- package/dist/types.js.map +1 -1
- package/dist/watcher.d.ts +3 -10
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +3 -34
- package/dist/watcher.js.map +1 -1
- package/package.json +20 -12
package/dist/detector.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite framework detector.
|
|
3
|
+
*
|
|
4
|
+
* Checks if a project uses Vite and extracts project metadata.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile } from 'fs/promises';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { join, basename } from 'path';
|
|
9
|
+
export class ViteDetector {
|
|
10
|
+
async detect(projectRoot) {
|
|
11
|
+
const configFiles = [
|
|
12
|
+
'vite.config.ts',
|
|
13
|
+
'vite.config.js',
|
|
14
|
+
'vite.config.mts',
|
|
15
|
+
'vite.config.mjs',
|
|
16
|
+
];
|
|
17
|
+
for (const config of configFiles) {
|
|
18
|
+
if (existsSync(join(projectRoot, config))) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
24
|
+
if (existsSync(pkgPath)) {
|
|
25
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
26
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
27
|
+
return 'vite' in allDeps;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Ignore
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
async getAppName(projectRoot) {
|
|
36
|
+
try {
|
|
37
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
38
|
+
if (existsSync(pkgPath)) {
|
|
39
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
40
|
+
if (pkg.name)
|
|
41
|
+
return pkg.name.replace(/^@[^/]+\//, '');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Fall through
|
|
46
|
+
}
|
|
47
|
+
return basename(projectRoot);
|
|
48
|
+
}
|
|
49
|
+
async getSourcePaths(projectRoot) {
|
|
50
|
+
const candidates = ['src', 'lib', 'app', 'pages', 'components'];
|
|
51
|
+
const result = [];
|
|
52
|
+
for (const dir of candidates) {
|
|
53
|
+
if (existsSync(join(projectRoot, dir))) {
|
|
54
|
+
result.push(dir);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return result.length > 0 ? result : ['src'];
|
|
58
|
+
}
|
|
59
|
+
getIgnorePatterns() {
|
|
60
|
+
return [
|
|
61
|
+
'node_modules',
|
|
62
|
+
'dist',
|
|
63
|
+
'.vite',
|
|
64
|
+
'public',
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAGtC,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,WAAW,GAAG;YAClB,gBAAgB;YAChB,gBAAgB;YAChB,iBAAiB;YACjB,iBAAiB;SAClB,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAClD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;gBAChE,OAAO,MAAM,IAAI,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;QAClC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAClD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,IAAI,GAAG,CAAC,IAAI;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;QACD,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED,iBAAiB;QACf,OAAO;YACL,cAAc;YACd,MAAM;YACN,OAAO;YACP,QAAQ;SACT,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev runner — watches .cdml files, diffs, processes changes.
|
|
3
|
+
*
|
|
4
|
+
* Flow: watch .cdml -> diff -> context engine -> headless Claude -> update
|
|
5
|
+
*/
|
|
6
|
+
import type { DevOptions } from '@claudiv/core';
|
|
7
|
+
export declare function runDev(projectRoot: string, opts: DevOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=dev-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-runner.d.ts","sourceRoot":"","sources":["../src/dev-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,OAAO,KAAK,EAAE,UAAU,EAAoC,MAAM,eAAe,CAAC;AAGlF,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGjF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev runner — watches .cdml files, diffs, processes changes.
|
|
3
|
+
*
|
|
4
|
+
* Flow: watch .cdml -> diff -> context engine -> headless Claude -> update
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import chokidar from 'chokidar';
|
|
10
|
+
import { diffCdml, getChangedElements, assembleContext, loadContextManifest, executeClaudeHeadless, loadProject, parsePlanQuestions, allQuestionsAnswered, questionsToFacts, serializeContextManifest, parseSpecFile, } from '@claudiv/core';
|
|
11
|
+
import { CdmlCache } from './cache.js';
|
|
12
|
+
export async function runDev(projectRoot, opts) {
|
|
13
|
+
const cache = new CdmlCache();
|
|
14
|
+
const debounceMs = opts.debounceMs || 300;
|
|
15
|
+
let processing = false;
|
|
16
|
+
// Load project registry
|
|
17
|
+
const manifestPath = join(projectRoot, 'claudiv.project.cdml');
|
|
18
|
+
let registry = null;
|
|
19
|
+
if (existsSync(manifestPath)) {
|
|
20
|
+
registry = await loadProject(manifestPath);
|
|
21
|
+
}
|
|
22
|
+
// Load context manifest
|
|
23
|
+
const contextPath = join(projectRoot, '.claudiv', 'context.cdml');
|
|
24
|
+
let contextManifest = null;
|
|
25
|
+
if (existsSync(contextPath)) {
|
|
26
|
+
contextManifest = await loadContextManifest(contextPath);
|
|
27
|
+
}
|
|
28
|
+
// Watch .cdml files
|
|
29
|
+
const watcher = chokidar.watch('**/*.cdml', {
|
|
30
|
+
cwd: projectRoot,
|
|
31
|
+
persistent: true,
|
|
32
|
+
ignoreInitial: false,
|
|
33
|
+
ignored: ['**/node_modules/**', '**/.claudiv/**', '**/claudiv.project.cdml'],
|
|
34
|
+
awaitWriteFinish: { stabilityThreshold: debounceMs, pollInterval: 50 },
|
|
35
|
+
});
|
|
36
|
+
console.log('[claudiv:dev] Watching for .cdml changes...');
|
|
37
|
+
// Cache files on initial scan
|
|
38
|
+
watcher.on('add', async (relativePath) => {
|
|
39
|
+
try {
|
|
40
|
+
const content = await readFile(join(projectRoot, relativePath), 'utf-8');
|
|
41
|
+
cache.set(relativePath, content);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Ignore
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
watcher.on('change', async (relativePath) => {
|
|
48
|
+
if (processing)
|
|
49
|
+
return;
|
|
50
|
+
processing = true;
|
|
51
|
+
try {
|
|
52
|
+
const filePath = join(projectRoot, relativePath);
|
|
53
|
+
const newContent = await readFile(filePath, 'utf-8');
|
|
54
|
+
const oldContent = cache.get(relativePath);
|
|
55
|
+
if (!oldContent) {
|
|
56
|
+
cache.set(relativePath, newContent);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const diff = diffCdml(oldContent, newContent);
|
|
60
|
+
if (!diff.hasChanges)
|
|
61
|
+
return;
|
|
62
|
+
console.log(`[claudiv:dev] Change in ${relativePath}: ` +
|
|
63
|
+
`+${diff.summary.added} -${diff.summary.removed} ~${diff.summary.modified}`);
|
|
64
|
+
const changes = getChangedElements(diff);
|
|
65
|
+
// Handle plan directives and questions
|
|
66
|
+
const parsed = parseSpecFile(newContent);
|
|
67
|
+
if (parsed.hasPlanQuestions) {
|
|
68
|
+
const questions = parsePlanQuestions(parsed.dom);
|
|
69
|
+
if (allQuestionsAnswered(questions)) {
|
|
70
|
+
const facts = questionsToFacts(questions, `plan:${new Date().toISOString().split('T')[0]}`);
|
|
71
|
+
if (contextManifest) {
|
|
72
|
+
contextManifest.global.facts.push(...facts);
|
|
73
|
+
await writeFile(contextPath, serializeContextManifest(contextManifest), 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Process changes
|
|
78
|
+
for (const change of changes) {
|
|
79
|
+
if (!contextManifest)
|
|
80
|
+
continue;
|
|
81
|
+
const assembled = await assembleContext(change, change.path, contextManifest, registry, projectRoot);
|
|
82
|
+
const result = await executeClaudeHeadless(assembled, { mode: opts.mode || 'cli', apiKey: opts.apiKey });
|
|
83
|
+
if (result.success) {
|
|
84
|
+
console.log(`[claudiv:dev] Generated (${result.durationMs}ms)`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.error(`[claudiv:dev] Failed: ${result.error}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
cache.set(relativePath, newContent);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error(`[claudiv:dev] Error: ${error.message}`);
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
processing = false;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
// Block forever
|
|
100
|
+
await new Promise(() => { });
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=dev-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-runner.js","sourceRoot":"","sources":["../src/dev-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-runner.d.ts","sourceRoot":"","sources":["../src/gen-runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EAAE,UAAU,EAAoC,MAAM,eAAe,CAAC;AAGlF,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEjF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gen runner — one-shot diff -> process -> exit.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, readdir } from 'fs/promises';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { diffCdml, getChangedElements, assembleContext, loadContextManifest, executeClaudeHeadless, loadProject, parseSpecFile, } from '@claudiv/core';
|
|
8
|
+
import { CdmlCache } from './cache.js';
|
|
9
|
+
export async function runGen(projectRoot, opts) {
|
|
10
|
+
const manifestPath = join(projectRoot, 'claudiv.project.cdml');
|
|
11
|
+
let registry = null;
|
|
12
|
+
if (existsSync(manifestPath)) {
|
|
13
|
+
registry = await loadProject(manifestPath);
|
|
14
|
+
}
|
|
15
|
+
const contextPath = join(projectRoot, '.claudiv', 'context.cdml');
|
|
16
|
+
let contextManifest = null;
|
|
17
|
+
if (existsSync(contextPath)) {
|
|
18
|
+
contextManifest = await loadContextManifest(contextPath);
|
|
19
|
+
}
|
|
20
|
+
const entries = await readdir(projectRoot);
|
|
21
|
+
const cdmlFiles = entries.filter((f) => f.endsWith('.cdml') && f !== 'claudiv.project.cdml');
|
|
22
|
+
if (cdmlFiles.length === 0) {
|
|
23
|
+
console.log('[claudiv:gen] No .cdml files found');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const cache = new CdmlCache();
|
|
27
|
+
for (const cdmlFile of cdmlFiles) {
|
|
28
|
+
const filePath = join(projectRoot, cdmlFile);
|
|
29
|
+
const content = await readFile(filePath, 'utf-8');
|
|
30
|
+
const oldContent = cache.get(cdmlFile) || '';
|
|
31
|
+
const diff = diffCdml(oldContent, content);
|
|
32
|
+
if (!diff.hasChanges && oldContent) {
|
|
33
|
+
console.log(`[claudiv:gen] No changes in ${cdmlFile}`);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const changes = getChangedElements(diff);
|
|
37
|
+
console.log(`[claudiv:gen] Processing ${cdmlFile}: ${changes.length} change(s)`);
|
|
38
|
+
const filteredChanges = opts.scope
|
|
39
|
+
? changes.filter((c) => c.path.includes(opts.scope))
|
|
40
|
+
: changes;
|
|
41
|
+
for (const change of filteredChanges) {
|
|
42
|
+
if (!contextManifest) {
|
|
43
|
+
const parsed = parseSpecFile(content);
|
|
44
|
+
if (parsed.component)
|
|
45
|
+
console.log(`[claudiv:gen] Component: ${parsed.component.name}`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const assembled = await assembleContext(change, change.path, contextManifest, registry, projectRoot);
|
|
49
|
+
if (opts.dryRun) {
|
|
50
|
+
console.log(`[claudiv:gen] Dry run — prompt: ${assembled.prompt.length} chars`);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const result = await executeClaudeHeadless(assembled, { mode: opts.mode || 'cli', apiKey: opts.apiKey });
|
|
54
|
+
if (result.success) {
|
|
55
|
+
console.log(`[claudiv:gen] Generated (${result.durationMs}ms)`);
|
|
56
|
+
process.stdout.write(result.response);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.error(`[claudiv:gen] Failed: ${result.error}`);
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
cache.set(cdmlFile, content);
|
|
64
|
+
}
|
|
65
|
+
console.log('[claudiv:gen] Done');
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=gen-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gen-runner.js","sourceRoot":"","sources":["../src/gen-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @claudiv/vite-sdk
|
|
2
|
+
* @claudiv/vite-sdk — Vite framework SDK for Claudiv.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Add-on package providing `claudiv:*` npm scripts for Vite projects.
|
|
5
|
+
* Implements ClaudivSDK interface for Vite-specific integration.
|
|
5
6
|
*/
|
|
6
|
-
export {
|
|
7
|
-
export
|
|
8
|
-
export {
|
|
7
|
+
export { ViteSdk } from './sdk.js';
|
|
8
|
+
export { ViteDetector } from './detector.js';
|
|
9
|
+
export { initViteProject } from './init.js';
|
|
10
|
+
export { runDev } from './dev-runner.js';
|
|
11
|
+
export { runGen } from './gen-runner.js';
|
|
12
|
+
export { selectMode } from './mode-selector.js';
|
|
13
|
+
export { CdmlCache } from './cache.js';
|
|
14
|
+
export { addScripts, removeScripts } from './package-json.js';
|
|
9
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @claudiv/vite-sdk
|
|
2
|
+
* @claudiv/vite-sdk — Vite framework SDK for Claudiv.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Add-on package providing `claudiv:*` npm scripts for Vite projects.
|
|
5
|
+
* Implements ClaudivSDK interface for Vite-specific integration.
|
|
5
6
|
*/
|
|
6
|
-
|
|
7
|
-
export {
|
|
8
|
-
|
|
9
|
-
export {
|
|
7
|
+
export { ViteSdk } from './sdk.js';
|
|
8
|
+
export { ViteDetector } from './detector.js';
|
|
9
|
+
export { initViteProject } from './init.js';
|
|
10
|
+
export { runDev } from './dev-runner.js';
|
|
11
|
+
export { runGen } from './gen-runner.js';
|
|
12
|
+
export { selectMode } from './mode-selector.js';
|
|
13
|
+
export { CdmlCache } from './cache.js';
|
|
14
|
+
export { addScripts, removeScripts } from './package-json.js';
|
|
10
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite project initialization for Claudiv.
|
|
3
|
+
*
|
|
4
|
+
* Detects Vite project -> scans source -> generates .cdml + context.cdml
|
|
5
|
+
* + project manifest -> adds claudiv:* scripts to package.json.
|
|
6
|
+
*/
|
|
7
|
+
import type { FrameworkDetector, InitResult } from '@claudiv/core';
|
|
8
|
+
export declare function initViteProject(projectRoot: string, detector: FrameworkDetector): Promise<InitResult>;
|
|
9
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAInE,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAoErB"}
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vite project initialization for Claudiv.
|
|
3
|
+
*
|
|
4
|
+
* Detects Vite project -> scans source -> generates .cdml + context.cdml
|
|
5
|
+
* + project manifest -> adds claudiv:* scripts to package.json.
|
|
6
|
+
*/
|
|
7
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
8
|
+
import { existsSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { scanProject } from '@claudiv/core';
|
|
11
|
+
import { addScripts } from './package-json.js';
|
|
12
|
+
export async function initViteProject(projectRoot, detector) {
|
|
13
|
+
const filesCreated = [];
|
|
14
|
+
const warnings = [];
|
|
15
|
+
const isVite = await detector.detect(projectRoot);
|
|
16
|
+
if (!isVite) {
|
|
17
|
+
return {
|
|
18
|
+
success: false,
|
|
19
|
+
filesCreated: [],
|
|
20
|
+
scriptsAdded: {},
|
|
21
|
+
warnings: ['Not a Vite project'],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const scanResult = await scanProject(projectRoot, detector);
|
|
25
|
+
// Create .claudiv directory
|
|
26
|
+
const claudivDir = join(projectRoot, '.claudiv');
|
|
27
|
+
if (!existsSync(claudivDir)) {
|
|
28
|
+
await mkdir(claudivDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
// Write CDML skeleton
|
|
31
|
+
const cdmlPath = join(projectRoot, `${scanResult.projectName}.cdml`);
|
|
32
|
+
if (!existsSync(cdmlPath)) {
|
|
33
|
+
await writeFile(cdmlPath, scanResult.cdmlContent, 'utf-8');
|
|
34
|
+
filesCreated.push(`${scanResult.projectName}.cdml`);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
warnings.push(`${scanResult.projectName}.cdml already exists, skipping`);
|
|
38
|
+
}
|
|
39
|
+
// Write context manifest
|
|
40
|
+
const contextPath = join(claudivDir, 'context.cdml');
|
|
41
|
+
if (!existsSync(contextPath)) {
|
|
42
|
+
await writeFile(contextPath, scanResult.contextContent, 'utf-8');
|
|
43
|
+
filesCreated.push('.claudiv/context.cdml');
|
|
44
|
+
}
|
|
45
|
+
// Write project manifest
|
|
46
|
+
const manifestPath = join(projectRoot, 'claudiv.project.cdml');
|
|
47
|
+
if (!existsSync(manifestPath)) {
|
|
48
|
+
await writeFile(manifestPath, scanResult.projectManifestContent, 'utf-8');
|
|
49
|
+
filesCreated.push('claudiv.project.cdml');
|
|
50
|
+
}
|
|
51
|
+
// Write default config
|
|
52
|
+
const configPath = join(claudivDir, 'config.json');
|
|
53
|
+
if (!existsSync(configPath)) {
|
|
54
|
+
await writeFile(configPath, JSON.stringify({ mode: 'cli' }, null, 2), 'utf-8');
|
|
55
|
+
filesCreated.push('.claudiv/config.json');
|
|
56
|
+
}
|
|
57
|
+
// Add scripts to package.json
|
|
58
|
+
const scripts = {
|
|
59
|
+
'claudiv:init': 'claudiv-vite-init',
|
|
60
|
+
'claudiv:dev': 'claudiv-vite-dev',
|
|
61
|
+
'claudiv:gen': 'claudiv-vite-gen',
|
|
62
|
+
'claudiv:mode': 'claudiv-vite-mode',
|
|
63
|
+
};
|
|
64
|
+
await addScripts(projectRoot, scripts);
|
|
65
|
+
return {
|
|
66
|
+
success: true,
|
|
67
|
+
filesCreated,
|
|
68
|
+
scriptsAdded: scripts,
|
|
69
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-selector.d.ts","sourceRoot":"","sources":["../src/mode-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiCnE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mode selector — prompt user to choose CLI or API mode.
|
|
3
|
+
* Writes selection to .claudiv/config.json.
|
|
4
|
+
*/
|
|
5
|
+
import { writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import prompts from 'prompts';
|
|
9
|
+
export async function selectMode(projectRoot) {
|
|
10
|
+
const response = await prompts({
|
|
11
|
+
type: 'select',
|
|
12
|
+
name: 'mode',
|
|
13
|
+
message: 'How should Claudiv invoke Claude?',
|
|
14
|
+
choices: [
|
|
15
|
+
{ title: 'CLI (claude --print)', description: 'Requires claude CLI installed', value: 'cli' },
|
|
16
|
+
{ title: 'API (Anthropic SDK)', description: 'Requires ANTHROPIC_API_KEY', value: 'api' },
|
|
17
|
+
],
|
|
18
|
+
initial: 0,
|
|
19
|
+
});
|
|
20
|
+
if (!response.mode) {
|
|
21
|
+
console.log('Cancelled');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const config = { mode: response.mode };
|
|
25
|
+
if (response.mode === 'api') {
|
|
26
|
+
const apiKeyResponse = await prompts({
|
|
27
|
+
type: 'text',
|
|
28
|
+
name: 'apiKey',
|
|
29
|
+
message: 'Enter your Anthropic API key (or set ANTHROPIC_API_KEY env var):',
|
|
30
|
+
});
|
|
31
|
+
if (apiKeyResponse.apiKey)
|
|
32
|
+
config.apiKey = apiKeyResponse.apiKey;
|
|
33
|
+
}
|
|
34
|
+
const claudivDir = join(projectRoot, '.claudiv');
|
|
35
|
+
if (!existsSync(claudivDir))
|
|
36
|
+
await mkdir(claudivDir, { recursive: true });
|
|
37
|
+
await writeFile(join(claudivDir, 'config.json'), JSON.stringify(config, null, 2), 'utf-8');
|
|
38
|
+
console.log(`Mode set to: ${response.mode}`);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=mode-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mode-selector.js","sourceRoot":"","sources":["../src/mode-selector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,mCAAmC;QAC5C,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,sBAAsB,EAAE,WAAW,EAAE,+BAA+B,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7F,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,4BAA4B,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1F;QACD,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE5D,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC;YACnC,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,kEAAkE;SAC5E,CAAC,CAAC;QACH,IAAI,cAAc,CAAC,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IACnE,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1E,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package.json script management.
|
|
3
|
+
*/
|
|
4
|
+
export declare function addScripts(projectRoot: string, scripts: Record<string, string>): Promise<void>;
|
|
5
|
+
export declare function removeScripts(projectRoot: string, scriptNames: string[]): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=package-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../src/package-json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package.json script management.
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
export async function addScripts(projectRoot, scripts) {
|
|
7
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
8
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
9
|
+
if (!pkg.scripts)
|
|
10
|
+
pkg.scripts = {};
|
|
11
|
+
for (const [name, command] of Object.entries(scripts)) {
|
|
12
|
+
pkg.scripts[name] = command;
|
|
13
|
+
}
|
|
14
|
+
await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
15
|
+
}
|
|
16
|
+
export async function removeScripts(projectRoot, scriptNames) {
|
|
17
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
18
|
+
const pkg = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
19
|
+
if (!pkg.scripts)
|
|
20
|
+
return;
|
|
21
|
+
for (const name of scriptNames)
|
|
22
|
+
delete pkg.scripts[name];
|
|
23
|
+
await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=package-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-json.js","sourceRoot":"","sources":["../src/package-json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,OAA+B;IAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,WAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO;IACzB,KAAK,MAAM,IAAI,IAAI,WAAW;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACzE,CAAC"}
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Vite
|
|
2
|
+
* Vite SDK — implements ClaudivSDK for Vite-based projects.
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export declare const claudivPlugin: typeof claudiv;
|
|
4
|
+
import type { ClaudivSDK, FrameworkDetector, InitResult, DevOptions, GenOptions } from '@claudiv/core';
|
|
5
|
+
export declare class ViteSdk implements ClaudivSDK {
|
|
6
|
+
name: string;
|
|
7
|
+
frameworkDetector: FrameworkDetector;
|
|
8
|
+
init(projectRoot: string): Promise<InitResult>;
|
|
9
|
+
dev(projectRoot: string, opts: DevOptions): Promise<void>;
|
|
10
|
+
gen(projectRoot: string, opts: GenOptions): Promise<void>;
|
|
11
|
+
getScripts(): Record<string, string>;
|
|
12
|
+
}
|
|
14
13
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMvG,qBAAa,OAAQ,YAAW,UAAU;IACxC,IAAI,SAAU;IACd,iBAAiB,EAAE,iBAAiB,CAAsB;IAEpD,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAI9C,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAQrC"}
|