agentic/code/addons/agentic-installer/skills/setup-generate/SKILL.md
Generate a `setup.manifest.yaml` file for a project using the `setup.aiwg.io/v1`
npx skillsauth add jmagly/aiwg setup-generateInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a setup.manifest.yaml file for a project using the setup.aiwg.io/v1 SetupManifest language.
Path to the project root. Defaults to ..
Extract requirements from README.md or INSTALL.md in the project dir.
Update an existing setup.manifest.yaml rather than creating from scratch.
Comma-separated list of target platforms: linux,macos,windows,wsl2.
Default: linux,macos.
Install type to generate: user, developer, or ci.
Default: user.
user — production/end-user deployment (default, behavior unchanged from previous versions)developer — local development environment standup with OS configurationci — headless pipeline setupWhen --type developer, output filename is setup.dev.manifest.yaml. When --type user, output is setup.user.manifest.yaml (or setup.manifest.yaml if no type is specified for backwards compatibility).
Ask clarifying questions before generating.
package.json, requirements.txt, Cargo.toml, go.mod, Makefile, etc.README.md, INSTALL.md, docs/install.mdsetup.manifest.yaml--from-readme, parse installation instructions from readme--interactive, ask:
--type developer)Additional discovery steps for developer manifests:
.nvmrc, .tool-versions, mise.toml, pyproject.toml [dev], Brewfile, .devcontainer/--watch flags)--interactive or key information is absent, ask mandatory interactive questions:
Build the manifest YAML following this priority order:
install_type matching --type flag (default: user)--platforms or detected by project typeINSTALL_DIR, BRANCH (default: main); add CONFIG_DIR if a config step is needednode for npm projects, python3 for Python)clone or verify-existing detect stepinstall-deps-* steps for each target platformconfigure step if config files are neededverify stepfull-reset fallback--type developer)When assembling developer manifests, apply these additional rules:
os_config block — emit entries based on detection:
| Condition | Entry |
|-----------|-------|
| Linux + Docker in project | docker-group (requires_relogin: true) |
| Linux + file watchers detected (webpack/jest/vite/nodemon) | inotify-watches |
| Linux + Elasticsearch/Weaviate/OpenSearch detected | vm-mapcount |
| macOS | xcode-cli-tools (interactive: true) |
| HTTPS dev + local domain | mkcert install step (not os_config, but a script step) |
| GPU dev | nvidia-container-toolkit os_config entry |
params — emit with interactive_required: true for:
LOCAL_DOMAIN — when HTTPS dev or local domain detectedSSH_EMAIL — when SSH key setup is requiredGIT_USER_NAME, GIT_USER_EMAIL — when git config step is includedGIT_GPG_KEY_ID — when GPG signing is requestedIDE — when IDE-specific extension installation is includedsteps — emit os-config steps for each os_config entry:
- id: apply-docker-group
type: os-config
config_id: docker-group
depends_on: [install-docker]
platform: linux
dev-specific prerequisites — add as detected:
nvm or mise — when .nvmrc or .tool-versions foundmkcert — when HTTPS dev requestedact — when GitHub Actions local testing detectedWhen docker-compose.yml or compose.yaml is found during Phase 1 discovery, apply these additional behaviors:
Platform (#676):
macos in the platform block alongside linux — Docker Desktop covers both.when: "$(uname -s) = Linux" so they are skipped on macOS.install_hint for docker prereqs to include macOS install links.Prerequisites (#672, #674):
command -v docker with docker version --format '{{.Server.Version}}' 2>/dev/null to catch both "not installed" and "installed but no permission" cases.install_hint to mention sudo usermod -aG docker $USER.- name: disk-space
detect: "df --output=avail -BG / | tail -1 | tr -d ' G'"
version_min: "20"
install_hint: "At least 20GB free disk space required for Docker images."
- name: ram
detect: "awk '/MemTotal/ {printf \"%.0f\", $2/1024/1024}' /proc/meminfo"
version_min: "8"
install_hint: "At least 8GB RAM recommended. 16GB+ for GPU profiles."
Params (#671, #675):
DOMAIN or ISSUER_URL param is emitted, also emit a PROTOCOL param with a smart default:
- name: PROTOCOL
type: choice
choices: [http, https]
default: "$(echo ${DOMAIN} | grep -qE '^(localhost|127\\.0\\.0\\.1)' && echo http || echo https)"
description: "Protocol for OAuth/API URLs. Defaults to http for localhost."
Then reference ${PROTOCOL}://${DOMAIN} in configure.sh instead of hardcoding https://.DATA_DIR to ${INSTALL_DIR}/data (project-local, user-writable) rather than any system path like /var/lib/<project>. If the project explicitly requires a system path, emit a check-data-dir step (see steps below).Steps (#673, #675, #677):
check-ports step before deploy that validates all ports declared in the compose file are free:
- id: check-ports
type: script
script: installer/scripts/check-ports.sh
depends_on: [configure]
DATA_DIR is a system path, emit a check-data-dir step before configure:
- id: check-data-dir
type: script
script: installer/scripts/check-data-dir.sh
depends_on: [clone]
.env template, emit a pull-models step after deploy:
- id: pull-models
type: script
description: Pull Ollama models (may take several minutes)
script: installer/scripts/pull-models.sh
depends_on: [deploy]
verify: "docker exec $(docker compose ps -q ollama) ollama list | grep -q ${OLLAMA_GEN_MODEL%%:*}"
Script templates used for Docker projects:
installer/scripts/check-ports.sh — port availability check before deployinstaller/scripts/pull-models.sh — Ollama model pull after deploy (when applicable)For each script step:
agentic/code/addons/agentic-installer/scripts/templates/scripts/templates/dev/<project>/installer/scripts/ (user install) or <project>/installer/scripts/dev/ (developer install)script: fieldWrite the manifest to the appropriate path:
installer/setup.user.manifest.yaml — user install (when installer/ dir exists)installer/setup.dev.manifest.yaml — developer install (when installer/ dir exists)setup.manifest.yaml — backwards-compatible default (no --type flag, no installer/ dir)Report:
Generated: setup.dev.manifest.yaml
Install type: developer
Platform: linux, macos
OS config: docker-group (linux), inotify-watches (linux), xcode-cli-tools (macos)
Params: INSTALL_DIR, LOCAL_DOMAIN [required], SSH_EMAIL [required]
Prerequisites: git, node (>=20), nvm, mkcert
Steps: clone, install-deps, apply-docker-group, apply-inotify, configure-dev, verify-dev
Recovery: full-reset
Scripts: installer/scripts/dev/ (6 files)
Note: 2 OS config steps require re-login to take effect. Installer will warn user.
Note: 1 OS config step (xcode-cli-tools) triggers a GUI dialog on macOS.
Validate with: aiwg setup-validate installer/setup.dev.manifest.yaml
Run with: aiwg setup-run installer/setup.dev.manifest.yaml
A full-suite project (both user and developer install) ships these files:
installer/
├── setup.user.manifest.yaml # end-user deploy
├── setup.dev.manifest.yaml # developer standup
├── docs/
│ ├── install-user-linux.md
│ ├── install-user-macos.md
│ ├── install-user-windows.md
│ ├── install-dev-linux.md
│ ├── install-dev-macos.md
│ ├── install-dev-windows.md
│ └── install-dev-wsl2.md
└── scripts/
├── clone.sh
├── configure.sh
├── verify.sh
├── dev/
│ ├── configure-dev.sh
│ ├── install-mkcert.sh
│ ├── apply-docker-group.sh
│ ├── apply-inotify.sh
│ ├── apply-vm-mapcount.sh
│ ├── install-ide-extensions.sh
│ ├── setup-git-config.sh
│ ├── setup-ssh-key.sh
│ └── verify-dev.sh
└── user/
├── install-deps-ubuntu.sh
├── install-deps-macos.sh
└── install-deps-windows.ps1
Every step that can be scripted MUST be a script step. Only use type: agentic for:
apiVersion: setup.aiwg.io/v1
kind: SetupManifest
metadata:
name: myapp-dev
version: 1.0.0
description: Developer environment setup for myapp
install_type: developer
spec:
platforms:
- os: linux
distros: [ubuntu, debian, fedora]
arch: [x86_64, arm64]
shell: bash
- os: macos
arch: [x86_64, arm64]
shell: zsh
params:
- name: INSTALL_DIR
type: path
required: true
description: Directory to clone the project into
- name: LOCAL_DOMAIN
type: string
interactive_required: true
description: Local domain for HTTPS dev (e.g., myapp.local)
- name: SSH_EMAIL
type: string
interactive_required: true
description: Email address for SSH key generation
- name: IDE
type: choice
choices: [vscode, jetbrains, none]
interactive_required: true
description: IDE to install extensions for
prerequisites:
- name: git
detect: "command -v git"
version_min: "2.30"
install_hint: "Install git: https://git-scm.com"
- name: docker
detect: "docker version --format '{{.Server.Version}}' 2>/dev/null"
install_hint: "Install Docker: https://docs.docker.com/get-docker/"
os_config:
- id: docker-group
description: Add current user to docker group (avoids sudo for docker)
check: "id -nG | grep -qw docker"
apply: "sudo usermod -aG docker ${USER}"
requires_relogin: true
platforms: [linux]
- id: inotify-watches
description: Increase inotify watches for file watchers (webpack, jest, vite)
check: "sysctl fs.inotify.max_user_watches | awk '{print $3}' | xargs -I{} test {} -ge 524288"
apply: |
echo 'fs.inotify.max_user_watches=524288' | sudo tee -a /etc/sysctl.d/99-dev.conf
sudo sysctl -p /etc/sysctl.d/99-dev.conf
platforms: [linux]
- id: xcode-cli-tools
description: Xcode Command Line Tools (required for native compilation on macOS)
check: "xcode-select -p 2>/dev/null | grep -q CommandLineTools"
apply: "xcode-select --install"
interactive: true
platforms: [macos]
steps:
- id: clone
type: script
script: installer/scripts/clone.sh
verify: "test -d ${INSTALL_DIR}/.git"
- id: setup-git-config
type: script
script: installer/scripts/dev/setup-git-config.sh
params: [GIT_USER_NAME, GIT_USER_EMAIL]
depends_on: [clone]
- id: setup-ssh-key
type: script
script: installer/scripts/dev/setup-ssh-key.sh
params: [SSH_EMAIL]
depends_on: [clone]
- id: apply-docker-group
type: os-config
config_id: docker-group
platform: linux
depends_on: [clone]
- id: apply-inotify
type: os-config
config_id: inotify-watches
platform: linux
depends_on: [clone]
- id: apply-xcode-tools
type: os-config
config_id: xcode-cli-tools
platform: macos
depends_on: [clone]
- id: install-mkcert
type: script
script: installer/scripts/dev/install-mkcert.sh
params: [LOCAL_DOMAIN]
depends_on: [clone]
- id: configure-dev
type: script
script: installer/scripts/dev/configure-dev.sh
params: [INSTALL_DIR, LOCAL_DOMAIN]
depends_on: [install-mkcert]
- id: install-ide-extensions
type: script
script: installer/scripts/dev/install-ide-extensions.sh
params: [IDE]
depends_on: [clone]
- id: verify-dev
type: script
script: installer/scripts/dev/verify-dev.sh
params: [LOCAL_DOMAIN]
depends_on: [configure-dev, apply-docker-group, apply-inotify]
recovery:
- id: full-reset
steps:
- id: reset
type: script
script: installer/scripts/reset.sh
agentic/code/addons/agentic-installer/schemas/v1/setup-manifest.schema.jsonagentic/code/addons/agentic-installer/scripts/templates/agentic/code/addons/agentic-installer/scripts/templates/dev/agentic/code/addons/agentic-installer/skills/setup-run/SKILL.mdagentic/code/addons/agentic-installer/skills/setup-validate/SKILL.mddata-ai
Report which research-corpus radar sidecars are overdue for refresh. Computes staleness (days since last refresh vs the cadence window) for every radar, sorted most-overdue-first. Runs via `aiwg corpus radar-status`.
data-ai
Aggregate research-corpus radar sidecars into a corpus or per-cluster freshness report — totals, overdue count, per-cluster / per-GRADE / per-trajectory breakdowns, an overdue table, and per-radar rationale snippets. Runs via `aiwg corpus radar-report`.
testing
Scaffold radar/freshness sidecars for research-corpus REFs. Pulls title/authors from the citation sidecar and GRADE from the analysis doc, defaults the refresh cadence from GRADE and the cluster from a corpus-local map, and stamps documentation/radar/REF-XXX-radar.md. Runs via `aiwg corpus radar-init`.
data-ai
Compute an entity's publication trajectory — per-year paper counts, topic drift, hot-streak detection (≥3 consecutive A-grade years), and career phase. Runs via `aiwg corpus profile-temporal`.