id3-cli 0.9.1
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.ja-JP.md +769 -0
- package/README.ko-KR.md +769 -0
- package/README.md +769 -0
- package/README.tr-TR.md +769 -0
- package/README.zh-CN.md +769 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +40 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/scripts/build-hooks.d.ts +1 -0
- package/dist/scripts/build-hooks.js +58 -0
- package/dist/scripts/build-hooks.js.map +1 -0
- package/dist/src/hooks/auto-audit.d.ts +4 -0
- package/dist/src/hooks/auto-audit.js +47 -0
- package/dist/src/hooks/auto-audit.js.map +1 -0
- package/dist/src/hooks/claude-pretool-entry.d.ts +1 -0
- package/dist/src/hooks/claude-pretool-entry.js +36 -0
- package/dist/src/hooks/claude-pretool-entry.js.map +1 -0
- package/dist/src/hooks/claude-stop-entry.d.ts +1 -0
- package/dist/src/hooks/claude-stop-entry.js +7 -0
- package/dist/src/hooks/claude-stop-entry.js.map +1 -0
- package/dist/src/hooks/post-commit-entry.d.ts +1 -0
- package/dist/src/hooks/post-commit-entry.js +7 -0
- package/dist/src/hooks/post-commit-entry.js.map +1 -0
- package/dist/src/hooks/pre-commit-entry.d.ts +1 -0
- package/dist/src/hooks/pre-commit-entry.js +16 -0
- package/dist/src/hooks/pre-commit-entry.js.map +1 -0
- package/dist/src/hooks/rule-check.d.ts +8 -0
- package/dist/src/hooks/rule-check.js +101 -0
- package/dist/src/hooks/rule-check.js.map +1 -0
- package/dist/src/hooks/schema-drift.d.ts +17 -0
- package/dist/src/hooks/schema-drift.js +151 -0
- package/dist/src/hooks/schema-drift.js.map +1 -0
- package/dist/src/hooks/shared.d.ts +43 -0
- package/dist/src/hooks/shared.js +98 -0
- package/dist/src/hooks/shared.js.map +1 -0
- package/dist/src/init.d.ts +20 -0
- package/dist/src/init.js +193 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/preview/mockup-generator.d.ts +56 -0
- package/dist/src/preview/mockup-generator.js +402 -0
- package/dist/src/preview/mockup-generator.js.map +1 -0
- package/dist/src/preview/renderer.d.ts +30 -0
- package/dist/src/preview/renderer.js +145 -0
- package/dist/src/preview/renderer.js.map +1 -0
- package/dist/src/preview/server.d.ts +9 -0
- package/dist/src/preview/server.js +55 -0
- package/dist/src/preview/server.js.map +1 -0
- package/dist/src/preview/ui-auditor.d.ts +27 -0
- package/dist/src/preview/ui-auditor.js +141 -0
- package/dist/src/preview/ui-auditor.js.map +1 -0
- package/dist/src/preview/ui-gate.d.ts +66 -0
- package/dist/src/preview/ui-gate.js +210 -0
- package/dist/src/preview/ui-gate.js.map +1 -0
- package/dist/src/utils/ascii.d.ts +7 -0
- package/dist/src/utils/ascii.js +41 -0
- package/dist/src/utils/ascii.js.map +1 -0
- package/dist/src/utils/fs.d.ts +6 -0
- package/dist/src/utils/fs.js +39 -0
- package/dist/src/utils/fs.js.map +1 -0
- package/dist/templates/hooks/iddd-auto-audit.js +121 -0
- package/dist/templates/hooks/iddd-schema-drift.js +279 -0
- package/dist/templates/hooks/post-commit +121 -0
- package/dist/templates/hooks/pre-commit +348 -0
- package/package.json +37 -0
- package/templates/.agents/skills/.gitkeep +0 -0
- package/templates/.claude/hooks/.gitkeep +0 -0
- package/templates/.claude/hooks/hook-config.json +34 -0
- package/templates/.claude/skills/.gitkeep +0 -0
- package/templates/.codex/.gitkeep +0 -0
- package/templates/.codex/hooks.json +40 -0
- package/templates/.iddd/commit-count +1 -0
- package/templates/.iddd/preview/.gitkeep +0 -0
- package/templates/AGENTS.md +204 -0
- package/templates/CLAUDE.md +215 -0
- package/templates/README.md +476 -0
- package/templates/docs/.gitkeep +0 -0
- package/templates/docs/business-rules.md +14 -0
- package/templates/docs/domain-glossary.md +8 -0
- package/templates/docs/info-debt.md +17 -0
- package/templates/docs/model-changelog.md +12 -0
- package/templates/hooks/.gitkeep +0 -0
- package/templates/hooks/iddd-auto-audit.js +121 -0
- package/templates/hooks/iddd-schema-drift.js +279 -0
- package/templates/hooks/post-commit +121 -0
- package/templates/hooks/pre-commit +348 -0
- package/templates/skills/id3-design-information/SKILL.md +170 -0
- package/templates/skills/id3-design-information/references/phase2-procedure.md +241 -0
- package/templates/skills/id3-design-ui/.gitkeep +0 -0
- package/templates/skills/id3-design-ui/SKILL.md +200 -0
- package/templates/skills/id3-design-ui/references/.gitkeep +0 -0
- package/templates/skills/id3-design-ui/references/step1-structure-derivation.md +177 -0
- package/templates/skills/id3-design-ui/references/step2-visual-contract.md +257 -0
- package/templates/skills/id3-design-ui/references/step3-gate-and-mockup.md +177 -0
- package/templates/skills/id3-design-ui/references/step4-implementation.md +244 -0
- package/templates/skills/id3-identify-entities/SKILL.md +239 -0
- package/templates/skills/id3-identify-entities/references/.gitkeep +0 -0
- package/templates/skills/id3-identify-entities/references/phase0-brownfield.md +377 -0
- package/templates/skills/id3-identify-entities/references/phase1-greenfield.md +319 -0
- package/templates/skills/id3-info-audit/.gitkeep +0 -0
- package/templates/skills/id3-info-audit/SKILL.md +191 -0
- package/templates/skills/id3-preview/.gitkeep +0 -0
- package/templates/skills/id3-preview/SKILL.md +168 -0
- package/templates/skills/id3-spawn-team/.gitkeep +0 -0
- package/templates/skills/id3-spawn-team/SKILL.md +213 -0
- package/templates/specs/.gitkeep +0 -0
- package/templates/specs/data-model.md +26 -0
- package/templates/specs/entity-catalog.md +22 -0
- package/templates/specs/ui-design-contract.md +54 -0
- package/templates/specs/ui-inventory.md +24 -0
- package/templates/specs/ui-structure.md +32 -0
- package/templates/src/.gitkeep +0 -0
- package/templates/steering/.gitkeep +0 -0
- package/templates/steering/data-conventions.md +42 -0
- package/templates/steering/product.md +38 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { box } from '../utils/ascii.js';
|
|
5
|
+
export function parseGitDiff(output) {
|
|
6
|
+
if (!output.trim())
|
|
7
|
+
return [];
|
|
8
|
+
return output
|
|
9
|
+
.trim()
|
|
10
|
+
.split('\n')
|
|
11
|
+
.map((line) => {
|
|
12
|
+
const [status, path] = line.split('\t');
|
|
13
|
+
return { status, path };
|
|
14
|
+
})
|
|
15
|
+
.filter((e) => e.path);
|
|
16
|
+
}
|
|
17
|
+
export function parseHookInput(stdinData) {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(stdinData);
|
|
20
|
+
if (!parsed.tool_name || !parsed.tool_input?.file_path) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
toolName: parsed.tool_name,
|
|
25
|
+
filePath: parsed.tool_input.file_path,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function getCachedDiff() {
|
|
33
|
+
try {
|
|
34
|
+
const output = execSync('git diff --cached --name-status', {
|
|
35
|
+
encoding: 'utf-8',
|
|
36
|
+
});
|
|
37
|
+
return parseGitDiff(output);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function getCachedFileContent(filePath) {
|
|
44
|
+
try {
|
|
45
|
+
return execSync(`git show :${filePath}`, { encoding: 'utf-8' });
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function isSchemaFile(filePath, patterns) {
|
|
52
|
+
return patterns.some((pattern) => matchGlob(filePath, pattern));
|
|
53
|
+
}
|
|
54
|
+
export function isValidationFile(filePath, patterns) {
|
|
55
|
+
return patterns.some((pattern) => matchGlob(filePath, pattern));
|
|
56
|
+
}
|
|
57
|
+
export function matchGlob(filePath, pattern) {
|
|
58
|
+
const regex = pattern
|
|
59
|
+
.replace(/\./g, '\\.')
|
|
60
|
+
.replace(/\*\*/g, '{{GLOBSTAR}}')
|
|
61
|
+
.replace(/\*/g, '[^/]*')
|
|
62
|
+
.replace(/\{\{GLOBSTAR\}\}/g, '.*');
|
|
63
|
+
return (new RegExp(`^${regex}$`).test(filePath) ||
|
|
64
|
+
new RegExp(`(^|/)${regex}$`).test(filePath));
|
|
65
|
+
}
|
|
66
|
+
export async function loadHookConfig(projectRoot) {
|
|
67
|
+
try {
|
|
68
|
+
const configPath = join(projectRoot, '.claude', 'hooks', 'hook-config.json');
|
|
69
|
+
const content = await readFile(configPath, 'utf-8');
|
|
70
|
+
return JSON.parse(content);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function isSkipHooks() {
|
|
77
|
+
return process.env['IDDD_SKIP_HOOKS'] === '1';
|
|
78
|
+
}
|
|
79
|
+
export async function logSkip(projectRoot) {
|
|
80
|
+
const { appendFile, mkdir } = await import('node:fs/promises');
|
|
81
|
+
const logDir = join(projectRoot, '.iddd');
|
|
82
|
+
await mkdir(logDir, { recursive: true });
|
|
83
|
+
const logPath = join(logDir, 'skip-history.log');
|
|
84
|
+
const timestamp = new Date().toISOString();
|
|
85
|
+
let commitHash = 'unknown';
|
|
86
|
+
try {
|
|
87
|
+
commitHash = execSync('git rev-parse HEAD', { encoding: 'utf-8' }).trim();
|
|
88
|
+
}
|
|
89
|
+
catch { }
|
|
90
|
+
await appendFile(logPath, `${timestamp}\t${commitHash}\tHook skipped\n`);
|
|
91
|
+
}
|
|
92
|
+
export function printBlock(title, message) {
|
|
93
|
+
console.error(box(message, { title }));
|
|
94
|
+
}
|
|
95
|
+
export function printWarn(title, message) {
|
|
96
|
+
console.error(box(message, { title }));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/hooks/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAOxC,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC9B,OAAO,MAAM;SACV,IAAI,EAAE;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,SAAS;YAC1B,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,SAAS;SACtC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,iCAAiC,EAAE;YACzD,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,aAAa,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,QAAkB;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,QAAkB;IAElB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe;IACzD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC;SAChC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,CACL,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAC5C,CAAC;AACJ,CAAC;AA0BD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CACrB,WAAW,EACX,SAAS,EACT,OAAO,EACP,kBAAkB,CACnB,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAe,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,GAAG,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,WAAmB;IAC/C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,UAAU,GAAG,SAAS,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,SAAS,KAAK,UAAU,kBAAkB,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,OAAe;IACvD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
templatesDir?: string;
|
|
3
|
+
overwrite?: boolean;
|
|
4
|
+
skipGitHooks?: boolean;
|
|
5
|
+
noSymlink?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface InitResult {
|
|
8
|
+
alreadyInstalled: boolean;
|
|
9
|
+
targetDir: string;
|
|
10
|
+
gitHooksInstalled: boolean;
|
|
11
|
+
claudeHooksInjected: boolean;
|
|
12
|
+
platforms: {
|
|
13
|
+
claude: boolean;
|
|
14
|
+
codex: boolean;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export declare function initProject(targetDir: string, options?: InitOptions): Promise<InitResult>;
|
|
18
|
+
export declare function injectClaudeHooks(targetDir: string): Promise<void>;
|
|
19
|
+
export declare function printBanner(): void;
|
|
20
|
+
export declare function printSuccess(result: InitResult): void;
|
package/dist/src/init.js
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { join, resolve } from 'node:path';
|
|
2
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { copyDir, createSymlink, fileExists } from './utils/fs.js';
|
|
4
|
+
import { banner, box } from './utils/ascii.js';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
export async function initProject(targetDir, options = {}) {
|
|
7
|
+
const { templatesDir: tplDir, overwrite = false, skipGitHooks = false, noSymlink = false, } = options;
|
|
8
|
+
const absTarget = resolve(targetDir);
|
|
9
|
+
// When compiled, runs from dist/src/, so go up 2 levels to project root
|
|
10
|
+
const templatesDir = tplDir ?? join(import.meta.dirname, '..', '..', 'templates');
|
|
11
|
+
// Check existing installation
|
|
12
|
+
const claudeMdExists = await fileExists(join(absTarget, 'CLAUDE.md'));
|
|
13
|
+
if (claudeMdExists && !overwrite) {
|
|
14
|
+
return {
|
|
15
|
+
alreadyInstalled: true,
|
|
16
|
+
targetDir: absTarget,
|
|
17
|
+
gitHooksInstalled: false,
|
|
18
|
+
claudeHooksInjected: false,
|
|
19
|
+
platforms: { claude: false, codex: false },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Copy templates
|
|
23
|
+
await copyDir(templatesDir, absTarget, { overwrite });
|
|
24
|
+
// Create skill symlinks
|
|
25
|
+
if (!noSymlink) {
|
|
26
|
+
await createSkillSymlinks(absTarget);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
// Windows fallback: copy instead of symlink
|
|
30
|
+
await copySkillFiles(absTarget);
|
|
31
|
+
}
|
|
32
|
+
// Detect platforms
|
|
33
|
+
const platforms = detectPlatforms();
|
|
34
|
+
// Inject Claude Code Hooks into settings.local.json
|
|
35
|
+
let claudeHooksInjected = false;
|
|
36
|
+
if (platforms.claude) {
|
|
37
|
+
await injectClaudeHooks(absTarget);
|
|
38
|
+
claudeHooksInjected = true;
|
|
39
|
+
}
|
|
40
|
+
// Set up Codex hooks.json if Codex detected
|
|
41
|
+
if (platforms.codex) {
|
|
42
|
+
// hooks.json is already in templates/.codex/hooks.json
|
|
43
|
+
// Symlinks to .agents/skills/ are handled by createSkillSymlinks
|
|
44
|
+
}
|
|
45
|
+
// Install Git hooks
|
|
46
|
+
let gitHooksInstalled = false;
|
|
47
|
+
if (!skipGitHooks) {
|
|
48
|
+
gitHooksInstalled = await installGitHooks(absTarget);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
alreadyInstalled: false,
|
|
52
|
+
targetDir: absTarget,
|
|
53
|
+
gitHooksInstalled,
|
|
54
|
+
claudeHooksInjected,
|
|
55
|
+
platforms,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function createSkillSymlinks(targetDir) {
|
|
59
|
+
const skills = [
|
|
60
|
+
'id3-identify-entities',
|
|
61
|
+
'id3-design-information',
|
|
62
|
+
'id3-design-ui',
|
|
63
|
+
'id3-spawn-team',
|
|
64
|
+
'id3-info-audit',
|
|
65
|
+
'id3-preview',
|
|
66
|
+
];
|
|
67
|
+
const platforms = ['.claude', '.agents'];
|
|
68
|
+
for (const skill of skills) {
|
|
69
|
+
const original = join(targetDir, 'skills', skill, 'SKILL.md');
|
|
70
|
+
for (const platform of platforms) {
|
|
71
|
+
const link = join(targetDir, platform, 'skills', skill, 'SKILL.md');
|
|
72
|
+
await createSymlink(original, link);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function copySkillFiles(targetDir) {
|
|
77
|
+
// Windows fallback: copy files instead of creating symlinks
|
|
78
|
+
const { copyFile, mkdir } = await import('node:fs/promises');
|
|
79
|
+
const skills = [
|
|
80
|
+
'id3-identify-entities',
|
|
81
|
+
'id3-design-information',
|
|
82
|
+
'id3-design-ui',
|
|
83
|
+
'id3-spawn-team',
|
|
84
|
+
'id3-info-audit',
|
|
85
|
+
'id3-preview',
|
|
86
|
+
];
|
|
87
|
+
const platformDirs = ['.claude', '.agents'];
|
|
88
|
+
for (const skill of skills) {
|
|
89
|
+
const original = join(targetDir, 'skills', skill, 'SKILL.md');
|
|
90
|
+
for (const platform of platformDirs) {
|
|
91
|
+
const dest = join(targetDir, platform, 'skills', skill, 'SKILL.md');
|
|
92
|
+
await mkdir(join(targetDir, platform, 'skills', skill), { recursive: true });
|
|
93
|
+
if (await fileExists(original)) {
|
|
94
|
+
await copyFile(original, dest);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function injectClaudeHooks(targetDir) {
|
|
100
|
+
const settingsPath = join(targetDir, '.claude', 'settings.local.json');
|
|
101
|
+
let settings = {};
|
|
102
|
+
try {
|
|
103
|
+
const existing = await readFile(settingsPath, 'utf-8');
|
|
104
|
+
settings = JSON.parse(existing);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// No existing settings — start fresh
|
|
108
|
+
}
|
|
109
|
+
// Inject Hook configuration
|
|
110
|
+
const hooks = settings['hooks'] ?? {};
|
|
111
|
+
hooks['PreToolUse'] = [
|
|
112
|
+
...(hooks['PreToolUse'] ?? []),
|
|
113
|
+
{
|
|
114
|
+
matcher: 'Write|Edit',
|
|
115
|
+
command: `node "${join(targetDir, 'hooks', 'iddd-schema-drift.js')}"`,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
hooks['Stop'] = [
|
|
119
|
+
...(hooks['Stop'] ?? []),
|
|
120
|
+
{
|
|
121
|
+
command: `node "${join(targetDir, 'hooks', 'iddd-auto-audit.js')}"`,
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
settings['hooks'] = hooks;
|
|
125
|
+
const { mkdir } = await import('node:fs/promises');
|
|
126
|
+
await mkdir(join(targetDir, '.claude'), { recursive: true });
|
|
127
|
+
await writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
128
|
+
}
|
|
129
|
+
function detectPlatforms() {
|
|
130
|
+
const claude = commandExists('claude');
|
|
131
|
+
const codex = commandExists('codex');
|
|
132
|
+
return { claude, codex };
|
|
133
|
+
}
|
|
134
|
+
function commandExists(cmd) {
|
|
135
|
+
try {
|
|
136
|
+
execSync(`which ${cmd}`, { stdio: 'ignore' });
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function installGitHooks(targetDir) {
|
|
144
|
+
const gitDir = join(targetDir, '.git');
|
|
145
|
+
if (!(await fileExists(gitDir))) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
const hooksDir = join(gitDir, 'hooks');
|
|
149
|
+
const hooks = ['pre-commit', 'post-commit'];
|
|
150
|
+
for (const hook of hooks) {
|
|
151
|
+
const target = join(targetDir, 'hooks', hook);
|
|
152
|
+
const link = join(hooksDir, hook);
|
|
153
|
+
if (await fileExists(link)) {
|
|
154
|
+
continue; // don't overwrite existing hooks
|
|
155
|
+
}
|
|
156
|
+
await createSymlink(target, link);
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
export function printBanner() {
|
|
161
|
+
const pkg = { version: '0.9.1' };
|
|
162
|
+
console.log(banner(pkg.version));
|
|
163
|
+
}
|
|
164
|
+
export function printSuccess(result) {
|
|
165
|
+
const platformLine = [
|
|
166
|
+
result.platforms.claude ? 'Claude Code \u2713' : 'Claude Code \u2717',
|
|
167
|
+
result.platforms.codex ? 'Codex \u2713' : 'Codex \u2717',
|
|
168
|
+
].join(' ');
|
|
169
|
+
const hookLine = [
|
|
170
|
+
result.gitHooksInstalled ? 'Git Hooks \u2713' : 'Git Hooks \u2717',
|
|
171
|
+
result.claudeHooksInjected ? 'Claude Code Hooks \u2713' : 'Claude Code Hooks \u2717',
|
|
172
|
+
].join(' ');
|
|
173
|
+
const content = [
|
|
174
|
+
'Next steps:',
|
|
175
|
+
'',
|
|
176
|
+
'1. Fill in steering/product.md',
|
|
177
|
+
'2. Use "identify entities" to start',
|
|
178
|
+
'3. Customize steering/data-conventions.md',
|
|
179
|
+
'',
|
|
180
|
+
'Skills:',
|
|
181
|
+
'\u251c\u2500\u2500 id3-identify-entities (Phase 0/1)',
|
|
182
|
+
'\u251c\u2500\u2500 id3-design-information (Phase 2)',
|
|
183
|
+
'\u251c\u2500\u2500 id3-design-ui (Phase 2.5)',
|
|
184
|
+
'\u251c\u2500\u2500 id3-spawn-team (Phase 3-5)',
|
|
185
|
+
'\u251c\u2500\u2500 id3-info-audit (Audit)',
|
|
186
|
+
'\u2514\u2500\u2500 id3-preview (Visual Preview)',
|
|
187
|
+
'',
|
|
188
|
+
`Platforms: ${platformLine}`,
|
|
189
|
+
`Hooks: ${hookLine}`,
|
|
190
|
+
].join('\n');
|
|
191
|
+
console.log(box(content, { title: '\u2713 IDDD installed' }));
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export interface AttributeDef {
|
|
2
|
+
name: string;
|
|
3
|
+
type: string;
|
|
4
|
+
constraints: string[];
|
|
5
|
+
maxLength?: number;
|
|
6
|
+
enumValues?: string[];
|
|
7
|
+
refEntity?: string;
|
|
8
|
+
subtype?: string;
|
|
9
|
+
min?: number;
|
|
10
|
+
max?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface RelationshipDef {
|
|
13
|
+
target: string;
|
|
14
|
+
type: '1:N' | 'N:1' | 'N:M' | '1:1';
|
|
15
|
+
fk: string;
|
|
16
|
+
}
|
|
17
|
+
export interface StateTransition {
|
|
18
|
+
from: string;
|
|
19
|
+
to: string;
|
|
20
|
+
}
|
|
21
|
+
export interface EntityDef {
|
|
22
|
+
name: string;
|
|
23
|
+
attributes: AttributeDef[];
|
|
24
|
+
relationships: RelationshipDef[];
|
|
25
|
+
stateTransitions: StateTransition[];
|
|
26
|
+
}
|
|
27
|
+
export interface ScreenDerivation {
|
|
28
|
+
name: string;
|
|
29
|
+
url: string;
|
|
30
|
+
entity: string;
|
|
31
|
+
pattern: string;
|
|
32
|
+
priority: string;
|
|
33
|
+
source: string;
|
|
34
|
+
relatedEntity?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface DesignTokens {
|
|
37
|
+
spacing: {
|
|
38
|
+
base: number;
|
|
39
|
+
};
|
|
40
|
+
colors: {
|
|
41
|
+
accent: string;
|
|
42
|
+
surface: string;
|
|
43
|
+
secondary: string;
|
|
44
|
+
};
|
|
45
|
+
typography: {
|
|
46
|
+
body: {
|
|
47
|
+
size: string;
|
|
48
|
+
weight: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export declare function deriveScreensFromEntities(entities: EntityDef[]): ScreenDerivation[];
|
|
53
|
+
export declare function mapAttributeToWidget(attr: AttributeDef): string;
|
|
54
|
+
export declare function generateSampleData(attr: AttributeDef, count: number): (string | number | boolean)[];
|
|
55
|
+
export declare function renderMockupIndexHtml(screens: ScreenDerivation[], title: string): string;
|
|
56
|
+
export declare function renderEntityMockupHtml(entity: EntityDef, tokens: DesignTokens): string;
|