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.
- package/LICENSE +21 -0
- package/README.md +243 -0
- package/bin/dino.js +3 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +114 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/active.d.ts +5 -0
- package/dist/commands/active.d.ts.map +1 -0
- package/dist/commands/active.js +85 -0
- package/dist/commands/active.js.map +1 -0
- package/dist/commands/archive.d.ts +9 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +77 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +91 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +12 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +169 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/skill.d.ts +17 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +143 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +96 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +64 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/view.d.ts +5 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +177 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/core/config.d.ts +51 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +58 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/skills/index.d.ts +7 -0
- package/dist/core/skills/index.d.ts.map +1 -0
- package/dist/core/skills/index.js +6 -0
- package/dist/core/skills/index.js.map +1 -0
- package/dist/core/skills/loader.d.ts +34 -0
- package/dist/core/skills/loader.d.ts.map +1 -0
- package/dist/core/skills/loader.js +110 -0
- package/dist/core/skills/loader.js.map +1 -0
- package/dist/core/skills/registry.d.ts +31 -0
- package/dist/core/skills/registry.d.ts.map +1 -0
- package/dist/core/skills/registry.js +150 -0
- package/dist/core/skills/registry.js.map +1 -0
- package/dist/core/skills/types.d.ts +33 -0
- package/dist/core/skills/types.d.ts.map +1 -0
- package/dist/core/skills/types.js +5 -0
- package/dist/core/skills/types.js.map +1 -0
- package/dist/core/templates/dna-template.d.ts +5 -0
- package/dist/core/templates/dna-template.d.ts.map +1 -0
- package/dist/core/templates/dna-template.js +52 -0
- package/dist/core/templates/dna-template.js.map +1 -0
- package/dist/core/templates/index.d.ts +8 -0
- package/dist/core/templates/index.d.ts.map +1 -0
- package/dist/core/templates/index.js +8 -0
- package/dist/core/templates/index.js.map +1 -0
- package/dist/core/templates/rules-template.d.ts +5 -0
- package/dist/core/templates/rules-template.d.ts.map +1 -0
- package/dist/core/templates/rules-template.js +71 -0
- package/dist/core/templates/rules-template.js.map +1 -0
- package/dist/core/templates/skill-template.d.ts +5 -0
- package/dist/core/templates/skill-template.d.ts.map +1 -0
- package/dist/core/templates/skill-template.js +63 -0
- package/dist/core/templates/skill-template.js.map +1 -0
- package/dist/core/templates/slash-commands.d.ts +5 -0
- package/dist/core/templates/slash-commands.d.ts.map +1 -0
- package/dist/core/templates/slash-commands.js +753 -0
- package/dist/core/templates/slash-commands.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/ascii-art.d.ts +38 -0
- package/dist/utils/ascii-art.d.ts.map +1 -0
- package/dist/utils/ascii-art.js +66 -0
- package/dist/utils/ascii-art.js.map +1 -0
- package/dist/utils/file-system.d.ts +67 -0
- package/dist/utils/file-system.d.ts.map +1 -0
- package/dist/utils/file-system.js +177 -0
- package/dist/utils/file-system.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,64 @@
|
|
|
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 { DINO_DIR_NAME, CLAUDE_DIR_NAME, CLAUDE_DIRS } from '../core/config.js';
|
|
6
|
+
import { getSlashCommandTemplates } from '../core/templates/slash-commands.js';
|
|
7
|
+
import { getWorkflowSkillTemplate } from '../core/templates/skill-template.js';
|
|
8
|
+
import { getWorkflowRulesTemplate } from '../core/templates/rules-template.js';
|
|
9
|
+
/**
|
|
10
|
+
* Update dino-spec configuration files in .claude/
|
|
11
|
+
*/
|
|
12
|
+
export async function updateCommand(options) {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
const dinoDir = join(cwd, DINO_DIR_NAME);
|
|
15
|
+
const claudeDir = join(cwd, CLAUDE_DIR_NAME);
|
|
16
|
+
// Check if dino is initialized
|
|
17
|
+
if (!await FileSystem.exists(dinoDir)) {
|
|
18
|
+
console.log(chalk.yellow('\nNo .dino directory found.'));
|
|
19
|
+
console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const spinner = ora('Updating dino-spec configuration...').start();
|
|
23
|
+
try {
|
|
24
|
+
// Update slash commands
|
|
25
|
+
const commandsDir = join(claudeDir, CLAUDE_DIRS.commands);
|
|
26
|
+
const templates = getSlashCommandTemplates();
|
|
27
|
+
let updated = 0;
|
|
28
|
+
for (const [name, content] of Object.entries(templates)) {
|
|
29
|
+
const filePath = join(commandsDir, `${name}.md`);
|
|
30
|
+
const existing = await FileSystem.readFileSafe(filePath);
|
|
31
|
+
if (!existing || options?.force) {
|
|
32
|
+
await FileSystem.writeFile(filePath, content);
|
|
33
|
+
updated++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Update skill
|
|
37
|
+
const skillPath = join(claudeDir, CLAUDE_DIRS.skills, 'SKILL.md');
|
|
38
|
+
const existingSkill = await FileSystem.readFileSafe(skillPath);
|
|
39
|
+
if (!existingSkill || options?.force) {
|
|
40
|
+
await FileSystem.writeFile(skillPath, getWorkflowSkillTemplate());
|
|
41
|
+
updated++;
|
|
42
|
+
}
|
|
43
|
+
// Update rules
|
|
44
|
+
const rulesPath = join(claudeDir, CLAUDE_DIRS.rules, 'workflow.md');
|
|
45
|
+
const existingRules = await FileSystem.readFileSafe(rulesPath);
|
|
46
|
+
if (!existingRules || options?.force) {
|
|
47
|
+
await FileSystem.writeFile(rulesPath, getWorkflowRulesTemplate());
|
|
48
|
+
updated++;
|
|
49
|
+
}
|
|
50
|
+
if (updated === 0) {
|
|
51
|
+
spinner.succeed('All configuration files are up to date');
|
|
52
|
+
console.log(chalk.dim(' Use --force to overwrite existing files.\n'));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
spinner.succeed(`Updated ${updated} configuration file(s)`);
|
|
56
|
+
console.log('');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
spinner.fail('Failed to update configuration');
|
|
61
|
+
console.error(chalk.red(`\n${error}\n`));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA2EjD"}
|
|
@@ -0,0 +1,177 @@
|
|
|
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, WORKFLOW_PHASES } from '../core/config.js';
|
|
5
|
+
import { getDinoHeader } from '../utils/ascii-art.js';
|
|
6
|
+
import { VERSION } from '../core/config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Show interactive dashboard view
|
|
9
|
+
*/
|
|
10
|
+
export async function viewCommand() {
|
|
11
|
+
const dinoDir = join(process.cwd(), DINO_DIR_NAME);
|
|
12
|
+
// Check if dino is initialized
|
|
13
|
+
if (!await FileSystem.exists(dinoDir)) {
|
|
14
|
+
console.log(getDinoHeader('Spec-Driven Development for Claude Code', VERSION));
|
|
15
|
+
console.log(chalk.yellow('No .dino directory found.'));
|
|
16
|
+
console.log(chalk.dim('Run "dino init" to initialize dino-spec in this project.\n'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Read active spec
|
|
20
|
+
const activePath = join(dinoDir, FILES.active);
|
|
21
|
+
const active = await FileSystem.readJsonSafe(activePath);
|
|
22
|
+
// Get all specs
|
|
23
|
+
const specsDir = join(dinoDir, DINO_DIRS.specs);
|
|
24
|
+
const archiveDir = join(dinoDir, DINO_DIRS.archive);
|
|
25
|
+
const activeSpecs = await getSpecsSummary(specsDir, active?.id ?? null);
|
|
26
|
+
const archivedSpecs = await getSpecsSummary(archiveDir, null, true);
|
|
27
|
+
// Display dashboard
|
|
28
|
+
console.log(getDinoHeader('Dashboard', VERSION));
|
|
29
|
+
// Workflow phases visualization
|
|
30
|
+
console.log(chalk.bold('Workflow Phases'));
|
|
31
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
32
|
+
displayWorkflowPhases(active?.phase ?? null);
|
|
33
|
+
console.log('');
|
|
34
|
+
// Active spec details
|
|
35
|
+
if (active?.id && activeSpecs.length > 0) {
|
|
36
|
+
const currentSpec = activeSpecs.find(s => s.id === active.id);
|
|
37
|
+
if (currentSpec) {
|
|
38
|
+
console.log(chalk.bold('Current Specification'));
|
|
39
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
40
|
+
displaySpecDetail(currentSpec);
|
|
41
|
+
console.log('');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// All specs
|
|
45
|
+
console.log(chalk.bold('All Specifications'));
|
|
46
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
47
|
+
if (activeSpecs.length === 0 && archivedSpecs.length === 0) {
|
|
48
|
+
console.log(chalk.dim(' No specifications found.'));
|
|
49
|
+
console.log(chalk.dim(' Run "/dino.discover" to create your first specification.\n'));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
if (activeSpecs.length > 0) {
|
|
53
|
+
console.log(chalk.dim(' Active:'));
|
|
54
|
+
for (const spec of activeSpecs) {
|
|
55
|
+
displaySpecLine(spec);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (archivedSpecs.length > 0) {
|
|
59
|
+
console.log(chalk.dim('\n Archived:'));
|
|
60
|
+
for (const spec of archivedSpecs) {
|
|
61
|
+
displaySpecLine(spec, true);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.log('');
|
|
66
|
+
// Quick commands
|
|
67
|
+
console.log(chalk.bold('Quick Commands'));
|
|
68
|
+
console.log(chalk.dim('─'.repeat(60)));
|
|
69
|
+
console.log(` ${chalk.cyan('dino status')} Show current spec progress`);
|
|
70
|
+
console.log(` ${chalk.cyan('dino list')} List all specs and skills`);
|
|
71
|
+
console.log(` ${chalk.cyan('dino active')} Show or set active spec`);
|
|
72
|
+
console.log(` ${chalk.cyan('/dino.discover')} Start a new specification`);
|
|
73
|
+
console.log('');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get summaries of all specs in a directory
|
|
77
|
+
*/
|
|
78
|
+
async function getSpecsSummary(dir, activeId, archived = false) {
|
|
79
|
+
const summaries = [];
|
|
80
|
+
if (!await FileSystem.exists(dir)) {
|
|
81
|
+
return summaries;
|
|
82
|
+
}
|
|
83
|
+
const specIds = await FileSystem.listDirectory(dir);
|
|
84
|
+
for (const id of specIds) {
|
|
85
|
+
const specDir = join(dir, id);
|
|
86
|
+
if (!await FileSystem.isDirectory(specDir))
|
|
87
|
+
continue;
|
|
88
|
+
const specPath = join(specDir, FILES.spec);
|
|
89
|
+
const tasksPath = join(specDir, FILES.tasks);
|
|
90
|
+
const specContent = await FileSystem.readFileSafe(specPath);
|
|
91
|
+
if (!specContent)
|
|
92
|
+
continue;
|
|
93
|
+
// Extract title and phase
|
|
94
|
+
const titleMatch = specContent.match(/^#\s+(.+)$/m);
|
|
95
|
+
const phaseMatch = specContent.match(/Phase:\s*(\w+)/i);
|
|
96
|
+
const title = titleMatch?.[1] ?? id;
|
|
97
|
+
const phase = archived ? 'archived' : (phaseMatch?.[1] ?? 'discover');
|
|
98
|
+
// Count tasks
|
|
99
|
+
let completed = 0;
|
|
100
|
+
let total = 0;
|
|
101
|
+
const tasksContent = await FileSystem.readFileSafe(tasksPath);
|
|
102
|
+
if (tasksContent) {
|
|
103
|
+
const lines = tasksContent.split('\n');
|
|
104
|
+
for (const line of lines) {
|
|
105
|
+
if (line.match(/^- \[[ x]\]/)) {
|
|
106
|
+
total++;
|
|
107
|
+
if (line.match(/^- \[x\]/i)) {
|
|
108
|
+
completed++;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
summaries.push({
|
|
114
|
+
id,
|
|
115
|
+
title,
|
|
116
|
+
phase,
|
|
117
|
+
progress: { completed, total },
|
|
118
|
+
isActive: id === activeId,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return summaries;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Display workflow phases with current phase highlighted
|
|
125
|
+
*/
|
|
126
|
+
function displayWorkflowPhases(currentPhase) {
|
|
127
|
+
const phaseDisplay = WORKFLOW_PHASES.map(phase => {
|
|
128
|
+
if (phase === currentPhase) {
|
|
129
|
+
return chalk.cyan.bold(`[${phase}]`);
|
|
130
|
+
}
|
|
131
|
+
const index = WORKFLOW_PHASES.indexOf(phase);
|
|
132
|
+
const currentIndex = currentPhase ? WORKFLOW_PHASES.indexOf(currentPhase) : -1;
|
|
133
|
+
if (currentIndex >= 0 && index < currentIndex) {
|
|
134
|
+
return chalk.green(phase);
|
|
135
|
+
}
|
|
136
|
+
return chalk.dim(phase);
|
|
137
|
+
});
|
|
138
|
+
console.log(` ${phaseDisplay.join(' → ')}`);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Display detailed spec info
|
|
142
|
+
*/
|
|
143
|
+
function displaySpecDetail(spec) {
|
|
144
|
+
console.log(` ${chalk.bold(spec.title)}`);
|
|
145
|
+
console.log(chalk.dim(` ID: ${spec.id}`));
|
|
146
|
+
console.log(` Phase: ${chalk.cyan(spec.phase)}`);
|
|
147
|
+
if (spec.progress.total > 0) {
|
|
148
|
+
const percentage = Math.round((spec.progress.completed / spec.progress.total) * 100);
|
|
149
|
+
const progressBar = createProgressBar(percentage);
|
|
150
|
+
console.log(` Progress: ${progressBar} ${percentage}% (${spec.progress.completed}/${spec.progress.total})`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Display a single spec line
|
|
155
|
+
*/
|
|
156
|
+
function displaySpecLine(spec, archived = false) {
|
|
157
|
+
const icon = spec.isActive ? chalk.green('●') : (archived ? chalk.dim('○') : chalk.yellow('○'));
|
|
158
|
+
const progress = spec.progress.total > 0
|
|
159
|
+
? chalk.dim(` [${spec.progress.completed}/${spec.progress.total}]`)
|
|
160
|
+
: '';
|
|
161
|
+
const activeMarker = spec.isActive ? chalk.cyan(' (active)') : '';
|
|
162
|
+
console.log(` ${icon} ${spec.id}${progress}${activeMarker}`);
|
|
163
|
+
if (spec.title !== spec.id) {
|
|
164
|
+
console.log(chalk.dim(` ${spec.title}`));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Create a progress bar
|
|
169
|
+
*/
|
|
170
|
+
function createProgressBar(percentage, width = 15) {
|
|
171
|
+
const filled = Math.round((percentage / 100) * width);
|
|
172
|
+
const empty = width - filled;
|
|
173
|
+
const filledChar = chalk.green('█');
|
|
174
|
+
const emptyChar = chalk.dim('░');
|
|
175
|
+
return `[${filledChar.repeat(filled)}${emptyChar.repeat(empty)}]`;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/commands/view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core configuration constants for dino-spec
|
|
3
|
+
*/
|
|
4
|
+
/** Directory name for dino data files */
|
|
5
|
+
export declare const DINO_DIR_NAME = ".dino";
|
|
6
|
+
/** Directory name for Claude Code configuration */
|
|
7
|
+
export declare const CLAUDE_DIR_NAME = ".claude";
|
|
8
|
+
/** Markers for managed content sections */
|
|
9
|
+
export declare const DINO_MARKERS: {
|
|
10
|
+
readonly start: "<!-- DINO:START -->";
|
|
11
|
+
readonly end: "<!-- DINO:END -->";
|
|
12
|
+
readonly coreStart: "<!-- DINO:CORE:START -->";
|
|
13
|
+
readonly coreEnd: "<!-- DINO:CORE:END -->";
|
|
14
|
+
readonly userStart: "<!-- DINO:USER:START -->";
|
|
15
|
+
readonly userEnd: "<!-- DINO:USER:END -->";
|
|
16
|
+
};
|
|
17
|
+
/** Workflow phases in order */
|
|
18
|
+
export declare const WORKFLOW_PHASES: readonly ["discover", "scout", "clarify", "nest", "hatch", "hunt", "fossil", "next"];
|
|
19
|
+
export type WorkflowPhase = typeof WORKFLOW_PHASES[number];
|
|
20
|
+
/** Phases that require Plan Mode */
|
|
21
|
+
export declare const PLAN_MODE_PHASES: WorkflowPhase[];
|
|
22
|
+
/** Minimum tasks before requiring Plan Mode for hatch */
|
|
23
|
+
export declare const PLAN_MODE_TASK_THRESHOLD = 5;
|
|
24
|
+
/** Maximum tasks per phase to prevent context loss */
|
|
25
|
+
export declare const MAX_TASKS_PER_PHASE = 10;
|
|
26
|
+
/** Spec statuses */
|
|
27
|
+
export declare const SPEC_STATUSES: readonly ["draft", "active", "completed", "archived"];
|
|
28
|
+
export type SpecStatus = typeof SPEC_STATUSES[number];
|
|
29
|
+
/** File names */
|
|
30
|
+
export declare const FILES: {
|
|
31
|
+
readonly active: "active.json";
|
|
32
|
+
readonly dna: "dna.md";
|
|
33
|
+
readonly spec: "spec.md";
|
|
34
|
+
readonly plan: "plan.md";
|
|
35
|
+
readonly research: "research.md";
|
|
36
|
+
readonly tasks: "tasks.md";
|
|
37
|
+
};
|
|
38
|
+
/** Directory names within .dino */
|
|
39
|
+
export declare const DINO_DIRS: {
|
|
40
|
+
readonly specs: "specs";
|
|
41
|
+
readonly archive: "archive";
|
|
42
|
+
};
|
|
43
|
+
/** Directory names within .claude */
|
|
44
|
+
export declare const CLAUDE_DIRS: {
|
|
45
|
+
readonly commands: "commands/dino";
|
|
46
|
+
readonly skills: "skills/dino-workflow";
|
|
47
|
+
readonly rules: "rules/dino";
|
|
48
|
+
};
|
|
49
|
+
/** Package version (will be replaced during build) */
|
|
50
|
+
export declare const VERSION = "0.1.0";
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,eAAO,MAAM,aAAa,UAAU,CAAC;AAErC,mDAAmD;AACnD,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,2CAA2C;AAC3C,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,+BAA+B;AAC/B,eAAO,MAAM,eAAe,sFASlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE3D,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAAsB,CAAC;AAEnE,yDAAyD;AACzD,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,oBAAoB;AACpB,eAAO,MAAM,aAAa,uDAAwD,CAAC;AACnF,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtD,iBAAiB;AACjB,eAAO,MAAM,KAAK;;;;;;;CAOR,CAAC;AAEX,mCAAmC;AACnC,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AAEX,qCAAqC;AACrC,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,sDAAsD;AACtD,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core configuration constants for dino-spec
|
|
3
|
+
*/
|
|
4
|
+
/** Directory name for dino data files */
|
|
5
|
+
export const DINO_DIR_NAME = '.dino';
|
|
6
|
+
/** Directory name for Claude Code configuration */
|
|
7
|
+
export const CLAUDE_DIR_NAME = '.claude';
|
|
8
|
+
/** Markers for managed content sections */
|
|
9
|
+
export const DINO_MARKERS = {
|
|
10
|
+
start: '<!-- DINO:START -->',
|
|
11
|
+
end: '<!-- DINO:END -->',
|
|
12
|
+
coreStart: '<!-- DINO:CORE:START -->',
|
|
13
|
+
coreEnd: '<!-- DINO:CORE:END -->',
|
|
14
|
+
userStart: '<!-- DINO:USER:START -->',
|
|
15
|
+
userEnd: '<!-- DINO:USER:END -->',
|
|
16
|
+
};
|
|
17
|
+
/** Workflow phases in order */
|
|
18
|
+
export const WORKFLOW_PHASES = [
|
|
19
|
+
'discover',
|
|
20
|
+
'scout',
|
|
21
|
+
'clarify',
|
|
22
|
+
'nest',
|
|
23
|
+
'hatch',
|
|
24
|
+
'hunt',
|
|
25
|
+
'fossil',
|
|
26
|
+
'next',
|
|
27
|
+
];
|
|
28
|
+
/** Phases that require Plan Mode */
|
|
29
|
+
export const PLAN_MODE_PHASES = ['nest', 'hatch'];
|
|
30
|
+
/** Minimum tasks before requiring Plan Mode for hatch */
|
|
31
|
+
export const PLAN_MODE_TASK_THRESHOLD = 5;
|
|
32
|
+
/** Maximum tasks per phase to prevent context loss */
|
|
33
|
+
export const MAX_TASKS_PER_PHASE = 10;
|
|
34
|
+
/** Spec statuses */
|
|
35
|
+
export const SPEC_STATUSES = ['draft', 'active', 'completed', 'archived'];
|
|
36
|
+
/** File names */
|
|
37
|
+
export const FILES = {
|
|
38
|
+
active: 'active.json',
|
|
39
|
+
dna: 'dna.md',
|
|
40
|
+
spec: 'spec.md',
|
|
41
|
+
plan: 'plan.md',
|
|
42
|
+
research: 'research.md',
|
|
43
|
+
tasks: 'tasks.md',
|
|
44
|
+
};
|
|
45
|
+
/** Directory names within .dino */
|
|
46
|
+
export const DINO_DIRS = {
|
|
47
|
+
specs: 'specs',
|
|
48
|
+
archive: 'archive',
|
|
49
|
+
};
|
|
50
|
+
/** Directory names within .claude */
|
|
51
|
+
export const CLAUDE_DIRS = {
|
|
52
|
+
commands: 'commands/dino',
|
|
53
|
+
skills: 'skills/dino-workflow',
|
|
54
|
+
rules: 'rules/dino',
|
|
55
|
+
};
|
|
56
|
+
/** Package version (will be replaced during build) */
|
|
57
|
+
export const VERSION = '0.1.0';
|
|
58
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,yCAAyC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AAErC,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AAEzC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,KAAK,EAAE,qBAAqB;IAC5B,GAAG,EAAE,mBAAmB;IACxB,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,wBAAwB;IACjC,SAAS,EAAE,0BAA0B;IACrC,OAAO,EAAE,wBAAwB;CACzB,CAAC;AAEX,+BAA+B;AAC/B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU;IACV,OAAO;IACP,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,MAAM;CACE,CAAC;AAIX,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnE,yDAAyD;AACzD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C,sDAAsD;AACtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,oBAAoB;AACpB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAU,CAAC;AAGnF,iBAAiB;AACjB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,aAAa;IACrB,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,UAAU;CACT,CAAC;AAEX,mCAAmC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;CACV,CAAC;AAEX,qCAAqC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,eAAe;IACzB,MAAM,EAAE,sBAAsB;IAC9B,KAAK,EAAE,YAAY;CACX,CAAC;AAEX,sDAAsD;AACtD,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/skills/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader - loads and parses skill files
|
|
3
|
+
*/
|
|
4
|
+
import type { Skill } from './types.js';
|
|
5
|
+
export declare class SkillLoader {
|
|
6
|
+
private projectPath;
|
|
7
|
+
private skillsDir;
|
|
8
|
+
constructor(projectPath: string);
|
|
9
|
+
/**
|
|
10
|
+
* Load all skills from the project
|
|
11
|
+
*/
|
|
12
|
+
loadAll(): Promise<Skill[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Load a specific skill by ID
|
|
15
|
+
*/
|
|
16
|
+
load(skillId: string): Promise<Skill | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if a skill exists
|
|
19
|
+
*/
|
|
20
|
+
exists(skillId: string): Promise<boolean>;
|
|
21
|
+
/**
|
|
22
|
+
* Parse skill metadata from content
|
|
23
|
+
*/
|
|
24
|
+
private parseMetadata;
|
|
25
|
+
/**
|
|
26
|
+
* Determine the source of a skill
|
|
27
|
+
*/
|
|
28
|
+
private determineSource;
|
|
29
|
+
/**
|
|
30
|
+
* Get the skills directory path
|
|
31
|
+
*/
|
|
32
|
+
getSkillsDir(): string;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AAEvD,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM;IAK/B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAmBjC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA4BlD;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader - loads and parses skill files
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { FileSystem } from '../../utils/file-system.js';
|
|
6
|
+
import { CLAUDE_DIR_NAME } from '../config.js';
|
|
7
|
+
export class SkillLoader {
|
|
8
|
+
projectPath;
|
|
9
|
+
skillsDir;
|
|
10
|
+
constructor(projectPath) {
|
|
11
|
+
this.projectPath = projectPath;
|
|
12
|
+
this.skillsDir = join(projectPath, CLAUDE_DIR_NAME, 'skills');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load all skills from the project
|
|
16
|
+
*/
|
|
17
|
+
async loadAll() {
|
|
18
|
+
const skills = [];
|
|
19
|
+
if (!await FileSystem.exists(this.skillsDir)) {
|
|
20
|
+
return skills;
|
|
21
|
+
}
|
|
22
|
+
const dirs = await FileSystem.listDirectory(this.skillsDir);
|
|
23
|
+
for (const dir of dirs) {
|
|
24
|
+
const skill = await this.load(dir);
|
|
25
|
+
if (skill) {
|
|
26
|
+
skills.push(skill);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return skills;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load a specific skill by ID
|
|
33
|
+
*/
|
|
34
|
+
async load(skillId) {
|
|
35
|
+
const skillPath = join(this.skillsDir, skillId);
|
|
36
|
+
if (!await FileSystem.isDirectory(skillPath)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const skillFile = join(skillPath, 'SKILL.md');
|
|
40
|
+
const content = await FileSystem.readFileSafe(skillFile);
|
|
41
|
+
if (!content) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const metadata = this.parseMetadata(content);
|
|
45
|
+
if (!metadata) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
id: skillId,
|
|
50
|
+
metadata,
|
|
51
|
+
path: skillPath,
|
|
52
|
+
content,
|
|
53
|
+
source: this.determineSource(skillId),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if a skill exists
|
|
58
|
+
*/
|
|
59
|
+
async exists(skillId) {
|
|
60
|
+
const skillPath = join(this.skillsDir, skillId, 'SKILL.md');
|
|
61
|
+
return FileSystem.exists(skillPath);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse skill metadata from content
|
|
65
|
+
*/
|
|
66
|
+
parseMetadata(content) {
|
|
67
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
68
|
+
if (!match)
|
|
69
|
+
return null;
|
|
70
|
+
const frontmatter = match[1];
|
|
71
|
+
const lines = frontmatter.split('\n');
|
|
72
|
+
const data = {};
|
|
73
|
+
for (const line of lines) {
|
|
74
|
+
const colonIndex = line.indexOf(':');
|
|
75
|
+
if (colonIndex > 0) {
|
|
76
|
+
const key = line.substring(0, colonIndex).trim();
|
|
77
|
+
const value = line.substring(colonIndex + 1).trim();
|
|
78
|
+
data[key] = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!data.name)
|
|
82
|
+
return null;
|
|
83
|
+
return {
|
|
84
|
+
name: data.name,
|
|
85
|
+
description: data.description ?? 'No description',
|
|
86
|
+
version: data.version,
|
|
87
|
+
author: data.author,
|
|
88
|
+
repository: data.repository,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Determine the source of a skill
|
|
93
|
+
*/
|
|
94
|
+
determineSource(skillId) {
|
|
95
|
+
// Bundled skills
|
|
96
|
+
if (skillId === 'dino-workflow') {
|
|
97
|
+
return 'bundled';
|
|
98
|
+
}
|
|
99
|
+
// Future: Check for registry marker
|
|
100
|
+
// For now, all non-bundled skills are local
|
|
101
|
+
return 'local';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the skills directory path
|
|
105
|
+
*/
|
|
106
|
+
getSkillsDir() {
|
|
107
|
+
return this.skillsDir;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/core/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Registry - manages skill discovery and installation
|
|
3
|
+
*/
|
|
4
|
+
import type { Skill, RegistrySkill } from './types.js';
|
|
5
|
+
export declare class SkillRegistry {
|
|
6
|
+
private registryUrl;
|
|
7
|
+
private cache;
|
|
8
|
+
constructor(registryUrl?: string);
|
|
9
|
+
/**
|
|
10
|
+
* List all installed skills in the project
|
|
11
|
+
*/
|
|
12
|
+
listInstalled(projectPath: string): Promise<Skill[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Get a specific installed skill
|
|
15
|
+
*/
|
|
16
|
+
getInstalled(projectPath: string, skillId: string): Promise<Skill | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Install a skill from registry
|
|
19
|
+
* For MVP, this creates a placeholder - full registry support coming later
|
|
20
|
+
*/
|
|
21
|
+
install(projectPath: string, skillName: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Remove an installed skill
|
|
24
|
+
*/
|
|
25
|
+
remove(projectPath: string, skillId: string): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Search registry for skills (MVP: returns empty, future: queries registry)
|
|
28
|
+
*/
|
|
29
|
+
search(query: string): Promise<RegistrySkill[]>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/skills/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAKtE,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAyC;gBAE1C,WAAW,GAAE,MAA6B;IAItD;;OAEG;IACG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAkC1D;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAmB/E;;;OAGG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvE;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBpE;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAKtD"}
|