@przeprogramowani/10x-cli 1.22.1 → 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 +13 -3
- package/dist/index.mjs +54 -10
- package/package.json +7 -3
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.
|
|
3186
|
+
version: "1.23.0",
|
|
3187
3187
|
description: "Open-source CLI for 10xDevs course content",
|
|
3188
3188
|
repository: {
|
|
3189
3189
|
type: "git",
|
|
@@ -3208,10 +3208,14 @@ var package_default = {
|
|
|
3208
3208
|
build: "bun build src/index.ts --outfile dist/index.mjs --target node",
|
|
3209
3209
|
"build:binary": "bun build --compile --minify src/index.ts --outfile dist/10x",
|
|
3210
3210
|
"generate-types": "bun run scripts/generate-types.ts",
|
|
3211
|
-
typecheck: "tsc --noEmit",
|
|
3211
|
+
typecheck: "node node_modules/typescript/bin/tsc --noEmit",
|
|
3212
3212
|
test: "bun test",
|
|
3213
3213
|
lint: "bun run --bun node_modules/oxlint/bin/oxlint .",
|
|
3214
|
-
"validate:cli-skills": "node scripts/validate-cli-skills.mjs"
|
|
3214
|
+
"validate:cli-skills": "node scripts/validate-cli-skills.mjs",
|
|
3215
|
+
"quality:fast": "node .quality/run.mjs fast",
|
|
3216
|
+
"quality:affected": "node .quality/run.mjs affected",
|
|
3217
|
+
"quality:gate": "node .quality/run.mjs gate",
|
|
3218
|
+
"quality:risk": "node .quality/run.mjs risk"
|
|
3215
3219
|
},
|
|
3216
3220
|
dependencies: {
|
|
3217
3221
|
"@clack/prompts": "0.9.1",
|
|
@@ -4732,6 +4736,19 @@ var PROFILES = {
|
|
|
4732
4736
|
sentinelBegin: SENTINEL_BEGIN,
|
|
4733
4737
|
sentinelEnd: SENTINEL_END
|
|
4734
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
|
+
},
|
|
4735
4752
|
generic: {
|
|
4736
4753
|
toolId: "generic",
|
|
4737
4754
|
displayName: "Other / Generic",
|
|
@@ -5177,6 +5194,27 @@ function detectTools(projectRoot) {
|
|
|
5177
5194
|
} else if (hit(".gemini")) {
|
|
5178
5195
|
signals.push({ profileId: "gemini", confidence: "medium", reason: ".gemini/ directory" });
|
|
5179
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
|
+
}
|
|
5180
5218
|
if (hit(".ai/" + MANIFEST_FILENAME)) {
|
|
5181
5219
|
signals.push({
|
|
5182
5220
|
profileId: "generic",
|
|
@@ -5198,6 +5236,7 @@ var PROFILE_ORDER = [
|
|
|
5198
5236
|
"codex",
|
|
5199
5237
|
"devin-desktop",
|
|
5200
5238
|
"gemini",
|
|
5239
|
+
"kiro",
|
|
5201
5240
|
"generic"
|
|
5202
5241
|
];
|
|
5203
5242
|
function rankSignals(signals) {
|
|
@@ -5220,7 +5259,7 @@ var TEMPLATE_REPO_URL = "https://github.com/przeprogramowani/10x-bench-kit";
|
|
|
5220
5259
|
var BOOTSTRAP_ENTRY = join5(".bench-kit", "bootstrap", "index.mjs");
|
|
5221
5260
|
var CONTRACT_VERSION = 1;
|
|
5222
5261
|
function registerBenchKitCommand(cli) {
|
|
5223
|
-
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) => {
|
|
5224
5263
|
const ctx = resolveContext(options);
|
|
5225
5264
|
if (action === "init") {
|
|
5226
5265
|
await runBenchKitInit(ctx, dir, options);
|
|
@@ -5270,6 +5309,7 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
|
|
|
5270
5309
|
templateRef: requestedRef ?? "latest",
|
|
5271
5310
|
templateSource: TEMPLATE_REPO_URL,
|
|
5272
5311
|
detectedBaseRepo,
|
|
5312
|
+
...options.deep === true ? { deepClone: true } : {},
|
|
5273
5313
|
now: deps.now().toISOString()
|
|
5274
5314
|
};
|
|
5275
5315
|
verbose(ctx, `running template bootstrap (${BOOTSTRAP_ENTRY})`);
|
|
@@ -5280,7 +5320,8 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
|
|
|
5280
5320
|
let baseRepoClone = "skipped";
|
|
5281
5321
|
if (res.baseRepoClone != null) {
|
|
5282
5322
|
const cloneDest = join5(targetDir, res.baseRepoClone.dest);
|
|
5283
|
-
|
|
5323
|
+
const depth = res.baseRepoClone.depth ?? null;
|
|
5324
|
+
verbose(ctx, `cloning base repo into ${res.baseRepoClone.dest}${depth === null ? "" : ` (depth ${depth})`}`);
|
|
5284
5325
|
const cloned = await deps.cloneBaseRepo(res.baseRepoClone, cloneDest);
|
|
5285
5326
|
if (cloned.ok) {
|
|
5286
5327
|
baseRepoClone = "cloned";
|
|
@@ -5306,9 +5347,9 @@ async function runBenchKitInit(ctx, dirArg, options, deps = defaultDeps) {
|
|
|
5306
5347
|
`Pinned the demo task to ${detectedBaseRepo.headCommit.slice(0, 12)} (current HEAD of the base repo).`
|
|
5307
5348
|
] : [],
|
|
5308
5349
|
...baseRepoClone === "cloned" && res.baseRepoClone != null ? [
|
|
5309
|
-
`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).`
|
|
5310
5351
|
] : baseRepoClone === "failed" && res.baseRepoClone != null ? [
|
|
5311
|
-
`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.`
|
|
5312
5353
|
] : [],
|
|
5313
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)."] : [],
|
|
5314
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).",
|
|
@@ -5552,7 +5593,10 @@ var defaultDeps = {
|
|
|
5552
5593
|
return { rootDir, name: basename(rootDir), url, headCommit };
|
|
5553
5594
|
},
|
|
5554
5595
|
async cloneBaseRepo(repo, destDir) {
|
|
5555
|
-
const
|
|
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);
|
|
5556
5600
|
if (!clone.ok)
|
|
5557
5601
|
return { ok: false, error: clone.error };
|
|
5558
5602
|
return run("git", ["-C", destDir, "remote", "set-url", "origin", repo.url]);
|
|
@@ -7118,7 +7162,7 @@ function resolveCourseRulesFlag(argv) {
|
|
|
7118
7162
|
return;
|
|
7119
7163
|
}
|
|
7120
7164
|
function registerGetCommand(cli) {
|
|
7121
|
-
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) => {
|
|
7122
7166
|
const ctx = resolveContext(options);
|
|
7123
7167
|
await runGet(ctx, ref, options);
|
|
7124
7168
|
});
|
|
@@ -8759,7 +8803,7 @@ function isLessonFresh(root, manifest, id, profile, lang, courseRules) {
|
|
|
8759
8803
|
// src/commands/sync.ts
|
|
8760
8804
|
var SUPPORTED_LANGS = ["en", "pl"];
|
|
8761
8805
|
function registerSyncCommand(cli) {
|
|
8762
|
-
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) => {
|
|
8763
8807
|
const ctx = resolveContext(options);
|
|
8764
8808
|
await runSync(ctx, options);
|
|
8765
8809
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@przeprogramowani/10x-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0",
|
|
4
4
|
"description": "Open-source CLI for 10xDevs course content",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,10 +25,14 @@
|
|
|
25
25
|
"build": "bun build src/index.ts --outfile dist/index.mjs --target node",
|
|
26
26
|
"build:binary": "bun build --compile --minify src/index.ts --outfile dist/10x",
|
|
27
27
|
"generate-types": "bun run scripts/generate-types.ts",
|
|
28
|
-
"typecheck": "tsc --noEmit",
|
|
28
|
+
"typecheck": "node node_modules/typescript/bin/tsc --noEmit",
|
|
29
29
|
"test": "bun test",
|
|
30
30
|
"lint": "bun run --bun node_modules/oxlint/bin/oxlint .",
|
|
31
|
-
"validate:cli-skills": "node scripts/validate-cli-skills.mjs"
|
|
31
|
+
"validate:cli-skills": "node scripts/validate-cli-skills.mjs",
|
|
32
|
+
"quality:fast": "node .quality/run.mjs fast",
|
|
33
|
+
"quality:affected": "node .quality/run.mjs affected",
|
|
34
|
+
"quality:gate": "node .quality/run.mjs gate",
|
|
35
|
+
"quality:risk": "node .quality/run.mjs risk"
|
|
32
36
|
},
|
|
33
37
|
"dependencies": {
|
|
34
38
|
"@clack/prompts": "0.9.1",
|