Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa56dbd8b0 | ||
|
|
793e5176ef | ||
|
|
29eb082e2a | ||
|
|
7176d2dea3 | ||
|
|
6cade67360 | ||
|
|
c106281eff | ||
|
|
74ccf93512 | ||
|
|
decccc4e95 | ||
|
|
23c6bf1b71 | ||
|
|
36fbb85c65 | ||
|
|
f077e90a24 | ||
|
|
f88f6c8c05 | ||
|
|
fd517699a4 | ||
|
|
b4833cb7ea | ||
|
|
2fc7ebeebe | ||
|
|
b4b31f167c | ||
|
|
f3fb55d183 | ||
|
|
54c7f9c19b | ||
|
|
81fea96e42 | ||
|
|
b5b02b3961 | ||
|
|
c3ff114c5f | ||
|
|
5ee736b677 | ||
|
|
704e272a00 | ||
|
|
f755bcfb43 | ||
|
|
c96f6e1a1b | ||
|
|
dc6556d102 | ||
|
|
084d111d68 | ||
|
|
f20105daab | ||
|
|
56120b2ff0 | ||
|
|
a378163c3c | ||
|
|
855be88df1 | ||
|
|
26da1c13b8 | ||
|
|
6710a2a595 |
21
.github/workflows/release.yml
vendored
21
.github/workflows/release.yml
vendored
@@ -11,12 +11,14 @@ jobs:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Get latest tag
|
||||
id: get_tag
|
||||
@@ -204,7 +206,7 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Update version in pyproject.toml
|
||||
- name: Update version in pyproject.toml (for release artifacts only)
|
||||
if: steps.check_release.outputs.exists == 'false'
|
||||
run: |
|
||||
# Update version in pyproject.toml (remove 'v' prefix for Python versioning)
|
||||
@@ -213,19 +215,8 @@ jobs:
|
||||
|
||||
if [ -f "pyproject.toml" ]; then
|
||||
sed -i "s/version = \".*\"/version = \"$PYTHON_VERSION\"/" pyproject.toml
|
||||
echo "Updated pyproject.toml version to $PYTHON_VERSION"
|
||||
echo "Updated pyproject.toml version to $PYTHON_VERSION (for release artifacts only)"
|
||||
fi
|
||||
|
||||
- name: Commit version update
|
||||
if: steps.check_release.outputs.exists == 'false'
|
||||
run: |
|
||||
git config --local user.email "action@github.com"
|
||||
git config --local user.name "GitHub Action"
|
||||
|
||||
if git diff --quiet; then
|
||||
echo "No changes to commit"
|
||||
else
|
||||
git add pyproject.toml
|
||||
git commit -m "chore: bump version to ${{ steps.get_tag.outputs.new_version }}"
|
||||
git push
|
||||
fi
|
||||
# Note: No longer committing version changes back to main branch
|
||||
# The version is only updated in the release artifacts
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 GitHub
|
||||
Copyright GitHub, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
19
README.md
19
README.md
@@ -8,6 +8,8 @@
|
||||
<strong>An effort to allow organizations to focus on product scenarios rather than writing undifferentiated code with the help of Spec-Driven Development.</strong>
|
||||
</p>
|
||||
|
||||
[](https://github.com/github/spec-kit/actions/workflows/release.yml)
|
||||
|
||||
---
|
||||
|
||||
## Table of Contents
|
||||
@@ -205,14 +207,13 @@ At this stage, your project folder contents should resemble the following:
|
||||
│ ├── setup-plan.sh
|
||||
│ └── update-claude-md.sh
|
||||
├── specs
|
||||
│ └── 002-create-taskify
|
||||
│ └── 001-create-taskify
|
||||
│ └── spec.md
|
||||
└── templates
|
||||
├── CLAUDE-template.md
|
||||
├── plan-template.md
|
||||
├── spec-template.md
|
||||
├── tasks-template.md
|
||||
└── worktree-setup.sh
|
||||
└── tasks-template.md
|
||||
```
|
||||
|
||||
### **STEP 2:** Functional specification clarification
|
||||
@@ -259,7 +260,7 @@ The output of this step will include a number of implementation detail documents
|
||||
│ ├── setup-plan.sh
|
||||
│ └── update-claude-md.sh
|
||||
├── specs
|
||||
│ └── 002-create-taskify
|
||||
│ └── 001-create-taskify
|
||||
│ ├── contracts
|
||||
│ │ ├── api-spec.json
|
||||
│ │ └── signalr-spec.md
|
||||
@@ -272,8 +273,7 @@ The output of this step will include a number of implementation detail documents
|
||||
├── CLAUDE-template.md
|
||||
├── plan-template.md
|
||||
├── spec-template.md
|
||||
├── tasks-template.md
|
||||
└── worktree-setup.sh
|
||||
└── tasks-template.md
|
||||
```
|
||||
|
||||
Check the `research.md` document to ensure that the right tech stack is used, based on your instructions. You can ask Claude Code to refine it if any of the components stand out, or even have it check the locally-installed version of the platform/framework you want to use (e.g., .NET).
|
||||
@@ -348,7 +348,7 @@ Once the implementation step is done, ask Claude Code to try to run the applicat
|
||||
If you're having issues with Git authentication on Linux, you can install Git Credential Manager:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
echo "Downloading Git Credential Manager v2.6.1..."
|
||||
wget https://github.com/git-ecosystem/git-credential-manager/releases/download/v2.6.1/gcm-linux_amd64.2.6.1.deb
|
||||
@@ -363,6 +363,7 @@ rm gcm-linux_amd64.2.6.1.deb
|
||||
## Maintainers
|
||||
|
||||
- Den Delimarsky ([@localden](https://github.com/localden))
|
||||
- John Lam ([@jflam](https://github.com/jflam))
|
||||
|
||||
## Support
|
||||
|
||||
@@ -371,3 +372,7 @@ For support, please open a [GitHub issue](https://github.com/github/spec-kit/iss
|
||||
## Acknowledgements
|
||||
|
||||
This project is heavily influenced by and based on the work and research of [John Lam](https://github.com/jflam).
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the terms of the MIT open source license. Please refer to the [LICENSE](./LICENSE) file for the full terms.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "specify-cli"
|
||||
version = "0.0.48"
|
||||
version = "0.0.2"
|
||||
description = "Setup tool for Specify spec-driven development projects"
|
||||
requires-python = ">=3.11"
|
||||
dependencies = [
|
||||
|
||||
2
scripts/check-task-prerequisites.sh
Normal file → Executable file
2
scripts/check-task-prerequisites.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Check that implementation plan exists and find optional design documents
|
||||
# Usage: ./check-task-prerequisites.sh [--json]
|
||||
|
||||
|
||||
2
scripts/common.sh
Normal file → Executable file
2
scripts/common.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Common functions and variables for all scripts
|
||||
|
||||
# Get repository root
|
||||
|
||||
2
scripts/create-new-feature.sh
Normal file → Executable file
2
scripts/create-new-feature.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Create a new feature with branch, directory structure, and template
|
||||
# Usage: ./create-new-feature.sh "feature description"
|
||||
# ./create-new-feature.sh --json "feature description"
|
||||
|
||||
2
scripts/get-feature-paths.sh
Normal file → Executable file
2
scripts/get-feature-paths.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Get paths for current feature branch without creating anything
|
||||
# Used by commands that need to find existing feature files
|
||||
|
||||
|
||||
2
scripts/setup-plan.sh
Normal file → Executable file
2
scripts/setup-plan.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Setup implementation plan structure for current branch
|
||||
# Returns paths needed for implementation plan generation
|
||||
# Usage: ./setup-plan.sh [--json]
|
||||
|
||||
2
scripts/update-agent-context.sh
Normal file → Executable file
2
scripts/update-agent-context.sh
Normal file → Executable file
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
# Incrementally update agent context files based on new feature plan
|
||||
# Supports: CLAUDE.md, GEMINI.md, and .github/copilot-instructions.md
|
||||
# O(1) operation - only reads current context file and new plan.md
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## The Power Inversion
|
||||
|
||||
For decades, code has been king. Specifications served code—they were the scaffolding we built and then discarded once the "real work" of coding began. We wrote PRDs to guide development, created design docs to inform implementation, drew diagrams to visualize architecture. But these were always subordinate to the code itself. Code was truth. Everything else was, at best, good intentions. Code was the source of truth, as it mvoed forward, and spec's rarely kept pace. As the asset (code) and the implementation are one, it's not easy to have a parallel implementation without trying to build from the code.
|
||||
For decades, code has been king. Specifications served code—they were the scaffolding we built and then discarded once the "real work" of coding began. We wrote PRDs to guide development, created design docs to inform implementation, drew diagrams to visualize architecture. But these were always subordinate to the code itself. Code was truth. Everything else was, at best, good intentions. Code was the source of truth, as it moved forward, and spec's rarely kept pace. As the asset (code) and the implementation are one, it's not easy to have a parallel implementation without trying to build from the code.
|
||||
|
||||
Spec-Driven Development (SDD) inverts this power structure. Specifications don't serve code—code serves specifications. The (Product Requirements Document-Specification) PRD isn't a guide for implementation; it's the source that generates implementation. Technical plans aren't documents that inform coding; they're precise definitions that produce code. This isn't an incremental improvement to how we build software. It's a fundamental rethinking of what drives development.
|
||||
|
||||
@@ -34,13 +34,13 @@ The feedback loop extends beyond initial development. Production metrics and inc
|
||||
|
||||
Three trends make SDD not just possible but necessary:
|
||||
|
||||
First, AI capabilities have reached a threshold where natural language specifications can reliably generate working code. This isn't about replacing developers—it's about amplifying their effectiveness by automating the mechanical translation from specification to implementation. It can amplify exploration and creativity, it can support "start-over" easily, it supports addition substraction and critical thinking.
|
||||
First, AI capabilities have reached a threshold where natural language specifications can reliably generate working code. This isn't about replacing developers—it's about amplifying their effectiveness by automating the mechanical translation from specification to implementation. It can amplify exploration and creativity, it can support "start-over" easily, it supports addition subtraction and critical thinking.
|
||||
|
||||
Second, software complexity continues to grow exponentially. Modern systems integrate dozens of services, frameworks, and dependencies. Keeping all these pieces aligned with original intent through manual processes becomes increasingly difficult. SDD provides systematic alignment through specification-driven generation. Frameworks may eviolve to provide AI-first support, not human-first support, or architect around reusable components.
|
||||
Second, software complexity continues to grow exponentially. Modern systems integrate dozens of services, frameworks, and dependencies. Keeping all these pieces aligned with original intent through manual processes becomes increasingly difficult. SDD provides systematic alignment through specification-driven generation. Frameworks may evolve to provide AI-first support, not human-first support, or architect around reusable components.
|
||||
|
||||
Third, the pace of change accelerates. Requirements change far more rapidly today than ever before. Pivoting is no longer exceptional—it's expected. Modern product development demands rapid iteration based on user feedback, market conditions, and competitive pressures. Traditional development treats these changes as disruptions. Each pivot requires manually propagating changes through documentation, design, and code. The result is either slow, careful updates that limit velocity, or fast, reckless changes that accumulate technical debt.
|
||||
|
||||
SDD can support what-if/simulation experiments, "If we need to re-implement of change the application to promote a business need to sell more T-shirts, how would we implement and experiment for that?".
|
||||
SDD can support what-if/simulation experiments, "If we need to re-implement or change the application to promote a business need to sell more T-shirts, how would we implement and experiment for that?".
|
||||
|
||||
SDD transforms requirement changes from obstacles into normal workflow. When specifications drive implementation, pivots become systematic regenerations rather than manual rewrites. Change a core requirement in the PRD, and affected implementation plans update automatically. Modify a user story, and corresponding API endpoints regenerate. This isn't just about initial development—it's about maintaining engineering velocity through inevitable changes.
|
||||
|
||||
@@ -256,7 +256,7 @@ The constitution defines nine articles that shape every aspect of the developmen
|
||||
#### Article I: Library-First Principle
|
||||
Every feature must begin as a standalone library—no exceptions. This forces modular design from the start:
|
||||
```
|
||||
Every feature in Specify2 MUST begin its existence as a standalone library.
|
||||
Every feature in Specify MUST begin its existence as a standalone library.
|
||||
No feature shall be implemented directly within application code without
|
||||
first being abstracted into a reusable library component.
|
||||
```
|
||||
|
||||
@@ -15,7 +15,7 @@ Specify CLI - Setup tool for Specify projects
|
||||
Usage:
|
||||
uvx specify-cli.py init <project-name>
|
||||
uvx specify-cli.py init --here
|
||||
|
||||
|
||||
Or install globally:
|
||||
uv tool install --from specify-cli.py specify-cli
|
||||
specify init <project-name>
|
||||
@@ -813,12 +813,12 @@ def init(
|
||||
if selected_ai == "claude":
|
||||
steps_lines.append(f"{step_num}. Open in Visual Studio Code and start using / commands with Claude Code")
|
||||
steps_lines.append(" - Type / in any file to see available commands")
|
||||
steps_lines.append(" - Use /spec to create specifications")
|
||||
steps_lines.append(" - Use /specify to create specifications")
|
||||
steps_lines.append(" - Use /plan to create implementation plans")
|
||||
steps_lines.append(" - Use /tasks to generate tasks")
|
||||
elif selected_ai == "gemini":
|
||||
steps_lines.append(f"{step_num}. Use / commands with Gemini CLI")
|
||||
steps_lines.append(" - Run gemini /spec to create specifications")
|
||||
steps_lines.append(" - Run gemini /specify to create specifications")
|
||||
steps_lines.append(" - Run gemini /plan to create implementation plans")
|
||||
steps_lines.append(" - See GEMINI.md for all available commands")
|
||||
elif selected_ai == "copilot":
|
||||
@@ -868,4 +868,4 @@ def main():
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
main()
|
||||
|
||||
@@ -19,7 +19,7 @@ Given the implementation details provided as an argument, do this:
|
||||
3. Read the constitution at `/memory/constitution.md` to understand constitutional requirements.
|
||||
|
||||
4. Execute the implementation plan template:
|
||||
- Load `/templates/implementation-plan-template.md` (already copied to IMPL_PLAN path)
|
||||
- Load `/templates/plan-template.md` (already copied to IMPL_PLAN path)
|
||||
- Set Input path to FEATURE_SPEC
|
||||
- Run the Execution Flow (main) function steps 1-10
|
||||
- The template is self-contained and executable
|
||||
|
||||
Reference in New Issue
Block a user