devmind 1.0.1 → 1.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/README.md +157 -141
- package/dist/cli/handlers.d.ts +2 -0
- package/dist/cli/handlers.js +140 -0
- package/dist/cli/handlers.js.map +1 -0
- package/dist/cli/register-all.d.ts +2 -0
- package/dist/cli/register-all.js +11 -0
- package/dist/cli/register-all.js.map +1 -0
- package/dist/cli/register-analysis.d.ts +2 -0
- package/dist/cli/register-analysis.js +137 -0
- package/dist/cli/register-analysis.js.map +1 -0
- package/dist/cli/register-codebase.d.ts +2 -0
- package/dist/cli/register-codebase.js +22 -0
- package/dist/cli/register-codebase.js.map +1 -0
- package/dist/cli/register-database.d.ts +2 -0
- package/dist/cli/register-database.js +44 -0
- package/dist/cli/register-database.js.map +1 -0
- package/dist/cli/register-memory.d.ts +2 -0
- package/dist/cli/register-memory.js +58 -0
- package/dist/cli/register-memory.js.map +1 -0
- package/dist/cli.js +9 -220
- package/dist/cli.js.map +1 -1
- package/dist/codebase/index.js +2 -2
- package/dist/codebase/index.js.map +1 -1
- package/dist/codebase/parsers/typescript.d.ts +1 -0
- package/dist/codebase/parsers/typescript.js +3 -0
- package/dist/codebase/parsers/typescript.js.map +1 -1
- package/dist/codebase/scanners/filesystem.d.ts +1 -0
- package/dist/codebase/scanners/filesystem.js +131 -4
- package/dist/codebase/scanners/filesystem.js.map +1 -1
- package/dist/commands/analyze.d.ts +1 -0
- package/dist/commands/analyze.js +166 -24
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/audit-design.d.ts +8 -0
- package/dist/commands/audit-design.js +158 -0
- package/dist/commands/audit-design.js.map +1 -0
- package/dist/commands/audit-report.d.ts +18 -0
- package/dist/commands/audit-report.js +30 -0
- package/dist/commands/audit-report.js.map +1 -0
- package/dist/commands/audit-source.d.ts +21 -0
- package/dist/commands/audit-source.js +57 -0
- package/dist/commands/audit-source.js.map +1 -0
- package/dist/commands/audit.d.ts +8 -0
- package/dist/commands/audit.js +266 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/autosave.d.ts +19 -0
- package/dist/commands/autosave.js +85 -0
- package/dist/commands/autosave.js.map +1 -0
- package/dist/commands/claude-plugin.d.ts +8 -0
- package/dist/commands/claude-plugin.js +123 -0
- package/dist/commands/claude-plugin.js.map +1 -0
- package/dist/commands/codex-plugin.d.ts +9 -0
- package/dist/commands/codex-plugin.js +145 -0
- package/dist/commands/codex-plugin.js.map +1 -0
- package/dist/commands/context.js +66 -5
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/design-system.d.ts +8 -0
- package/dist/commands/design-system.js +95 -0
- package/dist/commands/design-system.js.map +1 -0
- package/dist/commands/extract.d.ts +33 -0
- package/dist/commands/extract.js +231 -0
- package/dist/commands/extract.js.map +1 -0
- package/dist/commands/openclaw-plugin.d.ts +8 -0
- package/dist/commands/openclaw-plugin.js +103 -0
- package/dist/commands/openclaw-plugin.js.map +1 -0
- package/dist/commands/retrieve.d.ts +12 -0
- package/dist/commands/retrieve.js +230 -0
- package/dist/commands/retrieve.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.js +148 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/core/cache-json.d.ts +7 -0
- package/dist/core/cache-json.js +60 -0
- package/dist/core/cache-json.js.map +1 -0
- package/dist/core/errors.d.ts +2 -0
- package/dist/core/errors.js +49 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/learning-parser.d.ts +6 -0
- package/dist/core/learning-parser.js +23 -0
- package/dist/core/learning-parser.js.map +1 -0
- package/dist/core/profile.d.ts +18 -0
- package/dist/core/profile.js +37 -0
- package/dist/core/profile.js.map +1 -0
- package/dist/core/source-file-cache.d.ts +13 -0
- package/dist/core/source-file-cache.js +85 -0
- package/dist/core/source-file-cache.js.map +1 -0
- package/dist/database/cli/register-all.d.ts +2 -0
- package/dist/database/cli/register-all.js +9 -0
- package/dist/database/cli/register-all.js.map +1 -0
- package/dist/database/cli/register-database.d.ts +2 -0
- package/dist/database/cli/register-database.js +44 -0
- package/dist/database/cli/register-database.js.map +1 -0
- package/dist/database/cli/register-interactive.d.ts +2 -0
- package/dist/database/cli/register-interactive.js +29 -0
- package/dist/database/cli/register-interactive.js.map +1 -0
- package/dist/database/cli/register-memory.d.ts +2 -0
- package/dist/database/cli/register-memory.js +47 -0
- package/dist/database/cli/register-memory.js.map +1 -0
- package/dist/database/cli.js +5 -112
- package/dist/database/cli.js.map +1 -1
- package/dist/database/commands/checkpoint.js +8 -10
- package/dist/database/commands/checkpoint.js.map +1 -1
- package/dist/database/commands/generate.js +17 -8
- package/dist/database/commands/generate.js.map +1 -1
- package/dist/database/commands/handoff.js +9 -8
- package/dist/database/commands/handoff.js.map +1 -1
- package/dist/database/commands/learn.d.ts +4 -0
- package/dist/database/commands/learn.js +245 -43
- package/dist/database/commands/learn.js.map +1 -1
- package/dist/database/commands/memory.js +1 -1
- package/dist/database/commands/validate.js +6 -4
- package/dist/database/commands/validate.js.map +1 -1
- package/dist/database/commands/watch.js +1 -1
- package/dist/database/commands/watch.js.map +1 -1
- package/dist/database/generators/templates.js +26 -26
- package/dist/database/generators/templates.js.map +1 -1
- package/dist/database/utils/json-output.d.ts +4 -0
- package/dist/database/utils/json-output.js +7 -0
- package/dist/database/utils/json-output.js.map +1 -1
- package/dist/generators/unified.d.ts +13 -0
- package/dist/generators/unified.js +420 -59
- package/dist/generators/unified.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { ensureDir, readFileSafe, writeFileSafe, logger } from '../core/index.js';
|
|
3
|
+
import { runExtraction } from './extract.js';
|
|
4
|
+
function createSessionId() {
|
|
5
|
+
return `sess_${Date.now()}`;
|
|
6
|
+
}
|
|
7
|
+
async function appendJournal(outputDir, source, note) {
|
|
8
|
+
const journalPath = path.join(outputDir, 'memory', 'SESSION_JOURNAL.md');
|
|
9
|
+
await ensureDir(path.dirname(journalPath));
|
|
10
|
+
let existing = '';
|
|
11
|
+
try {
|
|
12
|
+
existing = await readFileSafe(journalPath);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
existing = '# Session Journal\n\n> Incremental execution journal for crash-safe recovery.\n\n';
|
|
16
|
+
}
|
|
17
|
+
const line = `- ${new Date().toISOString()} | ${source}${note ? ` | ${note}` : ''}\n`;
|
|
18
|
+
await writeFileSafe(journalPath, `${existing}${line}`);
|
|
19
|
+
return journalPath;
|
|
20
|
+
}
|
|
21
|
+
async function updateSessionContext(outputDir, source, note) {
|
|
22
|
+
const contextPath = path.join(outputDir, 'context', 'SESSION_CONTEXT.json');
|
|
23
|
+
await ensureDir(path.dirname(contextPath));
|
|
24
|
+
let context = {};
|
|
25
|
+
try {
|
|
26
|
+
const existing = await readFileSafe(contextPath);
|
|
27
|
+
context = JSON.parse(existing);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
context = {};
|
|
31
|
+
}
|
|
32
|
+
const now = new Date().toISOString();
|
|
33
|
+
context.session = {
|
|
34
|
+
id: context.session?.id || createSessionId(),
|
|
35
|
+
...context.session,
|
|
36
|
+
lastAutosaveAt: now,
|
|
37
|
+
lastAutosaveSource: source,
|
|
38
|
+
};
|
|
39
|
+
context.state = {
|
|
40
|
+
...context.state,
|
|
41
|
+
lastAction: note || source,
|
|
42
|
+
};
|
|
43
|
+
await writeFileSafe(contextPath, JSON.stringify(context, null, 2));
|
|
44
|
+
return contextPath;
|
|
45
|
+
}
|
|
46
|
+
export async function runAutosave(options) {
|
|
47
|
+
const outputDir = options.output || '.devmind';
|
|
48
|
+
const source = options.source || 'manual';
|
|
49
|
+
const skipExtract = options.noExtract || options.extract === false;
|
|
50
|
+
const journalPath = await appendJournal(outputDir, source, options.note);
|
|
51
|
+
const sessionContextPath = await updateSessionContext(outputDir, source, options.note);
|
|
52
|
+
let extracted = 0;
|
|
53
|
+
let applied = false;
|
|
54
|
+
if (!skipExtract) {
|
|
55
|
+
const extractResult = await runExtraction({
|
|
56
|
+
output: outputDir,
|
|
57
|
+
path: options.path || '.',
|
|
58
|
+
apply: true,
|
|
59
|
+
silent: true,
|
|
60
|
+
});
|
|
61
|
+
extracted = extractResult.extracted;
|
|
62
|
+
applied = extractResult.applied;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
journalPath,
|
|
66
|
+
sessionContextPath,
|
|
67
|
+
extracted,
|
|
68
|
+
applied,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export async function autosave(options) {
|
|
72
|
+
const result = await runAutosave(options);
|
|
73
|
+
if (options.json) {
|
|
74
|
+
console.log(JSON.stringify(result, null, 2));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (!options.silent) {
|
|
78
|
+
logger.info('Autosave complete.');
|
|
79
|
+
logger.info(`Journal: ${result.journalPath}`);
|
|
80
|
+
logger.info(`Session context: ${result.sessionContextPath}`);
|
|
81
|
+
logger.info(`Learnings extracted: ${result.extracted}`);
|
|
82
|
+
logger.info(`Applied to LEARN.md: ${result.applied ? 'yes' : 'no'}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=autosave.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autosave.js","sourceRoot":"","sources":["../../src/commands/autosave.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import { logger, ensureDir, readFileSafe, writeFileSafe } from '../core/index.js';
|
|
4
|
+
function toDisplayError(error) {
|
|
5
|
+
return error instanceof Error ? error.message : String(error);
|
|
6
|
+
}
|
|
7
|
+
async function fileExists(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
await fs.access(filePath);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function readPackageVersion() {
|
|
17
|
+
try {
|
|
18
|
+
const raw = await readFileSafe(path.resolve(process.cwd(), 'package.json'));
|
|
19
|
+
const parsed = JSON.parse(raw);
|
|
20
|
+
return parsed.version || '1.0.0';
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return '1.0.0';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function buildMarketplace(pluginName, version) {
|
|
27
|
+
return {
|
|
28
|
+
name: pluginName,
|
|
29
|
+
owner: {
|
|
30
|
+
name: 'devmind',
|
|
31
|
+
},
|
|
32
|
+
plugins: [
|
|
33
|
+
{
|
|
34
|
+
name: pluginName,
|
|
35
|
+
source: './',
|
|
36
|
+
description: 'Agent-first context and memory workflow for design system, codebase, and database.',
|
|
37
|
+
version,
|
|
38
|
+
author: {
|
|
39
|
+
name: 'devmind',
|
|
40
|
+
},
|
|
41
|
+
repository: 'https://github.com/Nyanlin95/devmind',
|
|
42
|
+
license: 'Apache-2.0',
|
|
43
|
+
keywords: ['agent', 'context', 'memory', 'design-system', 'database', 'codebase'],
|
|
44
|
+
skills: ['./skills/'],
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function claudePlugin(options) {
|
|
50
|
+
const outputDir = options.output || '.claude-plugin';
|
|
51
|
+
const pluginName = options.name || 'devmind';
|
|
52
|
+
const force = !!options.force;
|
|
53
|
+
const jsonMode = !!options.json;
|
|
54
|
+
const marketPath = path.join(outputDir, 'marketplace.json');
|
|
55
|
+
const skillsDir = path.join(outputDir, 'skills', pluginName);
|
|
56
|
+
const skillPath = path.join(skillsDir, 'SKILL.md');
|
|
57
|
+
const skillSourceCandidates = [
|
|
58
|
+
path.resolve(process.cwd(), 'SKILL.md'),
|
|
59
|
+
path.resolve(process.cwd(), 'integrations', 'openclaw', 'SKILL.md'),
|
|
60
|
+
];
|
|
61
|
+
const existingMarketplace = await fileExists(marketPath);
|
|
62
|
+
if (existingMarketplace && !force) {
|
|
63
|
+
const message = `Claude plugin already exists at ${marketPath}. Use --force to overwrite.`;
|
|
64
|
+
if (jsonMode) {
|
|
65
|
+
console.log(JSON.stringify({
|
|
66
|
+
success: false,
|
|
67
|
+
error: message,
|
|
68
|
+
timestamp: new Date().toISOString(),
|
|
69
|
+
}, null, 2));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
logger.warn(message);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
await ensureDir(skillsDir);
|
|
76
|
+
let skillSource = null;
|
|
77
|
+
for (const candidate of skillSourceCandidates) {
|
|
78
|
+
if (await fileExists(candidate)) {
|
|
79
|
+
skillSource = candidate;
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (!skillSource) {
|
|
84
|
+
const message = 'No SKILL.md found to package for Claude plugin.';
|
|
85
|
+
if (jsonMode) {
|
|
86
|
+
console.log(JSON.stringify({
|
|
87
|
+
success: false,
|
|
88
|
+
error: message,
|
|
89
|
+
timestamp: new Date().toISOString(),
|
|
90
|
+
}, null, 2));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
logger.error(message);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const skillContent = await readFileSafe(skillSource);
|
|
97
|
+
await writeFileSafe(skillPath, skillContent);
|
|
98
|
+
const version = await readPackageVersion();
|
|
99
|
+
const marketplace = buildMarketplace(pluginName, version);
|
|
100
|
+
await writeFileSafe(marketPath, JSON.stringify(marketplace, null, 2));
|
|
101
|
+
if (jsonMode) {
|
|
102
|
+
console.log(JSON.stringify({
|
|
103
|
+
success: true,
|
|
104
|
+
plugin: pluginName,
|
|
105
|
+
outputDir,
|
|
106
|
+
marketplace: marketPath,
|
|
107
|
+
skill: skillPath,
|
|
108
|
+
version,
|
|
109
|
+
next: [
|
|
110
|
+
'Use your Claude Code plugin installer with this folder as local plugin source.',
|
|
111
|
+
`Local source: ${path.resolve(outputDir)}`,
|
|
112
|
+
],
|
|
113
|
+
}, null, 2));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
logger.success('Claude Code plugin package generated.');
|
|
117
|
+
logger.info(` Plugin: ${pluginName}`);
|
|
118
|
+
logger.info(` Marketplace: ${marketPath}`);
|
|
119
|
+
logger.info(` Skill: ${skillPath}`);
|
|
120
|
+
logger.info('Next step: install this local plugin directory in Claude Code.');
|
|
121
|
+
logger.info(` Local source: ${path.resolve(outputDir)}`);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=claude-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-plugin.js","sourceRoot":"","sources":["../../src/commands/claude-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as os from 'os';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as fs from 'fs/promises';
|
|
4
|
+
import { logger, ensureDir, readFileSafe, writeFileSafe } from '../core/index.js';
|
|
5
|
+
function toDisplayError(error) {
|
|
6
|
+
return error instanceof Error ? error.message : String(error);
|
|
7
|
+
}
|
|
8
|
+
async function fileExists(filePath) {
|
|
9
|
+
try {
|
|
10
|
+
await fs.access(filePath);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async function resolveSkillSource() {
|
|
18
|
+
const candidates = [
|
|
19
|
+
path.resolve(process.cwd(), 'SKILL.md'),
|
|
20
|
+
path.resolve(process.cwd(), 'integrations', 'openclaw', 'SKILL.md'),
|
|
21
|
+
];
|
|
22
|
+
for (const candidate of candidates) {
|
|
23
|
+
if (await fileExists(candidate)) {
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function resolveTargets(skillName, project, includeLegacy) {
|
|
30
|
+
const homeDir = os.homedir();
|
|
31
|
+
const cwd = process.cwd();
|
|
32
|
+
const userRoot = path.join(homeDir, '.agents', 'skills');
|
|
33
|
+
const targets = [
|
|
34
|
+
{
|
|
35
|
+
kind: 'user',
|
|
36
|
+
root: userRoot,
|
|
37
|
+
skillDir: path.join(userRoot, skillName),
|
|
38
|
+
skillPath: path.join(userRoot, skillName, 'SKILL.md'),
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
if (project) {
|
|
42
|
+
const projectRoot = path.join(cwd, '.agents', 'skills');
|
|
43
|
+
targets.push({
|
|
44
|
+
kind: 'project',
|
|
45
|
+
root: projectRoot,
|
|
46
|
+
skillDir: path.join(projectRoot, skillName),
|
|
47
|
+
skillPath: path.join(projectRoot, skillName, 'SKILL.md'),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
if (includeLegacy) {
|
|
51
|
+
const legacyRoots = new Set();
|
|
52
|
+
const codexHome = process.env.CODEX_HOME;
|
|
53
|
+
if (codexHome && codexHome.trim().length > 0) {
|
|
54
|
+
legacyRoots.add(path.resolve(codexHome, 'skills'));
|
|
55
|
+
}
|
|
56
|
+
legacyRoots.add(path.join(homeDir, '.codex', 'skills'));
|
|
57
|
+
for (const legacyRoot of legacyRoots) {
|
|
58
|
+
const normalized = path.resolve(legacyRoot);
|
|
59
|
+
if (normalized === path.resolve(userRoot)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
targets.push({
|
|
63
|
+
kind: 'legacy',
|
|
64
|
+
root: normalized,
|
|
65
|
+
skillDir: path.join(normalized, skillName),
|
|
66
|
+
skillPath: path.join(normalized, skillName, 'SKILL.md'),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return targets;
|
|
71
|
+
}
|
|
72
|
+
export async function codexPlugin(options) {
|
|
73
|
+
const skillName = options.name || 'devmind';
|
|
74
|
+
const force = !!options.force;
|
|
75
|
+
const jsonMode = !!options.json;
|
|
76
|
+
const projectInstall = !!options.project;
|
|
77
|
+
const includeLegacy = !options.noLegacy;
|
|
78
|
+
const skillSource = await resolveSkillSource();
|
|
79
|
+
if (!skillSource) {
|
|
80
|
+
const message = 'No SKILL.md found to install for Codex plugin.';
|
|
81
|
+
if (jsonMode) {
|
|
82
|
+
console.log(JSON.stringify({
|
|
83
|
+
success: false,
|
|
84
|
+
error: message,
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
}, null, 2));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
logger.error(message);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const skillContent = await readFileSafe(skillSource);
|
|
93
|
+
const targets = resolveTargets(skillName, projectInstall, includeLegacy);
|
|
94
|
+
const blockedTargets = [];
|
|
95
|
+
for (const target of targets) {
|
|
96
|
+
const exists = await fileExists(target.skillPath);
|
|
97
|
+
if (exists && !force) {
|
|
98
|
+
blockedTargets.push(target.skillPath);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (blockedTargets.length > 0) {
|
|
102
|
+
const message = `Codex skill already exists. Use --force to overwrite. Conflicts: ${blockedTargets.join(', ')}`;
|
|
103
|
+
if (jsonMode) {
|
|
104
|
+
console.log(JSON.stringify({
|
|
105
|
+
success: false,
|
|
106
|
+
error: message,
|
|
107
|
+
conflicts: blockedTargets,
|
|
108
|
+
timestamp: new Date().toISOString(),
|
|
109
|
+
}, null, 2));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
logger.warn(message);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
for (const target of targets) {
|
|
116
|
+
await ensureDir(target.skillDir);
|
|
117
|
+
await writeFileSafe(target.skillPath, skillContent);
|
|
118
|
+
}
|
|
119
|
+
const installedPaths = targets.map((t) => t.skillPath);
|
|
120
|
+
if (jsonMode) {
|
|
121
|
+
console.log(JSON.stringify({
|
|
122
|
+
success: true,
|
|
123
|
+
skill: skillName,
|
|
124
|
+
source: skillSource,
|
|
125
|
+
installed: installedPaths,
|
|
126
|
+
notes: [
|
|
127
|
+
'Codex app and Codex CLI share user skills under ~/.agents/skills.',
|
|
128
|
+
includeLegacy
|
|
129
|
+
? 'Legacy mirrors were written for compatibility (CODEX_HOME/.codex).'
|
|
130
|
+
: 'Legacy mirrors were skipped (--no-legacy).',
|
|
131
|
+
],
|
|
132
|
+
}, null, 2));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
logger.success('Codex skill installed for DevMind.');
|
|
136
|
+
logger.info(` Skill: ${skillName}`);
|
|
137
|
+
logger.info(` Source: ${skillSource}`);
|
|
138
|
+
logger.info(' Installed paths:');
|
|
139
|
+
for (const installedPath of installedPaths) {
|
|
140
|
+
logger.info(` - ${installedPath}`);
|
|
141
|
+
}
|
|
142
|
+
logger.info('Codex app and Codex CLI should pick this up from user skills.');
|
|
143
|
+
logger.info('Restart Codex to pick up new skills.');
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=codex-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-plugin.js","sourceRoot":"","sources":["../../src/commands/codex-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAiBlF,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC;KACpE,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,OAAgB,EAAE,aAAsB;IACjF,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAoB;QAC/B;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;YACxC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;SACtD;KACF,CAAC;IAEF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;YAC3C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAEzC,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAExD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5C,IAAI,UAAU,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;gBAC1C,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9B,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAChC,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACzC,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC/C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,gDAAgD,CAAC;QACjE,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAEzE,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,oEAAoE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChH,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,OAAO;gBACd,SAAS,EAAE,cAAc;gBACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACF,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;YACE,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,cAAc;YACzB,KAAK,EAAE;gBACL,mEAAmE;gBACnE,aAAa;oBACX,CAAC,CAAC,oEAAoE;oBACtE,CAAC,CAAC,4CAA4C;aACjD;SACF,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACnC,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,aAAa,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/commands/context.js
CHANGED
|
@@ -17,10 +17,17 @@ export async function context(options) {
|
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
19
|
if (options.query) {
|
|
20
|
-
// Simple keyword search in existing context files (placeholder for now)
|
|
21
20
|
logger.info(`Searching context for: ${options.query}`);
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
const results = await searchContextFiles(path.join(cwd, '.devmind'), options.query);
|
|
22
|
+
if (results.length === 0) {
|
|
23
|
+
console.log(`No context matches found for "${options.query}" in .devmind.`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
console.log(`# Context Search: ${options.query}\n`);
|
|
27
|
+
for (const result of results) {
|
|
28
|
+
console.log(`- ${result.file}:${result.line} ${result.text}`);
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
24
31
|
}
|
|
25
32
|
// Default: Show high-level map
|
|
26
33
|
logger.info('No focus specified. Showing high-level project map.');
|
|
@@ -31,10 +38,10 @@ function generateFocusedSummary(node, relPath) {
|
|
|
31
38
|
let output = `# Context: ${relPath}\n\n`;
|
|
32
39
|
function renderNode(n, depth) {
|
|
33
40
|
const indent = ' '.repeat(depth);
|
|
34
|
-
const icon = n.type === 'directory' ? '
|
|
41
|
+
const icon = n.type === 'directory' ? '[D]' : '[F]';
|
|
35
42
|
const meta = n.type === 'file' && n.size ? ` (${(n.size / 1024).toFixed(1)}KB)` : '';
|
|
36
43
|
output += `${indent}- ${icon} ${n.name}${meta}\n`;
|
|
37
|
-
// Show exports for files if available (Context Slicing
|
|
44
|
+
// Show exports for files if available (Context Slicing helper)
|
|
38
45
|
if (n.type === 'file' && n.exports && n.exports.length > 0) {
|
|
39
46
|
const exports = n.exports.map((e) => (typeof e === 'string' ? e : e.name)).slice(0, 5);
|
|
40
47
|
output += `${indent} - Exports: \`${exports.join(', ')}\`${n.exports.length > 5 ? '...' : ''}\n`;
|
|
@@ -51,4 +58,58 @@ function generateFocusedSummary(node, relPath) {
|
|
|
51
58
|
}
|
|
52
59
|
return output;
|
|
53
60
|
}
|
|
61
|
+
async function searchContextFiles(rootDir, query) {
|
|
62
|
+
const results = [];
|
|
63
|
+
const needle = query.trim().toLowerCase();
|
|
64
|
+
if (!needle)
|
|
65
|
+
return results;
|
|
66
|
+
if (!fs.existsSync(rootDir))
|
|
67
|
+
return results;
|
|
68
|
+
const stack = [rootDir];
|
|
69
|
+
const maxResults = 50;
|
|
70
|
+
while (stack.length > 0 && results.length < maxResults) {
|
|
71
|
+
const current = stack.pop();
|
|
72
|
+
if (!current)
|
|
73
|
+
break;
|
|
74
|
+
let entries;
|
|
75
|
+
try {
|
|
76
|
+
entries = fs.readdirSync(current, { withFileTypes: true });
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
82
|
+
for (let idx = entries.length - 1; idx >= 0; idx -= 1) {
|
|
83
|
+
const entry = entries[idx];
|
|
84
|
+
const fullPath = path.join(current, entry.name);
|
|
85
|
+
if (entry.isDirectory()) {
|
|
86
|
+
stack.push(fullPath);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (!entry.isFile())
|
|
90
|
+
continue;
|
|
91
|
+
if (!/\.(md|json|ya?ml|txt|log)$/i.test(entry.name))
|
|
92
|
+
continue;
|
|
93
|
+
let content = '';
|
|
94
|
+
try {
|
|
95
|
+
content = fs.readFileSync(fullPath, 'utf-8');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const lines = content.split('\n');
|
|
101
|
+
for (let idx = 0; idx < lines.length && results.length < maxResults; idx += 1) {
|
|
102
|
+
const line = lines[idx];
|
|
103
|
+
if (!line.toLowerCase().includes(needle))
|
|
104
|
+
continue;
|
|
105
|
+
results.push({
|
|
106
|
+
file: path.relative(rootDir, fullPath).replace(/\\/g, '/'),
|
|
107
|
+
line: idx + 1,
|
|
108
|
+
text: line.trim().slice(0, 220),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
114
|
+
}
|
|
54
115
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,aAAa,EAAY,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import { logger, ensureDir, readFileSafe, writeFileSafe } from '../core/index.js';
|
|
4
|
+
function isJsonFlagEnabled(options) {
|
|
5
|
+
if (options.json === true)
|
|
6
|
+
return true;
|
|
7
|
+
try {
|
|
8
|
+
return options.opts?.().json === true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function jsonFail(message) {
|
|
15
|
+
console.log(JSON.stringify({
|
|
16
|
+
success: false,
|
|
17
|
+
error: message,
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
}, null, 2));
|
|
20
|
+
}
|
|
21
|
+
function defaultProfile() {
|
|
22
|
+
return {
|
|
23
|
+
name: 'project-design-system',
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
allowedComponentImports: ['@/components/ui', '@mui/material', 'antd', '@chakra-ui/react'],
|
|
26
|
+
tokenSources: ['src/styles/tokens.css', 'src/theme', 'tailwind.config.ts'],
|
|
27
|
+
requiredWrappers: ['ThemeProvider'],
|
|
28
|
+
bannedRegexRules: [
|
|
29
|
+
{
|
|
30
|
+
id: 'no-inline-style',
|
|
31
|
+
pattern: 'style\\s*=\\s*\\{\\{',
|
|
32
|
+
message: 'Avoid inline style objects; use design-system tokens/components.',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'no-raw-hex',
|
|
36
|
+
pattern: '#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})',
|
|
37
|
+
message: 'Avoid raw hex values in UI code; use design-system tokens.',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function profilePath(outputDir) {
|
|
43
|
+
return path.join(outputDir, 'design-system.json');
|
|
44
|
+
}
|
|
45
|
+
export async function designSystem(options) {
|
|
46
|
+
const jsonMode = isJsonFlagEnabled(options);
|
|
47
|
+
const outputDir = options.output || '.devmind';
|
|
48
|
+
const dsPath = profilePath(outputDir);
|
|
49
|
+
if (options.init) {
|
|
50
|
+
if (fs.existsSync(dsPath) && !options.force) {
|
|
51
|
+
const message = `Design system profile already exists: ${dsPath}. Use --force to overwrite.`;
|
|
52
|
+
if (jsonMode) {
|
|
53
|
+
jsonFail(message);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
logger.warn(`Design system profile already exists: ${dsPath}`);
|
|
57
|
+
logger.info('Use --force to overwrite.');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await ensureDir(path.dirname(dsPath));
|
|
61
|
+
const profile = defaultProfile();
|
|
62
|
+
await writeFileSafe(dsPath, JSON.stringify(profile, null, 2));
|
|
63
|
+
if (jsonMode) {
|
|
64
|
+
console.log(JSON.stringify({ initialized: true, file: dsPath }, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
logger.success('Initialized design system profile.');
|
|
68
|
+
logger.info(`File: ${dsPath}`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (!fs.existsSync(dsPath)) {
|
|
72
|
+
const message = `No design system profile found at ${dsPath}. Run: devmind design-system --init`;
|
|
73
|
+
if (jsonMode) {
|
|
74
|
+
jsonFail(message);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
logger.warn(`No design system profile found at ${dsPath}`);
|
|
78
|
+
logger.info('Run: devmind design-system --init');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const content = await readFileSafe(dsPath);
|
|
82
|
+
const parsed = JSON.parse(content);
|
|
83
|
+
if (jsonMode) {
|
|
84
|
+
console.log(JSON.stringify(parsed, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
logger.info('Design System Profile');
|
|
88
|
+
logger.info(`Name: ${parsed.name}`);
|
|
89
|
+
logger.info(`Version: ${parsed.version}`);
|
|
90
|
+
logger.info(`Allowed imports: ${parsed.allowedComponentImports.join(', ') || '(none)'}`);
|
|
91
|
+
logger.info(`Token sources: ${parsed.tokenSources.join(', ') || '(none)'}`);
|
|
92
|
+
logger.info(`Required wrappers: ${parsed.requiredWrappers.join(', ') || '(none)'}`);
|
|
93
|
+
logger.info(`Banned rules: ${parsed.bannedRegexRules.length}`);
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=design-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-system.js","sourceRoot":"","sources":["../../src/commands/design-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
interface ExtractOptions {
|
|
2
|
+
output?: string;
|
|
3
|
+
path?: string;
|
|
4
|
+
apply?: boolean;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
silent?: boolean;
|
|
7
|
+
profile?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ExtractedLearning {
|
|
10
|
+
category: string;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ExtractResult {
|
|
14
|
+
extracted: number;
|
|
15
|
+
report: string;
|
|
16
|
+
applied: boolean;
|
|
17
|
+
learnPath: string | null;
|
|
18
|
+
sourceCache?: {
|
|
19
|
+
reused: number;
|
|
20
|
+
diskReads: number;
|
|
21
|
+
};
|
|
22
|
+
sourceListCache?: boolean;
|
|
23
|
+
profile?: {
|
|
24
|
+
totalMs: number;
|
|
25
|
+
steps: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
ms: number;
|
|
28
|
+
}>;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function runExtraction(options: ExtractOptions): Promise<ExtractResult>;
|
|
32
|
+
export declare function extract(options: ExtractOptions): Promise<void>;
|
|
33
|
+
export {};
|