Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [v0.7.0] - 2026-07-08

### Changed

- **Agent slash commands shortened: `/speckeep.*` → `/spk.*`**:
- All agent file paths renamed (e.g. `.claude/commands/speckeep.inspect.md` → `.claude/commands/spk.inspect.md`)
- All adapter implementations updated (Claude, Codex, Copilot, Cursor, Kilocode, OpenCode, Roocode, Trae, Windsurf, Aider)
- All prompt templates (EN/RU) for every phase: constitution, spec, inspect, plan, tasks, implement, verify, handoff, hotfix, rollback
- CLI output: root help, `check`, `dashboard`, `demo`, `explore`, `init`, `status`, `archive`
- README (EN/RU) and CLI docs (EN/RU) updated
- `agents-snippet.md` simplified — removed the "⚠️ prefix is speckeep with a p" warning since `/spk` is unambiguous
- `LegacyPrefixPaths()` function in `agents/files.go` enables discovery of stale `speckeep.*` artifacts
- `doctor` warns about remaining old-prefix agent files
- `refresh` auto-removes old-prefix files and regenerates with `/spk.*` naming
- `CleanupAgents` also removes orphaned old-prefix artifacts

- **`speckeep init` now syncs skills manifest and `.gitignore`** — previously only `refresh` handled this; init was missing the skills setup step

- **Doctor: stronger deprecated command detection** — `/speckeep.*` detection now catches any remaining old-style references (was limited to `/speckeep.archive`)

### Fixed

- **Init: missing skills bootstrap** — `Initialize` now calls `syncSkillsManifest` and `syncSkillsGitignore`, matching `refresh` behavior

## [v0.6.0] - 2026-06-28

### Added
Expand Down Expand Up @@ -266,4 +290,5 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
[0.5.0]: https://github.com/bzdvdn/speckeep/releases/tag/v0.5.0
[0.5.1]: https://github.com/bzdvdn/speckeep/releases/tag/v0.5.1
[0.6.0]: https://github.com/bzdvdn/speckeep/releases/tag/v0.6.0
[unreleased]: https://github.com/bzdvdn/speckeep/compare/v0.6.0...HEAD
[0.7.0]: https://github.com/bzdvdn/speckeep/releases/tag/v0.7.0
[unreleased]: https://github.com/bzdvdn/speckeep/compare/v0.7.0...HEAD
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Results in practice: agents produce correct code on first try more often, handof
constitution → spec → [inspect] → plan → tasks → implement → verify → archive
```

Each phase loads only the minimum context. Optional workflow commands available at any phase: `/speckeep.challenge`, `/speckeep.handoff`, `/speckeep.hotfix`, `/speckeep.scope`, `/speckeep.recap`.
Each phase loads only the minimum context. Optional workflow commands available at any phase: `/spk.challenge`, `/spk.handoff`, `/spk.hotfix`, `/spk.scope`, `/spk.recap`.

---

Expand Down Expand Up @@ -137,7 +137,7 @@ speckeep init . --lang en --shell sh --agents claude

### 2. Spec

Call `/speckeep.spec --name "CSV export for reports"` in your agent.
Call `/spk.spec --name "CSV export for reports"` in your agent.

`specs/active/csv-export-for-reports/spec.md`:

Expand All @@ -160,15 +160,15 @@ Then a .csv with headers only downloads — no error shown

### 3. Inspect

Call `/speckeep.inspect csv-export-for-reports`. Produces `inspect.md` with verdict.
Call `/spk.inspect csv-export-for-reports`. Produces `inspect.md` with verdict.

### 4. Plan

Call `/speckeep.plan csv-export-for-reports`. Surfaces: `ReportsPage.tsx`, `useReportExport.ts`, `reports.test.ts`.
Call `/spk.plan csv-export-for-reports`. Surfaces: `ReportsPage.tsx`, `useReportExport.ts`, `reports.test.ts`.

### 5. Tasks

Call `/speckeep.tasks csv-export-for-reports`. Produces `tasks.md`:
Call `/spk.tasks csv-export-for-reports`. Produces `tasks.md`:

| Surface | Tasks |
|---|---|
Expand All @@ -179,8 +179,8 @@ Call `/speckeep.tasks csv-export-for-reports`. Produces `tasks.md`:
### 6. Implement, verify, archive

```
/speckeep.implement csv-export-for-reports
/speckeep.verify csv-export-for-reports # verdict: pass
/spk.implement csv-export-for-reports
/spk.verify csv-export-for-reports # verdict: pass
speckeep archive csv-export-for-reports .
```

Expand All @@ -190,7 +190,7 @@ speckeep archive csv-export-for-reports .
speckeep check csv-export-for-reports
# Phase: tasks → implement
# Tasks: 0 / 3 done
# Next: /speckeep.implement csv-export-for-reports
# Next: /spk.implement csv-export-for-reports
```

