Remove QUICK-REFERENCE.md from .ai/ — it contained kube-log project-specific content (hardcoded paths, OpenShift/ArgoCD config) that was leaking into all projects via the symlink. Update docs to match the actual apply.sh implementation: - apply.md: rewrite to reflect curl-only invocation, bootstrap/local phases, factory-reset marker behaviour; remove .ai-instructions.conf and interactive checklist references - architecture.md: remove scripts/ subdirectory and .ai-instructions.conf that were never implemented - apply-usecases.md: remove INSTALL subgraph (rm -rf + cp -r was never done), fix symlink targets to SCRIPT_DIR/.ai - apply-requirements.md: NFR-1 corrected (TTY-gated prompt exists), NFR-4 updated to <150 lines, .ai-instructions.conf removed from out-of-scope list
5.6 KiB
apply.sh — requirements
Goal
A single bash script that gives any developer AI superpowers across all their projects in one command. Run once to set up, run again to repair. No configuration, no questions.
Functional requirements
FR-1 Bootstrap via curl
- FR-1.1 When run via
curl | bash, the script detects it has no filesystem location (BASH_SOURCE[0]is empty) - FR-1.2 If
ai-superpower/does not exist in$PWD: clone the repo there - FR-1.3 If
ai-superpower/already exists: rungit pullto update it - FR-1.4 After clone/pull: re-exec the local copy of
apply.shwith--bootstrapped DEV_ROOTand stdin reopened from/dev/ttyso interactive prompts work even when piped through curl
FR-2 Project discovery
- FR-2.1 Scan dev root recursively for directories containing
.git - FR-2.2 Dev root is the parent directory of the script's own location
- FR-2.3 Exclude any project containing a
.ai-superpowermarker file in its root — this identifies the ai-superpower repo itself regardless of what the directory is named - FR-2.4 Maximum scan depth: 4 levels below dev root (
-maxdepth 4from dev root)
FR-3 Symlink
- FR-3.1 For each discovered project: create
project/.aias a symlink pointing directly toai-superpower/.ai/in the repo (absolute path) - FR-3.2 If symlink is already correct: skip silently
- FR-3.3 If symlink is missing or broken: create it
- FR-3.4 This means changes made to
.ai/instruction files from any project are immediately reflected in the git working tree ofai-superpower/— no sync step needed
FR-4 .gitignore
- FR-4.1 Check if
.aiis present inproject/.gitignore - FR-4.2 If missing: append
.aito the file (create file if it does not exist) - FR-4.3 If already present: skip silently
FR-5 ai-context.md
- FR-5.1 If
project/docs/does not exist and stdin is a TTY: ask the developer[y/N]whether to create it; create it ony, skip on anything else - FR-5.1b If
project/docs/does not exist and stdin is not a TTY (non-interactive environment): print a warning and skip - FR-5.2 If
project/docs/ai-context.mddoes not exist: create it from a template - FR-5.3 The template contains section headings and inline instructions explaining what each section should contain and how to fill it in (manually or by asking the AI)
- FR-5.4 If file already exists and the first line is the factory-reset marker (
<!-- ai-superpower:template): overwrite with the current template — the file has not yet been customised - FR-5.5 If file already exists and marker is absent: skip silently — the developer owns this file
- FR-5.6 (future) Interactive mode: before creating the template, ask the developer for a one-line project description and pre-fill it into the template
FR-6 architecture.md
- FR-6.1 If
project/docs/architecture.mddoes not exist: create it from a template - FR-6.2 The template contains section headings and inline instructions explaining what each section should contain and how to fill it in (manually or by asking the AI)
- FR-6.3 If file already exists and the first line is the factory-reset marker: overwrite with the current template — the file has not yet been customised
- FR-6.4 If file already exists and marker is absent: skip silently — the developer owns this file
- FR-6.5 (future) Interactive mode: offer to scaffold a richer
architecture.mdbased on a brief description from the developer
FR-7 Idempotency
- FR-7.1 Running
apply.shmultiple times produces the same result - FR-7.2 Files that have been customised by the developer (factory-reset marker absent) are never overwritten
- FR-7.3 No duplicate lines added to
.gitignore
FR-8 Version file
- FR-8.1 After each run, write
$DEV_ROOT/.ai-superpower.versionwith the current UTC timestamp and the short git commit hash of the ai-superpower repo - FR-8.2 The file is overwritten on every run (always reflects the last run)
- FR-8.3
$DEV_ROOT/.ai-superpower.versionis listed in this repo's.gitignore
Non-functional requirements
NFR-1 Minimal interaction
The script is designed to run non-interactively. One exception: when project/docs/ does not exist and stdin is a TTY, the script asks [y/N] before creating the folder. This is gated on TTY detection — in non-interactive environments (piped through curl, CI) it falls back to a printed warning and skip. All other steps run without prompts.
Future: FR-5.6 and FR-6.5 describe potential interactive scaffolding for ai-context.md and architecture.md. The code structure must allow this to be added per-project without redesigning the main loop.
NFR-2 Output
Each project prints a short status line per action taken. Silent for skipped steps.
▸ project-name
✓ .ai symlinked
✓ .ai added to .gitignore
✓ created docs/ai-context.md
⚠ no docs/architecture.md
NFR-3 Error handling
set -euo pipefail— fail fast on errors- Failed
git cloneorgit pull: print clear error message and exit - Failed write to
.gitignoreor docs files: script exits immediately (inherits pipefail behaviour)
NFR-4 Size
Target: under 150 lines. Single file, no external scripts.
NFR-5 Compatibility
- macOS (zsh + bash)
- Linux (bash)
- Windows via WSL
- No dependencies beyond
git,bash,find
Out of scope (v1)
- Interactive project selection checklist
- Interactive docs/ scaffolding (deferred to future version — see FR-5.6, FR-6.5)
- Harnesses (CLAUDE.md, AGENTS.md, .cursor/rules/)
- Copy mode — symlinks only
- Windows native (WSL required)