@brookmind/ai-toolkit 1.1.7 → 1.2.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/LICENSE +21 -0
- package/README.md +42 -14
- package/dist/__tests__/constants.test.d.ts +2 -0
- package/dist/__tests__/constants.test.d.ts.map +1 -0
- package/dist/__tests__/constants.test.js +102 -0
- package/dist/__tests__/constants.test.js.map +1 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +114 -0
- package/dist/__tests__/index.test.js.map +1 -0
- package/dist/__tests__/integration/installer.test.d.ts +2 -0
- package/dist/__tests__/integration/installer.test.d.ts.map +1 -0
- package/dist/__tests__/integration/installer.test.js +425 -0
- package/dist/__tests__/integration/installer.test.js.map +1 -0
- package/dist/__tests__/services/installers.test.d.ts +2 -0
- package/dist/__tests__/services/installers.test.d.ts.map +1 -0
- package/dist/__tests__/services/installers.test.js +222 -0
- package/dist/__tests__/services/installers.test.js.map +1 -0
- package/dist/__tests__/services/opencode.test.d.ts +2 -0
- package/dist/__tests__/services/opencode.test.d.ts.map +1 -0
- package/dist/__tests__/services/opencode.test.js +120 -0
- package/dist/__tests__/services/opencode.test.js.map +1 -0
- package/dist/__tests__/ui/categorize.test.d.ts +2 -0
- package/dist/__tests__/ui/categorize.test.d.ts.map +1 -0
- package/dist/__tests__/ui/categorize.test.js +194 -0
- package/dist/__tests__/ui/categorize.test.js.map +1 -0
- package/dist/__tests__/ui/choices.test.d.ts +2 -0
- package/dist/__tests__/ui/choices.test.d.ts.map +1 -0
- package/dist/__tests__/ui/choices.test.js +180 -0
- package/dist/__tests__/ui/choices.test.js.map +1 -0
- package/dist/__tests__/ui/display.test.d.ts +2 -0
- package/dist/__tests__/ui/display.test.d.ts.map +1 -0
- package/dist/__tests__/ui/display.test.js +142 -0
- package/dist/__tests__/ui/display.test.js.map +1 -0
- package/dist/__tests__/utils/fs.test.d.ts +2 -0
- package/dist/__tests__/utils/fs.test.d.ts.map +1 -0
- package/dist/__tests__/utils/fs.test.js +142 -0
- package/dist/__tests__/utils/fs.test.js.map +1 -0
- package/dist/__tests__/utils/terminal.test.d.ts +2 -0
- package/dist/__tests__/utils/terminal.test.d.ts.map +1 -0
- package/dist/__tests__/utils/terminal.test.js +97 -0
- package/dist/__tests__/utils/terminal.test.js.map +1 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +40 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -332
- package/dist/index.js.map +1 -1
- package/dist/services/installers.d.ts +8 -0
- package/dist/services/installers.d.ts.map +1 -0
- package/dist/services/installers.js +79 -0
- package/dist/services/installers.js.map +1 -0
- package/dist/services/opencode.d.ts +3 -0
- package/dist/services/opencode.d.ts.map +1 -0
- package/dist/services/opencode.js +33 -0
- package/dist/services/opencode.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/categorize.d.ts +6 -0
- package/dist/ui/categorize.d.ts.map +1 -0
- package/dist/ui/categorize.js +69 -0
- package/dist/ui/categorize.js.map +1 -0
- package/dist/ui/choices.d.ts +6 -0
- package/dist/ui/choices.d.ts.map +1 -0
- package/dist/ui/choices.js +70 -0
- package/dist/ui/choices.js.map +1 -0
- package/dist/ui/display.d.ts +8 -0
- package/dist/ui/display.d.ts.map +1 -0
- package/dist/ui/display.js +86 -0
- package/dist/ui/display.js.map +1 -0
- package/dist/utils/fs.d.ts +5 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +40 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/terminal.d.ts +5 -0
- package/dist/utils/terminal.d.ts.map +1 -0
- package/dist/utils/terminal.js +18 -0
- package/dist/utils/terminal.js.map +1 -0
- package/package.json +29 -5
- package/agents/code-reviewer.md +0 -35
- package/agents/code-simplifier.md +0 -52
- package/commands/create-pr-description.md +0 -102
- package/commands/create-pr.md +0 -76
- package/commands/create-react-tests.md +0 -207
- package/mcps/context7/.mcp.json +0 -13
- package/mcps/expo-mcp/.mcp.json +0 -13
- package/mcps/figma-mcp/.mcp.json +0 -10
- package/skills/github-cli/SKILL.md +0 -125
- package/skills/pdf-processing-pro/FORMS.md +0 -610
- package/skills/pdf-processing-pro/OCR.md +0 -137
- package/skills/pdf-processing-pro/SKILL.md +0 -296
- package/skills/pdf-processing-pro/TABLES.md +0 -626
- package/skills/pdf-processing-pro/scripts/analyze_form.py +0 -307
- package/skills/react-best-practices/AGENTS.md +0 -915
- package/skills/react-best-practices/README.md +0 -127
- package/skills/react-best-practices/SKILL.md +0 -110
- package/skills/react-best-practices/metadata.json +0 -14
- package/skills/react-best-practices/rules/_sections.md +0 -41
- package/skills/react-best-practices/rules/_template.md +0 -28
- package/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -80
- package/skills/react-best-practices/rules/advanced-use-latest.md +0 -76
- package/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/skills/react-best-practices/rules/async-dependencies.md +0 -36
- package/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -100
- package/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -42
- package/skills/react-best-practices/rules/bundle-conditional.md +0 -106
- package/skills/react-best-practices/rules/bundle-preload.md +0 -44
- package/skills/react-best-practices/rules/client-event-listeners.md +0 -131
- package/skills/react-best-practices/rules/client-swr-dedup.md +0 -133
- package/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
- package/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/skills/react-best-practices/rules/rendering-activity.md +0 -90
- package/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -65
- package/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/skills/react-best-practices/rules/rerender-memo.md +0 -85
- package/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/skills/skill-creator/LICENSE.txt +0 -202
- package/skills/skill-creator/SKILL.md +0 -209
- package/skills/skill-creator/scripts/init_skill.py +0 -303
- package/skills/skill-creator/scripts/package_skill.py +0 -110
- package/skills/skill-creator/scripts/quick_validate.py +0 -65
- package/skills/spring-boot-development/EXAMPLES.md +0 -2346
- package/skills/spring-boot-development/README.md +0 -595
- package/skills/spring-boot-development/SKILL.md +0 -1519
- package/themes/README.md +0 -68
- package/themes/claude-vivid.json +0 -72
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, writeFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { OPENCODE_CONFIG, OPENCODE_DIR, TOOLS_DIR } from '../constants.js';
|
|
4
|
+
import { exists, readJsonConfig } from '../utils/fs.js';
|
|
5
|
+
export async function installAgents(agents) {
|
|
6
|
+
if (agents.length === 0)
|
|
7
|
+
return;
|
|
8
|
+
const agentDir = join(OPENCODE_DIR, 'agent');
|
|
9
|
+
await mkdir(agentDir, { recursive: true });
|
|
10
|
+
for (const agent of agents) {
|
|
11
|
+
await cp(join(TOOLS_DIR, 'agents', `${agent}.md`), join(agentDir, `${agent}.md`));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function installSkills(skills) {
|
|
15
|
+
if (skills.length === 0)
|
|
16
|
+
return;
|
|
17
|
+
const skillDir = join(OPENCODE_DIR, 'skill');
|
|
18
|
+
await mkdir(skillDir, { recursive: true });
|
|
19
|
+
for (const skill of skills) {
|
|
20
|
+
await cp(join(TOOLS_DIR, 'skills', skill), join(skillDir, skill), {
|
|
21
|
+
recursive: true,
|
|
22
|
+
force: true,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export async function installCommands(commands) {
|
|
27
|
+
if (commands.length === 0)
|
|
28
|
+
return;
|
|
29
|
+
const commandDir = join(OPENCODE_DIR, 'command');
|
|
30
|
+
await mkdir(commandDir, { recursive: true });
|
|
31
|
+
for (const command of commands) {
|
|
32
|
+
await cp(join(TOOLS_DIR, 'commands', `${command}.md`), join(commandDir, `${command}.md`));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function installMcps(mcps) {
|
|
36
|
+
if (mcps.length === 0)
|
|
37
|
+
return;
|
|
38
|
+
const config = await readJsonConfig(OPENCODE_CONFIG);
|
|
39
|
+
if (!config.mcp) {
|
|
40
|
+
config.mcp = {};
|
|
41
|
+
}
|
|
42
|
+
const mcpSection = config.mcp;
|
|
43
|
+
for (const mcp of mcps) {
|
|
44
|
+
const mcpConfig = await readJsonConfig(join(TOOLS_DIR, 'mcps', mcp, '.mcp.json'));
|
|
45
|
+
const servers = mcpConfig.mcpServers;
|
|
46
|
+
if (servers) {
|
|
47
|
+
Object.assign(mcpSection, servers);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
await writeFile(OPENCODE_CONFIG, JSON.stringify(config, null, 2));
|
|
51
|
+
}
|
|
52
|
+
export async function installTheme() {
|
|
53
|
+
const themesDir = join(OPENCODE_DIR, 'themes');
|
|
54
|
+
await mkdir(themesDir, { recursive: true });
|
|
55
|
+
const themeSource = join(TOOLS_DIR, 'themes', 'claude-vivid.json');
|
|
56
|
+
const themeExists = await exists(themeSource);
|
|
57
|
+
if (themeExists) {
|
|
58
|
+
await cp(themeSource, join(themesDir, 'claude-vivid.json'));
|
|
59
|
+
const config = await readJsonConfig(OPENCODE_CONFIG);
|
|
60
|
+
config.theme = 'claude-vivid';
|
|
61
|
+
await writeFile(OPENCODE_CONFIG, JSON.stringify(config, null, 2));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function isThemeInstalled(themeName) {
|
|
65
|
+
const themePath = join(OPENCODE_DIR, 'themes', `${themeName}.json`);
|
|
66
|
+
return await exists(themePath);
|
|
67
|
+
}
|
|
68
|
+
export async function getInstalledMcps() {
|
|
69
|
+
try {
|
|
70
|
+
const content = await readFile(OPENCODE_CONFIG, 'utf-8');
|
|
71
|
+
const config = JSON.parse(content);
|
|
72
|
+
const mcpSection = config.mcp;
|
|
73
|
+
return mcpSection ? new Set(Object.keys(mcpSection)) : new Set();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return new Set();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=installers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installers.js","sourceRoot":"","sources":["../../src/services/installers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/services/opencode.ts"],"names":[],"mappings":"AASA,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO5D;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBrD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { OPENCODE_DIR } from '../constants.js';
|
|
6
|
+
import { exists } from '../utils/fs.js';
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
export async function isOpenCodeInstalled() {
|
|
9
|
+
try {
|
|
10
|
+
await execAsync('which opencode');
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return await exists(OPENCODE_DIR);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export async function installOpenCode() {
|
|
18
|
+
const spinner = ora('Installing OpenCode...').start();
|
|
19
|
+
try {
|
|
20
|
+
await execAsync('curl -fsSL https://opencode.ai/install | bash', {
|
|
21
|
+
shell: '/bin/bash',
|
|
22
|
+
});
|
|
23
|
+
spinner.succeed('OpenCode installed successfully!');
|
|
24
|
+
console.log(chalk.cyan('\n Next Steps:'));
|
|
25
|
+
console.log(' OpenCode has been installed. You may need to restart your terminal or run:');
|
|
26
|
+
console.log(' source ~/.bashrc (or ~/.zshrc)\n');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
spinner.fail('Installation failed');
|
|
30
|
+
throw new Error(`Failed to install OpenCode: ${error instanceof Error ? error.message : String(error)}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/services/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,+CAA+C,EAAE;YAC/D,KAAK,EAAE,WAAW;SACnB,CAAC,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CategorizedItems } from '../types.js';
|
|
2
|
+
export declare function categorizeAgents(agents: string[]): Promise<CategorizedItems>;
|
|
3
|
+
export declare function categorizeSkills(skills: string[]): Promise<CategorizedItems>;
|
|
4
|
+
export declare function categorizeCommands(commands: string[]): Promise<CategorizedItems>;
|
|
5
|
+
export declare function categorizeMcps(mcps: string[]): Promise<CategorizedItems>;
|
|
6
|
+
//# sourceMappingURL=categorize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorize.d.ts","sourceRoot":"","sources":["../../src/ui/categorize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAWlF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAWlF;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAWtF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0B9E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { MCP_DISPLAY_NAMES, OPENCODE_DIR, TOOLS_DIR } from '../constants.js';
|
|
3
|
+
import { exists, readJsonConfig } from '../utils/fs.js';
|
|
4
|
+
import { getInstalledMcps } from '../services/installers.js';
|
|
5
|
+
export async function categorizeAgents(agents) {
|
|
6
|
+
const result = { new: [], update: [] };
|
|
7
|
+
for (const agent of agents) {
|
|
8
|
+
const agentPath = join(OPENCODE_DIR, 'agent', `${agent}.md`);
|
|
9
|
+
if (await exists(agentPath)) {
|
|
10
|
+
result.update.push(agent);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
result.new.push(agent);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
export async function categorizeSkills(skills) {
|
|
19
|
+
const result = { new: [], update: [] };
|
|
20
|
+
for (const skill of skills) {
|
|
21
|
+
const skillPath = join(OPENCODE_DIR, 'skill', skill);
|
|
22
|
+
if (await exists(skillPath)) {
|
|
23
|
+
result.update.push(skill);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
result.new.push(skill);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
export async function categorizeCommands(commands) {
|
|
32
|
+
const result = { new: [], update: [] };
|
|
33
|
+
for (const command of commands) {
|
|
34
|
+
const commandPath = join(OPENCODE_DIR, 'command', `${command}.md`);
|
|
35
|
+
if (await exists(commandPath)) {
|
|
36
|
+
result.update.push(command);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
result.new.push(command);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export async function categorizeMcps(mcps) {
|
|
45
|
+
const installedMcps = await getInstalledMcps();
|
|
46
|
+
const result = { new: [], update: [] };
|
|
47
|
+
for (const mcp of mcps) {
|
|
48
|
+
const mcpConfig = await readJsonConfig(join(TOOLS_DIR, 'mcps', mcp, '.mcp.json'));
|
|
49
|
+
const servers = mcpConfig.mcpServers;
|
|
50
|
+
const displayName = MCP_DISPLAY_NAMES[mcp] ?? mcp;
|
|
51
|
+
let isInstalled = false;
|
|
52
|
+
if (servers) {
|
|
53
|
+
for (const serverName of Object.keys(servers)) {
|
|
54
|
+
if (installedMcps.has(serverName)) {
|
|
55
|
+
isInstalled = true;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (isInstalled) {
|
|
61
|
+
result.update.push(displayName);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
result.new.push(displayName);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=categorize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"categorize.js","sourceRoot":"","sources":["../../src/ui/categorize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CheckboxChoice } from '../types.js';
|
|
2
|
+
export declare function buildAgentChoices(agents: string[]): Promise<CheckboxChoice[]>;
|
|
3
|
+
export declare function buildSkillChoices(skills: string[]): Promise<CheckboxChoice[]>;
|
|
4
|
+
export declare function buildCommandChoices(commands: string[]): Promise<CheckboxChoice[]>;
|
|
5
|
+
export declare function buildMcpChoices(mcps: string[]): Promise<CheckboxChoice[]>;
|
|
6
|
+
//# sourceMappingURL=choices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choices.d.ts","sourceRoot":"","sources":["../../src/ui/choices.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWnF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWnF;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWvF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA0B/E"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { getDescription, MCP_DISPLAY_NAMES, OPENCODE_DIR, TOOLS_DIR } from '../constants.js';
|
|
4
|
+
import { exists, readJsonConfig } from '../utils/fs.js';
|
|
5
|
+
import { getInstalledMcps } from '../services/installers.js';
|
|
6
|
+
function formatChoiceLabel(name, description, isInstalled) {
|
|
7
|
+
const installedTag = isInstalled ? chalk.yellow(' (installed)') : '';
|
|
8
|
+
const descText = description ? chalk.dim(` - ${description}`) : '';
|
|
9
|
+
return `${name}${descText}${installedTag}`;
|
|
10
|
+
}
|
|
11
|
+
export async function buildAgentChoices(agents) {
|
|
12
|
+
const choices = [];
|
|
13
|
+
for (const agent of agents) {
|
|
14
|
+
const agentPath = join(OPENCODE_DIR, 'agent', `${agent}.md`);
|
|
15
|
+
const isInstalled = await exists(agentPath);
|
|
16
|
+
choices.push({
|
|
17
|
+
name: formatChoiceLabel(agent, getDescription(agent), isInstalled),
|
|
18
|
+
value: agent,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return choices;
|
|
22
|
+
}
|
|
23
|
+
export async function buildSkillChoices(skills) {
|
|
24
|
+
const choices = [];
|
|
25
|
+
for (const skill of skills) {
|
|
26
|
+
const skillPath = join(OPENCODE_DIR, 'skill', skill);
|
|
27
|
+
const isInstalled = await exists(skillPath);
|
|
28
|
+
choices.push({
|
|
29
|
+
name: formatChoiceLabel(skill, getDescription(skill), isInstalled),
|
|
30
|
+
value: skill,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return choices;
|
|
34
|
+
}
|
|
35
|
+
export async function buildCommandChoices(commands) {
|
|
36
|
+
const choices = [];
|
|
37
|
+
for (const command of commands) {
|
|
38
|
+
const commandPath = join(OPENCODE_DIR, 'command', `${command}.md`);
|
|
39
|
+
const isInstalled = await exists(commandPath);
|
|
40
|
+
choices.push({
|
|
41
|
+
name: formatChoiceLabel(command, getDescription(command), isInstalled),
|
|
42
|
+
value: command,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return choices;
|
|
46
|
+
}
|
|
47
|
+
export async function buildMcpChoices(mcps) {
|
|
48
|
+
const installedMcps = await getInstalledMcps();
|
|
49
|
+
const choices = [];
|
|
50
|
+
for (const mcp of mcps) {
|
|
51
|
+
const mcpConfig = await readJsonConfig(join(TOOLS_DIR, 'mcps', mcp, '.mcp.json'));
|
|
52
|
+
const servers = mcpConfig.mcpServers;
|
|
53
|
+
let isInstalled = false;
|
|
54
|
+
if (servers) {
|
|
55
|
+
for (const serverName of Object.keys(servers)) {
|
|
56
|
+
if (installedMcps.has(serverName)) {
|
|
57
|
+
isInstalled = true;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const displayName = MCP_DISPLAY_NAMES[mcp] ?? mcp;
|
|
63
|
+
choices.push({
|
|
64
|
+
name: formatChoiceLabel(displayName, getDescription(mcp), isInstalled),
|
|
65
|
+
value: mcp,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return choices;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=choices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choices.js","sourceRoot":"","sources":["../../src/ui/choices.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CategorizedItems } from '../types.js';
|
|
2
|
+
export declare function displayHeader(): Promise<void>;
|
|
3
|
+
export declare function formatCategorized(cat: CategorizedItems): string;
|
|
4
|
+
export declare function formatTheme(installThemeChoice: boolean, themeIsUpdate: boolean): string;
|
|
5
|
+
export declare function showSelectionResult(count: number, label: string): void;
|
|
6
|
+
export declare function getSeparator(): string;
|
|
7
|
+
export declare function displaySummary(agentsCat: CategorizedItems, skillsCat: CategorizedItems, commandsCat: CategorizedItems, mcpsCat: CategorizedItems, installThemeChoice: boolean, themeIsUpdate: boolean): void;
|
|
8
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAIpD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBnD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAS/D;AAED,wBAAgB,WAAW,CAAC,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAGvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,cAAc,CAC5B,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB,EAC3B,WAAW,EAAE,gBAAgB,EAC7B,OAAO,EAAE,gBAAgB,EACzB,kBAAkB,EAAE,OAAO,EAC3B,aAAa,EAAE,OAAO,GACrB,IAAI,CAsCN"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { ROOT_DIR, UI_PANEL_WIDTH } from '../constants.js';
|
|
5
|
+
import { readJsonConfig } from '../utils/fs.js';
|
|
6
|
+
import { clearScreen } from '../utils/terminal.js';
|
|
7
|
+
export async function displayHeader() {
|
|
8
|
+
const pkg = await readJsonConfig(join(ROOT_DIR, 'package.json'));
|
|
9
|
+
const version = pkg.version;
|
|
10
|
+
const logo = [
|
|
11
|
+
chalk.cyanBright(' ██████╗██╗ ██╗██╗ ██╗'),
|
|
12
|
+
chalk.cyanBright(' ██╔════╝██║ ██╔╝██║ ██║'),
|
|
13
|
+
chalk.cyanBright(' ██║ █████╔╝ ██║ █╗ ██║'),
|
|
14
|
+
chalk.cyanBright(' ██║ ██╔═██╗ ██║███╗██║'),
|
|
15
|
+
chalk.cyanBright(' ╚██████╗██║ ██╗╚███╔███╔╝'),
|
|
16
|
+
chalk.cyanBright(' ╚═════╝╚═╝ ╚═╝ ╚══╝╚══╝') + chalk.green(' ●'),
|
|
17
|
+
].join('\n');
|
|
18
|
+
clearScreen();
|
|
19
|
+
console.log(boxen(logo, {
|
|
20
|
+
padding: { top: 1, bottom: 1, left: 16, right: 16 },
|
|
21
|
+
borderStyle: 'round',
|
|
22
|
+
borderColor: 'green',
|
|
23
|
+
title: chalk.white(`CKW AI Toolkit v${version}`),
|
|
24
|
+
titleAlignment: 'left',
|
|
25
|
+
width: UI_PANEL_WIDTH,
|
|
26
|
+
}));
|
|
27
|
+
console.log(chalk.dim(' Install agents, skills, commands and MCPs\n'));
|
|
28
|
+
}
|
|
29
|
+
export function formatCategorized(cat) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (cat.new.length > 0) {
|
|
32
|
+
parts.push(chalk.green(`+ ${cat.new.join(', ')}`));
|
|
33
|
+
}
|
|
34
|
+
if (cat.update.length > 0) {
|
|
35
|
+
parts.push(chalk.yellow(`↻ ${cat.update.join(', ')}`));
|
|
36
|
+
}
|
|
37
|
+
return parts.length > 0 ? parts.join(' ') : chalk.dim('none');
|
|
38
|
+
}
|
|
39
|
+
export function formatTheme(installThemeChoice, themeIsUpdate) {
|
|
40
|
+
if (!installThemeChoice)
|
|
41
|
+
return chalk.dim('none');
|
|
42
|
+
return themeIsUpdate ? chalk.yellow('↻ claude-vivid') : chalk.green('+ claude-vivid');
|
|
43
|
+
}
|
|
44
|
+
export function showSelectionResult(count, label) {
|
|
45
|
+
if (count > 0) {
|
|
46
|
+
console.log(chalk.green(`✓ ${count} ${label} selected`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.dim(` No ${label} selected`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function getSeparator() {
|
|
53
|
+
return chalk.dim('─'.repeat(50));
|
|
54
|
+
}
|
|
55
|
+
export function displaySummary(agentsCat, skillsCat, commandsCat, mcpsCat, installThemeChoice, themeIsUpdate) {
|
|
56
|
+
const totalNew = agentsCat.new.length +
|
|
57
|
+
skillsCat.new.length +
|
|
58
|
+
commandsCat.new.length +
|
|
59
|
+
mcpsCat.new.length +
|
|
60
|
+
(installThemeChoice && !themeIsUpdate ? 1 : 0);
|
|
61
|
+
const totalUpdate = agentsCat.update.length +
|
|
62
|
+
skillsCat.update.length +
|
|
63
|
+
commandsCat.update.length +
|
|
64
|
+
mcpsCat.update.length +
|
|
65
|
+
(installThemeChoice && themeIsUpdate ? 1 : 0);
|
|
66
|
+
const summaryLines = [
|
|
67
|
+
chalk.dim('(+ new ↻ update)'),
|
|
68
|
+
'',
|
|
69
|
+
`Agents: ${formatCategorized(agentsCat)}`,
|
|
70
|
+
`Skills: ${formatCategorized(skillsCat)}`,
|
|
71
|
+
`Commands: ${formatCategorized(commandsCat)}`,
|
|
72
|
+
`MCPs: ${formatCategorized(mcpsCat)}`,
|
|
73
|
+
`Theme: ${formatTheme(installThemeChoice, themeIsUpdate)}`,
|
|
74
|
+
'',
|
|
75
|
+
chalk.white(`Total: ${chalk.green(`${totalNew} new`)}, ${chalk.yellow(`${totalUpdate} updates`)}`),
|
|
76
|
+
].join('\n');
|
|
77
|
+
console.log(boxen(summaryLines, {
|
|
78
|
+
padding: { top: 0, bottom: 0, left: 2, right: 2 },
|
|
79
|
+
borderStyle: 'round',
|
|
80
|
+
borderColor: 'white',
|
|
81
|
+
title: chalk.white('Summary'),
|
|
82
|
+
titleAlignment: 'left',
|
|
83
|
+
width: UI_PANEL_WIDTH,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/ui/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function exists(path: string): Promise<boolean>;
|
|
2
|
+
export declare function getDirectories(path: string): Promise<string[]>;
|
|
3
|
+
export declare function getFiles(path: string, extension: string): Promise<string[]>;
|
|
4
|
+
export declare function readJsonConfig(path: string): Promise<Record<string, unknown>>;
|
|
5
|
+
//# sourceMappingURL=fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAEA,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAOpE;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASjF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAOnF"}
|
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { access, readdir, readFile } from 'fs/promises';
|
|
2
|
+
export async function exists(path) {
|
|
3
|
+
try {
|
|
4
|
+
await access(path);
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function getDirectories(path) {
|
|
12
|
+
try {
|
|
13
|
+
const entries = await readdir(path, { withFileTypes: true });
|
|
14
|
+
return entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function getFiles(path, extension) {
|
|
21
|
+
try {
|
|
22
|
+
const entries = await readdir(path, { withFileTypes: true });
|
|
23
|
+
return entries
|
|
24
|
+
.filter((e) => e.isFile() && e.name.endsWith(extension))
|
|
25
|
+
.map((e) => e.name.replace(extension, ''));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function readJsonConfig(path) {
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(path, 'utf-8');
|
|
34
|
+
return JSON.parse(content);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BOTTOM_PADDING } from '../constants.js';
|
|
2
|
+
export function setupScrollRegion() {
|
|
3
|
+
const rows = process.stdout.rows || 24;
|
|
4
|
+
if (rows > BOTTOM_PADDING + 10) {
|
|
5
|
+
process.stdout.write(`\x1b[1;${rows - BOTTOM_PADDING}r`);
|
|
6
|
+
process.stdout.write('\x1b[H');
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function resetScrollRegion() {
|
|
10
|
+
process.stdout.write('\x1b[r');
|
|
11
|
+
}
|
|
12
|
+
export function handleResize() {
|
|
13
|
+
setupScrollRegion();
|
|
14
|
+
}
|
|
15
|
+
export function clearScreen() {
|
|
16
|
+
process.stdout.write('\x1b[2J\x1b[H');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/utils/terminal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACvC,IAAI,IAAI,GAAG,cAAc,GAAG,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,GAAG,cAAc,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,iBAAiB,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brookmind/ai-toolkit",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "AI Toolkit installer for OpenCode - agents, skills, MCPs, and themes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,16 @@
|
|
|
19
19
|
"scripts": {
|
|
20
20
|
"build": "tsc",
|
|
21
21
|
"start": "npm run build && node bin/cli.js",
|
|
22
|
-
"
|
|
22
|
+
"lint": "eslint src/",
|
|
23
|
+
"lint:fix": "eslint src/ --fix",
|
|
24
|
+
"format": "prettier --write src/",
|
|
25
|
+
"format:check": "prettier --check src/",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"prepublishOnly": "npm run build",
|
|
31
|
+
"prepare": "husky"
|
|
23
32
|
},
|
|
24
33
|
"keywords": [
|
|
25
34
|
"opencode",
|
|
@@ -39,11 +48,20 @@
|
|
|
39
48
|
"ora": "^9.0.0"
|
|
40
49
|
},
|
|
41
50
|
"devDependencies": {
|
|
51
|
+
"@eslint/js": "^9.39.2",
|
|
42
52
|
"@types/node": "^25.0.9",
|
|
43
|
-
"
|
|
53
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
54
|
+
"eslint": "^9.39.2",
|
|
55
|
+
"eslint-config-prettier": "^10.1.8",
|
|
56
|
+
"husky": "^9.1.7",
|
|
57
|
+
"lint-staged": "^16.2.7",
|
|
58
|
+
"prettier": "^3.8.0",
|
|
59
|
+
"typescript": "^5.9.3",
|
|
60
|
+
"typescript-eslint": "^8.53.0",
|
|
61
|
+
"vitest": "^4.0.17"
|
|
44
62
|
},
|
|
45
63
|
"engines": {
|
|
46
|
-
"node": ">=
|
|
64
|
+
"node": ">=20.0.0"
|
|
47
65
|
},
|
|
48
66
|
"files": [
|
|
49
67
|
"bin",
|
|
@@ -53,5 +71,11 @@
|
|
|
53
71
|
"skills",
|
|
54
72
|
"mcps",
|
|
55
73
|
"themes"
|
|
56
|
-
]
|
|
74
|
+
],
|
|
75
|
+
"lint-staged": {
|
|
76
|
+
"src/**/*.ts": [
|
|
77
|
+
"eslint --fix",
|
|
78
|
+
"prettier --write"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
57
81
|
}
|
package/agents/code-reviewer.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: code-reviewer
|
|
3
|
-
description: Expert code review specialist for quality, security, and maintainability. Use PROACTIVELY after writing or modifying code to ensure high development standards.
|
|
4
|
-
tools:
|
|
5
|
-
Read: true
|
|
6
|
-
Write: true
|
|
7
|
-
Edit: true
|
|
8
|
-
Bash: true
|
|
9
|
-
Grep: true
|
|
10
|
-
model: sonnet
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
You are a senior code reviewer ensuring high standards of code quality and security.
|
|
14
|
-
|
|
15
|
-
When invoked:
|
|
16
|
-
1. Run git diff to see recent changes
|
|
17
|
-
2. Focus on modified files
|
|
18
|
-
3. Begin review immediately
|
|
19
|
-
|
|
20
|
-
Review checklist:
|
|
21
|
-
- Code is simple and readable
|
|
22
|
-
- Functions and variables are well-named
|
|
23
|
-
- No duplicated code
|
|
24
|
-
- Proper error handling
|
|
25
|
-
- No exposed secrets or API keys
|
|
26
|
-
- Input validation implemented
|
|
27
|
-
- Good test coverage
|
|
28
|
-
- Performance considerations addressed
|
|
29
|
-
|
|
30
|
-
Provide feedback organized by priority:
|
|
31
|
-
- Critical issues (must fix)
|
|
32
|
-
- Warnings (should fix)
|
|
33
|
-
- Suggestions (consider improving)
|
|
34
|
-
|
|
35
|
-
Include specific examples of how to fix issues.
|