</details>
Expand Down
16 changes: 8 additions & 8 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ speckeep решает это через **discipline per token** — миним
constitution → spec → [inspect] → plan → tasks → implement → verify → archive
```

Каждая фаза загружает только минимум контекста. Опциональные команды на любой фазе: `/speckeep.challenge`, `/speckeep.handoff`, `/speckeep.hotfix`, `/speckeep.scope`, `/speckeep.recap`.
Каждая фаза загружает только минимум контекста. Опциональные команды на любой фазе: `/spk.challenge`, `/spk.handoff`, `/spk.hotfix`, `/spk.scope`, `/spk.recap`.

---

Expand Down Expand Up @@ -137,7 +137,7 @@ speckeep init . --lang ru --shell sh --agents claude

### 2. Spec

Вызовите `/speckeep.spec --name "Экспорт отчётов в CSV"` в агенте.
Вызовите `/spk.spec --name "Экспорт отчётов в CSV"` в агенте.

`specs/active/eksport-otchetov-v-csv/spec.md`:

Expand All @@ -160,15 +160,15 @@ Then скачивается .csv только с заголовками — бе

### 3. Inspect

Вызовите `/speckeep.inspect eksport-otchetov-v-csv`.
Вызовите `/spk.inspect eksport-otchetov-v-csv`.

### 4. Plan

Вызовите `/speckeep.plan eksport-otchetov-v-csv`. Surfaces: `ReportsPage.tsx`, `useReportExport.ts`, `reports.test.ts`.
Вызовите `/spk.plan eksport-otchetov-v-csv`. Surfaces: `ReportsPage.tsx`, `useReportExport.ts`, `reports.test.ts`.

### 5. Tasks

Вызовите `/speckeep.tasks eksport-otchetov-v-csv`. Результат:
Вызовите `/spk.tasks eksport-otchetov-v-csv`. Результат:

| Surface | Задачи |
|---|---|
Expand All @@ -179,8 +179,8 @@ Then скачивается .csv только с заголовками — бе
### 6. Implement, verify, archive

```
/speckeep.implement eksport-otchetov-v-csv
/speckeep.verify eksport-otchetov-v-csv # вердикт: pass
/spk.implement eksport-otchetov-v-csv
/spk.verify eksport-otchetov-v-csv # вердикт: pass
speckeep archive eksport-otchetov-v-csv .
```

Expand All @@ -190,7 +190,7 @@ speckeep archive eksport-otchetov-v-csv .
speckeep check eksport-otchetov-v-csv
# Фаза: tasks → implement
# Задачи: 0 / 3 выполнено
# Далее: /speckeep.implement eksport-otchetov-v-csv
# Далее: /spk.implement eksport-otchetov-v-csv
```

</details>
Expand Down
99 changes: 0 additions & 99 deletions change-spec-archive-roadmap.md

This file was deleted.

Binary file modified demo/speckeep-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions docs/en/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Refreshes only SpecKeep-managed generated artifacts in an existing project.

This command updates:

- `.speckeep/speckeep.yaml`
- `.speckeep/spk.yaml`
- `.speckeep/skills/manifest.yaml`
- `.speckeep/templates/**`
- `.speckeep/scripts/**`
Expand Down Expand Up @@ -103,7 +103,7 @@ speckeep add-agent my-project --agents claude --agents codex

### `speckeep list-agents [path]`

Lists enabled agent targets from `.speckeep/speckeep.yaml`.
Lists enabled agent targets from `.speckeep/spk.yaml`.

### `speckeep remove-agent [path]`

Expand Down Expand Up @@ -146,7 +146,7 @@ Use `--no-install` to skip immediate reconciliation of installed skills in agent

Installs enabled skills from `.speckeep/skills/manifest.yaml` into target agent skill folders.

By default, uses enabled targets from `.speckeep/speckeep.yaml`. Override with `--targets codex,opencode`.
By default, uses enabled targets from `.speckeep/spk.yaml`. Override with `--targets codex,opencode`.

For git-backed skills, this command can rehydrate missing `.speckeep/skills/checkouts/<id>` from manifest data (`location` + `ref`) before installation. This helps when a checkout was deleted locally. If the upstream git source is unavailable, the manifest alone is not enough to reconstruct the skill contents.

Expand Down Expand Up @@ -336,7 +336,7 @@ speckeep trace export-report my-project --json

Creates a demo workspace at the given path (default: `./speckeep-demo`).

The workspace is pre-populated with an example feature (`export-report`) at the implement phase — spec, inspect report, plan, tasks, and data model are all present. Suggests `/speckeep.scope`, `/speckeep.challenge`, and `/speckeep.handoff` to try immediately.
The workspace is pre-populated with an example feature (`export-report`) at the implement phase — spec, inspect report, plan, tasks, and data model are all present. Suggests `/spk.scope`, `/spk.challenge`, and `/spk.handoff` to try immediately.

