@przeprogramowani/10x-cli 1.22.2 → 1.23.0

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
@@ -38,7 +38,7 @@ Once your release includes it, run from the intended project directory:
38
38
 
39
39
  This installs **both** `10x-cli-setup` and `10x-cli-guide`, each with its complete
40
40
  `SKILL.md` and `references/compatibility.md`, into `.github/skills/`. Use
41
- `--tool claude-code`, `cursor`, `codex`, `devin-desktop`, `gemini`, or `generic`
41
+ `--tool claude-code`, `cursor`, `codex`, `devin-desktop`, `gemini`, `kiro`, or `generic`
42
42
  when that is your intended tool. The target must be explicit; installation is
43
43
  project-only. There is no `--global`, automatic agent detection, `skills`/npx
44
44
  subprocess, authentication, or network access. The helper bytes come from the
@@ -175,7 +175,7 @@ remain visible. Full lesson downloads and other commands remain available below.
175
175
 
176
176
  | Flag | Description |
177
177
  |------|-------------|
178
- | `--tool <tool>` | AI coding tool: `claude-code`, `cursor`, `copilot`, `codex`, `devin-desktop`, `gemini`, `generic` |
178
+ | `--tool <tool>` | AI coding tool: `claude-code`, `cursor`, `copilot`, `codex`, `devin-desktop`, `gemini`, `kiro`, `generic` |
179
179
  | `--print` | Output artifact content to stdout instead of writing files |
180
180
  | `--type <type>` | Filter by artifact type: `skills`, `prompts`, `rules`, `configs` |
181
181
  | `--name <name>` | Filter by artifact name (requires `--type`) |
@@ -302,8 +302,9 @@ scoring live in the template and the instance.
302
302
  | Flag | Description |
303
303
  |------|-------------|
304
304
  | `--template-version <tag>` | Template tag to install (default: latest) |
305
- | `--tool <id>` | Agent tool for skill placement (`claude-code`, `cursor`, `copilot`, `codex`, `devin-desktop`, `gemini`, `generic`) |
305
+ | `--tool <id>` | Agent tool for skill placement (`claude-code`, `cursor`, `copilot`, `codex`, `devin-desktop`, `gemini`, `kiro`, `generic`) |
306
306
  | `--yes` | Run non-interactively, accepting defaults |
307
+ | `--deep` | Clone the detected base repo with full history (default: shallow, HEAD only) |
307
308
 
308
309
  ```bash
309
310
  # Create an instance next to your product repo (run inside it to auto-register)
@@ -312,10 +313,18 @@ scoring live in the template and the instance.
312
313
  # Pin the template version
313
314
  10x bench-kit init my-benchmark --template-version v0.8.0
314
315
 
316
+ # Keep the full history in the base repo clone under .repos/
317
+ 10x bench-kit init my-benchmark --deep
318
+
315
319
  # Upgrade an existing instance to the latest template
316
320
  10x bench-kit update
317
321
  ```
318
322
 
323
+ A detected base repo is cloned into the instance's `.repos/<name>/` (gitignored)
324
+ as a working copy for the authoring skills. That clone is **shallow** — HEAD only
325
+ — because the skills read the file tree, not the history; `--deep` keeps the full
326
+ history, and `git fetch --unshallow` inside the clone adds it later.
327
+
319
328
  Re-running `init` on an existing instance is a **repair**: missing template
320
329
  files are restored, company content is never touched. After `update`, run the
321
330
  instance's `bench validate` to confirm the content still matches the new kit.
@@ -346,6 +355,7 @@ On first run, the CLI prompts you to choose your AI coding tool. Artifacts are w
346
355
  | Codex CLI | `.agents/` | `AGENTS.md` |
347
356
  | Devin Desktop | `.devin/` | `AGENTS.md` |
348
357
  | Gemini CLI | `.gemini/` | `GEMINI.md` |
358
+ | Kiro | `.kiro/` | `AGENTS.md` |
349
359
  | Generic | `.ai/` | `AGENTS.md` |
350
360
 
351
361
  Override with `--tool <name>`. Validated writing commands save your choice in `~/.config/10x-cli/config.json`. Previews leave it unchanged.
package/dist/index.mjs CHANGED
@@ -3183,7 +3183,7 @@ var cac = (name = "") => new CAC(name);
3183
3183
  // package.json
