@rayul/kordis 0.1.13 → 0.1.14

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.
@@ -25,6 +25,18 @@ Publish a valid, AI-review-passing version. ALWAYS dry-run first.
25
25
  `version` differs from that result, the API rejects with `usage`. Either
26
26
  drop the `version` field on updates, set `--bump` to match, or align
27
27
  them.
28
+ - RECOMMENDED: **omit `version:` from frontmatter on update pushes** and
29
+ use only `--bump patch|minor|major` to control versioning. Having both
30
+ is the most common push failure.
31
+
32
+ ## Deleting a package
33
+
34
+ There is **no `kordis delete` CLI command**. Options:
35
+ - Web UI: `https://kordis.store/p/<full_slug>` (if a delete button is available)
36
+ - Registry owner: soft-delete via the prod Postgres
37
+ (`UPDATE packages SET deleted_at = NOW() WHERE full_slug = '...'`)
38
+ - Workaround: push a new version with `visibility: unlisted` or a
39
+ deprecation notice in the body
28
40
 
29
41
  If the body contains third-party content, MUST preserve the original copyright
30
42
  and license text inside the body and link to source via `homepage`.
@@ -27,6 +27,14 @@ DEFAULT to `read` when you spontaneously want to consult a skill. DEFAULT to
27
27
  - Trust gate: only `review_status=passed` returned by default. To get a
28
28
  `pending_review` body, pass `--allow-pending` AFTER warning the user the
29
29
  package has not been AI-reviewed.
30
+ - Note: `jit_blocked` fires for BOTH ineligible types AND packages still
31
+ under review. Check `kordis info --json` to distinguish: `review_status`
32
+ tells you which case you're in.
33
+
34
+ `pull` vs `read` on pending packages: `pull` writes files even while
35
+ `review_status=pending_review`; `read` blocks. When you need the content
36
+ immediately (e.g. to verify a package you just pushed), use `pull` with
37
+ `--tool <name>` — it bypasses the JIT trust gate.
30
38
 
31
39
  ## Commands
32
40
 
package/dist/index.js CHANGED
@@ -842,6 +842,9 @@ var init_client = __esm({
842
842
  getPackage(username, slug) {
843
843
  return this.request(`/api/packages/${username}/${slug}`);
844
844
  }
845
+ deletePackage(username, slug) {
846
+ return this.request(`/api/packages/${username}/${slug}`, { method: "DELETE" });
847
+ }
845
848
  getContent(username, slug, opts = {}) {
846
849
  return this.request(
847
850
  `/api/packages/${username}/${slug}/content`,
@@ -972,7 +975,7 @@ var init_src2 = __esm({
972
975
 
973
976
  // src/index.ts
974
977
  init_src2();
975
- import { Command as Command12 } from "commander";
978
+ import { Command as Command13 } from "commander";
976
979
 
977
980
  // src/commands/login.ts
978
981
  import { Command } from "commander";
@@ -2920,9 +2923,48 @@ function unstarCommand() {
2920
2923
  });
2921
2924
  }
2922
2925
 
2926
+ // src/commands/delete.ts
2927
+ import { Command as Command12 } from "commander";
2928
+ import prompts from "prompts";
2929
+ function deleteCommand() {
2930
+ return new Command12("delete").description("permanently delete a package you own").argument("<full_slug>", "package identifier {username}/{slug}").option("--force", "skip the confirmation prompt").action(async (fullSlug, opts) => {
2931
+ const [username, slug] = fullSlug.split("/");
2932
+ if (!username || !slug) {
2933
+ throw new Error('full_slug must be "{username}/{slug}"');
2934
+ }
2935
+ const bundle = await useClient();
2936
+ const detail = await bundle.api.getPackage(username, slug);
2937
+ if (!opts.force) {
2938
+ printHuman(c.yellow(` \u26A0 You are about to permanently delete:`));
2939
+ printHuman(` ${c.bold(detail.full_slug)} v${detail.current_version}`);
2940
+ printHuman(` "${detail.description?.slice(0, 80) ?? ""}"`);
2941
+ printHuman(c.yellow(` The slug cannot be reused after deletion. This cannot be undone via the CLI.`));
2942
+ printHuman("");
2943
+ const { confirmed } = await prompts({
2944
+ type: "confirm",
2945
+ name: "confirmed",
2946
+ message: `Delete ${c.bold(fullSlug)}?`,
2947
+ initial: false
2948
+ });
2949
+ if (!confirmed) {
2950
+ printHuman(c.gray("Aborted."));
2951
+ process.exit(0);
2952
+ }
2953
+ }
2954
+ await bundle.authedRequest((api) => api.deletePackage(username, slug));
2955
+ printDual({
2956
+ json: { status: "deleted", full_slug: fullSlug },
2957
+ human: () => {
2958
+ printHuman(c.green(`\u2713 Deleted ${c.bold(fullSlug)}`));
2959
+ printHuman(c.gray(` The package is no longer visible. Slug "${fullSlug}" is reserved permanently.`));
2960
+ }
2961
+ });
2962
+ });
2963
+ }
2964
+
2923
2965
  // src/index.ts
2924
2966
  function buildProgram() {
2925
- const program = new Command12("kordis").version(VERSION).description("Kordis \u2014 registry for agentic-coding packages").option("--json", "emit JSON output to stdout (default: human)", false).hook("preAction", (thisCommand) => {
2967
+ const program = new Command13("kordis").version(VERSION).description("Kordis \u2014 registry for agentic-coding packages").option("--json", "emit JSON output to stdout (default: human)", false).hook("preAction", (thisCommand) => {
2926
2968
  const opts = thisCommand.optsWithGlobals();
2927
2969
  if (opts.json) setJsonMode(true);
2928
2970
  });
@@ -2937,6 +2979,7 @@ function buildProgram() {
2937
2979
  program.addCommand(commentCommand());
2938
2980
  program.addCommand(starCommand());
2939
2981
  program.addCommand(unstarCommand());
2982
+ program.addCommand(deleteCommand());
2940
2983
  program.addCommand(setupCommand());
2941
2984
  return program;
2942
2985
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayul/kordis",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "private": false,
5
5
  "description": "Command-line client for the Kordis registry — discover, install, and publish agentic-coding packages.",
6
6
  "license": "MIT",