```bash
speckeep demo
Expand Down
8 changes: 4 additions & 4 deletions docs/ru/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ speckeep init my-project --docs-lang ru --agent-lang en --comments-lang en --she

Эта команда обновляет:

- `.speckeep/speckeep.yaml`
- `.speckeep/spk.yaml`
- `.speckeep/skills/manifest.yaml`
- `.speckeep/templates/**`
- `.speckeep/scripts/**`
Expand Down Expand Up @@ -103,7 +103,7 @@ speckeep add-agent my-project --agents claude --agents codex

### `speckeep list-agents [path]`

Показывает включенные agent targets из `.speckeep/speckeep.yaml`.
Показывает включенные agent targets из `.speckeep/spk.yaml`.

### `speckeep remove-agent [path]`

Expand Down Expand Up @@ -146,7 +146,7 @@ speckeep add-skill my-project --id openai-docs --from-git https://example.com/sk

Устанавливает включенные skills из `.speckeep/skills/manifest.yaml` в skill-папки выбранных агентов.

По умолчанию используются targets из `.speckeep/speckeep.yaml`. Можно переопределить через `--targets codex,opencode`.
По умолчанию используются targets из `.speckeep/spk.yaml`. Можно переопределить через `--targets codex,opencode`.

Для git-backed skills команда умеет rehydrate отсутствующие `.speckeep/skills/checkouts/<id>` из данных manifest (`location` + `ref`) перед установкой. Это помогает, если checkout был удален локально. Если исходный git source недоступен, одного manifest недостаточно для восстановления содержимого.

Expand Down Expand Up @@ -336,7 +336,7 @@ speckeep trace export-report my-project --json

Создаёт демо-workspace по указанному пути (по умолчанию: `./speckeep-demo`).

Workspace заполнен примером фичи (`export-report`) на фазе implement — spec, inspect report, plan, tasks и data model уже присутствуют. После создания предлагает попробовать `/speckeep.scope`, `/speckeep.challenge` и `/speckeep.handoff`.
Workspace заполнен примером фичи (`export-report`) на фазе implement — spec, inspect report, plan, tasks и data model уже присутствуют. После создания предлагает попробовать `/spk.scope`, `/spk.challenge` и `/spk.handoff`.

```bash
speckeep demo
Expand Down
4 changes: 2 additions & 2 deletions src/internal/agents/adapter_aider.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func renderAiderCommands(commands []CommandDefinition, language string) string {
sections = append(sections, "")
sections = append(sections, "Команды:")
for _, cmd := range commands {
sections = append(sections, fmt.Sprintf("- `/speckeep.%s` → %s", cmd.Name, cmd.PromptPath))
sections = append(sections, fmt.Sprintf("- `/spk.%s` → %s", cmd.Name, cmd.PromptPath))
}
sections = append(sections, "- `speckeep archive <slug> .` → CLI-only archive after verify")
sections = append(sections, "")
Expand All @@ -62,7 +62,7 @@ func renderAiderCommands(commands []CommandDefinition, language string) string {
sections = append(sections, "")
sections = append(sections, "Commands:")
for _, cmd := range commands {
sections = append(sections, fmt.Sprintf("- `/speckeep.%s` → %s", cmd.Name, cmd.PromptPath))
sections = append(sections, fmt.Sprintf("- `/spk.%s` → %s", cmd.Name, cmd.PromptPath))
}
sections = append(sections, "- `speckeep archive <slug> .` → CLI-only archive after verify")
sections = append(sections, "")
Expand Down
2 changes: 1 addition & 1 deletion src/internal/agents/adapter_claude.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func (claudeAdapter) Render(commands []CommandDefinition, language string) ([]Fi
files := make([]File, 0, len(commands))
for _, command := range commands {
files = append(files, File{
Path: filepath.ToSlash(filepath.Join(".claude", "commands", fmt.Sprintf("speckeep.%s.md", command.Name))),
Path: filepath.ToSlash(filepath.Join(".claude", "commands", fmt.Sprintf("spk.%s.md", command.Name))),
Content: renderClaude(command, lang),
Mode: 0o644,
})
Expand Down
2 changes: 1 addition & 1 deletion src/internal/agents/adapter_codex.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func (codexAdapter) Render(commands []CommandDefinition, language string) ([]Fil
files := make([]File, 0, len(commands))
for _, command := range commands {
files = append(files, File{
Path: filepath.ToSlash(filepath.Join(".codex", "prompts", fmt.Sprintf("speckeep.%s.md", command.Name))),
Path: filepath.ToSlash(filepath.Join(".codex", "prompts", fmt.Sprintf("spk.%s.md", command.Name))),
Content: renderCodex(command, lang),
Mode: 0o644,
})
Expand Down
2 changes: 1 addition & 1 deletion src/internal/agents/adapter_copilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func (copilotAdapter) Render(commands []CommandDefinition, language string) ([]F
files := make([]File, 0, len(commands))
for _, command := range commands {
files = append(files, File{
Path: filepath.ToSlash(filepath.Join(".github", "prompts", fmt.Sprintf("speckeep-%s.prompt.md", command.Name))),
Path: filepath.ToSlash(filepath.Join(".github", "prompts", fmt.Sprintf("spk-%s.prompt.md", command.Name))),
Content: renderCopilot(command, lang),
Mode: 0o644,
})
Expand Down
Loading
Loading