dino-spec 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.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +243 -0
  3. package/bin/dino.js +3 -0
  4. package/dist/cli/index.d.ts +3 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +114 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/commands/active.d.ts +5 -0
  9. package/dist/commands/active.d.ts.map +1 -0
  10. package/dist/commands/active.js +85 -0
  11. package/dist/commands/active.js.map +1 -0
  12. package/dist/commands/archive.d.ts +9 -0
  13. package/dist/commands/archive.d.ts.map +1 -0
  14. package/dist/commands/archive.js +77 -0
  15. package/dist/commands/archive.js.map +1 -0
  16. package/dist/commands/init.d.ts +9 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +91 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/list.d.ts +12 -0
  21. package/dist/commands/list.d.ts.map +1 -0
  22. package/dist/commands/list.js +169 -0
  23. package/dist/commands/list.js.map +1 -0
  24. package/dist/commands/skill.d.ts +17 -0
  25. package/dist/commands/skill.d.ts.map +1 -0
  26. package/dist/commands/skill.js +143 -0
  27. package/dist/commands/skill.js.map +1 -0
  28. package/dist/commands/status.d.ts +9 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +96 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/update.d.ts +9 -0
  33. package/dist/commands/update.d.ts.map +1 -0
  34. package/dist/commands/update.js +64 -0
  35. package/dist/commands/update.js.map +1 -0
  36. package/dist/commands/view.d.ts +5 -0
  37. package/dist/commands/view.d.ts.map +1 -0
  38. package/dist/commands/view.js +177 -0
  39. package/dist/commands/view.js.map +1 -0
  40. package/dist/core/config.d.ts +51 -0
  41. package/dist/core/config.d.ts.map +1 -0
  42. package/dist/core/config.js +58 -0
  43. package/dist/core/config.js.map +1 -0
  44. package/dist/core/skills/index.d.ts +7 -0
  45. package/dist/core/skills/index.d.ts.map +1 -0
  46. package/dist/core/skills/index.js +6 -0
  47. package/dist/core/skills/index.js.map +1 -0
  48. package/dist/core/skills/loader.d.ts +34 -0
  49. package/dist/core/skills/loader.d.ts.map +1 -0
  50. package/dist/core/skills/loader.js +110 -0
  51. package/dist/core/skills/loader.js.map +1 -0
  52. package/dist/core/skills/registry.d.ts +31 -0
  53. package/dist/core/skills/registry.d.ts.map +1 -0
  54. package/dist/core/skills/registry.js +150 -0
  55. package/dist/core/skills/registry.js.map +1 -0
  56. package/dist/core/skills/types.d.ts +33 -0
  57. package/dist/core/skills/types.d.ts.map +1 -0
  58. package/dist/core/skills/types.js +5 -0
  59. package/dist/core/skills/types.js.map +1 -0
  60. package/dist/core/templates/dna-template.d.ts +5 -0
  61. package/dist/core/templates/dna-template.d.ts.map +1 -0
  62. package/dist/core/templates/dna-template.js +52 -0
  63. package/dist/core/templates/dna-template.js.map +1 -0
  64. package/dist/core/templates/index.d.ts +8 -0
  65. package/dist/core/templates/index.d.ts.map +1 -0
  66. package/dist/core/templates/index.js +8 -0
  67. package/dist/core/templates/index.js.map +1 -0
  68. package/dist/core/templates/rules-template.d.ts +5 -0
  69. package/dist/core/templates/rules-template.d.ts.map +1 -0
  70. package/dist/core/templates/rules-template.js +71 -0
  71. package/dist/core/templates/rules-template.js.map +1 -0
  72. package/dist/core/templates/skill-template.d.ts +5 -0
  73. package/dist/core/templates/skill-template.d.ts.map +1 -0
  74. package/dist/core/templates/skill-template.js +63 -0
  75. package/dist/core/templates/skill-template.js.map +1 -0
  76. package/dist/core/templates/slash-commands.d.ts +5 -0
  77. package/dist/core/templates/slash-commands.d.ts.map +1 -0
  78. package/dist/core/templates/slash-commands.js +753 -0
  79. package/dist/core/templates/slash-commands.js.map +1 -0
  80. package/dist/index.d.ts +7 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +7 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/utils/ascii-art.d.ts +38 -0
  85. package/dist/utils/ascii-art.d.ts.map +1 -0
  86. package/dist/utils/ascii-art.js +66 -0
  87. package/dist/utils/ascii-art.js.map +1 -0
  88. package/dist/utils/file-system.d.ts +67 -0
  89. package/dist/utils/file-system.d.ts.map +1 -0
  90. package/dist/utils/file-system.js +177 -0
  91. package/dist/utils/file-system.js.map +1 -0
  92. package/package.json +68 -0
