Skip to content

Commit 3e93a87

Browse files
committed
Merge upstream/main
2 parents 514001b + ec60c5b commit 3e93a87

13 files changed

Lines changed: 523 additions & 19 deletions

.devcontainer/post-create.sh

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ run_command() {
88
local command_to_run="$*"
99
local output
1010
local exit_code
11-
11+
1212
# Capture all output (stdout and stderr)
1313
output=$(eval "$command_to_run" 2>&1) || exit_code=$?
1414
exit_code=${exit_code:-0}
15-
15+
1616
if [ $exit_code -ne 0 ]; then
1717
echo -e "\033[0;31m[ERROR] Command failed (Exit Code $exit_code): $command_to_run\033[0m" >&2
1818
echo -e "\033[0;31m$output\033[0m" >&2
19-
19+
2020
exit $exit_code
2121
fi
2222
}
@@ -53,7 +53,7 @@ echo "✅ Done"
5353

5454
echo -e "\n🤖 Installing Kiro CLI..."
5555
# https://kiro.dev/docs/cli/
56-
KIRO_INSTALLER_URL="https://cli.kiro.dev/install"
56+
KIRO_INSTALLER_URL="https://kiro.dev/install.sh"
5757
KIRO_INSTALLER_SHA256="7487a65cf310b7fb59b357c4b5e6e3f3259d383f4394ecedb39acf70f307cffb"
5858
KIRO_INSTALLER_PATH="$(mktemp)"
5959

@@ -80,6 +80,11 @@ fi
8080
run_command "$kiro_binary --help > /dev/null"
8181
echo "✅ Done"
8282

83+
echo -e "\n🤖 Installing Kimi CLI..."
84+
# https://code.kimi.com
85+
run_command "pipx install kimi-cli"
86+
echo "✅ Done"
87+
8388
echo -e "\n🤖 Installing CodeBuddy CLI..."
8489
run_command "npm install -g @tencent-ai/codebuddy-code@latest"
8590
echo "✅ Done"

AGENTS.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Specify supports multiple AI agents by generating agent-specific command files a
5656
| **Amp** | `.agents/commands/` | Markdown | `amp` | Amp CLI |
5757
| **SHAI** | `.shai/commands/` | Markdown | `shai` | SHAI CLI |
5858
| **Tabnine CLI** | `.tabnine/agent/commands/` | TOML | `tabnine` | Tabnine CLI |
59+
| **Kimi Code** | `.kimi/skills/` | Markdown | `kimi` | Kimi Code CLI (Moonshot AI) |
5960
| **IBM Bob** | `.bob/commands/` | Markdown | N/A (IDE-based) | IBM Bob IDE |
6061
| **Generic** | User-specified via `--ai-commands-dir` | Markdown | N/A | Bring your own agent |
6162

@@ -332,6 +333,7 @@ Require a command-line tool to be installed:
332333
- **Amp**: `amp` CLI
333334
- **SHAI**: `shai` CLI
334335
- **Tabnine CLI**: `tabnine` CLI
336+
- **Kimi Code**: `kimi` CLI
335337

336338
### IDE-Based Agents
337339

@@ -345,7 +347,7 @@ Work within integrated development environments:
345347

346348
### Markdown Format
347349

348-
Used by: Claude, Cursor, opencode, Windsurf, Kiro CLI, Amp, SHAI, IBM Bob
350+
Used by: Claude, Cursor, opencode, Windsurf, Kiro CLI, Amp, SHAI, IBM Bob, Kimi Code
349351

