# 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: run `git pull` to update it - **FR-1.4** After clone/pull: re-exec the local copy of `apply.sh` with `--bootstrapped DEV_ROOT` and stdin reopened from `/dev/tty` so interactive prompts work even when piped through curl - **FR-1.5** If `--update` is passed as the first argument (`curl ... | bash -s -- --update`): forward it through the re-exec along with the commit hash captured before `git pull`; local mode detects the flag at `$3`, compares `$4` (pre-pull commit) with the current HEAD, and either reports "already up to date" or prints new commit messages with `git log --oneline`; skips all project scanning and setup ### 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-superpower` marker 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 4` from dev root) ### FR-3 Symlink - **FR-3.1** For each discovered project: create `project/.ai` as a symlink pointing directly to `ai-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 of `ai-superpower/` — no sync step needed ### FR-4 .gitignore - **FR-4.1** Check if `.ai` is present in `project/.gitignore` - **FR-4.2** If missing: append `.ai` to the file (create file if it does not exist) - **FR-4.3** If already present: skip silently ### FR-5 ai-context.md - **FR-5.0** Before handling docs: read `docs_folders` list from `config.yaml` in the script directory. Use this list to find an existing docs folder in the project (first match wins). If none exists, use the first entry as the default folder name when prompting to create one. - **FR-5.1** If the resolved docs folder does not exist and stdin is a TTY: ask the developer `[y/N]` whether to create it; create it on `y`, 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.md` does 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 (`