Image Enhancer
nexu-io/open-design
Improve image and screenshot quality by enhancing resolution, sharpness, and clarity for professional presentations and documentation.
Analyze project and generate or enhance build automation file (Makefile, Taskfile.yml, Justfile, Magefile.go).
$ npx skills add unxed/f4 --skill aif-build-automation -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install unxed/f4 aif-build-automation --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/aif-build-automation .claude/skills/aif-build-automation && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .claude/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add unxed/f4 --skill aif-build-automation -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install unxed/f4 aif-build-automation --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/aif-build-automation .agents/skills/aif-build-automation && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .agents/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add unxed/f4 --skill aif-build-automation -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install unxed/f4 aif-build-automation --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/aif-build-automation .cursor/skills/aif-build-automation && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .cursor/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/unxed/f4.git --path .agents/skills/aif-build-automation--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add unxed/f4 --skill aif-build-automation -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install unxed/f4 aif-build-automation --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/aif-build-automation .gemini/skills/aif-build-automation && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .gemini/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install unxed/f4 aif-build-automationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add unxed/f4 --skill aif-build-automation -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/aif-build-automation .github/skills/aif-build-automation && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .github/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add unxed/f4 --skill aif-build-automation -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install unxed/f4 aif-build-automation --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/unxed/f4.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/aif-build-automation .opencode/skills/aif-build-automation && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "aif-build-automation" agent skill from https://github.com/unxed/f4/tree/main/.agents/skills/aif-build-automation into .opencode/skills/aif-build-automation/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aif-build-automation", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
aif-build-automationAnalyze project and generate or enhance build automation file (Makefile, Taskfile.yml, Justfile, Magefile.go).
Aif Build Automation is an agent skill from unxed/f4. Analyze project and generate or enhance build automation file (Makefile, Taskfile.yml, Justfile, Magefile.go). If a build file already exists, improves it by adding missing targets and best practices. Use when user says "generate makefile", "create taskfile", "add justfile", "setup mage", or "build automation".
Its SKILL.md is about 8.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 31 other files, including reference files (for example `references/BEST-PRACTICES.md`, `references/DOC-INTEGRATION.md` and `references/SUMMARY-FORMAT.md`).
The repository describes itself as: dual pane like a charm. The licence is BSD-3-Clause.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 772edc7. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadEditGlobGrepWriteBash(git *)AskUserQuestionQuestionsFrom allowed-tools in the SKILL.md frontmatter.
Ships script files (Go, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
dockerblacknpmdotnetbundleuvicornFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use docker and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Aif Build Automation loads about 8.3k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 83 tokens; SKILL.md has 3,408 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from unxed/f4 at commit 772edc7, republished under its BSD-3-Clause licence (© unxed). 3,408 words, ~8,312 tokens.
.claude/skills/aif-build-automation/SKILL.md (or your agent's skills folder). This skill also uses 29 other files; get the full folder from GitHub.Generate or enhance a build automation file for any project. Supports Makefile, Taskfile.yml, Justfile, and Magefile.go.
Two modes:
Read the project description if available:
Read .ai-factory/DESCRIPTION.mdStore the project context (tech stack, framework, architecture) for use in later steps. If the file doesn't exist, that's fine — we'll detect everything in Step 2.
Read .ai-factory/skill-context/aif-build-automation/SKILL.md — MANDATORY if the file exists.
This file contains project-specific rules accumulated by /aif-evolve from patches,
codebase conventions, and tech-stack analysis. These rules are tailored to the current project.
How to apply skill-context rules:
Enforcement: After generating any output artifact, verify it against all skill-context rules. If any rule is violated — fix the output before presenting it to the user.
Before anything else, check if the project already has build automation:
Glob: Makefile, makefile, GNUmakefile, Taskfile.yml, Taskfile.yaml, taskfile.yml, justfile, Justfile, .justfile, magefile.go, magefiles/*.goBuild a list of EXISTING_FILES from the results.
Mode A — Enhance Existing (if EXISTING_FILES is not empty):
MODE = "enhance"TARGET_TOOL automatically from the detected file (Makefile → makefile, Taskfile.yml → taskfile, etc.)$ARGUMENTS specifies one, use the argument to pick which one to enhanceAskUserQuestion: This project has multiple build files. Which one should I improve?
Options (dynamic, based on what exists):
1. Makefile — Enhance the existing Makefile
2. Taskfile.yml — Enhance the existing Taskfile
...EXISTING_CONTENTMode B — Generate New (if EXISTING_FILES is empty):
MODE = "generate"$ARGUMENTS to determine tool:| Argument | Tool | Output File |
|---|---|---|
makefile or make | GNU Make | Makefile |
taskfile or task | Taskfile | Taskfile.yml |
justfile or just | Just | justfile |
mage or magefile | Mage | magefile.go |
$ARGUMENTS is empty or doesn't match, ask the user interactively:AskUserQuestion: Which build automation tool do you want to generate?
Options:
1. Makefile — GNU Make (universal, no install needed)
2. Taskfile.yml — Task runner (YAML, modern, cross-platform)
3. justfile — Just command runner (simple, fast, ergonomic)
4. magefile.go — Mage (Go-native, type-safe, no shell scripts)Store the chosen tool as TARGET_TOOL.
Detect the project profile by scanning the repository with Glob and Grep. Use the same flow for every stack: primary language → package manager / build entrypoints → frameworks → Docker → CI → migrations → tests → linters → monorepo, then the Summary object. JVM projects are handled inside those steps (not a separate pipeline).
Check for these files (first match wins in the table order below). For Java / Kotlin (JVM), infer language from build files: default Java unless Kotlin plugins / kotlin("jvm") / dominant .kt layout suggests Kotlin.
| File / signal | Language |
|---|---|
go.mod | Go |
package.json | Node.js / JavaScript / TypeScript |
pyproject.toml or setup.py or setup.cfg | Python |
Cargo.toml | Rust |
composer.json | PHP |
Gemfile | Ruby |
| JVM: Gradle root or wrapper (see §2.2) | Java / Kotlin (JVM) |
JVM: pom.xml | Java / Kotlin (JVM) |
*.csproj or *.sln | C# / .NET |
Lock files and wrappers (same idea as package-lock.json → npm):
| File | Package manager / tool |
|---|---|
bun.lockb | bun |
pnpm-lock.yaml | pnpm |
yarn.lock | yarn |
package-lock.json | npm |
poetry.lock | poetry |
uv.lock | uv |
Pipfile.lock | pipenv |
gradle/wrapper/gradle-wrapper.properties | ./gradlew |
.mvn/wrapper/maven-wrapper.properties | ./mvnw |
Java / Kotlin (JVM) — Gradle vs Maven: Detect Gradle with one batch of checks (single Glob over the paths below, or parallel existence checks — avoid redundant sequential walks):
settings.gradle, settings.gradle.kts, build.gradle, build.gradle.kts (repo root), gradle/wrapper/gradle-wrapper.propertiesIf any Gradle signal matches → Gradle is in play. pom.xml indicates Maven. Set PROJECT_PROFILE.java_build.build_tool from this table:
| Condition | build_tool | Notes |
|---|---|---|
| Gradle signals present | gradle | Wire targets to Gradle commands below. |
No Gradle, pom.xml present | maven | Wire targets to Maven commands below. |
Gradle and pom.xml | gradle | Set java_build.mixed_maven_gradle: true and append a warning to PROJECT_PROFILE.warnings (both builds present; recipes follow Gradle — user confirms authoritative build). |
Concrete JVM Entrypoint: Persist the detected entrypoint in PROJECT_PROFILE.build_entrypoint based on wrapper presence:
build_tool is gradle: use ./gradlew if gradlew or gradle/wrapper/gradle-wrapper.properties exists, else fallback to gradle.build_tool is maven: use ./mvnw if mvnw or .mvn/wrapper/maven-wrapper.properties exists, else fallback to mvn.Single source of truth: The predicate above is the same rule the JVM templates implement in shell (ENTRYPOINT / entrypoint — test ./gradlew or gradle/wrapper/gradle-wrapper.properties; test ./mvnw or .mvn/wrapper/maven-wrapper.properties). When generating or enhancing build files, set PROJECT_PROFILE.build_entrypoint to the result those tests imply (./gradlew vs gradle, ./mvnw vs mvn). Do not emit a different entrypoint string than that predicate unless the user overrides (e.g. Makefile ENTRYPOINT=…). Templates re-resolve at recipe runtime so clones stay correct without editing.
Version catalog: If gradle/libs.versions.toml exists, set java_build.has_version_catalog and document PROJECT_PROFILE.build_entrypoint / catalog usage in comments where helpful.
Commands to wire into Makefile / Taskfile / Just for JVM (same role as npm run build / pytest for other stacks; use gradlew.bat on Windows):
| Goal | Gradle | Maven |
|---|---|---|
| Full compile + checks | <build_entrypoint> build | <build_entrypoint> verify |
| Unit / integration tests | <build_entrypoint> test | <build_entrypoint> test |
| Verification (tests + static analysis where configured) | <build_entrypoint> check | <build_entrypoint> verify |
| Package only | <build_entrypoint> assemble (or jar / bootJar) | <build_entrypoint> package |
| Dev server — Spring Boot (see §2.3) | <build_entrypoint> bootRun | <build_entrypoint> spring-boot:run |
| Dev server — Quarkus | <build_entrypoint> quarkusDev | <build_entrypoint> quarkus:dev |
| Dev server — Micronaut | <build_entrypoint> run | <build_entrypoint> mn:run |
| Dev server — Vert.x | <build_entrypoint> vertxRun | <build_entrypoint> vertx:run |
| Spring Boot — runnable JAR | <build_entrypoint> bootJar | <build_entrypoint> package (spring-boot repackage) |
| Clean | <build_entrypoint> clean | <build_entrypoint> clean |
| Multi-module | <build_entrypoint> :subproject:build | <build_entrypoint> -pl module -am package |
dev target (templates + generated files): Resolve the framework dev task/goal from the same signals as §2.3, fixed priority (first match wins): Quarkus → Micronaut → Vert.x → Spring Boot. Scan Gradle: build.gradle, build.gradle.kts, settings.gradle, settings.gradle.kts, gradle/libs.versions.toml with the same grep -E patterns you use for §2.3 (quarkus / io.quarkus; micronaut / io.micronaut; Vert.x Gradle plugin — vertx-plugin or io.vertx.vertx; Spring Boot — fallback). Scan Maven: pom.xml only; Vert.x Maven — vertx-maven-plugin or io.reactiverse. If the repo root is an aggregator and detection misses, override the template’s dev task variable (same idea as JVM_MODULE).
Templates: JVM Makefile/Taskfile/Just ship a fixed catalog: lint → Gradle check / Maven verify; fmt → spotlessApply / spotless:apply; lint-checkstyle, lint-spotbugs, lint-pmd, lint-spotless (Taskfile lint:*); db-migrate-liquibase, db-migrate-flyway (Taskfile db:migrate:*). Multi-module: module-* with JVM_MODULE. Step 5 removes catalog entries the repo does not wire (see JVM template rules).
For Node.js projects, check package.json dependencies for:
next → Next.jsnuxt → Nuxt@remix-run/node → Remixexpress → Expressfastify → Fastifyhono → Hono@nestjs/core → NestJSFor Python projects, check pyproject.toml or imports for:
fastapi → FastAPIdjango → Djangoflask → FlaskFor PHP projects, check composer.json require for:
laravel/framework → Laravelsymfony/framework-bundle → Symfonyslim/slim → Slimcakephp/cakephp → CakePHPFor Go projects, check go.mod for:
gin-gonic/gin → Ginlabstack/echo → Echogofiber/fiber → Fibergo-chi/chi → ChiFor Rust projects, read Cargo.toml (workspace members and [dependencies] / [workspace.dependencies]) for:
axum → Axumactix-web → Actix Webrocket → Rocketwarp → WarpFor Ruby projects, read Gemfile for:
rails → Ruby on Railssinatra → Sinatrahanami → Hanamiroda → RodaFor Java / JVM projects, read pom.xml, build.gradle*, and gradle/libs.versions.toml (when present) for dependencies and plugins — same discovery depth as package.json for Node:
spring-boot, spring-boot-starter, spring-boot-parent → Spring Bootgrpc, protobuf, spring-grpc or *.proto in repo → gRPC / protobufquarkus, io.quarkus → Quarkusmicronaut → Micronautvertx / Vert.x stack → Vert.xliquibase in deps or db.changelog* → Liquibase (see §2.6)org.flywaydb / flyway-core / flyway-maven-plugin / Flyway Gradle plugin in pom.xml, build.gradle*, or gradle/libs.versions.toml → Flyway (see §2.6)jakarta.*) for Java 9+ / Spring Boot 3+; flag legacy javax.* migration if both appearMap findings into framework / java_build flags (spring_boot, grpc, liquibase, flyway) like other ecosystems map Express vs NestJS.
Glob: Dockerfile, Dockerfile.*, docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml, .dockerignoreIf any exist, set HAS_DOCKER=true and perform a deeper analysis:
Read the Dockerfile(s) to detect:
dev / prod stages) → DOCKER_MULTISTAGE=trueDOCKER_PORTS (e.g., 3000, 8080)DOCKER_BASE (e.g., node:20-alpine, golang:1.22)Read docker-compose / compose file to detect:
DOCKER_SERVICES (e.g., app, db, redis, worker)dev, production, testDOCKER_DEPSStore as DOCKER_PROFILE:
has_compose: booleanhas_multistage: booleanservices: list of service namesdeps: list of infrastructure services (db, cache, queue)ports: exposed portshas_dev_stage: boolean (Dockerfile has a dev or development stage)Glob: .github/workflows/*.yml, .gitlab-ci.yml, .circleci/config.yml, Jenkinsfile, .travis.ymlNote which CI system is in use.
Search for migration tools:
Grep: prisma|drizzle|knex|typeorm|sequelize|alembic|django.*migrate|goose|migrate|atlas|sqlx|liquibase|flywayCheck for:
prisma/schema.prisma → Prismadrizzle.config.ts → Drizzlealembic/ directory → Alembicmigrations/ directory → Generic migrationsdb.changelog*, liquibase in Gradle/Maven or resources → Liquibase (JVM and others); set java_build.liquibase: trueorg.flywaydb, flyway-core, flyway-maven-plugin, Flyway Gradle plugin) in pom.xml, build.gradle*, or gradle/libs.versions.toml; set java_build.flyway: true| Language | Check For |
|---|---|
| Node.js | jest, vitest, mocha, ava in package.json |
| Python | pytest in pyproject.toml/requirements, unittest imports |
| Go | Go has built-in testing; check for testify in go.mod |
| Rust | Built-in; check for integration test directory tests/ |
| Ruby | rspec in Gemfile → RSpec; minitest / minitest- gems → Minitest; else default rake test when Rakefile exists |
| Java / Kotlin (JVM) | junit-jupiter, junit-jupiter-api, JUnitPlatform, JUnit5, testcontainers, mockito, rest-assured, cucumber in Gradle/Maven / libs.versions.toml |
Scan for formatter/linter configs (EditorConfig, Checkstyle on JVM, ESLint/Prettier/Biome, Python tools, PHP, Go, Rust, Ruby):
Glob: .eslintrc*, eslint.config.*, .prettierrc*, biome.json, biome.jsonc, .golangci.yml, .golangci.yaml
Glob: checkstyle.xml, .checkstyle.xml, config/checkstyle/checkstyle.xml, .editorconfig
Glob: ruff.toml, .ruff.toml, .flake8, phpcs.xml, phpcs.xml.dist
Glob: rustfmt.toml, .rustfmt.toml, clippy.toml, .rubocop.yml, .rubocop_todo.yml, .standard.yml
Grep in pyproject.toml: ruff|black|flake8|pylint|isort
Grep in build.gradle*, pom.xml: spotless|spotbugs|pmd|errorprone|checkstyle (when not covered by config files alone)Merge JVM matches into PROJECT_PROFILE.linters as normalized ids (e.g. checkstyle, spotless, spotbugs, pmd, errorprone) for use when wiring lint / fmt targets (Step 5).
Glob: turbo.json, nx.json, lerna.json, pnpm-workspace.yamlBuild a PROJECT_PROFILE object with:
language: primary languagepackage_manager: detected PM (npm, pnpm, Gradle, Maven, …)build_entrypoint: the exact entrypoint command detected (e.g. ./gradlew, mvn, npm, cargo)framework: detected framework (if any); JVM frameworks map here the same way as NestJS or Djangowarnings: optional string array (e.g. mixed Maven+Gradle from §2.2)java_build: optional — when language is JVM: { build_tool: "gradle"|"maven", mixed_maven_gradle?: boolean, has_version_catalog: boolean, spring_boot: boolean, grpc: boolean, liquibase: boolean, flyway: boolean }has_docker: booleandocker_profile: DOCKER_PROFILE object (if has_docker)ci_system: detected CI (if any)has_migrations: boolean + tool nametest_framework: detected test runnerlinters: list of detected lintersis_monorepo: booleanhas_dev_server: boolean (framework with dev server)Read the best practices reference for the chosen tool:
Read skills/aif-build-automation/references/BEST-PRACTICES.mdFocus on the section matching TARGET_TOOL:
Also read the "Cross-Cutting Concerns" section for standard targets.
Pick the closest matching template based on language + TARGET_TOOL:
| Tool | Go | Node.js | Python | PHP | Rust | Ruby | Java / JVM | Other |
|---|---|---|---|---|---|---|---|---|
| Makefile | makefile-go.mk | makefile-node.mk | makefile-python.mk | makefile-php.mk | makefile-rust.mk | makefile-ruby.mk | makefile-gradle.mk or makefile-maven.mk | Use closest match |
| Taskfile | taskfile-go.yml | taskfile-node.yml | taskfile-python.yml | taskfile-php.yml | taskfile-rust.yml | taskfile-ruby.yml | taskfile-gradle.yml or taskfile-maven.yml | Use closest match |
| Justfile | justfile-go | justfile-node | justfile-python | justfile-php | justfile-rust | justfile-ruby | justfile-gradle or justfile-maven | Use closest match |
| Magefile | magefile-basic.go | magefile-full.go | magefile-full.go | N/A (use Makefile) | N/A (use Makefile) | N/A (use Makefile) | N/A (use Makefile) | N/A (use Makefile) |
For Java / JVM, select the Gradle or Maven template based on PROJECT_PROFILE.java_build.build_tool.
If language is not among Go, Node.js, Python, PHP, Rust, Ruby, or Java / JVM in the table above, use the Node.js template as the structural fallback and adapt it to the detected build_entrypoint and language conventions (e.g., dotnet build).
For Magefile: use magefile-full.go if HAS_DOCKER or has_migrations is true, otherwise magefile-basic.go.
For PHP, Rust, Ruby, or Java/JVM + Magefile: Mage is Go-specific and not generally applicable to these stacks. If the user explicitly requested mage for such a project, explain this and suggest Makefile as the closest alternative (universal, no install needed). Ask via AskUserQuestion whether to proceed with Makefile instead.
Read the selected template:
Read skills/aif-build-automation/templates/<selected-template>Using the PROJECT_PROFILE, best practices, and template as reference, generate a customized build file from scratch.
ci). JVM: the template is a complete catalog; prune targets in Mode B per Step 5 JVM rules (do not invent one-off lint recipes).has_dockerhas_migrations (non-JVM); JVM: use the canonical db-migrate-liquibase / db-migrate-flyway (or Taskfile db:migrate:*) only when the matching java_build flag is true — omit the otherPROJECT_PROFILE (§2.2): JVM → <build_entrypoint> (from §2.2); Node → npm/pnpm/yarn/bun; Python → uv/poetry/pip; Go → go; Rust → cargo; Ruby → Bundler (bundle, bundle exec); do not substitute the wrong ecosystem (e.g. npm scripts for a Gradle-only repo)ci = clean + build on JVM (already runs check/verify); add lint / fmt to ci only if those targets remain after pruningJVM_MODULE for module-* targets (§2.2)has_docker, generate a dedicated Docker section (see below)JVM template catalog (fixed names; prune unused tools in Mode B) — Source of truth is skills/aif-build-automation/templates/*gradle* and *maven*. Always use these exact Gradle/Maven task names in generated files unless the build files use a different official task name for the same plugin (document in a comment next to the recipe).
| Target (Make/Just) | Taskfile task | Gradle command | Maven command |
|---|---|---|---|
lint | lint | check | verify |
fmt | fmt | spotlessApply | spotless:apply |
lint-checkstyle | lint:checkstyle | checkstyleMain | checkstyle:check |
lint-spotbugs | lint:spotbugs | spotbugsMain | spotbugs:check |
lint-pmd | lint:pmd | pmdMain | pmd:check |
lint-spotless | lint:spotless | spotlessCheck | spotless:check |
db-migrate-liquibase | db:migrate:liquibase | liquibaseUpdate | liquibase:update |
db-migrate-flyway | db:migrate:flyway | flywayMigrate | flyway:migrate |
dev | dev | see §2.2 dev tasks + template DEV_GRADLE_TASK resolver (§2.3 priority) | see §2.2 dev goals + template DEV_MAVEN_GOAL resolver (§2.3 priority) |
lint-checkstyle if checkstyle ∉ linters; remove lint-spotbugs / lint-pmd if those ids are missing; remove fmt and lint-spotless if spotless ∉ linters; remove db-migrate-liquibase if not java_build.liquibase; remove db-migrate-flyway if not java_build.flyway. Always keep lint (= check / verify) unless the project truly has no Java plugin lifecycle (rare). Never substitute verify -DskipTests or check -x test as lint. For dev, templates already resolve the task/goal from build files; when enhancing, replace a wrong constant bootRun / spring-boot:run with the correct framework command from PROJECT_PROFILE (same strings as the template resolver).java_build / linters.When has_docker is true, generate two layers of commands:
Layer 1 — Container lifecycle (always when Docker detected):
| Target | Purpose |
|---|---|
docker-build or docker:build | Build the Docker image |
docker-run or docker:run | Run the container |
docker-stop or docker:stop | Stop running containers |
docker-logs or docker:logs | Tail container logs |
docker-push or docker:push | Push image to registry |
docker-clean or docker:clean | Remove images and stopped containers |
Layer 2 — Dev vs Production separation (when compose or multistage detected):
##@ Docker — Development
docker-dev: ## Start all services in dev mode (with hot reload, mounted volumes)
docker-dev-build: ## Rebuild dev containers
docker-dev-down: ## Stop dev environment and remove volumes
##@ Docker — Production
docker-prod-build: ## Build production image (optimized, multi-stage)
docker-prod-run: ## Run production container locally for testing
docker-prod-push: ## Push production image to registryGeneration logic:
has_compose → use docker compose commands (not docker-compose)--profile dev / --profile productionhas_multistage → use --target dev for dev builds, no target (or --target production) for proddocker_profile.deps exist (db, redis, etc.) → add infra-up / infra-down targets to start/stop only infrastructure services without the appdocker-dev should run docker compose up with correct profile/servicesdocker-dev should run docker build --target dev + docker run with volume mountsLayer 3 — Container-based commands (mirror host commands via container):
When the project is Docker-based, also generate container-exec variants so that users who run everything in Docker can use the same targets:
# Run tests inside the container
docker-test: ## Run tests inside the Docker container
docker compose exec app [test command]
# Run linter inside the container
docker-lint: ## Run linter inside the Docker container
docker compose exec app [lint command]
# Open shell in the container
docker-shell: ## Open a shell inside the running container
docker compose exec app shOnly generate docker-* exec variants if the project appears to be Docker-first (compose file mounts source code as volumes, or no local language runtime setup is apparent).
java_build / Gradle or Maven): Use PROJECT_PROFILE.build_entrypoint from §2.2 Summary for every tool invocation. Quality and DB: use only the canonical target names and task names from the JVM template catalog (Step 5 table); when enhancing, add/remove recipes to match java_build and linters, not one-off guesses.go.mod, package.json, or directory namesrc/, app/, cmd/)next dev, uvicorn --reload, air; JVM → build_entrypoint plus the §2.2 dev task for the detected stack — Quarkus quarkusDev / quarkus:dev, Micronaut run / mn:run, Vert.x vertxRun / vertx:run, Spring Boot bootRun / spring-boot:run)lint must remain check / verify; per-tool rows use the Step 5 catalog tabledb-migrate-liquibase vs db-migrate-flyway (or Taskfile db:migrate:*) per java_buildWhen MODE = "enhance", do NOT replace the file from scratch. Instead, analyze it and improve it surgically.
Compare EXISTING_CONTENT against the PROJECT_PROFILE and best practices. Build a gap analysis:
Missing preamble/config — Check if the file has the recommended preamble:
SHELL := bash, .ONESHELL, .SHELLFLAGS, .DELETE_ON_ERROR, MAKEFLAGSversion: '3', output:, dotenv:set shell, set dotenv-load, set export//go:build mage, proper importsMissing standard targets — Check which of these are absent:
help / default (self-documenting)build, test, lint, clean, dev, fmt, and JVM catalog targets (lint-checkstyle, db-migrate-flyway, …) after template pruningci (aggregate target)Missing project-specific targets — Based on PROJECT_PROFILE, check for:
has_docker but no docker targets in file)db-migrate-* / db:migrate:* matching java_buildbuild / test / check delegating to <build_entrypoint> when java_build is set (not only generic shell or wrong ecosystem)module-build / module-test / module-check (or Taskfile module:*) when the repo is a Gradle multi-project or Maven reactor and per-module commands are usefulQuality issues — Check for anti-patterns from best practices:
.PHONY declarations (Makefile)Build a list of specific changes to make:
CHANGES = [
{ type: "add_preamble", detail: "Add .SHELLFLAGS and .DELETE_ON_ERROR" },
{ type: "add_target", name: "docker-build", detail: "Dockerfile detected but no docker target" },
{ type: "add_target", name: "help", detail: "No self-documenting help target" },
{ type: "fix_quality", detail: "Add ## comments to 3 targets missing descriptions" },
{ type: "add_variable", detail: "Add VERSION/COMMIT detection via git" },
...
]##@ sections, add to matching section; if no sections, append logically)Before writing the file, verify:
.PHONY declarations for all non-file targets (Makefile only)Mode B (Generate New):
Write the generated content using the Write tool:
| Tool | Output Path |
|---|---|
| Makefile | Makefile |
| Taskfile | Taskfile.yml |
| Justfile | justfile |
| Magefile | magefile.go |
Mode A (Enhance Existing):
Write the enhanced content to the same path where the existing file was found (preserving the original filename casing and location). The file is updated in-place — no need to ask about overwriting since we're improving, not replacing.
Display summary using format from references/SUMMARY-FORMAT.md. Shows targets table, project profile used, and quick start command for Mode B (generate), or what changed + new/existing targets for Mode A (enhance). Include installation hints if the tool requires setup.
After writing the build file, integrate quick commands into project docs.
For detailed integration procedures (README, AGENTS.md, existing markdown) → read references/DOC-INTEGRATION.md
Brief: scan for existing command sections, update or append quick reference, suggest AGENTS.md creation if missing.
Makefile, Taskfile.yml, justfile, magefile.go).AGENTS.md when directly tied to the generated build workflow.config.yaml.© unxed, BSD-3-Clause. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 29 other files (references) in .agents/skills/aif-build-automation of unxed/f4.
Open the folder on GitHubat commit 772edc7
Aif Build Automation next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Aif Build Automation this skillunxed/f4 | 243 | — | ~8.3k | Automated safety check: Pass | BSD-3-Clause | |
| Image Enhancernexu-io/open-design | 100k | — | ~332 | Automated safety check: Pass | Apache-2.0 | |
| Image Enhancerdavila7/claude-code-templates | 33k | 15 repos | ~633 | Automated safety check: Pass | MIT | |
| Enhance Promptnexu-io/open-design | 100k | — | ~301 | Automated safety check: Pass | Apache-2.0 | |
| Pagespeed Enhancersickn33/agentic-awesome-skills | 47k | 1 repos | ~716 | Automated safety check: Pass | MIT | |
| Comprehensive Review PR Enhancesickn33/agentic-awesome-skills | 47k | 2 repos | ~757 | Automated safety check: Pass | MIT |
nexu-io/open-design
Improve image and screenshot quality by enhancing resolution, sharpness, and clarity for professional presentations and documentation.
davila7/claude-code-templates
Improves the quality of images, especially screenshots, by enhancing resolution, sharpness, and clarity.
nexu-io/open-design
Improve prompts with design specs and UI/UX vocabulary. An agent skill from nexu-io/open-design.
sickn33/agentic-awesome-skills
Scan, audit, and fix web performance issues across all four Lighthouse/PageSpeed Insights pillars — Performance, Accessibility, Best Practices, and SEO — in structured batches.
sickn33/agentic-awesome-skills
Generate structured PR descriptions from diffs, add review checklists, risk assessments, and test coverage summaries.
elastic/kibana
Fetch a GitHub issue by number or URL and reformat it according to the Kibana bug report or feature request template.
unxed/f4
Comprehensive documentation guide for Golang projects, covering godoc comments, README, CONTRIBUTING, CHANGELOG, Go Playground, Example tests, API docs, and llms.txt.
unxed/f4
Golang code style conventions — line length and breaking, variable declarations, control flow clarity, when comments help vs hurt.
unxed/f4
Comprehensive guide for Go database access — parameterized queries, struct scanning, NULLable columns, transactions, isolation levels, SELECT FOR UPDATE, connection pool, batch processing, context…
unxed/f4
Security audit checklist based on OWASP Top 10 and best practices.
unxed/f4
Go (Golang) naming conventions — covers packages, constructors, structs, interfaces, constants, enums, errors, booleans, receivers, getters/setters, functional options, acronyms, test functions, and…
unxed/f4
Golang concurrency design — goroutine lifecycle and leak prevention, channels and select, channel ownership and direction, sync.Mutex/RWMutex/sync.Map/sync.Once/atomics, errgroup, singleflight…
Analyze project and generate or enhance build automation file (Makefile, Taskfile.yml, Justfile, Magefile.go). Aif Build Automation is an agent skill from unxed/f4.go).
Aif Build Automation fits situations like: user says generate makefile; create taskfile; build automation.
Run `npx skills add unxed/f4 --skill aif-build-automation -a claude-code`. Or copy the skill folder (.agents/skills/aif-build-automation in unxed/f4) into .claude/skills/aif-build-automation in your project. Claude Code loads it when a task matches its description.
Run `npx skills add unxed/f4 --skill aif-build-automation -a codex`. Or copy the skill folder (.agents/skills/aif-build-automation in unxed/f4) into .agents/skills/aif-build-automation in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add unxed/f4 --skill aif-build-automation -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/aif-build-automation, .gemini/skills/aif-build-automation, .github/skills/aif-build-automation and .opencode/skills/aif-build-automation in your project.
Going by SKILL.md and its folder, Aif Build Automation needs Go for the scripts in its folder and the command-line tools its instructions call (docker, black, npm, dotnet, bundle and uvicorn). Our summary lists: Python 3; Node.js; Docker. Its frontmatter pre-approves these tools: Read, Edit, Glob, Grep, Write, Bash(git *), AskUserQuestion, Questions.
SKILL.md contains no URLs. Its commands use docker and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Aif Build Automation is published under the BSD-3-Clause licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.3k tokens (SKILL.md is roughly 33k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Aif Build Automation: Image Enhancer (nexu-io/open-design, 100k stars), Image Enhancer (davila7/claude-code-templates, 33k stars), Enhance Prompt (nexu-io/open-design, 100k stars) and Pagespeed Enhancer (sickn33/agentic-awesome-skills, 47k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
unxed (a GitHub user) maintains it in unxed/f4, which has 243 GitHub stars. The repository holds 36 skills in this directory. The repository was last updated on October 10, 2026.
Source: unxed/f4 on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.