aicores 1.0.0 → 1.0.2
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 +52 -1
- package/bin/agents.mjs +0 -0
- package/bin/cli.mjs +0 -0
- package/dist/cli.mjs +168 -20
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -6,6 +6,57 @@ The CLI for the open agent ecosystem. Install and manage **agents** and **skills
|
|
|
6
6
|
Supports **OpenCode**, **Claude Code**, **Codex**, **Cursor**, and [37 more](#available-agents).
|
|
7
7
|
<!-- agent-list:end -->
|
|
8
8
|
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
No installation required — use directly with `npx`:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Install agents + skills from a GitHub repo
|
|
15
|
+
npx aicores wizeline/my-aicore
|
|
16
|
+
|
|
17
|
+
# Install from a full GitHub URL
|
|
18
|
+
npx aicores https://github.com/wizeline/my-aicore
|
|
19
|
+
|
|
20
|
+
# List available agents and skills without installing
|
|
21
|
+
npx aicores wizeline/my-aicore --list
|
|
22
|
+
|
|
23
|
+
# Install everything globally, skip all prompts
|
|
24
|
+
npx aicores wizeline/my-aicore -g -y
|
|
25
|
+
|
|
26
|
+
# Install only to Claude Code
|
|
27
|
+
npx aicores wizeline/my-aicore -a claude-code
|
|
28
|
+
|
|
29
|
+
# Install specific skills only
|
|
30
|
+
npx aicores wizeline/my-aicore --skill frontend-design
|
|
31
|
+
|
|
32
|
+
# Install agents separately
|
|
33
|
+
npx aicores agents add wizeline/agent-skills
|
|
34
|
+
|
|
35
|
+
# Install skills separately
|
|
36
|
+
npx aicores skills add wizeline/agent-skills
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or install globally to use without `npx`:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# npm
|
|
43
|
+
npm install -g aicores
|
|
44
|
+
|
|
45
|
+
# pnpm
|
|
46
|
+
pnpm add -g aicores
|
|
47
|
+
|
|
48
|
+
# yarn
|
|
49
|
+
yarn global add aicores
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Once installed globally, use `aicore`, `agents`, or `skills` directly:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
aicore wizeline/my-aicore
|
|
56
|
+
agents add wizeline/agent-skills
|
|
57
|
+
skills add wizeline/agent-skills
|
|
58
|
+
```
|
|
59
|
+
|
|
9
60
|
> [!TIP]
|
|
10
61
|
> **Three interchangeable commands**: `aicore`, `agents`, and `skills` all work the same way. Use `npx aicore` to install a bundled package of agents + skills at once, or use `npx agents` / `npx skills` to install them separately.
|
|
11
62
|
|
|
@@ -72,7 +123,7 @@ npx aicore ./my-local-aicore
|
|
|
72
123
|
### Examples
|
|
73
124
|
|
|
74
125
|
```bash
|
|
75
|
-
# List
|
|
126
|
+
# List aicores from a folder or URL without installing
|
|
76
127
|
npx aicore wizeline/my-aicore --list
|
|
77
128
|
|
|
78
129
|
# Install everything globally and skip all prompts
|
package/bin/agents.mjs
CHANGED
|
File without changes
|
package/bin/cli.mjs
CHANGED
|
File without changes
|
package/dist/cli.mjs
CHANGED
|
@@ -648,6 +648,78 @@ async function discoverAgentFiles(dir) {
|
|
|
648
648
|
}
|
|
649
649
|
return agents2;
|
|
650
650
|
}
|
|
651
|
+
async function discoverAicoresFromDir(baseDir) {
|
|
652
|
+
const aicores = [];
|
|
653
|
+
let entries;
|
|
654
|
+
try {
|
|
655
|
+
entries = await readdir(baseDir, { withFileTypes: true });
|
|
656
|
+
} catch {
|
|
657
|
+
return aicores;
|
|
658
|
+
}
|
|
659
|
+
for (const entry of entries) {
|
|
660
|
+
if (!entry.isDirectory()) continue;
|
|
661
|
+
const dirName = entry.name;
|
|
662
|
+
if (["node_modules", ".git", "dist", "build", "__pycache__"].includes(dirName)) continue;
|
|
663
|
+
const aicoreDir = join3(baseDir, dirName);
|
|
664
|
+
const agentsDir = join3(aicoreDir, "agents");
|
|
665
|
+
const skillsDir = join3(aicoreDir, "skills");
|
|
666
|
+
let hasAgents = false;
|
|
667
|
+
let hasSkills = false;
|
|
668
|
+
try {
|
|
669
|
+
const s = await stat(agentsDir);
|
|
670
|
+
hasAgents = s.isDirectory();
|
|
671
|
+
} catch {
|
|
672
|
+
}
|
|
673
|
+
try {
|
|
674
|
+
const s = await stat(skillsDir);
|
|
675
|
+
hasSkills = s.isDirectory();
|
|
676
|
+
} catch {
|
|
677
|
+
}
|
|
678
|
+
if (!hasAgents && !hasSkills) continue;
|
|
679
|
+
const agents2 = hasAgents ? await discoverAgentFiles(agentsDir) : [];
|
|
680
|
+
const skills = hasSkills ? await discoverSkillsBasic(skillsDir) : [];
|
|
681
|
+
aicores.push({ name: dirName, agents: agents2, skills });
|
|
682
|
+
}
|
|
683
|
+
return aicores.sort((a, b) => a.name.localeCompare(b.name));
|
|
684
|
+
}
|
|
685
|
+
async function discoverSkillsBasic(dir) {
|
|
686
|
+
const skills = [];
|
|
687
|
+
const scan = async (currentDir, depth) => {
|
|
688
|
+
if (depth > 3) return;
|
|
689
|
+
let entries;
|
|
690
|
+
try {
|
|
691
|
+
entries = await readdir(currentDir, { withFileTypes: true });
|
|
692
|
+
} catch {
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
for (const entry of entries) {
|
|
696
|
+
if (entry.isFile() && entry.name === "SKILL.md") {
|
|
697
|
+
const parsed = await parseSkillMdBasic(join3(currentDir, "SKILL.md"));
|
|
698
|
+
if (parsed) skills.push(parsed);
|
|
699
|
+
} else if (entry.isDirectory() && !["node_modules", ".git"].includes(entry.name)) {
|
|
700
|
+
await scan(join3(currentDir, entry.name), depth + 1);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
};
|
|
704
|
+
await scan(dir, 0);
|
|
705
|
+
return skills;
|
|
706
|
+
}
|
|
707
|
+
async function parseSkillMdBasic(filePath) {
|
|
708
|
+
try {
|
|
709
|
+
const content = await readFile2(filePath, "utf-8");
|
|
710
|
+
let data = {};
|
|
711
|
+
try {
|
|
712
|
+
const parsed = matter(content);
|
|
713
|
+
data = parsed.data || {};
|
|
714
|
+
} catch {
|
|
715
|
+
}
|
|
716
|
+
const name = typeof data.name === "string" && data.name ? data.name : basename(join3(filePath, ".."));
|
|
717
|
+
const description = typeof data.description === "string" ? data.description : "";
|
|
718
|
+
return { name, description, path: filePath, rawContent: content };
|
|
719
|
+
} catch {
|
|
720
|
+
return null;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
651
723
|
var SKIP_DIRS = ["node_modules", ".git", "dist", "build", "__pycache__"];
|
|
652
724
|
function shouldInstallInternalSkills() {
|
|
653
725
|
const envValue = process.env.INSTALL_INTERNAL_SKILLS;
|
|
@@ -2321,13 +2393,14 @@ function createEmptyLocalLock() {
|
|
|
2321
2393
|
// package.json
|
|
2322
2394
|
var package_default = {
|
|
2323
2395
|
name: "aicores",
|
|
2324
|
-
version: "1.0.
|
|
2396
|
+
version: "1.0.2",
|
|
2325
2397
|
description: "The open agent skills & subagents ecosystem",
|
|
2326
2398
|
type: "module",
|
|
2327
2399
|
bin: {
|
|
2328
2400
|
skills: "bin/cli.mjs",
|
|
2329
2401
|
agents: "bin/agents.mjs",
|
|
2330
2402
|
aicore: "bin/aicore.mjs",
|
|
2403
|
+
aicores: "bin/aicore.mjs",
|
|
2331
2404
|
"add-skill": "bin/cli.mjs"
|
|
2332
2405
|
},
|
|
2333
2406
|
files: [
|
|
@@ -3079,6 +3152,51 @@ async function runAdd(args, options = {}) {
|
|
|
3079
3152
|
const baseDir = parsed.subpath ? join8(skillsDir, parsed.subpath) : skillsDir;
|
|
3080
3153
|
const aiAgentsSubDir = join8(baseDir, "agents");
|
|
3081
3154
|
const aiSkillsSubDir = join8(baseDir, "skills");
|
|
3155
|
+
if (options.list) {
|
|
3156
|
+
spinner4.start("Discovering aicores...");
|
|
3157
|
+
const aicores = await discoverAicoresFromDir(baseDir);
|
|
3158
|
+
if (aicores.length > 0) {
|
|
3159
|
+
spinner4.stop(`Found ${pc2.green(aicores.length)} aicore(s)`);
|
|
3160
|
+
console.log();
|
|
3161
|
+
for (const aicore of aicores) {
|
|
3162
|
+
const totalItems = aicore.agents.length + aicore.skills.length;
|
|
3163
|
+
console.log(
|
|
3164
|
+
pc2.bold(pc2.cyan(aicore.name)) + pc2.dim(` (${totalItems} item${totalItems !== 1 ? "s" : ""})`)
|
|
3165
|
+
);
|
|
3166
|
+
const sections = [];
|
|
3167
|
+
if (aicore.agents.length > 0) sections.push({ label: "Agents", items: aicore.agents });
|
|
3168
|
+
if (aicore.skills.length > 0)
|
|
3169
|
+
sections.push({
|
|
3170
|
+
label: "Skills",
|
|
3171
|
+
items: aicore.skills.map((s) => ({
|
|
3172
|
+
name: getSkillDisplayName(s),
|
|
3173
|
+
description: s.description
|
|
3174
|
+
}))
|
|
3175
|
+
});
|
|
3176
|
+
for (let si = 0; si < sections.length; si++) {
|
|
3177
|
+
const section = sections[si];
|
|
3178
|
+
const isLastSection = si === sections.length - 1;
|
|
3179
|
+
const sectionPrefix = isLastSection ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
3180
|
+
const childIndent = isLastSection ? " " : "\u2502 ";
|
|
3181
|
+
console.log(
|
|
3182
|
+
`${sectionPrefix}${pc2.bold(section.label)} ${pc2.dim(`(${section.items.length})`)}`
|
|
3183
|
+
);
|
|
3184
|
+
for (let ii = 0; ii < section.items.length; ii++) {
|
|
3185
|
+
const item = section.items[ii];
|
|
3186
|
+
const isLastItem = ii === section.items.length - 1;
|
|
3187
|
+
const itemPrefix = isLastItem ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
3188
|
+
const desc = item.description ? pc2.dim(` \u2014 ${item.description}`) : "";
|
|
3189
|
+
console.log(`${childIndent}${itemPrefix}${pc2.cyan(item.name)}${desc}`);
|
|
3190
|
+
}
|
|
3191
|
+
}
|
|
3192
|
+
console.log();
|
|
3193
|
+
}
|
|
3194
|
+
p.outro(pc2.dim("Run without --list to install"));
|
|
3195
|
+
await cleanup(tempDir);
|
|
3196
|
+
process.exit(0);
|
|
3197
|
+
}
|
|
3198
|
+
spinner4.stop("");
|
|
3199
|
+
}
|
|
3082
3200
|
if (existsSync2(aiAgentsSubDir) || existsSync2(aiSkillsSubDir)) {
|
|
3083
3201
|
spinner4.start("Discovering aicore contents...");
|
|
3084
3202
|
const agentFiles = existsSync2(aiAgentsSubDir) ? await discoverAgentFiles(aiAgentsSubDir) : [];
|
|
@@ -3095,24 +3213,40 @@ async function runAdd(args, options = {}) {
|
|
|
3095
3213
|
process.exit(1);
|
|
3096
3214
|
}
|
|
3097
3215
|
if (options.list) {
|
|
3098
|
-
|
|
3099
|
-
|
|
3100
|
-
|
|
3101
|
-
|
|
3102
|
-
|
|
3103
|
-
|
|
3104
|
-
|
|
3105
|
-
}
|
|
3106
|
-
if (discoveredSkills.length > 0)
|
|
3107
|
-
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3216
|
+
const name = parsed.subpath ? basename3(parsed.subpath) : basename3(parsed.url);
|
|
3217
|
+
const totalItems = agentFiles.length + discoveredSkills.length;
|
|
3218
|
+
console.log();
|
|
3219
|
+
console.log(
|
|
3220
|
+
pc2.bold(pc2.cyan(name)) + pc2.dim(` (${totalItems} item${totalItems !== 1 ? "s" : ""})`)
|
|
3221
|
+
);
|
|
3222
|
+
const sections = [];
|
|
3223
|
+
if (agentFiles.length > 0) sections.push({ label: "Agents", items: agentFiles });
|
|
3224
|
+
if (discoveredSkills.length > 0)
|
|
3225
|
+
sections.push({
|
|
3226
|
+
label: "Skills",
|
|
3227
|
+
items: discoveredSkills.map((s) => ({
|
|
3228
|
+
name: getSkillDisplayName(s),
|
|
3229
|
+
description: s.description
|
|
3230
|
+
}))
|
|
3231
|
+
});
|
|
3232
|
+
for (let si = 0; si < sections.length; si++) {
|
|
3233
|
+
const section = sections[si];
|
|
3234
|
+
const isLastSection = si === sections.length - 1;
|
|
3235
|
+
const sectionPrefix = isLastSection ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
3236
|
+
const childIndent = isLastSection ? " " : "\u2502 ";
|
|
3237
|
+
console.log(
|
|
3238
|
+
`${sectionPrefix}${pc2.bold(section.label)} ${pc2.dim(`(${section.items.length})`)}`
|
|
3239
|
+
);
|
|
3240
|
+
for (let ii = 0; ii < section.items.length; ii++) {
|
|
3241
|
+
const item = section.items[ii];
|
|
3242
|
+
const isLastItem = ii === section.items.length - 1;
|
|
3243
|
+
const itemPrefix = isLastItem ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
|
|
3244
|
+
const desc = item.description ? pc2.dim(` \u2014 ${item.description}`) : "";
|
|
3245
|
+
console.log(`${childIndent}${itemPrefix}${pc2.cyan(item.name)}${desc}`);
|
|
3112
3246
|
}
|
|
3113
3247
|
}
|
|
3114
3248
|
console.log();
|
|
3115
|
-
p.outro("Run without --list to install");
|
|
3249
|
+
p.outro(pc2.dim("Run without --list to install"));
|
|
3116
3250
|
await cleanup(tempDir);
|
|
3117
3251
|
process.exit(0);
|
|
3118
3252
|
}
|
|
@@ -5681,9 +5815,17 @@ async function main() {
|
|
|
5681
5815
|
break;
|
|
5682
5816
|
}
|
|
5683
5817
|
case "list":
|
|
5684
|
-
case "ls":
|
|
5685
|
-
|
|
5818
|
+
case "ls": {
|
|
5819
|
+
const listSources = restArgs.filter((a) => !a.startsWith("-"));
|
|
5820
|
+
if (listSources.length > 0) {
|
|
5821
|
+
showLogo();
|
|
5822
|
+
const { source: addSource, options: addOpts } = parseAddOptions([...restArgs, "--list"]);
|
|
5823
|
+
await runAdd(addSource, addOpts);
|
|
5824
|
+
} else {
|
|
5825
|
+
await runList(restArgs);
|
|
5826
|
+
}
|
|
5686
5827
|
break;
|
|
5828
|
+
}
|
|
5687
5829
|
case "check":
|
|
5688
5830
|
runCheck(restArgs);
|
|
5689
5831
|
break;
|
|
@@ -5700,8 +5842,14 @@ async function main() {
|
|
|
5700
5842
|
console.log(VERSION);
|
|
5701
5843
|
break;
|
|
5702
5844
|
default:
|
|
5703
|
-
|
|
5704
|
-
|
|
5845
|
+
if (process.env.IS_AICORE_CLI) {
|
|
5846
|
+
showLogo();
|
|
5847
|
+
const { source: addSource, options: addOpts } = parseAddOptions(args);
|
|
5848
|
+
await runAdd(addSource, addOpts);
|
|
5849
|
+
} else {
|
|
5850
|
+
console.log(`Unknown command: ${command}`);
|
|
5851
|
+
console.log(`Run ${BOLD3}${binaryName} --help${RESET3} for usage.`);
|
|
5852
|
+
}
|
|
5705
5853
|
}
|
|
5706
5854
|
}
|
|
5707
5855
|
main();
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aicores",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "The open agent skills & subagents ecosystem",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"skills": "bin/cli.mjs",
|
|
8
8
|
"agents": "bin/agents.mjs",
|
|
9
9
|
"aicore": "bin/aicore.mjs",
|
|
10
|
+
"aicores": "bin/aicore.mjs",
|
|
10
11
|
"add-skill": "bin/cli.mjs"
|
|
11
12
|
},
|
|
12
13
|
"files": [
|