@rayul/kordis 0.6.3 → 0.6.5

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.
@@ -18,6 +18,13 @@ Publish a valid, AI-review-passing version. ALWAYS dry-run first.
18
18
  - `license` — SPDX (e.g. `MIT`, `Apache-2.0`, `CC-BY-4.0`).
19
19
  - Optional: `homepage`, `tags`, `type`.
20
20
 
21
+ **`type` auto-inference (0.6.4+):** The CLI infers `type: skill` when
22
+ you push a directory bundle, a `.skill` ZIP, OR a single file named
23
+ `SKILL.md` or `*.skill.md`. You don't need to write `type:` in the
24
+ frontmatter for any of these paths. Use `--type <t>` (or write the
25
+ field manually) only when pushing a different package type from a
26
+ single `.md` file that doesn't match the SKILL.md filename pattern.
27
+
21
28
  **`version` field handling:**
22
29
  - **First publish** — used as-is (else defaults to `0.1.0`).
23
30
  - **Update** — the registry computes the next version from
@@ -21,6 +21,7 @@ Keyword search; `--json` for parsing.
21
21
  | `--type <t>` | `skill`, `mcp-server`, `project-rules`, `custom-agent`, `hook` |
22
22
  | `--tool <s>` | filter by compatible tool (`claude-code`, `codex`, `cursor`, …) |
23
23
  | `--tier <t>` | filter by portability tier `A`/`B`/`C`/`D` |
24
+ | `--author <u>` | restrict to a single author. **When set, response includes exact `total`** (other filters return `total: null`). 0.6.4+. |
24
25
  | `--sort <m>` | `relevance` (default), `stars`, `downloads`, `recent`, `updated` |
25
26
  | `--trending` | list packages trending in `--window` (overrides `--sort`) |
26
27
  | `--rising` | list rising packages by 7d acceleration (overrides `--sort`) |
@@ -112,3 +113,11 @@ User: "show me the most-downloaded skills"
112
113
  - kordis search --type skill --sort downloads --json
113
114
  - list top results
114
115
  </example>
116
+
117
+ <example>
118
+ User: "how many packages has alice published?" / "alice가 publish한거 다 보여줘"
119
+ - kordis search --author alice --json
120
+ - the response carries an exact `total` field (other filters report
121
+ `total: null`); render "Showing N of M matches"
122
+ - do NOT post-process with jq for author filtering — use the flag
123
+ </example>
package/dist/index.js CHANGED
@@ -224,13 +224,13 @@ var init_user = __esm({
224
224
  bio: z5.string().max(500).nullable(),
225
225
  avatar_url: UrlSchema.nullable(),
226
226
  is_verified: z5.boolean(),
227
- package_count: z5.number().int().nonnegative(),
228
227
  follower_count: z5.number().int().nonnegative(),
229
228
  created_at: IsoDateTimeSchema
230
229
  });
231
230
  SelfUserSchema = PublicUserSchema.extend({
232
231
  primary_provider: OAuthProviderSchema,
233
232
  role: UserRoleSchema,
233
+ package_count: z5.number().int().nonnegative(),
234
234
  following_count: z5.number().int().nonnegative(),
235
235
  last_active_at: IsoDateTimeSchema.nullable()
236
236
  });
@@ -386,7 +386,15 @@ var init_comment = __esm({
386
386
  is_edited: z7.boolean(),
387
387
  edited_at: IsoDateTimeSchema.nullable(),
388
388
  is_deleted: z7.boolean(),
389
- created_at: IsoDateTimeSchema
389
+ created_at: IsoDateTimeSchema,
390
+ /**
391
+ * Web permalink (`https://kordis.store/p/<full_slug>#comment-<id>`). Server
392
+ * populates whenever it has the package slug at serialization time —
393
+ * always on create + list paths; absent on update/status paths that don't
394
+ * carry the slug. Old API responses (pre-0.6.4) omit it; new clients use
395
+ * it directly when present (e.g., "✓ comment posted — view: <permalink>").
396
+ */
397
+ permalink: z7.string().url().optional()
390
398
  });
