From dev-assistant
/etendo:init — Bootstrap a new Etendo project
npx claudepluginhub etendosoftware/etendo_claude_marketplace --plugin dev-assistantThis skill uses the workspace's default tool permissions.
**Arguments:** `$ARGUMENTS` (optional: target directory path)
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Guides agent creation for Claude Code plugins with file templates, frontmatter specs (name, description, model), triggering examples, system prompts, and best practices.
Arguments: $ARGUMENTS (optional: target directory path)
First, read skills/etendo-_guidelines/SKILL.md and skills/etendo-_context/SKILL.md.
For infrastructure modes (Source vs JAR, Docker flags), read references/infrastructure-modes.md. For Gradle task details, read references/gradle-tasks-reference.md.
This command performs a full bootstrap of a new Etendo development environment. It is designed for a developer setting up Etendo for the first time.
$ARGUMENTS is provided, use it as the target directoryVerify before proceeding:
git --versionjava -version and check $JAVA_HOME
export JAVA_HOME=/path/to/java17"docker infogradlew is bundled in the repoShow a checklist and stop if critical prerequisites are missing.
git clone https://github.com/etendosoftware/etendo_base.git {target_dir}
cd {target_dir}
If the directory already exists, check if it's a valid Etendo project (has gradle.properties, build.gradle with etendo plugin). If yes, ask: "Directory already exists and looks like an Etendo project. Run /etendo:install instead, or use a different directory?"
Read the existing gradle.properties and identify what needs to be filled:
GitHub credentials (required -- Etendo artifacts are hosted in GitHub Packages):
Check gradle.properties for githubUser and githubToken. If either is empty:
Tell the developer: "You need a GitHub Personal Access Token with read:packages scope to download Etendo artifacts."
Guide them to generate one:
read:packagesghp_ or gho_)Ask: "What is your GitHub username?" and "Paste your GitHub token:"
Write both into gradle.properties:
githubUser=their-github-username
githubToken=ghp_their_token_here
Do NOT proceed until these are set -- all Gradle tasks will fail without valid credentials.
Database configuration: Ask (with defaults shown):
localhost (only relevant if DB is NOT in Docker)etendotadtad5432Infrastructure mode: Ask: "How do you want to run Etendo?"
docker_com.etendoerp.docker_db=true + docker_com.etendoerp.tomcat=trueWrite the completed gradle.properties.
Ask: "Which Etendo Core mode?"
Show current build.gradle and explain the difference if needed.
Convention: All
./gradlewcalls redirect output to/tmp/etendo-{task}.log. Read that file only if the task fails.
Detect JAVA_HOME first (see _context skill section 6), then execute in this exact order:
# Detect JAVA_HOME (must be Java 17):
JAVA_HOME=$(/usr/libexec/java_home -v 17 2>/dev/null || echo "$JAVA_HOME")
# 6a. ALWAYS first -- initializes config/Openbravo.properties from gradle.properties
JAVA_HOME=${JAVA_HOME} ./gradlew setup > /tmp/etendo-setup.log 2>&1
# 6b. Source mode only: expand core source
JAVA_HOME=${JAVA_HOME} ./gradlew expandCore > /tmp/etendo-expandcore.log 2>&1
# 6c. Docker mode: start containers (setup must run first to generate correct .env with paths)
JAVA_HOME=${JAVA_HOME} ./gradlew resources.up > /tmp/etendo-resources-up.log 2>&1
docker ps --filter name=etendo --format "{{.Names}} {{.Status}}"
# 6d. Create DB schema and deploy WAR
JAVA_HOME=${JAVA_HOME} ./gradlew install > /tmp/etendo-install.log 2>&1
# 6e. Compile and deploy
JAVA_HOME=${JAVA_HOME} ./gradlew smartbuild > /tmp/etendo-smartbuild.log 2>&1
On failure, diagnose:
grep -E "ERROR|Exception|FAILED" /tmp/etendo-{task}.log | tail -30
Common errors:
invalid mount path -> setup not run before resources.upConnection refused -> DB container not yet up -> wait and retryAuthentication failed -> wrong bbdd.* credentialsCould not resolve -> invalid githubTokencurl -s -o /dev/null -w "%{http_code}" http://localhost:8080/{context.name}/security/Login
Show summary:
+ Etendo bootstrapped successfully
Project: {target_dir}
URL: http://localhost:8080/{context.name}
DB: {bbdd.sid} @ localhost:{bbdd.port}
Mode: [Source | JAR] / [Docker | Local]
Next steps:
/etendo:context set module=com.mycompany.mymodule
/etendo:smartbuild