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
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
# SpecFact CLI

> **The "swiss knife" CLI that turns any codebase into a clear, safe, and shippable workflow.**
> Keep backlog, specs, tests, and code in sync so AI-assisted changes do not break production.
> Keep backlog, specs, tests, and code in sync so changes made by people or AI copilots do not break production.
> Works for brand-new projects and long-lived codebases - even if you are new to coding.

**No API keys required. Works offline. Zero vendor lock-in.**

SpecFact CLI does **not** include built-in AI. It is a deterministic local CLI
that can be paired with IDE slash-command prompts so your chosen AI copilot can
invoke SpecFact as part of a command chain.

[![PyPI version](https://img.shields.io/pypi/v/specfact-cli.svg?color=22c55e)](https://pypi.org/project/specfact-cli/)
[![Python versions](https://img.shields.io/pypi/pyversions/specfact-cli.svg)](https://pypi.org/project/specfact-cli/)
[![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE)
Expand Down
5 changes: 4 additions & 1 deletion docs/_config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ title: SpecFact CLI Documentation
description: >-
Complete documentation for SpecFact CLI - Brownfield-first CLI: Reverse engineer legacy Python β†’ specs β†’ enforced contracts.
baseurl: "" # Custom domain at root, no baseurl needed
url: "https://docs.specfact.io" # Custom domain
url: &docs_site_url "https://docs.specfact.io" # Custom domain
docs_home_url: *docs_site_url
core_cli_docs_url: *docs_site_url
modules_docs_url: "https://modules.specfact.io"

# Build settings
markdown: kramdown
Expand Down
158 changes: 158 additions & 0 deletions docs/_data/nav.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
- section: Getting Started
items:
- title: Where to Start
url: /getting-started/where-to-start/
expertise: [beginner]
- title: Installation
url: /getting-started/installation/
expertise: [beginner]
- title: Quickstart
url: /getting-started/quickstart/
expertise: [beginner]

- section: Core CLI
items:
- title: specfact init
url: /core-cli/init/
expertise: [beginner, intermediate]
- title: specfact module
url: /core-cli/module/
expertise: [beginner, intermediate]
- title: specfact upgrade
url: /core-cli/upgrade/
expertise: [beginner, intermediate]
- title: Operational Modes
url: /core-cli/modes/
expertise: [intermediate, advanced]
- title: Debug Logging
url: /core-cli/debug-logging/
expertise: [advanced]

- section: Module System
items:
- title: Installing Modules
url: /module-system/installing-modules/
expertise: [beginner, intermediate]
- title: Module Marketplace
url: /module-system/module-marketplace/
expertise: [beginner, intermediate]
- title: Marketplace Bundles
url: /module-system/marketplace/
expertise: [intermediate]
- title: Custom Registries
url: /module-system/custom-registries/
expertise: [advanced]
- title: Module Bootstrap Checklist
url: /module-system/bootstrap-checklist/
expertise: [beginner, intermediate]

- section: Architecture
items:
- title: Overview
url: /architecture/overview/
expertise: [intermediate, advanced]
- title: Implementation Status
url: /architecture/implementation-status/
expertise: [advanced]
- title: Module System
url: /architecture/module-system/
expertise: [advanced]
- title: Interface Contracts
url: /architecture/interface-contracts/
expertise: [advanced]
- title: Component Graph
url: /architecture/component-graph/
expertise: [advanced]
- title: Data Flow
url: /architecture/data-flow/
expertise: [advanced]
- title: State Machines
url: /architecture/state-machines/
expertise: [advanced]

- section: Workflows
items:
- title: AI IDE Workflow
url: /guides/ai-ide-workflow/
expertise: [beginner, intermediate]
- title: Agile & Scrum Workflows
url: /guides/agile-scrum-workflows/
expertise: [intermediate]
- title: Command Chains
url: /guides/command-chains/
expertise: [intermediate, advanced]
- title: Contract Testing Workflow
url: /guides/contract-testing-workflow/
expertise: [advanced]
- title: Team Collaboration Workflow
url: /guides/team-collaboration-workflow/
expertise: [intermediate]
- title: OpenSpec Journey
url: /guides/openspec-journey/
expertise: [intermediate]

- section: Integrations
items:
- title: Integrations Overview
url: /guides/integrations-overview/
expertise: [intermediate]
- title: GitHub Adapter
url: /adapters/github/
expertise: [intermediate]
- title: Azure DevOps Adapter
url: /adapters/azuredevops/
expertise: [intermediate]
- title: DevOps Adapter Integration
url: /guides/devops-adapter-integration/
expertise: [intermediate, advanced]
- title: Custom Bridges
url: /guides/creating-custom-bridges/
expertise: [advanced]

- section: Migration
items:
- title: Migration Guide
url: /migration/migration-guide/
expertise: [intermediate]
- title: CLI Reorganization
url: /migration/migration-cli-reorganization/
expertise: [intermediate, advanced]
- title: OpenSpec Migration
url: /migration/openspec-migration/
expertise: [intermediate]

- section: Reference
items:
- title: Command Reference
url: /reference/commands/
expertise: [intermediate, advanced]
- title: Core vs Modules URL Contract
url: /reference/documentation-url-contract/
expertise: [advanced]
- title: Authentication
url: /reference/authentication/
expertise: [intermediate, advanced]
- title: Bridge Registry
url: /reference/bridge-registry/
expertise: [advanced]
- title: Directory Structure
url: /reference/directory-structure/
expertise: [advanced]
- title: Module Contracts
url: /reference/module-contracts/
expertise: [advanced]
- title: Module Categories
url: /reference/module-categories/
expertise: [intermediate]
- title: Module Security
url: /reference/module-security/
expertise: [advanced]
- title: ProjectBundle Schema
url: /reference/projectbundle-schema/
expertise: [advanced]
- title: Dependency Resolution
url: /reference/dependency-resolution/
expertise: [advanced]
- title: Thorough Codebase Validation
url: /reference/thorough-codebase-validation/
expertise: [advanced]
32 changes: 32 additions & 0 deletions docs/_includes/breadcrumbs.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{% unless page.url == '/' %}
<nav class="docs-breadcrumbs" aria-label="Breadcrumb">
<a href="{{ '/' | relative_url }}">Home</a>
{% assign url_parts = page.url | split: '/' %}
{% assign last_segment = '' %}
{% for part in url_parts %}
{% if part != '' %}
{% assign last_segment = part %}
{% endif %}
{% endfor %}
{% assign crumb_path = '' %}
{% for part in url_parts %}
{% if part != '' %}
{% if part == last_segment %}
{% assign label_source = page.title | default: part | replace: '-', ' ' %}
{% else %}
{% assign label_source = part | replace: '-', ' ' %}
{% endif %}
{% assign label_words = label_source | split: ' ' %}
{% capture breadcrumb_label %}{% for word in label_words %}{% if word != '' %}{{ word | capitalize }}{% unless forloop.last %} {% endunless %}{% endif %}{% endfor %}{% endcapture %}
{% assign crumb_path = crumb_path | append: '/' | append: part %}
{% if part == last_segment %}
<span class="separator">/</span>
<span class="current">{{ breadcrumb_label | strip }}</span>
{% else %}
<span class="separator">/</span>
<a href="{{ crumb_path | append: '/' | relative_url }}">{{ breadcrumb_label | strip }}</a>
{% endif %}
{% endif %}
{% endfor %}
Comment thread
djm81 marked this conversation as resolved.
</nav>
{% endunless %}
7 changes: 7 additions & 0 deletions docs/_includes/expertise-filter.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<div class="docs-expertise-filter" role="group" aria-label="Filter by expertise level">
<button type="button" class="expertise-pill active" data-level="all" aria-pressed="true">All</button>
<button type="button" class="expertise-pill" data-level="beginner" aria-pressed="false">Beginner</button>
<button type="button" class="expertise-pill" data-level="intermediate" aria-pressed="false">Intermediate</button>
<button type="button" class="expertise-pill" data-level="advanced" aria-pressed="false">Advanced</button>
<span class="expertise-count"></span>
</div>
5 changes: 5 additions & 0 deletions docs/_includes/search.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div class="docs-search" data-search-index-url="{{ '/assets/js/search-index.json' | relative_url }}">
<input type="text" class="docs-search-input" placeholder="Search docs..." aria-label="Search documentation">
<span class="docs-search-shortcut">Ctrl+K</span>
<div class="docs-search-results" role="list"></div>
</div>
34 changes: 34 additions & 0 deletions docs/_includes/sidebar-nav.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<nav class="docs-nav" role="navigation" aria-label="Documentation">
{% for section in site.data.nav %}
<p class="docs-nav-section">{{ section.section }}</p>

{% if section.bundles %}
{% for bundle in section.bundles %}
{% assign bundle_open = false %}
{% for item in bundle.items %}
{% if page.url == item.url %}
{% assign bundle_open = true %}
{% endif %}
{% endfor %}
<details class="docs-nav-bundle"{% if bundle_open %} open{% endif %}>
<summary>{{ bundle.name }}</summary>
<ul>
{% for item in bundle.items %}
<li data-expertise="{{ item.expertise | join: ',' }}">
<a href="{{ item.url | relative_url }}"{% if page.url == item.url %} class="active" aria-current="page"{% endif %}>{{ item.title }}</a>
</li>
{% endfor %}
</ul>
</details>
{% endfor %}
{% elsif section.items %}
<ul>
{% for item in section.items %}
<li data-expertise="{{ item.expertise | join: ',' }}">
<a href="{{ item.url | relative_url }}"{% if page.url == item.url %} class="active" aria-current="page"{% endif %}>{{ item.title }}</a>
</li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
</nav>
16 changes: 16 additions & 0 deletions docs/_includes/theme-toggle.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<button type="button" class="theme-toggle" aria-label="Toggle light/dark theme" title="Toggle theme">
<svg class="icon-sun" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
<svg class="icon-moon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
</svg>
</button>
Loading
Loading