yeka-skills 0.2.2 → 0.2.4

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.
Files changed (3) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.js +79 -15
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -31,8 +31,10 @@ yeka-skills logout
31
31
  ## Share a local skill with the team
32
32
 
33
33
  `yeka-skills share <skill>` packages one of your local skill folders and sends it to the private
34
- submission inbox, where a review bot turns it into a team-repo pull request. Nothing is published
35
- by a share a person reviews every submission first.
34
+ submission inbox, where the submission bot turns it into a team-repo pull request. Nothing bypasses
35
+ review but the reviewers are machines: the repository checks and an AI safety review gate the
36
+ merge, and they run from `main`, not from the pull request. The catalogue page was written from your
37
+ skill's own source and confirmed by you during the share conversation.
36
38
 
37
39
  - The CLI looks for the folder in the same local roots the installer knows. If a skill exists in
38
40
  several of them, it picks the one it would install into first (the current Codex folder, then
@@ -46,7 +48,8 @@ by a share — a person reviews every submission first.
46
48
  the review bot can find it, read it, and strip it before the skill content is unpacked. Do not
47
49
  create a `_yeka` folder inside your skill yourself.
48
50
  - A successful share answers with one sentence: the team is notified the moment the upload
49
- lands, and after review it usually goes live the same day, announced in #yeka-skills.
51
+ lands, and the skill goes live on its own once the automatic checks pass usually about ten
52
+ minutes — announced in #yeka-skills. A failed check messages the author, not the operator.
50
53
 
51
54
  Use `--dry-run` with `add`, `update`, or `remove` to verify and report changes without mutating the
52
55
  managed installation. Removal is fully offline and uses local receipts. It refuses locally edited
package/dist/cli.js CHANGED
@@ -2358,7 +2358,7 @@ var statusCommand = async (context = {}) => {
2358
2358
  return Promise.all(
2359
2359
  receipts.map((receipt) => inspectLocalStatus(receipt, remoteByName.get(receipt.skillName), home))
2360
2360
  );
2361
- });
2361
+ }, context.session);
2362
2362
  for (const status of statuses) {
2363
2363
  output(
2364
2364
  context,
@@ -2366,17 +2366,21 @@ var statusCommand = async (context = {}) => {
2366
2366
  );
2367
2367
  }
2368
2368
  };
2369
- var assertUpdatableStatuses = (skillName, statuses) => {
2369
+ var updateBlocker = (skillName, statuses) => {
2370
2370
  const modified = statuses.find((status) => status.kind === "modified");
2371
2371
  if (modified !== void 0) {
2372
- throw new CliError(
2373
- "local_changes",
2374
- `${skillName} has local changes for ${modified.receipt.runtime}. It was not changed.`
2375
- );
2372
+ return {
2373
+ code: "local_changes",
2374
+ message: `${skillName} has local changes for ${modified.receipt.runtime}. It was not changed.`
2375
+ };
2376
2376
  }
2377
2377
  if (statuses.some((status) => status.kind === "unavailable")) {
2378
- throw new CliError("skill_unavailable", `${skillName} is no longer available in the private registry.`);
2378
+ return {
2379
+ code: "skill_unavailable",
2380
+ message: `${skillName} is no longer available in the private registry.`
2381
+ };
2379
2382
  }
2383
+ return void 0;
2380
2384
  };
2381
2385
  var updateCommand = async (skillNameInput, options, context = {}) => {
2382
2386
  const selectedName = skillNameInput === void 0 ? void 0 : validatedSkillName(skillNameInput);
@@ -2396,17 +2400,25 @@ var updateCommand = async (skillNameInput, options, context = {}) => {
2396
2400
  const remoteByName = new Map(manifest.skills.map((skill) => [skill.name, skill]));
2397
2401
  const selectedGroups = [...groups.entries()].filter(([name]) => selectedName === void 0 || name === selectedName);
2398
2402
  const prepared = [];
2403
+ const skipped = [];
2399
2404
  for (const [name, receipts] of selectedGroups) {
2400
2405
  const remote = remoteByName.get(name);
2401
2406
  const statuses = await Promise.all(
2402
2407
  receipts.map((receipt) => inspectLocalStatus(receipt, remote, home))
2403
2408
  );
2404
- assertUpdatableStatuses(name, statuses);
2405
- if (remote === void 0) {
2406
- throw new CliError("skill_unavailable", `${name} is no longer available in the private registry.`);
2409
+ const blocker = updateBlocker(name, statuses) ?? (remote === void 0 ? { code: "skill_unavailable", message: `${name} is no longer available in the private registry.` } : void 0);
2410
+ if (blocker !== void 0) {
2411
+ if (selectedName !== void 0) {
2412
+ throw new CliError(blocker.code, blocker.message);
2413
+ }
2414
+ skipped.push(blocker.message);
2415
+ continue;
2407
2416
  }
2408
2417
  prepared.push({ name, receipts, skill: remote, statuses });
2409
2418
  }
2419
+ for (const message of skipped) {
2420
+ output(context, message);
2421
+ }
2410
2422
  const updated = [];
2411
2423
  for (const item of prepared) {
2412
2424
  if (item.statuses.every((status) => status.kind === "current")) {
@@ -2428,7 +2440,7 @@ var updateCommand = async (skillNameInput, options, context = {}) => {
2428
2440
  });
2429
2441
  }
2430
2442
  return updated;
2431
- });
2443
+ }, context.session);
2432
2444
  for (const result of results) {
2433
2445
  printActions(context, result.name, result.actions, options.dryRun === true);
2434
2446
  }