@@ -0,0 +1,91 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { join } from 'path';
4
+ import { FileSystem } from '../utils/file-system.js';
5
+ import { getSuccessDino, getWarningDino } from '../utils/ascii-art.js';
6
+ import { DINO_DIR_NAME, CLAUDE_DIR_NAME, DINO_DIRS, CLAUDE_DIRS, FILES, VERSION, } from '../core/config.js';
7
+ import { getSlashCommandTemplates } from '../core/templates/slash-commands.js';
8
+ import { getWorkflowSkillTemplate } from '../core/templates/skill-template.js';
9
+ import { getWorkflowRulesTemplate } from '../core/templates/rules-template.js';
10
+ import { getDnaTemplate } from '../core/templates/dna-template.js';
11
+ /**
12
+ * Initialize dino-spec in a project
13
+ */
14
+ export async function initCommand(targetPath, options) {
15
+ const projectDir = join(process.cwd(), targetPath);
16
+ const dinoDir = join(projectDir, DINO_DIR_NAME);
17
+ const claudeDir = join(projectDir, CLAUDE_DIR_NAME);
18
+ // Check if already initialized
19
+ if (await FileSystem.exists(dinoDir) && !options.force) {
20
+ console.log(getWarningDino('dino-spec is already initialized in this project.'));
21
+ console.log(chalk.dim('Use --force to reinitialize.\n'));
22
+ return;
23
+ }
24
+ const spinner = ora('Initializing dino-spec...').start();
25
+ try {
26
+ // Create .dino directory structure
27
+ spinner.text = 'Creating .dino directory...';
28
+ await FileSystem.createDirectory(join(dinoDir, DINO_DIRS.specs));
29
+ await FileSystem.createDirectory(join(dinoDir, DINO_DIRS.archive));
30
+ // Create active.json
31
+ await FileSystem.writeJson(join(dinoDir, FILES.active), {
32
+ id: null,
33
+ phase: null,
34
+ createdAt: null,
35
+ });
36
+ // Create dna.md template
37
+ await FileSystem.writeFile(join(dinoDir, FILES.dna), getDnaTemplate());
38
+ // Create .claude directory structure
39
+ spinner.text = 'Creating .claude/commands/dino...';
40
+ await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.commands));
41
+ // Create slash commands
42
+ const slashCommands = getSlashCommandTemplates();
43
+ for (const [name, content] of Object.entries(slashCommands)) {
44
+ await FileSystem.writeFile(join(claudeDir, CLAUDE_DIRS.commands, `${name}.md`), content);
45
+ }
46
+ // Create skills directory and workflow skill
47
+ spinner.text = 'Creating .claude/skills/dino-workflow...';
48
+ await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.skills));
49
+ await FileSystem.writeFile(join(claudeDir, CLAUDE_DIRS.skills, 'SKILL.md'), getWorkflowSkillTemplate());
50
+ // Create rules directory and workflow rules
51
+ spinner.text = 'Creating .claude/rules/dino...';
52
+ await FileSystem.createDirectory(join(claudeDir, CLAUDE_DIRS.rules));
53
+ await FileSystem.writeFile(join(claudeDir, CLAUDE_DIRS.rules, 'workflow.md'), getWorkflowRulesTemplate());
54
+ // Merge hooks into settings.json
55
+ spinner.text = 'Configuring hooks...';
56
+ const settingsPath = join(claudeDir, 'settings.json');
57
+ await FileSystem.deepMergeJson(settingsPath, {
58
+ hooks: {
59
+ UserPromptSubmit: [
60
+ {
61
+ hooks: [
62
+ {
63
+ type: 'command',
64
+ command: 'dino inject-context 2>/dev/null || true',
65
+ },
66
+ ],
67
+ },
68
+ ],
69
+ },
70
+ });
71
+ spinner.succeed('dino-spec initialized successfully!');
72
+ // Show success message
73
+ console.log(getSuccessDino(`dino-spec v${VERSION} is ready!`));
74
+ console.log(chalk.dim(' Created:'));
75
+ console.log(chalk.dim(` ${DINO_DIR_NAME}/ - Specification data`));
76
+ console.log(chalk.dim(` ${CLAUDE_DIR_NAME}/commands/dino/ - Slash commands`));
77
+ console.log(chalk.dim(` ${CLAUDE_DIR_NAME}/skills/ - Workflow skill`));
78
+ console.log(chalk.dim(` ${CLAUDE_DIR_NAME}/rules/dino/ - Workflow rules`));
79
+ console.log('');
80
+ console.log(chalk.bold(' Next steps:'));
81
+ console.log(chalk.cyan(' 1. Edit .dino/dna.md with your project conventions'));
82
+ console.log(chalk.cyan(' 2. Run /dino.discover <your feature idea>'));
83
+ console.log('');
84
+ }
85
+ catch (error) {
86
+ spinner.fail('Failed to initialize dino-spec');
87
+ console.error(chalk.red(error instanceof Error ? error.message : String(error)));
88
+ process.exit(1);
89
+ }
90
+ }
91
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ interface ListOptions {
2
+ specs?: boolean;
3
+ skills?: boolean;
4
+ archived?: boolean;
5
+ json?: boolean;
6
+ }
7
+ /**
8
+ * List specifications and/or skills
9
+ */
10
+ export declare function listCommand(options: ListOptions): Promise<void>;
11
+ export {};
12
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAgBD;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DrE"}
@@ -0,0 +1,169 @@
1
+ import chalk from 'chalk';
2
+ import { join } from 'path';
3
+ import { FileSystem } from '../utils/file-system.js';
4
+ import { DINO_DIR_NAME, DINO_DIRS, FILES, CLAUDE_DIR_NAME } from '../core/config.js';
5
+ /**
6
+ * List specifications and/or skills
7
+ */
8
+ export async function listCommand(options) {
9
+ const showSpecs = options.specs || (!options.specs && !options.skills);
10
+ const showSkills = options.skills || (!options.specs && !options.skills);
11
+ const result = {};
12
+ if (showSpecs) {
13
+ result.specs = await listSpecs(options.archived);
14
+ }
15
+ if (showSkills) {
16
+ result.skills = await listSkills();
17
+ }
18
+ if (options.json) {
19
+ console.log(JSON.stringify(result, null, 2));
20
+ return;
21
+ }
22
+ // Display specs
23
+ if (result.specs) {
24
+ console.log(chalk.bold('\nSpecifications'));
25
+ console.log(chalk.dim('─'.repeat(40)));
26
+ if (result.specs.length === 0) {
27
+ console.log(chalk.dim(' No specifications found.'));
28
+ }
29
+ else {
30
+ for (const spec of result.specs) {
31
+ const statusIcon = spec.status === 'archived'
32
+ ? chalk.dim('○')
33
+ : chalk.green('●');
34
+ const progress = spec.progress.total > 0
35
+ ? chalk.dim(` [${spec.progress.completed}/${spec.progress.total}]`)
36
+ : '';
37
+ console.log(` ${statusIcon} ${spec.id}${progress}`);
38
+ if (spec.title !== spec.id) {
39
+ console.log(chalk.dim(` ${spec.title}`));
40
+ }
41
+ }
42
+ }
43
+ }
44
+ // Display skills
45
+ if (result.skills) {
46
+ console.log(chalk.bold('\nSkills'));
47
+ console.log(chalk.dim('─'.repeat(40)));
48
+ if (result.skills.length === 0) {
49
+ console.log(chalk.dim(' No skills found.'));
50
+ }
51
+ else {
52
+ for (const skill of result.skills) {
53
+ console.log(` ${chalk.cyan('◆')} ${skill.name}`);
54
+ console.log(chalk.dim(` ${skill.description}`));
55
+ }
56
+ }
57
+ }
58
+ console.log('');
59
+ }
60
+ /**
61
+ * List all specifications
62
+ */
63
+ async function listSpecs(includeArchived) {
64
+ const specs = [];
65
+ const dinoDir = join(process.cwd(), DINO_DIR_NAME);
66
+ // Active specs
67
+ const specsDir = join(dinoDir, DINO_DIRS.specs);
68
+ if (await FileSystem.exists(specsDir)) {
69
+ const specIds = await FileSystem.listDirectory(specsDir);
70
+ for (const id of specIds) {
71
+ const specPath = join(specsDir, id);
72
+ if (await FileSystem.isDirectory(specPath)) {
73
+ const info = await getSpecInfo(specPath, id, 'active');
74
+ if (info)
75
+ specs.push(info);
76
+ }
77
+ }
78
+ }
79
+ // Archived specs
80
+ if (includeArchived) {
81
+ const archiveDir = join(dinoDir, DINO_DIRS.archive);
82
+ if (await FileSystem.exists(archiveDir)) {
83
+ const archivedIds = await FileSystem.listDirectory(archiveDir);
84
+ for (const id of archivedIds) {
85
+ const specPath = join(archiveDir, id);
86
+ if (await FileSystem.isDirectory(specPath)) {
87
+ const info = await getSpecInfo(specPath, id, 'archived');
88
+ if (info)
89
+ specs.push(info);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return specs;
95
+ }
96
+ /**
97
+ * Get spec info from directory
98
+ */
99
+ async function getSpecInfo(specPath, id, status) {
100
+ const specFile = join(specPath, FILES.spec);
101
+ const tasksFile = join(specPath, FILES.tasks);
102
+ const specContent = await FileSystem.readFileSafe(specFile);
103
+ if (!specContent)
104
+ return null;
105
+ // Extract title
106
+ const titleMatch = specContent.match(/^#\s+(.+)$/m);
107
+ const title = titleMatch?.[1] ?? id;
108
+ // Count tasks
109
+ let completed = 0;
110
+ let total = 0;
111
+ const tasksContent = await FileSystem.readFileSafe(tasksFile);
112
+ if (tasksContent) {
113
+ const lines = tasksContent.split('\n');
114
+ for (const line of lines) {
115
+ if (line.match(/^- \[[ x]\]/)) {
116
+ total++;
117
+ if (line.match(/^- \[x\]/i)) {
118
+ completed++;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return {
124
+ id,
125
+ title,
126
+ status,
127
+ progress: { completed, total },
128
+ };
129
+ }
130
+ /**
131
+ * List all skills
132
+ */
133
+ async function listSkills() {
134
+ const skills = [];
135
+ const claudeDir = join(process.cwd(), CLAUDE_DIR_NAME);
136
+ const skillsDir = join(claudeDir, 'skills');
137
+ if (!await FileSystem.exists(skillsDir)) {
138
+ return skills;
139
+ }
140
+ const skillDirs = await FileSystem.listDirectory(skillsDir);
141
+ for (const dir of skillDirs) {
142
+ const skillPath = join(skillsDir, dir, 'SKILL.md');
143
+ const content = await FileSystem.readFileSafe(skillPath);
144
+ if (content) {
145
+ const info = parseSkillFrontmatter(content, dir, skillPath);
146
+ if (info)
147
+ skills.push(info);
148
+ }
149
+ }
150
+ return skills;
151
+ }
152
+ /**
153
+ * Parse skill frontmatter
154
+ */
155
+ function parseSkillFrontmatter(content, id, path) {
156
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
157
+ if (!match)
158
+ return null;
159
+ const frontmatter = match[1];
160
+ const nameMatch = frontmatter.match(/^name:\s*(.+)$/m);
161
+ const descMatch = frontmatter.match(/^description:\s*(.+)$/m);
162
+ return {
163
+ id,
164
+ name: nameMatch?.[1]?.trim() ?? id,
165
+ description: descMatch?.[1]?.trim() ?? 'No description',
166
+ path,
167
+ };
168
+ }
169
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * List all installed skills
3
+ */
4
+ export declare function skillListCommand(): Promise<void>;
5
+ /**
6
+ * Install a skill
7
+ */
8
+ export declare function skillInstallCommand(name: string): Promise<void>;
9
+ /**
10
+ * Remove a skill
11
+ */
12
+ export declare function skillRemoveCommand(name: string): Promise<void>;
13
+ /**
14
+ * Create a new custom skill
15
+ */
16
+ export declare function skillCreateCommand(name: string): Promise<void>;
17
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBtD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BrE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCpE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCpE"}
@@ -0,0 +1,143 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { join } from 'path';
4
+ import { SkillRegistry, SkillLoader } from '../core/skills/index.js';
5
+ import { CLAUDE_DIR_NAME } from '../core/config.js';
6
+ import { FileSystem } from '../utils/file-system.js';
7
+ /**
8
+ * List all installed skills
9
+ */
10
+ export async function skillListCommand() {
11
+ const cwd = process.cwd();
12
+ const loader = new SkillLoader(cwd);
13
+ const skills = await loader.loadAll();
14
+ console.log(chalk.bold('\nInstalled Skills'));
15
+ console.log(chalk.dim('─'.repeat(40)));
16
+ if (skills.length === 0) {
17
+ console.log(chalk.dim(' No skills installed.'));
18
+ console.log(chalk.dim(' Run "dino skill install <name>" to install a skill.\n'));
19
+ return;
20
+ }
21
+ for (const skill of skills) {
22
+ const sourceIcon = getSourceIcon(skill.source);
23
+ console.log(` ${sourceIcon} ${chalk.cyan(skill.metadata.name)}`);
24
+ console.log(chalk.dim(` ${skill.metadata.description}`));
25
+ if (skill.metadata.version) {
26
+ console.log(chalk.dim(` v${skill.metadata.version}`));
27
+ }
28
+ }
29
+ console.log('');
30
+ }
31
+ /**
32
+ * Install a skill
33
+ */
34
+ export async function skillInstallCommand(name) {
35
+ const cwd = process.cwd();
36
+ // Check if .claude directory exists
37
+ const claudeDir = join(cwd, CLAUDE_DIR_NAME);
38
+ if (!await FileSystem.exists(claudeDir)) {
39
+ console.log(chalk.yellow('\nNo .claude directory found.'));
40
+ console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
41
+ return;
42
+ }
43
+ const spinner = ora(`Installing skill "${name}"...`).start();
44
+ try {
45
+ const registry = new SkillRegistry();
46
+ const success = await registry.install(cwd, name);
47
+ if (success) {
48
+ spinner.succeed(`Installed skill "${name}"`);
49
+ console.log(chalk.dim(` Location: .claude/skills/${name}/SKILL.md`));
50
+ console.log(chalk.dim(' Edit the SKILL.md file to customize the skill.\n'));
51
+ }
52
+ else {
53
+ spinner.fail(`Skill "${name}" is already installed`);
54
+ console.log('');
55
+ }
56
+ }
57
+ catch (error) {
58
+ spinner.fail(`Failed to install skill "${name}"`);
59
+ console.error(chalk.red(`\n${error}\n`));
60
+ }
61
+ }
62
+ /**
63
+ * Remove a skill
64
+ */
65
+ export async function skillRemoveCommand(name) {
66
+ const cwd = process.cwd();
67
+ // Check if .claude directory exists
68
+ const claudeDir = join(cwd, CLAUDE_DIR_NAME);
69
+ if (!await FileSystem.exists(claudeDir)) {
70
+ console.log(chalk.yellow('\nNo .claude directory found.'));
71
+ console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
72
+ return;
73
+ }
74
+ // Don't allow removing bundled skills
75
+ if (name === 'dino-workflow') {
76
+ console.log(chalk.yellow('\nCannot remove bundled skill "dino-workflow".'));
77
+ console.log(chalk.dim('This skill is required for the dino workflow to function.\n'));
78
+ return;
79
+ }
80
+ const spinner = ora(`Removing skill "${name}"...`).start();
81
+ try {
82
+ const registry = new SkillRegistry();
83
+ const success = await registry.remove(cwd, name);
84
+ if (success) {
85
+ spinner.succeed(`Removed skill "${name}"`);
86
+ console.log('');
87
+ }
88
+ else {
89
+ spinner.fail(`Skill "${name}" not found`);
90
+ console.log('');
91
+ }
92
+ }
93
+ catch (error) {
94
+ spinner.fail(`Failed to remove skill "${name}"`);
95
+ console.error(chalk.red(`\n${error}\n`));
96
+ }
97
+ }
98
+ /**
99
+ * Create a new custom skill
100
+ */
101
+ export async function skillCreateCommand(name) {
102
+ const cwd = process.cwd();
103
+ // Check if .claude directory exists
104
+ const claudeDir = join(cwd, CLAUDE_DIR_NAME);
105
+ if (!await FileSystem.exists(claudeDir)) {
106
+ console.log(chalk.yellow('\nNo .claude directory found.'));
107
+ console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
108
+ return;
109
+ }
110
+ const loader = new SkillLoader(cwd);
111
+ if (await loader.exists(name)) {
112
+ console.log(chalk.yellow(`\nSkill "${name}" already exists.`));
113
+ console.log(chalk.dim(` Edit: .claude/skills/${name}/SKILL.md\n`));
114
+ return;
115
+ }
116
+ const spinner = ora(`Creating skill "${name}"...`).start();
117
+ try {
118
+ const registry = new SkillRegistry();
119
+ await registry.install(cwd, name);
120
+ spinner.succeed(`Created skill "${name}"`);
121
+ console.log(chalk.dim(` Location: .claude/skills/${name}/SKILL.md`));
122
+ console.log(chalk.dim(' Edit the SKILL.md file to define your skill.\n'));
123
+ }
124
+ catch (error) {
125
+ spinner.fail(`Failed to create skill "${name}"`);
126
+ console.error(chalk.red(`\n${error}\n`));
127
+ }
128
+ }
129
+ /**
130
+ * Get icon for skill source
131
+ */
132
+ function getSourceIcon(source) {
133
+ switch (source) {
134
+ case 'bundled':
135
+ return chalk.green('◆');
136
+ case 'registry':
137
+ return chalk.blue('◆');
138
+ case 'local':
139
+ default:
140
+ return chalk.cyan('◆');
141
+ }
142
+ }
143
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/commands/skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface StatusOptions {
2
+ json?: boolean;
3
+ }
4
+ /**
5
+ * Show current specification status and progress
6
+ */
7
+ export declare function statusCommand(specName?: string, options?: StatusOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2F7F"}
@@ -0,0 +1,96 @@
1
+ import chalk from 'chalk';
2
+ import { join } from 'path';
3
+ import { FileSystem } from '../utils/file-system.js';
4
+ import { DINO_DIR_NAME, FILES, DINO_DIRS } from '../core/config.js';
5
+ import { getDinoArt } from '../utils/ascii-art.js';
6
+ /**
7
+ * Show current specification status and progress
8
+ */
9
+ export async function statusCommand(specName, options) {
10
+ const dinoDir = join(process.cwd(), DINO_DIR_NAME);
11
+ // Check if dino is initialized
12
+ if (!await FileSystem.exists(dinoDir)) {
13
+ console.log(chalk.yellow('\nNo .dino directory found.'));
14
+ console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
15
+ return;
16
+ }
17
+ // Read active spec
18
+ const activePath = join(dinoDir, FILES.active);
19
+ const active = await FileSystem.readJsonSafe(activePath);
20
+ if (!active && !specName) {
21
+ console.log(getDinoArt('yellow'));
22
+ console.log(chalk.yellow('No active specification.'));
23
+ console.log(chalk.dim('Run "/dino.discover" to create a new specification.\n'));
24
+ return;
25
+ }
26
+ const targetSpec = specName ?? active?.id;
27
+ if (!targetSpec) {
28
+ console.log(chalk.yellow('No specification specified.\n'));
29
+ return;
30
+ }
31
+ // Read spec details
32
+ const specDir = join(dinoDir, DINO_DIRS.specs, targetSpec);
33
+ if (!await FileSystem.exists(specDir)) {
34
+ console.log(chalk.red(`Specification "${targetSpec}" not found.\n`));
35
+ return;
36
+ }
37
+ // Read tasks file for progress
38
+ const tasksPath = join(specDir, FILES.tasks);
39
+ const tasksContent = await FileSystem.readFileSafe(tasksPath);
40
+ let completed = 0;
41
+ let total = 0;
42
+ if (tasksContent) {
43
+ const lines = tasksContent.split('\n');
44
+ for (const line of lines) {
45
+ if (line.match(/^- \[[ x]\]/)) {
46
+ total++;
47
+ if (line.match(/^- \[x\]/i)) {
48
+ completed++;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ // Read spec file for title
54
+ const specPath = join(specDir, FILES.spec);
55
+ const specContent = await FileSystem.readFileSafe(specPath);
56
+ const titleMatch = specContent?.match(/^#\s+(.+)$/m);
57
+ const title = titleMatch?.[1] ?? targetSpec;
58
+ if (options?.json) {
59
+ console.log(JSON.stringify({
60
+ id: targetSpec,
61
+ title,
62
+ phase: active?.phase ?? 'unknown',
63
+ progress: { completed, total },
64
+ createdAt: active?.createdAt,
65
+ }, null, 2));
66
+ return;
67
+ }
68
+ // Display status
69
+ console.log(getDinoArt('cyan'));
70
+ console.log(chalk.bold(` ${title}`));
71
+ console.log(chalk.dim(` ID: ${targetSpec}`));
72
+ if (active?.phase) {
73
+ console.log(chalk.dim(` Phase: ${active.phase}`));
74
+ }
75
+ if (total > 0) {
76
+ const percentage = Math.round((completed / total) * 100);
77
+ const progressBar = createProgressBar(percentage);
78
+ console.log(`\n Progress: ${progressBar} ${percentage}%`);
79
+ console.log(chalk.dim(` ${completed}/${total} tasks completed`));
80
+ }
81
+ else {
82
+ console.log(chalk.dim('\n No tasks defined yet.'));
83
+ }
84
+ console.log('');
85
+ }
86
+ /**
87
+ * Create a simple progress bar
88
+ */
89
+ function createProgressBar(percentage, width = 20) {
90
+ const filled = Math.round((percentage / 100) * width);
91
+ const empty = width - filled;
92
+ const filledChar = chalk.green('█');
93
+ const emptyChar = chalk.dim('░');
94
+ return `[${filledChar.repeat(filled)}${emptyChar.repeat(empty)}]`;
95
+ }
96
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface UpdateOptions {
2
+ force?: boolean;
3
+ }
4
+ /**
5
+ * Update dino-spec configuration files in .claude/
6
+ */
7
+ export declare function updateCommand(options?: UpdateOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D1E"}