350352
**Standard format:**
351353

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,7 @@ See Spec-Driven Development in action across different scenarios with these comm
444444
| [SHAI (OVHcloud)](https://github.com/ovh/shai) || |
445445
| [Tabnine CLI](https://docs.tabnine.com/main/getting-started/tabnine-cli) || |
446446
| [Mistral Vibe](https://github.com/mistralai/mistral-vibe) || |
447+
| [Kimi Code](https://code.kimi.com/) || |
447448
| [Windsurf](https://windsurf.com/) || |
448449
| [Antigravity (agy)](https://antigravity.google/) || |
449450
| Generic || Bring your own agent — use `--ai generic --ai-commands-dir <path>` for unsupported agents |
@@ -618,14 +619,14 @@ The Skills Package Manager is accessed via the `specify skill` subcommand:
618619
| Command | Description |
619620
| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
620621
| `init` | Initialize a new Specify project from the latest template |
621-
| `check` | Check for installed tools (`git`, `claude`, `gemini`, `code`/`code-insiders`, `cursor-agent`, `windsurf`, `qwen`, `opencode`, `codex`, `kiro-cli`, `shai`, `qodercli`, `vibe`) |
622+
| `check` | Check for installed tools (`git`, `claude`, `gemini`, `code`/`code-insiders`, `cursor-agent`, `windsurf`, `qwen`, `opencode`, `codex`, `kiro-cli`, `shai`, `qodercli`, `vibe`, `kimi`) |
622623

623624
### `specify init` Arguments & Options
624625

625626
| Argument/Option | Type | Description |
626627
| ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
627628
| `<project-name>` | Argument | Name for your new project directory (optional if using `--here`, or use `.` for current directory) |
628-
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, or `generic` (requires `--ai-commands-dir`) |
629+
| `--ai` | Option | AI assistant to use: `claude`, `gemini`, `copilot`, `cursor-agent`, `qwen`, `opencode`, `codex`, `windsurf`, `kilocode`, `auggie`, `roo`, `codebuddy`, `amp`, `shai`, `kiro-cli` (`kiro` alias), `agy`, `bob`, `qodercli`, `vibe`, `kimi`, or `generic` (requires `--ai-commands-dir`) |
629630
| `--ai-commands-dir` | Option | Directory for agent command files (required with `--ai generic`, e.g. `.myagent/commands/`) |
630631
| `--script` | Option | Script variant to use: `sh` (bash/zsh) or `ps` (PowerShell) |
631632
| `--ignore-agent-tools` | Flag | Skip checks for AI agent tools like Claude Code |

docs/quickstart.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,6 @@ Finally, implement the solution:
287287
288288
## Next Steps
289289
290-
- Read the [complete methodology](../spec-driven.md) for in-depth guidance
291-
- Check out [more examples](../templates) in the repository
290+
- Read the [complete methodology](https://github.com/github/spec-kit/blob/main/spec-driven.md) for in-depth guidance
291+
- Check out [more examples](https://github.com/github/spec-kit/tree/main/templates) in the repository
292292
- Explore the [source code on GitHub](https://github.com/github/spec-kit)

extensions/EXTENSION-DEVELOPMENT-GUIDE.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,67 @@ echo "$config"
332332

333333
---
334334

335+
## Excluding Files with `.extensionignore`
336+
337+
Extension authors can create a `.extensionignore` file in the extension root to exclude files and folders from being copied when a user installs the extension with `specify extension add`. This is useful for keeping development-only files (tests, CI configs, docs source, etc.) out of the installed copy.
338+
339+
### Format
340+
341+
The file uses `.gitignore`-compatible patterns (one per line), powered by the [`pathspec`](https://pypi.org/project/pathspec/) library:
342+
343+
- Blank lines are ignored
344+
- Lines starting with `#` are comments
345+
- `*` matches anything **except** `/` (does not cross directory boundaries)
346+
- `**` matches zero or more directories (e.g., `docs/**/*.draft.md`)
347+
- `?` matches any single character except `/`
348+
- A trailing `/` restricts a pattern to directories only
349+
- Patterns containing `/` (other than a trailing slash) are anchored to the extension root
350+
- Patterns without `/` match at any depth in the tree
351+
- `!` negates a previously excluded pattern (re-includes a file)
352+
- Backslashes in patterns are normalised to forward slashes for cross-platform compatibility
353+
- The `.extensionignore` file itself is always excluded automatically
354+
355+
### Example
356+
357+
```gitignore
358+
# .extensionignore
359+
360+
# Development files
361+
tests/
362+
.github/
363+
.gitignore
364+
365+
# Build artifacts
366+
__pycache__/
367+
*.pyc
368+
dist/
369+
370+
# Documentation source (keep only the built README)
371+
docs/
372+
CONTRIBUTING.md
373+
```
374+
375+
### Pattern Matching
376+
377+
| Pattern | Matches | Does NOT match |
378+
|---------|---------|----------------|
379+
| `*.pyc` | Any `.pyc` file in any directory | — |
380+
| `tests/` | The `tests` directory (and all its contents) | A file named `tests` |
381+
| `docs/*.draft.md` | `docs/api.draft.md` (directly inside `docs/`) | `docs/sub/api.draft.md` (nested) |
382+
| `.env` | The `.env` file at any level | — |
383+
| `!README.md` | Re-includes `README.md` even if matched by an earlier pattern | — |
384+
| `docs/**/*.draft.md` | `docs/api.draft.md`, `docs/sub/api.draft.md` | — |
385+
386+
### Unsupported Features
387+
388+
The following `.gitignore` features are **not applicable** in this context:
389+
390+
- **Multiple `.extensionignore` files**: Only a single file at the extension root is supported (`.gitignore` supports files in subdirectories)
391+
- **`$GIT_DIR/info/exclude` and `core.excludesFile`**: These are Git-specific and have no equivalent here
392+
- **Negation inside excluded directories**: Because file copying uses `shutil.copytree`, excluding a directory prevents recursion into it entirely. A negation pattern cannot re-include a file inside a directory that was itself excluded. For example, the combination `tests/` followed by `!tests/important.py` will **not** preserve `tests/important.py` — the `tests/` directory is skipped at the root level and its contents are never evaluated. To work around this, exclude the directory's contents individually instead of the directory itself (e.g., `tests/*.pyc` and `tests/.cache/` rather than `tests/`).
393+
394+
---
395+
335396
## Validation Rules
336397

337398
### Extension ID

extensions/EXTENSION-USER-GUIDE.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,26 @@ Spec Kit uses a **catalog stack** — an ordered list of catalogs searched simul
432432
specify extension catalog list
433433
```
434434

435+
### Managing Catalogs via CLI
436+
437+
You can view the main catalog management commands using `--help`:
438+
439+
```text
440+
specify extension catalog --help
441+
442+
Usage: specify extension catalog [OPTIONS] COMMAND [ARGS]...
443+
444+
Manage extension catalogs
445+
╭─ Options ────────────────────────────────────────────────────────────────────────╮
446+
│ --help Show this message and exit. │
447+
╰──────────────────────────────────────────────────────────────────────────────────╯
448+
╭─ Commands ───────────────────────────────────────────────────────────────────────╮
449+
│ list List all active extension catalogs. │
450+
│ add Add a catalog to .specify/extension-catalogs.yml. │
451+
│ remove Remove a catalog from .specify/extension-catalogs.yml. │
452+
╰──────────────────────────────────────────────────────────────────────────────────╯
453+
```
454+
435455
### Adding a Catalog (Project-scoped)
436456

437457
```bash

0 commit comments

Comments
 (0)