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 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 agents and skills in a package without installing
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.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
- if (agentFiles.length > 0) {
3099
- console.log();
3100
- p.log.step(pc2.bold("Agents"));
3101
- for (const af of agentFiles) {
3102
- p.log.message(` ${pc2.cyan(af.name)}`);
3103
- if (af.description) p.log.message(` ${pc2.dim(af.description)}`);
3104
- }
3105
- }
3106
- if (discoveredSkills.length > 0) {
3107
- console.log();
3108
- p.log.step(pc2.bold("Skills"));
3109
- for (const s of discoveredSkills) {
3110
- p.log.message(` ${pc2.cyan(getSkillDisplayName(s))}`);
3111
- if (s.description) p.log.message(` ${pc2.dim(s.description)}`);
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
- await runList(restArgs);
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
- console.log(`Unknown command: ${command}`);
5704
- console.log(`Run ${BOLD3}${binaryName} --help${RESET3} for usage.`);
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.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": [