3184
3184
  var package_default = {
3185
3185
  name: "@przeprogramowani/10x-cli",
3186
- version: "1.22.2",
3186
+ version: "1.23.0",
3187
3187
  description: "Open-source CLI for 10xDevs course content",
3188
3188
  repository: {
3189
3189
  type: "git",
@@ -4736,6 +4736,19 @@ var PROFILES = {
4736
4736
  sentinelBegin: SENTINEL_BEGIN,
4737
4737
  sentinelEnd: SENTINEL_END
4738
4738
  },
4739
+ kiro: {
4740
+ toolId: "kiro",
4741
+ contentToolId: "generic",
4742
+ displayName: "Kiro",
4743
+ skillPath: (n) => `.kiro/skills/${n}/SKILL.md`,
4744
+ skillDir: (n) => `.kiro/skills/${n}`,
4745
+ promptPath: (n) => `.kiro/prompts/${n}.md`,
4746
+ configPath: (n) => `.kiro/config-templates/${n}`,
4747
+ rulesFile: "AGENTS.md",
4748
+ manifestDir: ".kiro",
4749
+ sentinelBegin: SENTINEL_BEGIN,
4750
+ sentinelEnd: SENTINEL_END
4751
+ },
4739
4752
  generic: {
4740
4753
  toolId: "generic",
4741
4754
  displayName: "Other / Generic",
@@ -5181,6 +5194,27 @@ function detectTools(projectRoot) {
5181
5194
  } else if (hit(".gemini")) {
5182
5195
  signals.push({ profileId: "gemini", confidence: "medium", reason: ".gemini/ directory" });
5183
5196
  }
5197
+ if (hit(".kiro/" + MANIFEST_FILENAME)) {
5198
+ signals.push({
5199
+ profileId: "kiro",
5200
+ confidence: "strong",
5201
+ reason: ".kiro/.10x-cli-manifest.json"
5202
+ });
5203
+ } else if (hit(".kiro/steering") || hit(".kiro/specs")) {
5204
+ signals.push({
5205
+ profileId: "kiro",
5206
+ confidence: "strong",
5207
+ reason: ".kiro/steering/ or .kiro/specs/"
5208
+ });
5209
+ } else if (hit(".kiro/hooks") || hit(".kiro/settings")) {
5210
+ signals.push({
5211
+ profileId: "kiro",
5212
+ confidence: "strong",
5213
+ reason: ".kiro/hooks/ or .kiro/settings/"
5214
+ });
5215
+ } else if (hit(".kiro")) {
5216
+ signals.push({ profileId: "kiro", confidence: "strong", reason: ".kiro/ directory" });
5217
+ }
5184
5218
  if (hit(".ai/" + MANIFEST_FILENAME)) {
5185
5219
  signals.push({
5186
5220
  profileId: "generic",
@@ -5202,6 +5236,7 @@ var PROFILE_ORDER = [
5202
5236
  "codex",
5203
5237
  "devin-desktop",
5204
5238
  "gemini",
5239
+ "kiro",
5205
5240
  "generic"
5206
5241
  ];
5207
5242
  function rankSignals(signals) {
@@ -5224,7 +5259,7 @@ var TEMPLATE_REPO_URL = "https://github.com/przeprogramowani/10x-bench-kit";
5224
5259
  var BOOTSTRAP_ENTRY = join5(".bench-kit", "bootstrap", "index.mjs");
5225
5260
  var CONTRACT_VERSION = 1;
5226
5261
  function registerBenchKitCommand(cli) {
5227
- cli.command("bench-kit <action> [dir]", "Manage a benchmark instance (actions: init, update)").option("--template-version <tag>", "Template tag to install (default: latest)").option("--tool <id>", `Agent tool for skill placement (${Object.keys(PROFILES).join(", ")})`).option("--yes", "Run non-interactively, accepting defaults").example("10x bench-kit init my-benchmark").example("10x bench-kit init my-benchmark --template-version v0.1.0").example("10x bench-kit update").action(async (action, dir, options) => {
5262
+ cli.command("bench-kit <action> [dir]", "Manage a benchmark instance (actions: init, update)").option("--template-version <tag>", "Template tag to install (default: latest)").option("--tool <id>", `Agent tool for skill placement (${Object.keys(PROFILES).join(", ")})`).option("--yes", "Run non-interactively, accepting defaults").option("--deep", "Clone the detected base repo with full history (default: shallow, HEAD only)").example("10x bench-kit init my-benchmark").example("10x bench-kit init my-benchmark --template-version v0.1.0").example("10x bench-kit init my-benchmark --deep").example("10x bench-kit update").action(async (action, dir, options) => {
5228
5263
  const ctx = resolveContext(options);
5229
5264
  if (action === "init") {
5230
5265
  await runBenchKitInit(ctx, dir, options);
@@ -5274,6 +5309,7 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
5274
5309
  templateRef: requestedRef ?? "latest",
5275
5310
  templateSource: TEMPLATE_REPO_URL,
5276
5311
  detectedBaseRepo,
5312
+ ...options.deep === true ? { deepClone: true } : {},
5277
5313
  now: deps.now().toISOString()
5278
5314
  };
5279
5315
  verbose(ctx, `running template bootstrap (${BOOTSTRAP_ENTRY})`);
@@ -5284,7 +5320,8 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
5284
5320
  let baseRepoClone = "skipped";
5285
5321
  if (res.baseRepoClone != null) {
5286
5322
  const cloneDest = join5(targetDir, res.baseRepoClone.dest);
5287
- verbose(ctx, `cloning base repo into ${res.baseRepoClone.dest}`);
5323
+ const depth = res.baseRepoClone.depth ?? null;
5324
+ verbose(ctx, `cloning base repo into ${res.baseRepoClone.dest}${depth === null ? "" : ` (depth ${depth})`}`);
5288
5325
  const cloned = await deps.cloneBaseRepo(res.baseRepoClone, cloneDest);
5289
5326
  if (cloned.ok) {
5290
5327
  baseRepoClone = "cloned";
@@ -5310,9 +5347,9 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
5310
5347
  `Pinned the demo task to ${detectedBaseRepo.headCommit.slice(0, 12)} (current HEAD of the base repo).`
5311
5348
  ] : [],
5312
5349
  ...baseRepoClone === "cloned" && res.baseRepoClone != null ? [
5313
- `Cloned '${res.baseRepoClone.name}' into ${res.baseRepoClone.dest}/ — local working copy for the authoring skills (gitignored).`
5350
+ `Cloned '${res.baseRepoClone.name}' into ${res.baseRepoClone.dest}/ — ${(res.baseRepoClone.depth ?? null) === null ? "local working copy with full history" : "shallow local working copy (HEAD only; 'git fetch --unshallow' there when you need history)"} for the authoring skills (gitignored).`
5314
5351
  ] : baseRepoClone === "failed" && res.baseRepoClone != null ? [
5315
- `Base repo clone failed — run 'git clone ${res.baseRepoClone.url} ${res.baseRepoClone.dest}' yourself.`
5352
+ `Base repo clone failed — run 'git clone${(res.baseRepoClone.depth ?? null) === null ? "" : " --depth 1"} ${res.baseRepoClone.url} ${res.baseRepoClone.dest}' yourself.`
5316
5353
  ] : [],
5317
5354
  ...res.runnerDeps === "failed" ? ["Runner dependencies did not install — run 'npm ci --prefix .bench-kit/runner' yourself."] : res.runnerDeps === "installed" ? ["Runner dependencies installed (.bench-kit/runner/node_modules)."] : [],
5318
5355
  res.committed === true ? "Initialized a fresh git repository with an initial commit." : "Initialized a fresh git repository (initial commit skipped — commit the files yourself).",
@@ -5556,7 +5593,10 @@ var defaultDeps = {
5556
5593
  return { rootDir, name: basename(rootDir), url, headCommit };
5557
5594
  },
5558
5595
  async cloneBaseRepo(repo, destDir) {
5559
- const clone = await run("git", ["clone", "--quiet", repo.rootDir, destDir]);
5596
+ const depth = repo.depth ?? null;
5597
+ const source = depth === null ? repo.rootDir : `file://${resolve2(repo.rootDir)}`;
5598
+ const args = depth === null ? ["clone", "--quiet", source, destDir] : ["clone", "--quiet", "--depth", String(depth), "--no-tags", source, destDir];
5599
+ const clone = await run("git", args);
5560
5600
  if (!clone.ok)
5561
5601
  return { ok: false, error: clone.error };
5562
5602
  return run("git", ["-C", destDir, "remote", "set-url", "origin", repo.url]);
@@ -7122,7 +7162,7 @@ function resolveCourseRulesFlag(argv) {
7122
7162
  return;
7123
7163
  }
7124
7164
  function registerGetCommand(cli) {
7125
- cli.command("get <ref>", "Fetch and apply a lesson pack").option("--dry-run", "Show what would be written without touching the filesystem").option("--course <course>", "Select course ID or slug (default: project edition or API recommendation)").option("--tool <tool>", "AI coding tool (claude-code, cursor, copilot, codex, devin-desktop, gemini, generic)").option("--print", "Print artifact content to stdout instead of writing to files").option("--type <type>", "Artifact type filter: skills, prompts, rules, configs").option("--name <name>", "Artifact name filter (requires --type)").option("--lang <lang>", "Content language: en (default) or pl").option("--no-course-rules", "Skip applying the course rules block to your rules file (CLAUDE.md/AGENTS.md)").action(async (ref, options) => {
7165
+ cli.command("get <ref>", "Fetch and apply a lesson pack").option("--dry-run", "Show what would be written without touching the filesystem").option("--course <course>", "Select course ID or slug (default: project edition or API recommendation)").option("--tool <tool>", "AI coding tool (claude-code, cursor, copilot, codex, devin-desktop, gemini, kiro, generic)").option("--print", "Print artifact content to stdout instead of writing to files").option("--type <type>", "Artifact type filter: skills, prompts, rules, configs").option("--name <name>", "Artifact name filter (requires --type)").option("--lang <lang>", "Content language: en (default) or pl").option("--no-course-rules", "Skip applying the course rules block to your rules file (CLAUDE.md/AGENTS.md)").action(async (ref, options) => {
7126
7166
  const ctx = resolveContext(options);
7127
7167
  await runGet(ctx, ref, options);
7128
7168
  });
@@ -8763,7 +8803,7 @@ function isLessonFresh(root, manifest, id, profile, lang, courseRules) {
8763
8803
  // src/commands/sync.ts
8764
8804
  var SUPPORTED_LANGS = ["en", "pl"];
8765
8805
  function registerSyncCommand(cli) {
8766
- cli.command("sync", "Bulk-download and update lessons, reporting what changed upstream").option("--all", "Sync every unlocked lesson (default: only lessons you've already downloaded)").option("--dry-run", "Show what would change without writing").option("--force", "Ignore the cheap-skip digest and overwrite local edits with upstream").option("--module <module>", "Limit to one module (e.g. 'm2' or '2')").option("--course <course>", "Select course ID or slug (default: project edition or API recommendation)").option("--tool <tool>", "AI coding tool (claude-code, cursor, copilot, codex, devin-desktop, gemini, generic)").option("--lang <lang>", "Content language: en (default) or pl").option("--no-course-rules", "Skip applying the course rules block to your rules file (CLAUDE.md/AGENTS.md)").action(async (options) => {
8806
+ cli.command("sync", "Bulk-download and update lessons, reporting what changed upstream").option("--all", "Sync every unlocked lesson (default: only lessons you've already downloaded)").option("--dry-run", "Show what would change without writing").option("--force", "Ignore the cheap-skip digest and overwrite local edits with upstream").option("--module <module>", "Limit to one module (e.g. 'm2' or '2')").option("--course <course>", "Select course ID or slug (default: project edition or API recommendation)").option("--tool <tool>", "AI coding tool (claude-code, cursor, copilot, codex, devin-desktop, gemini, kiro, generic)").option("--lang <lang>", "Content language: en (default) or pl").option("--no-course-rules", "Skip applying the course rules block to your rules file (CLAUDE.md/AGENTS.md)").action(async (options) => {
8767
8807
  const ctx = resolveContext(options);
8768
8808
  await runSync(ctx, options);
8769
8809
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@przeprogramowani/10x-cli",
3
- "version": "1.22.2",
3
+ "version": "1.23.0",
4
4
  "description": "Open-source CLI for 10xDevs course content",
5
5
  "repository": {
6
6
  "type": "git",