391
399
  CommentTreeSchema = CommentSchema.extend({
392
400
  replies: z7.lazy(() => z7.array(CommentTreeSchema))
@@ -1887,7 +1895,7 @@ var SORT_MODES = [
1887
1895
  ];
1888
1896
  var TIME_WINDOWS = ["24h", "7d", "30d"];
1889
1897
  function searchCommand() {
1890
- return new Command3("search").description("search the Kordis registry").argument("[query...]", "keywords to match against title/description").option("--type <type>", "filter by harness type (skill|mcp-server|project-rules|custom-agent|hook)").option("--tool <tool>", "filter by compatible tool (claude-code|codex|cursor|...)").option("--tier <tier>", "filter by portability tier (A|B|C|D)").option("--sort <mode>", `sort: ${SORT_MODES.join("|")}`).option("--trending", "list trending packages (overrides --sort)", false).option("--rising", "list rising packages by 7d acceleration (overrides --sort)", false).option("--window <w>", `time window for --trending: ${TIME_WINDOWS.join("|")}`, "24h").option("--limit <n>", "max results", (v) => parseInt(v, 10), 20).action(async (query, opts) => {
1898
+ return new Command3("search").description("search the Kordis registry").argument("[query...]", "keywords to match against title/description").option("--type <type>", "filter by harness type (skill|mcp-server|project-rules|custom-agent|hook)").option("--tool <tool>", "filter by compatible tool (claude-code|codex|cursor|...)").option("--tier <tier>", "filter by portability tier (A|B|C|D)").option("--author <username>", "filter to a single author (server returns exact total when set)").option("--sort <mode>", `sort: ${SORT_MODES.join("|")}`).option("--trending", "list trending packages (overrides --sort)", false).option("--rising", "list rising packages by 7d acceleration (overrides --sort)", false).option("--window <w>", `time window for --trending: ${TIME_WINDOWS.join("|")}`, "24h").option("--limit <n>", "max results", (v) => parseInt(v, 10), 20).action(async (query, opts) => {
1891
1899
  if (opts.sort && !SORT_MODES.includes(opts.sort)) {
1892
1900
  throw new Error(`--sort must be one of ${SORT_MODES.join(", ")}`);
1893
1901
  }
@@ -1913,6 +1921,7 @@ function searchCommand() {
1913
1921
  type: opts.type ? [opts.type] : void 0,
1914
1922
  tool: opts.tool ? [opts.tool] : void 0,
1915
1923
  tier: opts.tier,
1924
+ ...opts.author ? { author: opts.author } : {},
1916
1925
  sort: opts.sort ?? "relevance",
1917
1926
  limit: opts.limit
1918
1927
  });
@@ -1944,6 +1953,14 @@ function searchCommand() {
1944
1953
  }
1945
1954
  return;
1946
1955
  }
1956
+ if (typeof res.total === "number") {
1957
+ printHuman(
1958
+ c.gray(
1959
+ `Showing ${res.results.length} of ${res.total} match${res.total === 1 ? "" : "es"}`
1960
+ )
1961
+ );
1962
+ printHuman("");
1963
+ }
1947
1964
  for (const p of res.results) {
1948
1965
  printHuman(
1949
1966
  `${c.bold(p.full_slug)} ${c.gray(`v${p.current_version}`)} ${c.cyan(`[${p.type}]`)}`
@@ -2557,6 +2574,10 @@ function pushCommand() {
2557
2574
  content = ensureTypeField(content, "skill");
2558
2575
  } else {
2559
2576
  content = await readFile6(abs, "utf8");
2577
+ const isSkillFilename = abs.endsWith("/SKILL.md") || abs.endsWith(".skill.md");
2578
+ if (isSkillFilename) {
2579
+ content = ensureTypeField(content, "skill");
2580
+ }
2560
2581
  }
2561
2582
  let nameFromFm = null;
2562
2583
  try {
@@ -3814,6 +3835,9 @@ function commentCommand() {
3814
3835
  const meta = [`kind: ${res.kind}`];
3815
3836
  if (res.title) meta.push(`title: "${res.title}"`);
3816
3837
  printHuman(` ${meta.join(" \xB7 ")}`);
3838
+ if (res.permalink) {
3839
+ printHuman(c.gray(` view: ${res.permalink}`));
3840
+ }
3817
3841
  }
3818
3842
  });
3819
3843
  }
@@ -4330,11 +4354,24 @@ function recommendCommand() {
4330
4354
  human: () => {
4331
4355
  if (res.items.length === 0) {
4332
4356
  printHuman(c.yellow("(no recommendations available right now)"));
4333
- printHuman(
4334
- c.gray(
4335
- " \u2192 registry may be sparse; try `kordis search --trending` for broader discovery"
4336
- )
4337
- );
4357
+ if (!res.personalized) {
4358
+ printHuman(
4359
+ c.gray(
4360
+ " \u2192 personalization is OFF, so the server ranks on popularity alone \u2014 likely empty pool."
4361
+ )
4362
+ );
4363
+ printHuman(
4364
+ c.gray(
4365
+ " \u2192 enable for stack-aware matches: `kordis setup --personalization on` (no Y/n prompt \u2014 agent-friendly; confirm with the user first)"
4366
+ )
4367
+ );
4368
+ } else {
4369
+ printHuman(
4370
+ c.gray(
4371
+ " \u2192 personalization is ON but no matches for your stack \u2014 registry may be sparse for this profile. Try `kordis search <topic>` or `kordis search --trending`."
4372
+ )
4373
+ );
4374
+ }
4338
4375
  return;
4339
4376
  }
4340
4377
  printHuman(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayul/kordis",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
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",