@@ -2531,7 +2543,8 @@ var shareCommand = async (skillNameInput, options, context = {}) => {
2531
2543
  const client = context.client ?? new RegistryClient();
2532
2544
  try {
2533
2545
  await withRegistrySession(
2534
- (token) => client.uploadSubmission(skillName, packaged.sha256, packaged.bytes, token)
2546
+ (token) => client.uploadSubmission(skillName, packaged.sha256, packaged.bytes, token),
2547
+ context.session
2535
2548
  );
2536
2549
  } catch (error) {
2537
2550
  if (error instanceof CliError && error.code.startsWith("login_")) {
@@ -2542,7 +2555,10 @@ var shareCommand = async (skillNameInput, options, context = {}) => {
2542
2555
  }
2543
2556
  throw error;
2544
2557
  }
2545
- output(context, "Shared. The team was notified the moment it landed; after review it usually goes live the same day, announced in #yeka-skills.");
2558
+ output(
2559
+ context,
2560
+ "Shared. Automatic checks read it first. It goes live on its own once they pass, usually about ten minutes, and only then is it announced to the team in #yeka-skills. If a check fails you get a Slack message saying what to fix, and your colleagues never see a skill that did not pass."
2561
+ );
2546
2562
  };
2547
2563
  var loginCommand = async (context = {}) => {
2548
2564
  await deleteSession();
@@ -2554,9 +2570,57 @@ var logoutCommand = async (context = {}) => {
2554
2570
  output(context, removed ? "The Yeka Skills session was removed." : "There was no saved Yeka Skills session.");
2555
2571
  };
2556
2572
 
2573
+ // package.json
2574
+ var package_default = {
2575
+ name: "yeka-skills",
2576
+ version: "0.2.4",
2577
+ description: "Install, update, and remove private Gemography agent skills",
2578
+ type: "module",
2579
+ license: "UNLICENSED",
2580
+ repository: {
2581
+ type: "git",
2582
+ url: "git+https://github.com/gemography/yeka-capsules.git",
2583
+ directory: "packages/cli"
2584
+ },
2585
+ homepage: "https://yekaskills.com",
2586
+ engines: {
2587
+ node: ">=22.15.0"
2588
+ },
2589
+ bin: {
2590
+ "yeka-skills": "./dist/cli.js"
2591
+ },
2592
+ files: [
2593
+ "dist",
2594
+ "README.md"
2595
+ ],
2596
+ publishConfig: {
2597
+ access: "public"
2598
+ },
2599
+ scripts: {
2600
+ build: "tsup src/cli.ts --format esm --platform node --target node22 --clean",
2601
+ typecheck: "tsc --noEmit",
2602
+ test: "vitest run",
2603
+ "pack:check": "npm pack --dry-run"
2604
+ },
2605
+ dependencies: {
2606
+ commander: "15.0.0",
2607
+ tar: "7.5.22",
2608
+ zod: "4.4.3"
2609
+ },
2610
+ devDependencies: {
2611
+ "@types/node": "26.2.0",
2612
+ "@yeka/contracts": "0.0.0",
2613
+ "@yeka/integrity": "0.0.0",
2614
+ tsup: "8.5.1",
2615
+ typescript: "7.0.2",
2616
+ vitest: "4.1.10"
2617
+ }
2618
+ };
2619
+
2557
2620
  // src/cli.ts
2621
+ var packageVersion = package_default.version;
2558
2622
  var program = new Command();
2559
- program.name("yeka-skills").description("Install, update, and remove private Gemography agent skills").version("0.1.0").showHelpAfterError();
2623
+ program.name("yeka-skills").description("Install, update, and remove private Gemography agent skills").version(packageVersion).showHelpAfterError();
2560
2624
  program.command("add").description("Install one private skill").argument("<skill>", "exact skill name").option("--dry-run", "verify and show changes without installation").action(async (skill, options) => addCommand(skill, options));
2561
2625
  program.command("list").description("List managed local skills without network access").action(async () => listCommand());
2562
2626
  program.command("status").description("Check local skills and available updates").action(async () => statusCommand());
@@ -2566,7 +2630,7 @@ program.command("update").description("Update one managed skill or all managed s
2566
2630
  program.command("remove").description("Remove one managed skill without registry access").argument("[skill]", "exact skill name").option("--force", "preserve and remove a locally edited copy").option("--dry-run", "verify and show changes without removal").action(
2567
2631
  async (skill, options) => removeCommand(skill, options)
2568
2632
  );
2569
- program.command("share").description("Share one local skill with the team for review").argument("<skill>", "exact skill name").option("--check", "look the skill over without sharing").option("--notes-file <path>", "text file with your interview answers, shared with the reviewers").action(
2633
+ program.command("share").description("Share one local skill with the team").argument("<skill>", "exact skill name").option("--check", "look the skill over without sharing").option("--notes-file <path>", "text file with your interview answers, kept with the submission").action(
2570
2634
  async (skill, options) => shareCommand(skill, options)
2571
2635
  );
2572
2636
  program.command("login").description("Start a new private registry session").action(async () => loginCommand());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yeka-skills",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Install, update, and remove private Gemography agent skills",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",