[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-spring-create-spring-boot-project":3,"mdc--8zd22i-key":38,"related-repo-spring-create-spring-boot-project":2118,"related-org-spring-create-spring-boot-project":2153},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":21,"repoUrl":22,"updatedAt":23,"license":24,"forks":25,"topics":26,"repo":33,"sourceUrl":36,"mdContent":37},"create-spring-boot-project","initialize new Spring Boot projects","Creates a new Spring Boot project by downloading it from start.spring.io using curl, then extracting it into the target directory. Use this when a user asks to create, generate, initialize, or scaffold a new Spring Boot project.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"spring","Spring","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fspring.png","spring-projects",[13,17,20],{"name":14,"slug":15,"type":16},"Java","java","tag",{"name":18,"slug":19,"type":16},"Build","build",{"name":9,"slug":8,"type":16},971,"https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-tools","2026-07-16T06:00:59.296242",null,231,[27,8,28,29,30,31,32],"eclipse","spring-boot","sts4","theia","visual-studio-code","vscode-extension",{"repoUrl":22,"stars":21,"forks":25,"topics":34,"description":35},[27,8,28,29,30,31,32],"The next generation of tooling for Spring Boot, including support for Cloud Foundry manifest files, Concourse CI pipeline definitions, BOSH deployment manifests, and more... - Available for Visual Studio Code, Cursor, Eclipse, and Theia","https:\u002F\u002Fgithub.com\u002Fspring-projects\u002Fspring-tools\u002Ftree\u002FHEAD\u002Fclaude-plugins\u002Fspring-tools\u002Fskills\u002Fcreate-spring-boot-project","---\nname: create-spring-boot-project\ndescription: Creates a new Spring Boot project by downloading it from start.spring.io using curl, then extracting it into the target directory. Use this when a user asks to create, generate, initialize, or scaffold a new Spring Boot project.\narguments: [project_description]\nallowed-tools: Bash, View\n---\n\nYou are creating a new Spring Boot project based on the user's request: `$ARGUMENTS[0]`\n\n## Step 1: Detect the available JDK version\n\nBefore choosing parameters, detect the major version of the JDK available in the environment, and use it as the default `javaVersion`:\n\n```bash\njava -version 2>&1 | head -n 1\n```\n\nParse the major version (e.g. `21`, `17`, `11`, `8`) from the output. If no JDK is available, stop and inform the user.\n\n## Step 2: Gather project parameters\n\nDetermine the following from the user's request (use defaults where not specified):\n\n| Parameter      | Default              | Notes                                              |\n|----------------|----------------------|----------------------------------------------------|\n| `type`         | `maven-project`      | `maven-project` or `gradle-project`                |\n| `language`     | `java`               | `java`, `kotlin`, or `groovy`                      |\n| `bootVersion`  | *(omit)*             | Omit to use the latest stable version automatically|\n| `groupId`      | `com.example`        |                                                    |\n| `artifactId`   | `demo`               | Derived from project name if given                 |\n| `name`         | same as `artifactId` | Becomes the main class name (`\u003CName>Application`)  |\n| `description`  | `Demo project`       |                                                    |\n| `packageName`  | `com.example.demo`   | `groupId` + `.` + `artifactId`                     |\n| `packaging`    | `jar`                | `jar` or `war`                                     |\n| `javaVersion`  | *(detected in Step 1)* | Override only if user explicitly asked           |\n| `dependencies` | *(none)*             | Comma-separated IDs from start.spring.io           |\n\nNote that `name` is also used to derive the main application class file. A hyphenated `artifactId` like `my-service` will produce `MyServiceApplication.java`. If the user wants a specific class name, set `name` independently from `artifactId`.\n\n### Finding Dependency IDs\n\n**Common IDs:**\n- **Web**: `web` (Spring Web \u002F REST), `webflux` (Reactive Web), `graphql`, `thymeleaf`\n- **Data**: `data-jpa`, `data-mongodb`, `data-redis`, `jdbc`\n- **Database drivers**: `h2`, `postgresql`, `mysql`\n- **Security**: `security`, `oauth2-client`, `oauth2-resource-server`\n- **Messaging**: `amqp` (RabbitMQ), `kafka`, `mail`\n- **Validation \u002F DevTools \u002F Ops**: `validation`, `devtools`, `actuator`, `lombok`, `docker-compose`, `testcontainers`\n- **Cloud**: `cloud-config-client`, `cloud-eureka` (Eureka **client**), `cloud-eureka-server` (Eureka **server**)\n- **AI**: Spring AI dependency IDs (e.g. for OpenAI, Ollama, Anthropic, vector stores) change frequently between Boot versions. ALWAYS verify them via the `\u002Fdependencies` endpoint below rather than guessing.\n\nIf the user requested a technology not listed above, or you have any doubt about the exact ID, you MUST look up the correct ID by running:\n\n```bash\ncurl -sS \"https:\u002F\u002Fstart.spring.io?bootVersion=\u003CbootVersion>\" | grep -i -A1 '\u003Csearch-term>'\n```\n\n(If no specific Boot version was requested, omit the `?bootVersion=...` query parameter.)\n\nWhen called by `curl` without an `Accept: application\u002Fjson` header, `start.spring.io` returns a human-readable text page that includes a table of every supported dependency with columns `Id`, `Description`, and `Required version`. This is far simpler than parsing the JSON `\u002Fdependencies` endpoint — do NOT write a Python\u002Fjq\u002Fsed script to parse JSON. Just `curl` the URL and `grep` for the technology name (e.g. `kafka`, `openai`, `eureka`). Read the matching `Id` value directly from the table.\n\nThe `bootVersion` query parameter is accepted but does not filter rows out of the table; instead, use the `Required version` column on the matched row to confirm the dependency is compatible with the requested Boot version (e.g. `>=3.5.0 and \u003C4.1.0-M1`). If the requested Boot version falls outside that range, do not use the dependency.\n\n## Step 3: Determine the target directory\n\n- If the user specified a path, use that.\n- Otherwise, create a new folder named after the `artifactId` in the current working directory.\n- If the target directory already exists and is non-empty, STOP and ask the user whether to overwrite, choose a different name, or abort. Do not extract on top of existing files.\n\n## Step 4: Download and extract the project\n\n*Note: The commands below are designed for macOS and Linux-based systems. If you are running on Windows, you MUST adapt these commands appropriately for your environment (e.g., downloading a `.zip` to a temporary file and extracting it using PowerShell, rather than piping binary data). Note that older Windows builds may ship a `tar` that does not support `-z`; `bsdtar` from Windows 10+ does.*\n\nUse a `POST` request to `start.spring.io\u002Fstarter.tgz` and pipe it directly into `tar`. This avoids URL encoding issues for the URL itself and avoids temporary files.\n\nRun the following command. Add `-d bootVersion=\u003CbootVersion>` only if the user explicitly requested a Boot version, and omit any other `-d` parameters that are not specified:\n\n```bash\nset -o pipefail\nmkdir -p \u003Ctarget-directory>\ncurl -fsS https:\u002F\u002Fstart.spring.io\u002Fstarter.tgz \\\n  -d type=\u003Ctype> \\\n  -d language=\u003Clanguage> \\\n  -d groupId=\u003CgroupId> \\\n  -d artifactId=\u003CartifactId> \\\n  --data-urlencode \"name=\u003Cname>\" \\\n  --data-urlencode \"description=\u003Cdescription>\" \\\n  -d packageName=\u003CpackageName> \\\n  -d packaging=\u003Cpackaging> \\\n  -d javaVersion=\u003CjavaVersion> \\\n  -d dependencies=\u003Cdep1,dep2,...> | tar -xzf - -C \u003Ctarget-directory>\n```\n\nUse `--data-urlencode` for any free-text field that may contain spaces or special characters (`name`, `description`). Plain `-d` does NOT URL-encode values, which can corrupt the request body. The `-f` flag on `curl` makes HTTP errors (e.g. 400 from start.spring.io for an invalid dependency ID) return a non-zero exit code instead of streaming an error body into `tar`. Combined with `set -o pipefail`, this surfaces the real failure cause.\n\n## Step 5: Confirm success\n\nAfter extraction, verify the project was created correctly by checking for a build file:\n\n```bash\nls -la \u003Ctarget-directory>\ntest -f \u003Ctarget-directory>\u002Fpom.xml \\\n  || test -f \u003Ctarget-directory>\u002Fbuild.gradle \\\n  || test -f \u003Ctarget-directory>\u002Fbuild.gradle.kts\n```\n\nIf no build file is present, treat the operation as failed and report the issue (typically a curl\u002Ftar pipeline error from Step 4) instead of claiming success.\n\nOn rare environments, the Maven\u002FGradle wrapper scripts may not retain their executable bit after extraction. If `.\u002Fmvnw` or `.\u002Fgradlew` reports \"permission denied\", run `chmod +x mvnw gradlew` inside the project directory.\n\n## Step 6: Switch the working directory into the new project\n\nOnce Step 5 confirms success, change the shell's working directory into the newly created project directory so that any subsequent commands (build, run, edits, follow-up tool calls) operate inside the project:\n\n```bash\ncd \u003Ctarget-directory>\npwd\n```\n\nRun `pwd` afterwards and confirm the output matches the expected project directory. This `cd` MUST happen as the final action of the skill (after success verification, before reporting back to the user) so that the user's next instruction starts inside the project.\n\nIf you also have access to a tool that changes Claude Code's persistent working directory (e.g. a dedicated `cwd` \u002F project-root tool exposed by the host), use it in addition to the shell `cd` so that all tools — not just `Bash` — operate from the new location.\n\n## Step 7: Report back to the user\n\nReport:\n- The directory where the project was extracted (and confirm that the working directory is now set to it)\n- The selected dependencies\n- The resolved `javaVersion` (and how it was detected)\n- Any next steps (e.g., `.\u002Fmvnw spring-boot:run` or `.\u002Fgradlew bootRun` — note that `cd` is no longer needed because Step 6 already moved into the project)\n",{"data":39,"body":43},{"name":4,"description":6,"arguments":40,"allowed-tools":42},[41],"project_description","Bash, View",{"type":44,"children":45},"root",[46,61,68,81,136,171,177,182,558,606,613,622,901,906,975,988,1089,1116,1122,1147,1153,1193,1221,1242,1692,1755,1761,1766,1918,1923,1951,1957,1962,2001,2021,2049,2055,2060,2112],{"type":47,"tag":48,"props":49,"children":50},"element","p",{},[51,54],{"type":52,"value":53},"text","You are creating a new Spring Boot project based on the user's request: ",{"type":47,"tag":55,"props":56,"children":58},"code",{"className":57},[],[59],{"type":52,"value":60},"$ARGUMENTS[0]",{"type":47,"tag":62,"props":63,"children":65},"h2",{"id":64},"step-1-detect-the-available-jdk-version",[66],{"type":52,"value":67},"Step 1: Detect the available JDK version",{"type":47,"tag":48,"props":69,"children":70},{},[71,73,79],{"type":52,"value":72},"Before choosing parameters, detect the major version of the JDK available in the environment, and use it as the default ",{"type":47,"tag":55,"props":74,"children":76},{"className":75},[],[77],{"type":52,"value":78},"javaVersion",{"type":52,"value":80},":",{"type":47,"tag":82,"props":83,"children":88},"pre",{"className":84,"code":85,"language":86,"meta":87,"style":87},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","java -version 2>&1 | head -n 1\n","bash","",[89],{"type":47,"tag":55,"props":90,"children":91},{"__ignoreMap":87},[92],{"type":47,"tag":93,"props":94,"children":97},"span",{"class":95,"line":96},"line",1,[98,103,109,115,120,125,130],{"type":47,"tag":93,"props":99,"children":101},{"style":100},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[102],{"type":52,"value":15},{"type":47,"tag":93,"props":104,"children":106},{"style":105},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[107],{"type":52,"value":108}," -version",{"type":47,"tag":93,"props":110,"children":112},{"style":111},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[113],{"type":52,"value":114}," 2>&1",{"type":47,"tag":93,"props":116,"children":117},{"style":111},[118],{"type":52,"value":119}," |",{"type":47,"tag":93,"props":121,"children":122},{"style":100},[123],{"type":52,"value":124}," head",{"type":47,"tag":93,"props":126,"children":127},{"style":105},[128],{"type":52,"value":129}," -n",{"type":47,"tag":93,"props":131,"children":133},{"style":132},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[134],{"type":52,"value":135}," 1\n",{"type":47,"tag":48,"props":137,"children":138},{},[139,141,147,149,155,156,162,163,169],{"type":52,"value":140},"Parse the major version (e.g. ",{"type":47,"tag":55,"props":142,"children":144},{"className":143},[],[145],{"type":52,"value":146},"21",{"type":52,"value":148},", ",{"type":47,"tag":55,"props":150,"children":152},{"className":151},[],[153],{"type":52,"value":154},"17",{"type":52,"value":148},{"type":47,"tag":55,"props":157,"children":159},{"className":158},[],[160],{"type":52,"value":161},"11",{"type":52,"value":148},{"type":47,"tag":55,"props":164,"children":166},{"className":165},[],[167],{"type":52,"value":168},"8",{"type":52,"value":170},") from the output. If no JDK is available, stop and inform the user.",{"type":47,"tag":62,"props":172,"children":174},{"id":173},"step-2-gather-project-parameters",[175],{"type":52,"value":176},"Step 2: Gather project parameters",{"type":47,"tag":48,"props":178,"children":179},{},[180],{"type":52,"value":181},"Determine the following from the user's request (use defaults where not specified):",{"type":47,"tag":183,"props":184,"children":185},"table",{},[186,210],{"type":47,"tag":187,"props":188,"children":189},"thead",{},[190],{"type":47,"tag":191,"props":192,"children":193},"tr",{},[194,200,205],{"type":47,"tag":195,"props":196,"children":197},"th",{},[198],{"type":52,"value":199},"Parameter",{"type":47,"tag":195,"props":201,"children":202},{},[203],{"type":52,"value":204},"Default",{"type":47,"tag":195,"props":206,"children":207},{},[208],{"type":52,"value":209},"Notes",{"type":47,"tag":211,"props":212,"children":213},"tbody",{},[214,252,295,321,345,371,406,430,473,509,533],{"type":47,"tag":191,"props":215,"children":216},{},[217,227,236],{"type":47,"tag":218,"props":219,"children":220},"td",{},[221],{"type":47,"tag":55,"props":222,"children":224},{"className":223},[],[225],{"type":52,"value":226},"type",{"type":47,"tag":218,"props":228,"children":229},{},[230],{"type":47,"tag":55,"props":231,"children":233},{"className":232},[],[234],{"type":52,"value":235},"maven-project",{"type":47,"tag":218,"props":237,"children":238},{},[239,244,246],{"type":47,"tag":55,"props":240,"children":242},{"className":241},[],[243],{"type":52,"value":235},{"type":52,"value":245}," or ",{"type":47,"tag":55,"props":247,"children":249},{"className":248},[],[250],{"type":52,"value":251},"gradle-project",{"type":47,"tag":191,"props":253,"children":254},{},[255,264,272],{"type":47,"tag":218,"props":256,"children":257},{},[258],{"type":47,"tag":55,"props":259,"children":261},{"className":260},[],[262],{"type":52,"value":263},"language",{"type":47,"tag":218,"props":265,"children":266},{},[267],{"type":47,"tag":55,"props":268,"children":270},{"className":269},[],[271],{"type":52,"value":15},{"type":47,"tag":218,"props":273,"children":274},{},[275,280,281,287,289],{"type":47,"tag":55,"props":276,"children":278},{"className":277},[],[279],{"type":52,"value":15},{"type":52,"value":148},{"type":47,"tag":55,"props":282,"children":284},{"className":283},[],[285],{"type":52,"value":286},"kotlin",{"type":52,"value":288},", or ",{"type":47,"tag":55,"props":290,"children":292},{"className":291},[],[293],{"type":52,"value":294},"groovy",{"type":47,"tag":191,"props":296,"children":297},{},[298,307,316],{"type":47,"tag":218,"props":299,"children":300},{},[301],{"type":47,"tag":55,"props":302,"children":304},{"className":303},[],[305],{"type":52,"value":306},"bootVersion",{"type":47,"tag":218,"props":308,"children":309},{},[310],{"type":47,"tag":311,"props":312,"children":313},"em",{},[314],{"type":52,"value":315},"(omit)",{"type":47,"tag":218,"props":317,"children":318},{},[319],{"type":52,"value":320},"Omit to use the latest stable version automatically",{"type":47,"tag":191,"props":322,"children":323},{},[324,333,342],{"type":47,"tag":218,"props":325,"children":326},{},[327],{"type":47,"tag":55,"props":328,"children":330},{"className":329},[],[331],{"type":52,"value":332},"groupId",{"type":47,"tag":218,"props":334,"children":335},{},[336],{"type":47,"tag":55,"props":337,"children":339},{"className":338},[],[340],{"type":52,"value":341},"com.example",{"type":47,"tag":218,"props":343,"children":344},{},[],{"type":47,"tag":191,"props":346,"children":347},{},[348,357,366],{"type":47,"tag":218,"props":349,"children":350},{},[351],{"type":47,"tag":55,"props":352,"children":354},{"className":353},[],[355],{"type":52,"value":356},"artifactId",{"type":47,"tag":218,"props":358,"children":359},{},[360],{"type":47,"tag":55,"props":361,"children":363},{"className":362},[],[364],{"type":52,"value":365},"demo",{"type":47,"tag":218,"props":367,"children":368},{},[369],{"type":52,"value":370},"Derived from project name if given",{"type":47,"tag":191,"props":372,"children":373},{},[374,383,393],{"type":47,"tag":218,"props":375,"children":376},{},[377],{"type":47,"tag":55,"props":378,"children":380},{"className":379},[],[381],{"type":52,"value":382},"name",{"type":47,"tag":218,"props":384,"children":385},{},[386,388],{"type":52,"value":387},"same as ",{"type":47,"tag":55,"props":389,"children":391},{"className":390},[],[392],{"type":52,"value":356},{"type":47,"tag":218,"props":394,"children":395},{},[396,398,404],{"type":52,"value":397},"Becomes the main class name (",{"type":47,"tag":55,"props":399,"children":401},{"className":400},[],[402],{"type":52,"value":403},"\u003CName>Application",{"type":52,"value":405},")",{"type":47,"tag":191,"props":407,"children":408},{},[409,418,427],{"type":47,"tag":218,"props":410,"children":411},{},[412],{"type":47,"tag":55,"props":413,"children":415},{"className":414},[],[416],{"type":52,"value":417},"description",{"type":47,"tag":218,"props":419,"children":420},{},[421],{"type":47,"tag":55,"props":422,"children":424},{"className":423},[],[425],{"type":52,"value":426},"Demo project",{"type":47,"tag":218,"props":428,"children":429},{},[],{"type":47,"tag":191,"props":431,"children":432},{},[433,442,451],{"type":47,"tag":218,"props":434,"children":435},{},[436],{"type":47,"tag":55,"props":437,"children":439},{"className":438},[],[440],{"type":52,"value":441},"packageName",{"type":47,"tag":218,"props":443,"children":444},{},[445],{"type":47,"tag":55,"props":446,"children":448},{"className":447},[],[449],{"type":52,"value":450},"com.example.demo",{"type":47,"tag":218,"props":452,"children":453},{},[454,459,461,467,468],{"type":47,"tag":55,"props":455,"children":457},{"className":456},[],[458],{"type":52,"value":332},{"type":52,"value":460}," + ",{"type":47,"tag":55,"props":462,"children":464},{"className":463},[],[465],{"type":52,"value":466},".",{"type":52,"value":460},{"type":47,"tag":55,"props":469,"children":471},{"className":470},[],[472],{"type":52,"value":356},{"type":47,"tag":191,"props":474,"children":475},{},[476,485,494],{"type":47,"tag":218,"props":477,"children":478},{},[479],{"type":47,"tag":55,"props":480,"children":482},{"className":481},[],[483],{"type":52,"value":484},"packaging",{"type":47,"tag":218,"props":486,"children":487},{},[488],{"type":47,"tag":55,"props":489,"children":491},{"className":490},[],[492],{"type":52,"value":493},"jar",{"type":47,"tag":218,"props":495,"children":496},{},[497,502,503],{"type":47,"tag":55,"props":498,"children":500},{"className":499},[],[501],{"type":52,"value":493},{"type":52,"value":245},{"type":47,"tag":55,"props":504,"children":506},{"className":505},[],[507],{"type":52,"value":508},"war",{"type":47,"tag":191,"props":510,"children":511},{},[512,520,528],{"type":47,"tag":218,"props":513,"children":514},{},[515],{"type":47,"tag":55,"props":516,"children":518},{"className":517},[],[519],{"type":52,"value":78},{"type":47,"tag":218,"props":521,"children":522},{},[523],{"type":47,"tag":311,"props":524,"children":525},{},[526],{"type":52,"value":527},"(detected in Step 1)",{"type":47,"tag":218,"props":529,"children":530},{},[531],{"type":52,"value":532},"Override only if user explicitly asked",{"type":47,"tag":191,"props":534,"children":535},{},[536,545,553],{"type":47,"tag":218,"props":537,"children":538},{},[539],{"type":47,"tag":55,"props":540,"children":542},{"className":541},[],[543],{"type":52,"value":544},"dependencies",{"type":47,"tag":218,"props":546,"children":547},{},[548],{"type":47,"tag":311,"props":549,"children":550},{},[551],{"type":52,"value":552},"(none)",{"type":47,"tag":218,"props":554,"children":555},{},[556],{"type":52,"value":557},"Comma-separated IDs from start.spring.io",{"type":47,"tag":48,"props":559,"children":560},{},[561,563,568,570,575,577,583,585,591,593,598,600,605],{"type":52,"value":562},"Note that ",{"type":47,"tag":55,"props":564,"children":566},{"className":565},[],[567],{"type":52,"value":382},{"type":52,"value":569}," is also used to derive the main application class file. A hyphenated ",{"type":47,"tag":55,"props":571,"children":573},{"className":572},[],[574],{"type":52,"value":356},{"type":52,"value":576}," like ",{"type":47,"tag":55,"props":578,"children":580},{"className":579},[],[581],{"type":52,"value":582},"my-service",{"type":52,"value":584}," will produce ",{"type":47,"tag":55,"props":586,"children":588},{"className":587},[],[589],{"type":52,"value":590},"MyServiceApplication.java",{"type":52,"value":592},". If the user wants a specific class name, set ",{"type":47,"tag":55,"props":594,"children":596},{"className":595},[],[597],{"type":52,"value":382},{"type":52,"value":599}," independently from ",{"type":47,"tag":55,"props":601,"children":603},{"className":602},[],[604],{"type":52,"value":356},{"type":52,"value":466},{"type":47,"tag":607,"props":608,"children":610},"h3",{"id":609},"finding-dependency-ids",[611],{"type":52,"value":612},"Finding Dependency IDs",{"type":47,"tag":48,"props":614,"children":615},{},[616],{"type":47,"tag":617,"props":618,"children":619},"strong",{},[620],{"type":52,"value":621},"Common IDs:",{"type":47,"tag":623,"props":624,"children":625},"ul",{},[626,666,702,730,759,789,839,883],{"type":47,"tag":627,"props":628,"children":629},"li",{},[630,635,637,643,645,651,653,659,660],{"type":47,"tag":617,"props":631,"children":632},{},[633],{"type":52,"value":634},"Web",{"type":52,"value":636},": ",{"type":47,"tag":55,"props":638,"children":640},{"className":639},[],[641],{"type":52,"value":642},"web",{"type":52,"value":644}," (Spring Web \u002F REST), ",{"type":47,"tag":55,"props":646,"children":648},{"className":647},[],[649],{"type":52,"value":650},"webflux",{"type":52,"value":652}," (Reactive Web), ",{"type":47,"tag":55,"props":654,"children":656},{"className":655},[],[657],{"type":52,"value":658},"graphql",{"type":52,"value":148},{"type":47,"tag":55,"props":661,"children":663},{"className":662},[],[664],{"type":52,"value":665},"thymeleaf",{"type":47,"tag":627,"props":667,"children":668},{},[669,674,675,681,682,688,689,695,696],{"type":47,"tag":617,"props":670,"children":671},{},[672],{"type":52,"value":673},"Data",{"type":52,"value":636},{"type":47,"tag":55,"props":676,"children":678},{"className":677},[],[679],{"type":52,"value":680},"data-jpa",{"type":52,"value":148},{"type":47,"tag":55,"props":683,"children":685},{"className":684},[],[686],{"type":52,"value":687},"data-mongodb",{"type":52,"value":148},{"type":47,"tag":55,"props":690,"children":692},{"className":691},[],[693],{"type":52,"value":694},"data-redis",{"type":52,"value":148},{"type":47,"tag":55,"props":697,"children":699},{"className":698},[],[700],{"type":52,"value":701},"jdbc",{"type":47,"tag":627,"props":703,"children":704},{},[705,710,711,716,717,723,724],{"type":47,"tag":617,"props":706,"children":707},{},[708],{"type":52,"value":709},"Database drivers",{"type":52,"value":636},{"type":47,"tag":55,"props":712,"children":714},{"className":713},[],[715],{"type":52,"value":62},{"type":52,"value":148},{"type":47,"tag":55,"props":718,"children":720},{"className":719},[],[721],{"type":52,"value":722},"postgresql",{"type":52,"value":148},{"type":47,"tag":55,"props":725,"children":727},{"className":726},[],[728],{"type":52,"value":729},"mysql",{"type":47,"tag":627,"props":731,"children":732},{},[733,738,739,745,746,752,753],{"type":47,"tag":617,"props":734,"children":735},{},[736],{"type":52,"value":737},"Security",{"type":52,"value":636},{"type":47,"tag":55,"props":740,"children":742},{"className":741},[],[743],{"type":52,"value":744},"security",{"type":52,"value":148},{"type":47,"tag":55,"props":747,"children":749},{"className":748},[],[750],{"type":52,"value":751},"oauth2-client",{"type":52,"value":148},{"type":47,"tag":55,"props":754,"children":756},{"className":755},[],[757],{"type":52,"value":758},"oauth2-resource-server",{"type":47,"tag":627,"props":760,"children":761},{},[762,767,768,774,776,782,783],{"type":47,"tag":617,"props":763,"children":764},{},[765],{"type":52,"value":766},"Messaging",{"type":52,"value":636},{"type":47,"tag":55,"props":769,"children":771},{"className":770},[],[772],{"type":52,"value":773},"amqp",{"type":52,"value":775}," (RabbitMQ), ",{"type":47,"tag":55,"props":777,"children":779},{"className":778},[],[780],{"type":52,"value":781},"kafka",{"type":52,"value":148},{"type":47,"tag":55,"props":784,"children":786},{"className":785},[],[787],{"type":52,"value":788},"mail",{"type":47,"tag":627,"props":790,"children":791},{},[792,797,798,804,805,811,812,818,819,825,826,832,833],{"type":47,"tag":617,"props":793,"children":794},{},[795],{"type":52,"value":796},"Validation \u002F DevTools \u002F Ops",{"type":52,"value":636},{"type":47,"tag":55,"props":799,"children":801},{"className":800},[],[802],{"type":52,"value":803},"validation",{"type":52,"value":148},{"type":47,"tag":55,"props":806,"children":808},{"className":807},[],[809],{"type":52,"value":810},"devtools",{"type":52,"value":148},{"type":47,"tag":55,"props":813,"children":815},{"className":814},[],[816],{"type":52,"value":817},"actuator",{"type":52,"value":148},{"type":47,"tag":55,"props":820,"children":822},{"className":821},[],[823],{"type":52,"value":824},"lombok",{"type":52,"value":148},{"type":47,"tag":55,"props":827,"children":829},{"className":828},[],[830],{"type":52,"value":831},"docker-compose",{"type":52,"value":148},{"type":47,"tag":55,"props":834,"children":836},{"className":835},[],[837],{"type":52,"value":838},"testcontainers",{"type":47,"tag":627,"props":840,"children":841},{},[842,847,848,854,855,861,863,868,870,876,877,882],{"type":47,"tag":617,"props":843,"children":844},{},[845],{"type":52,"value":846},"Cloud",{"type":52,"value":636},{"type":47,"tag":55,"props":849,"children":851},{"className":850},[],[852],{"type":52,"value":853},"cloud-config-client",{"type":52,"value":148},{"type":47,"tag":55,"props":856,"children":858},{"className":857},[],[859],{"type":52,"value":860},"cloud-eureka",{"type":52,"value":862}," (Eureka ",{"type":47,"tag":617,"props":864,"children":865},{},[866],{"type":52,"value":867},"client",{"type":52,"value":869},"), ",{"type":47,"tag":55,"props":871,"children":873},{"className":872},[],[874],{"type":52,"value":875},"cloud-eureka-server",{"type":52,"value":862},{"type":47,"tag":617,"props":878,"children":879},{},[880],{"type":52,"value":881},"server",{"type":52,"value":405},{"type":47,"tag":627,"props":884,"children":885},{},[886,891,893,899],{"type":47,"tag":617,"props":887,"children":888},{},[889],{"type":52,"value":890},"AI",{"type":52,"value":892},": Spring AI dependency IDs (e.g. for OpenAI, Ollama, Anthropic, vector stores) change frequently between Boot versions. ALWAYS verify them via the ",{"type":47,"tag":55,"props":894,"children":896},{"className":895},[],[897],{"type":52,"value":898},"\u002Fdependencies",{"type":52,"value":900}," endpoint below rather than guessing.",{"type":47,"tag":48,"props":902,"children":903},{},[904],{"type":52,"value":905},"If the user requested a technology not listed above, or you have any doubt about the exact ID, you MUST look up the correct ID by running:",{"type":47,"tag":82,"props":907,"children":909},{"className":84,"code":908,"language":86,"meta":87,"style":87},"curl -sS \"https:\u002F\u002Fstart.spring.io?bootVersion=\u003CbootVersion>\" | grep -i -A1 '\u003Csearch-term>'\n",[910],{"type":47,"tag":55,"props":911,"children":912},{"__ignoreMap":87},[913],{"type":47,"tag":93,"props":914,"children":915},{"class":95,"line":96},[916,921,926,931,936,941,945,950,955,960,965,970],{"type":47,"tag":93,"props":917,"children":918},{"style":100},[919],{"type":52,"value":920},"curl",{"type":47,"tag":93,"props":922,"children":923},{"style":105},[924],{"type":52,"value":925}," -sS",{"type":47,"tag":93,"props":927,"children":928},{"style":111},[929],{"type":52,"value":930}," \"",{"type":47,"tag":93,"props":932,"children":933},{"style":105},[934],{"type":52,"value":935},"https:\u002F\u002Fstart.spring.io?bootVersion=\u003CbootVersion>",{"type":47,"tag":93,"props":937,"children":938},{"style":111},[939],{"type":52,"value":940},"\"",{"type":47,"tag":93,"props":942,"children":943},{"style":111},[944],{"type":52,"value":119},{"type":47,"tag":93,"props":946,"children":947},{"style":100},[948],{"type":52,"value":949}," grep",{"type":47,"tag":93,"props":951,"children":952},{"style":105},[953],{"type":52,"value":954}," -i",{"type":47,"tag":93,"props":956,"children":957},{"style":105},[958],{"type":52,"value":959}," -A1",{"type":47,"tag":93,"props":961,"children":962},{"style":111},[963],{"type":52,"value":964}," '",{"type":47,"tag":93,"props":966,"children":967},{"style":105},[968],{"type":52,"value":969},"\u003Csearch-term>",{"type":47,"tag":93,"props":971,"children":972},{"style":111},[973],{"type":52,"value":974},"'\n",{"type":47,"tag":48,"props":976,"children":977},{},[978,980,986],{"type":52,"value":979},"(If no specific Boot version was requested, omit the ",{"type":47,"tag":55,"props":981,"children":983},{"className":982},[],[984],{"type":52,"value":985},"?bootVersion=...",{"type":52,"value":987}," query parameter.)",{"type":47,"tag":48,"props":989,"children":990},{},[991,993,998,1000,1006,1008,1014,1016,1022,1023,1029,1031,1037,1039,1044,1046,1051,1053,1059,1061,1066,1067,1073,1074,1080,1082,1087],{"type":52,"value":992},"When called by ",{"type":47,"tag":55,"props":994,"children":996},{"className":995},[],[997],{"type":52,"value":920},{"type":52,"value":999}," without an ",{"type":47,"tag":55,"props":1001,"children":1003},{"className":1002},[],[1004],{"type":52,"value":1005},"Accept: application\u002Fjson",{"type":52,"value":1007}," header, ",{"type":47,"tag":55,"props":1009,"children":1011},{"className":1010},[],[1012],{"type":52,"value":1013},"start.spring.io",{"type":52,"value":1015}," returns a human-readable text page that includes a table of every supported dependency with columns ",{"type":47,"tag":55,"props":1017,"children":1019},{"className":1018},[],[1020],{"type":52,"value":1021},"Id",{"type":52,"value":148},{"type":47,"tag":55,"props":1024,"children":1026},{"className":1025},[],[1027],{"type":52,"value":1028},"Description",{"type":52,"value":1030},", and ",{"type":47,"tag":55,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":52,"value":1036},"Required version",{"type":52,"value":1038},". This is far simpler than parsing the JSON ",{"type":47,"tag":55,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":52,"value":898},{"type":52,"value":1045}," endpoint — do NOT write a Python\u002Fjq\u002Fsed script to parse JSON. Just ",{"type":47,"tag":55,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":52,"value":920},{"type":52,"value":1052}," the URL and ",{"type":47,"tag":55,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":52,"value":1058},"grep",{"type":52,"value":1060}," for the technology name (e.g. ",{"type":47,"tag":55,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":52,"value":781},{"type":52,"value":148},{"type":47,"tag":55,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":52,"value":1072},"openai",{"type":52,"value":148},{"type":47,"tag":55,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":52,"value":1079},"eureka",{"type":52,"value":1081},"). Read the matching ",{"type":47,"tag":55,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":52,"value":1021},{"type":52,"value":1088}," value directly from the table.",{"type":47,"tag":48,"props":1090,"children":1091},{},[1092,1094,1099,1101,1106,1108,1114],{"type":52,"value":1093},"The ",{"type":47,"tag":55,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":52,"value":306},{"type":52,"value":1100}," query parameter is accepted but does not filter rows out of the table; instead, use the ",{"type":47,"tag":55,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":52,"value":1036},{"type":52,"value":1107}," column on the matched row to confirm the dependency is compatible with the requested Boot version (e.g. ",{"type":47,"tag":55,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":52,"value":1113},">=3.5.0 and \u003C4.1.0-M1",{"type":52,"value":1115},"). If the requested Boot version falls outside that range, do not use the dependency.",{"type":47,"tag":62,"props":1117,"children":1119},{"id":1118},"step-3-determine-the-target-directory",[1120],{"type":52,"value":1121},"Step 3: Determine the target directory",{"type":47,"tag":623,"props":1123,"children":1124},{},[1125,1130,1142],{"type":47,"tag":627,"props":1126,"children":1127},{},[1128],{"type":52,"value":1129},"If the user specified a path, use that.",{"type":47,"tag":627,"props":1131,"children":1132},{},[1133,1135,1140],{"type":52,"value":1134},"Otherwise, create a new folder named after the ",{"type":47,"tag":55,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":52,"value":356},{"type":52,"value":1141}," in the current working directory.",{"type":47,"tag":627,"props":1143,"children":1144},{},[1145],{"type":52,"value":1146},"If the target directory already exists and is non-empty, STOP and ask the user whether to overwrite, choose a different name, or abort. Do not extract on top of existing files.",{"type":47,"tag":62,"props":1148,"children":1150},{"id":1149},"step-4-download-and-extract-the-project",[1151],{"type":52,"value":1152},"Step 4: Download and extract the project",{"type":47,"tag":48,"props":1154,"children":1155},{},[1156],{"type":47,"tag":311,"props":1157,"children":1158},{},[1159,1161,1167,1169,1175,1177,1183,1185,1191],{"type":52,"value":1160},"Note: The commands below are designed for macOS and Linux-based systems. If you are running on Windows, you MUST adapt these commands appropriately for your environment (e.g., downloading a ",{"type":47,"tag":55,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":52,"value":1166},".zip",{"type":52,"value":1168}," to a temporary file and extracting it using PowerShell, rather than piping binary data). Note that older Windows builds may ship a ",{"type":47,"tag":55,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":52,"value":1174},"tar",{"type":52,"value":1176}," that does not support ",{"type":47,"tag":55,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":52,"value":1182},"-z",{"type":52,"value":1184},"; ",{"type":47,"tag":55,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":52,"value":1190},"bsdtar",{"type":52,"value":1192}," from Windows 10+ does.",{"type":47,"tag":48,"props":1194,"children":1195},{},[1196,1198,1204,1206,1212,1214,1219],{"type":52,"value":1197},"Use a ",{"type":47,"tag":55,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":52,"value":1203},"POST",{"type":52,"value":1205}," request to ",{"type":47,"tag":55,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":52,"value":1211},"start.spring.io\u002Fstarter.tgz",{"type":52,"value":1213}," and pipe it directly into ",{"type":47,"tag":55,"props":1215,"children":1217},{"className":1216},[],[1218],{"type":52,"value":1174},{"type":52,"value":1220},". This avoids URL encoding issues for the URL itself and avoids temporary files.",{"type":47,"tag":48,"props":1222,"children":1223},{},[1224,1226,1232,1234,1240],{"type":52,"value":1225},"Run the following command. Add ",{"type":47,"tag":55,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":52,"value":1231},"-d bootVersion=\u003CbootVersion>",{"type":52,"value":1233}," only if the user explicitly requested a Boot version, and omit any other ",{"type":47,"tag":55,"props":1235,"children":1237},{"className":1236},[],[1238],{"type":52,"value":1239},"-d",{"type":52,"value":1241}," parameters that are not specified:",{"type":47,"tag":82,"props":1243,"children":1245},{"className":84,"code":1244,"language":86,"meta":87,"style":87},"set -o pipefail\nmkdir -p \u003Ctarget-directory>\ncurl -fsS https:\u002F\u002Fstart.spring.io\u002Fstarter.tgz \\\n  -d type=\u003Ctype> \\\n  -d language=\u003Clanguage> \\\n  -d groupId=\u003CgroupId> \\\n  -d artifactId=\u003CartifactId> \\\n  --data-urlencode \"name=\u003Cname>\" \\\n  --data-urlencode \"description=\u003Cdescription>\" \\\n  -d packageName=\u003CpackageName> \\\n  -d packaging=\u003Cpackaging> \\\n  -d javaVersion=\u003CjavaVersion> \\\n  -d dependencies=\u003Cdep1,dep2,...> | tar -xzf - -C \u003Ctarget-directory>\n",[1246],{"type":47,"tag":55,"props":1247,"children":1248},{"__ignoreMap":87},[1249,1268,1303,1326,1364,1398,1433,1467,1493,1518,1552,1587,1622],{"type":47,"tag":93,"props":1250,"children":1251},{"class":95,"line":96},[1252,1258,1263],{"type":47,"tag":93,"props":1253,"children":1255},{"style":1254},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1256],{"type":52,"value":1257},"set",{"type":47,"tag":93,"props":1259,"children":1260},{"style":105},[1261],{"type":52,"value":1262}," -o",{"type":47,"tag":93,"props":1264,"children":1265},{"style":105},[1266],{"type":52,"value":1267}," pipefail\n",{"type":47,"tag":93,"props":1269,"children":1271},{"class":95,"line":1270},2,[1272,1277,1282,1287,1292,1298],{"type":47,"tag":93,"props":1273,"children":1274},{"style":100},[1275],{"type":52,"value":1276},"mkdir",{"type":47,"tag":93,"props":1278,"children":1279},{"style":105},[1280],{"type":52,"value":1281}," -p",{"type":47,"tag":93,"props":1283,"children":1284},{"style":111},[1285],{"type":52,"value":1286}," \u003C",{"type":47,"tag":93,"props":1288,"children":1289},{"style":105},[1290],{"type":52,"value":1291},"target-director",{"type":47,"tag":93,"props":1293,"children":1295},{"style":1294},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1296],{"type":52,"value":1297},"y",{"type":47,"tag":93,"props":1299,"children":1300},{"style":111},[1301],{"type":52,"value":1302},">\n",{"type":47,"tag":93,"props":1304,"children":1306},{"class":95,"line":1305},3,[1307,1311,1316,1321],{"type":47,"tag":93,"props":1308,"children":1309},{"style":100},[1310],{"type":52,"value":920},{"type":47,"tag":93,"props":1312,"children":1313},{"style":105},[1314],{"type":52,"value":1315}," -fsS",{"type":47,"tag":93,"props":1317,"children":1318},{"style":105},[1319],{"type":52,"value":1320}," https:\u002F\u002Fstart.spring.io\u002Fstarter.tgz",{"type":47,"tag":93,"props":1322,"children":1323},{"style":1294},[1324],{"type":52,"value":1325}," \\\n",{"type":47,"tag":93,"props":1327,"children":1329},{"class":95,"line":1328},4,[1330,1335,1340,1345,1350,1355,1360],{"type":47,"tag":93,"props":1331,"children":1332},{"style":105},[1333],{"type":52,"value":1334},"  -d",{"type":47,"tag":93,"props":1336,"children":1337},{"style":105},[1338],{"type":52,"value":1339}," type=",{"type":47,"tag":93,"props":1341,"children":1342},{"style":111},[1343],{"type":52,"value":1344},"\u003C",{"type":47,"tag":93,"props":1346,"children":1347},{"style":105},[1348],{"type":52,"value":1349},"typ",{"type":47,"tag":93,"props":1351,"children":1352},{"style":1294},[1353],{"type":52,"value":1354},"e",{"type":47,"tag":93,"props":1356,"children":1357},{"style":111},[1358],{"type":52,"value":1359},">",{"type":47,"tag":93,"props":1361,"children":1362},{"style":1294},[1363],{"type":52,"value":1325},{"type":47,"tag":93,"props":1365,"children":1367},{"class":95,"line":1366},5,[1368,1372,1377,1381,1386,1390,1394],{"type":47,"tag":93,"props":1369,"children":1370},{"style":105},[1371],{"type":52,"value":1334},{"type":47,"tag":93,"props":1373,"children":1374},{"style":105},[1375],{"type":52,"value":1376}," language=",{"type":47,"tag":93,"props":1378,"children":1379},{"style":111},[1380],{"type":52,"value":1344},{"type":47,"tag":93,"props":1382,"children":1383},{"style":105},[1384],{"type":52,"value":1385},"languag",{"type":47,"tag":93,"props":1387,"children":1388},{"style":1294},[1389],{"type":52,"value":1354},{"type":47,"tag":93,"props":1391,"children":1392},{"style":111},[1393],{"type":52,"value":1359},{"type":47,"tag":93,"props":1395,"children":1396},{"style":1294},[1397],{"type":52,"value":1325},{"type":47,"tag":93,"props":1399,"children":1401},{"class":95,"line":1400},6,[1402,1406,1411,1415,1420,1425,1429],{"type":47,"tag":93,"props":1403,"children":1404},{"style":105},[1405],{"type":52,"value":1334},{"type":47,"tag":93,"props":1407,"children":1408},{"style":105},[1409],{"type":52,"value":1410}," groupId=",{"type":47,"tag":93,"props":1412,"children":1413},{"style":111},[1414],{"type":52,"value":1344},{"type":47,"tag":93,"props":1416,"children":1417},{"style":105},[1418],{"type":52,"value":1419},"groupI",{"type":47,"tag":93,"props":1421,"children":1422},{"style":1294},[1423],{"type":52,"value":1424},"d",{"type":47,"tag":93,"props":1426,"children":1427},{"style":111},[1428],{"type":52,"value":1359},{"type":47,"tag":93,"props":1430,"children":1431},{"style":1294},[1432],{"type":52,"value":1325},{"type":47,"tag":93,"props":1434,"children":1436},{"class":95,"line":1435},7,[1437,1441,1446,1450,1455,1459,1463],{"type":47,"tag":93,"props":1438,"children":1439},{"style":105},[1440],{"type":52,"value":1334},{"type":47,"tag":93,"props":1442,"children":1443},{"style":105},[1444],{"type":52,"value":1445}," artifactId=",{"type":47,"tag":93,"props":1447,"children":1448},{"style":111},[1449],{"type":52,"value":1344},{"type":47,"tag":93,"props":1451,"children":1452},{"style":105},[1453],{"type":52,"value":1454},"artifactI",{"type":47,"tag":93,"props":1456,"children":1457},{"style":1294},[1458],{"type":52,"value":1424},{"type":47,"tag":93,"props":1460,"children":1461},{"style":111},[1462],{"type":52,"value":1359},{"type":47,"tag":93,"props":1464,"children":1465},{"style":1294},[1466],{"type":52,"value":1325},{"type":47,"tag":93,"props":1468,"children":1470},{"class":95,"line":1469},8,[1471,1476,1480,1485,1489],{"type":47,"tag":93,"props":1472,"children":1473},{"style":105},[1474],{"type":52,"value":1475},"  --data-urlencode",{"type":47,"tag":93,"props":1477,"children":1478},{"style":111},[1479],{"type":52,"value":930},{"type":47,"tag":93,"props":1481,"children":1482},{"style":105},[1483],{"type":52,"value":1484},"name=\u003Cname>",{"type":47,"tag":93,"props":1486,"children":1487},{"style":111},[1488],{"type":52,"value":940},{"type":47,"tag":93,"props":1490,"children":1491},{"style":1294},[1492],{"type":52,"value":1325},{"type":47,"tag":93,"props":1494,"children":1496},{"class":95,"line":1495},9,[1497,1501,1505,1510,1514],{"type":47,"tag":93,"props":1498,"children":1499},{"style":105},[1500],{"type":52,"value":1475},{"type":47,"tag":93,"props":1502,"children":1503},{"style":111},[1504],{"type":52,"value":930},{"type":47,"tag":93,"props":1506,"children":1507},{"style":105},[1508],{"type":52,"value":1509},"description=\u003Cdescription>",{"type":47,"tag":93,"props":1511,"children":1512},{"style":111},[1513],{"type":52,"value":940},{"type":47,"tag":93,"props":1515,"children":1516},{"style":1294},[1517],{"type":52,"value":1325},{"type":47,"tag":93,"props":1519,"children":1521},{"class":95,"line":1520},10,[1522,1526,1531,1535,1540,1544,1548],{"type":47,"tag":93,"props":1523,"children":1524},{"style":105},[1525],{"type":52,"value":1334},{"type":47,"tag":93,"props":1527,"children":1528},{"style":105},[1529],{"type":52,"value":1530}," packageName=",{"type":47,"tag":93,"props":1532,"children":1533},{"style":111},[1534],{"type":52,"value":1344},{"type":47,"tag":93,"props":1536,"children":1537},{"style":105},[1538],{"type":52,"value":1539},"packageNam",{"type":47,"tag":93,"props":1541,"children":1542},{"style":1294},[1543],{"type":52,"value":1354},{"type":47,"tag":93,"props":1545,"children":1546},{"style":111},[1547],{"type":52,"value":1359},{"type":47,"tag":93,"props":1549,"children":1550},{"style":1294},[1551],{"type":52,"value":1325},{"type":47,"tag":93,"props":1553,"children":1555},{"class":95,"line":1554},11,[1556,1560,1565,1569,1574,1579,1583],{"type":47,"tag":93,"props":1557,"children":1558},{"style":105},[1559],{"type":52,"value":1334},{"type":47,"tag":93,"props":1561,"children":1562},{"style":105},[1563],{"type":52,"value":1564}," packaging=",{"type":47,"tag":93,"props":1566,"children":1567},{"style":111},[1568],{"type":52,"value":1344},{"type":47,"tag":93,"props":1570,"children":1571},{"style":105},[1572],{"type":52,"value":1573},"packagin",{"type":47,"tag":93,"props":1575,"children":1576},{"style":1294},[1577],{"type":52,"value":1578},"g",{"type":47,"tag":93,"props":1580,"children":1581},{"style":111},[1582],{"type":52,"value":1359},{"type":47,"tag":93,"props":1584,"children":1585},{"style":1294},[1586],{"type":52,"value":1325},{"type":47,"tag":93,"props":1588,"children":1590},{"class":95,"line":1589},12,[1591,1595,1600,1604,1609,1614,1618],{"type":47,"tag":93,"props":1592,"children":1593},{"style":105},[1594],{"type":52,"value":1334},{"type":47,"tag":93,"props":1596,"children":1597},{"style":105},[1598],{"type":52,"value":1599}," javaVersion=",{"type":47,"tag":93,"props":1601,"children":1602},{"style":111},[1603],{"type":52,"value":1344},{"type":47,"tag":93,"props":1605,"children":1606},{"style":105},[1607],{"type":52,"value":1608},"javaVersio",{"type":47,"tag":93,"props":1610,"children":1611},{"style":1294},[1612],{"type":52,"value":1613},"n",{"type":47,"tag":93,"props":1615,"children":1616},{"style":111},[1617],{"type":52,"value":1359},{"type":47,"tag":93,"props":1619,"children":1620},{"style":1294},[1621],{"type":52,"value":1325},{"type":47,"tag":93,"props":1623,"children":1625},{"class":95,"line":1624},13,[1626,1630,1635,1639,1644,1648,1652,1656,1661,1666,1671,1676,1680,1684,1688],{"type":47,"tag":93,"props":1627,"children":1628},{"style":105},[1629],{"type":52,"value":1334},{"type":47,"tag":93,"props":1631,"children":1632},{"style":105},[1633],{"type":52,"value":1634}," dependencies=",{"type":47,"tag":93,"props":1636,"children":1637},{"style":111},[1638],{"type":52,"value":1344},{"type":47,"tag":93,"props":1640,"children":1641},{"style":105},[1642],{"type":52,"value":1643},"dep1,dep2,..",{"type":47,"tag":93,"props":1645,"children":1646},{"style":1294},[1647],{"type":52,"value":466},{"type":47,"tag":93,"props":1649,"children":1650},{"style":111},[1651],{"type":52,"value":1359},{"type":47,"tag":93,"props":1653,"children":1654},{"style":111},[1655],{"type":52,"value":119},{"type":47,"tag":93,"props":1657,"children":1658},{"style":100},[1659],{"type":52,"value":1660}," tar",{"type":47,"tag":93,"props":1662,"children":1663},{"style":105},[1664],{"type":52,"value":1665}," -xzf",{"type":47,"tag":93,"props":1667,"children":1668},{"style":105},[1669],{"type":52,"value":1670}," -",{"type":47,"tag":93,"props":1672,"children":1673},{"style":105},[1674],{"type":52,"value":1675}," -C",{"type":47,"tag":93,"props":1677,"children":1678},{"style":111},[1679],{"type":52,"value":1286},{"type":47,"tag":93,"props":1681,"children":1682},{"style":105},[1683],{"type":52,"value":1291},{"type":47,"tag":93,"props":1685,"children":1686},{"style":1294},[1687],{"type":52,"value":1297},{"type":47,"tag":93,"props":1689,"children":1690},{"style":111},[1691],{"type":52,"value":1302},{"type":47,"tag":48,"props":1693,"children":1694},{},[1695,1697,1703,1705,1710,1711,1716,1718,1723,1725,1731,1733,1738,1740,1745,1747,1753],{"type":52,"value":1696},"Use ",{"type":47,"tag":55,"props":1698,"children":1700},{"className":1699},[],[1701],{"type":52,"value":1702},"--data-urlencode",{"type":52,"value":1704}," for any free-text field that may contain spaces or special characters (",{"type":47,"tag":55,"props":1706,"children":1708},{"className":1707},[],[1709],{"type":52,"value":382},{"type":52,"value":148},{"type":47,"tag":55,"props":1712,"children":1714},{"className":1713},[],[1715],{"type":52,"value":417},{"type":52,"value":1717},"). Plain ",{"type":47,"tag":55,"props":1719,"children":1721},{"className":1720},[],[1722],{"type":52,"value":1239},{"type":52,"value":1724}," does NOT URL-encode values, which can corrupt the request body. The ",{"type":47,"tag":55,"props":1726,"children":1728},{"className":1727},[],[1729],{"type":52,"value":1730},"-f",{"type":52,"value":1732}," flag on ",{"type":47,"tag":55,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":52,"value":920},{"type":52,"value":1739}," makes HTTP errors (e.g. 400 from start.spring.io for an invalid dependency ID) return a non-zero exit code instead of streaming an error body into ",{"type":47,"tag":55,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":52,"value":1174},{"type":52,"value":1746},". Combined with ",{"type":47,"tag":55,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":52,"value":1752},"set -o pipefail",{"type":52,"value":1754},", this surfaces the real failure cause.",{"type":47,"tag":62,"props":1756,"children":1758},{"id":1757},"step-5-confirm-success",[1759],{"type":52,"value":1760},"Step 5: Confirm success",{"type":47,"tag":48,"props":1762,"children":1763},{},[1764],{"type":52,"value":1765},"After extraction, verify the project was created correctly by checking for a build file:",{"type":47,"tag":82,"props":1767,"children":1769},{"className":84,"code":1768,"language":86,"meta":87,"style":87},"ls -la \u003Ctarget-directory>\ntest -f \u003Ctarget-directory>\u002Fpom.xml \\\n  || test -f \u003Ctarget-directory>\u002Fbuild.gradle \\\n  || test -f \u003Ctarget-directory>\u002Fbuild.gradle.kts\n",[1770],{"type":47,"tag":55,"props":1771,"children":1772},{"__ignoreMap":87},[1773,1802,1840,1882],{"type":47,"tag":93,"props":1774,"children":1775},{"class":95,"line":96},[1776,1781,1786,1790,1794,1798],{"type":47,"tag":93,"props":1777,"children":1778},{"style":100},[1779],{"type":52,"value":1780},"ls",{"type":47,"tag":93,"props":1782,"children":1783},{"style":105},[1784],{"type":52,"value":1785}," -la",{"type":47,"tag":93,"props":1787,"children":1788},{"style":111},[1789],{"type":52,"value":1286},{"type":47,"tag":93,"props":1791,"children":1792},{"style":105},[1793],{"type":52,"value":1291},{"type":47,"tag":93,"props":1795,"children":1796},{"style":1294},[1797],{"type":52,"value":1297},{"type":47,"tag":93,"props":1799,"children":1800},{"style":111},[1801],{"type":52,"value":1302},{"type":47,"tag":93,"props":1803,"children":1804},{"class":95,"line":1270},[1805,1810,1815,1819,1823,1827,1831,1836],{"type":47,"tag":93,"props":1806,"children":1807},{"style":1254},[1808],{"type":52,"value":1809},"test",{"type":47,"tag":93,"props":1811,"children":1812},{"style":105},[1813],{"type":52,"value":1814}," -f",{"type":47,"tag":93,"props":1816,"children":1817},{"style":111},[1818],{"type":52,"value":1286},{"type":47,"tag":93,"props":1820,"children":1821},{"style":105},[1822],{"type":52,"value":1291},{"type":47,"tag":93,"props":1824,"children":1825},{"style":1294},[1826],{"type":52,"value":1297},{"type":47,"tag":93,"props":1828,"children":1829},{"style":111},[1830],{"type":52,"value":1359},{"type":47,"tag":93,"props":1832,"children":1833},{"style":105},[1834],{"type":52,"value":1835},"\u002Fpom.xml",{"type":47,"tag":93,"props":1837,"children":1838},{"style":1294},[1839],{"type":52,"value":1325},{"type":47,"tag":93,"props":1841,"children":1842},{"class":95,"line":1305},[1843,1848,1853,1857,1861,1865,1869,1873,1878],{"type":47,"tag":93,"props":1844,"children":1845},{"style":111},[1846],{"type":52,"value":1847},"  ||",{"type":47,"tag":93,"props":1849,"children":1850},{"style":1254},[1851],{"type":52,"value":1852}," test",{"type":47,"tag":93,"props":1854,"children":1855},{"style":105},[1856],{"type":52,"value":1814},{"type":47,"tag":93,"props":1858,"children":1859},{"style":111},[1860],{"type":52,"value":1286},{"type":47,"tag":93,"props":1862,"children":1863},{"style":105},[1864],{"type":52,"value":1291},{"type":47,"tag":93,"props":1866,"children":1867},{"style":1294},[1868],{"type":52,"value":1297},{"type":47,"tag":93,"props":1870,"children":1871},{"style":111},[1872],{"type":52,"value":1359},{"type":47,"tag":93,"props":1874,"children":1875},{"style":105},[1876],{"type":52,"value":1877},"\u002Fbuild.gradle",{"type":47,"tag":93,"props":1879,"children":1880},{"style":1294},[1881],{"type":52,"value":1325},{"type":47,"tag":93,"props":1883,"children":1884},{"class":95,"line":1328},[1885,1889,1893,1897,1901,1905,1909,1913],{"type":47,"tag":93,"props":1886,"children":1887},{"style":111},[1888],{"type":52,"value":1847},{"type":47,"tag":93,"props":1890,"children":1891},{"style":1254},[1892],{"type":52,"value":1852},{"type":47,"tag":93,"props":1894,"children":1895},{"style":105},[1896],{"type":52,"value":1814},{"type":47,"tag":93,"props":1898,"children":1899},{"style":111},[1900],{"type":52,"value":1286},{"type":47,"tag":93,"props":1902,"children":1903},{"style":105},[1904],{"type":52,"value":1291},{"type":47,"tag":93,"props":1906,"children":1907},{"style":1294},[1908],{"type":52,"value":1297},{"type":47,"tag":93,"props":1910,"children":1911},{"style":111},[1912],{"type":52,"value":1359},{"type":47,"tag":93,"props":1914,"children":1915},{"style":105},[1916],{"type":52,"value":1917},"\u002Fbuild.gradle.kts\n",{"type":47,"tag":48,"props":1919,"children":1920},{},[1921],{"type":52,"value":1922},"If no build file is present, treat the operation as failed and report the issue (typically a curl\u002Ftar pipeline error from Step 4) instead of claiming success.",{"type":47,"tag":48,"props":1924,"children":1925},{},[1926,1928,1934,1935,1941,1943,1949],{"type":52,"value":1927},"On rare environments, the Maven\u002FGradle wrapper scripts may not retain their executable bit after extraction. If ",{"type":47,"tag":55,"props":1929,"children":1931},{"className":1930},[],[1932],{"type":52,"value":1933},".\u002Fmvnw",{"type":52,"value":245},{"type":47,"tag":55,"props":1936,"children":1938},{"className":1937},[],[1939],{"type":52,"value":1940},".\u002Fgradlew",{"type":52,"value":1942}," reports \"permission denied\", run ",{"type":47,"tag":55,"props":1944,"children":1946},{"className":1945},[],[1947],{"type":52,"value":1948},"chmod +x mvnw gradlew",{"type":52,"value":1950}," inside the project directory.",{"type":47,"tag":62,"props":1952,"children":1954},{"id":1953},"step-6-switch-the-working-directory-into-the-new-project",[1955],{"type":52,"value":1956},"Step 6: Switch the working directory into the new project",{"type":47,"tag":48,"props":1958,"children":1959},{},[1960],{"type":52,"value":1961},"Once Step 5 confirms success, change the shell's working directory into the newly created project directory so that any subsequent commands (build, run, edits, follow-up tool calls) operate inside the project:",{"type":47,"tag":82,"props":1963,"children":1965},{"className":84,"code":1964,"language":86,"meta":87,"style":87},"cd \u003Ctarget-directory>\npwd\n",[1966],{"type":47,"tag":55,"props":1967,"children":1968},{"__ignoreMap":87},[1969,1993],{"type":47,"tag":93,"props":1970,"children":1971},{"class":95,"line":96},[1972,1977,1981,1985,1989],{"type":47,"tag":93,"props":1973,"children":1974},{"style":1254},[1975],{"type":52,"value":1976},"cd",{"type":47,"tag":93,"props":1978,"children":1979},{"style":111},[1980],{"type":52,"value":1286},{"type":47,"tag":93,"props":1982,"children":1983},{"style":105},[1984],{"type":52,"value":1291},{"type":47,"tag":93,"props":1986,"children":1987},{"style":1294},[1988],{"type":52,"value":1297},{"type":47,"tag":93,"props":1990,"children":1991},{"style":111},[1992],{"type":52,"value":1302},{"type":47,"tag":93,"props":1994,"children":1995},{"class":95,"line":1270},[1996],{"type":47,"tag":93,"props":1997,"children":1998},{"style":1254},[1999],{"type":52,"value":2000},"pwd\n",{"type":47,"tag":48,"props":2002,"children":2003},{},[2004,2006,2012,2014,2019],{"type":52,"value":2005},"Run ",{"type":47,"tag":55,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":52,"value":2011},"pwd",{"type":52,"value":2013}," afterwards and confirm the output matches the expected project directory. This ",{"type":47,"tag":55,"props":2015,"children":2017},{"className":2016},[],[2018],{"type":52,"value":1976},{"type":52,"value":2020}," MUST happen as the final action of the skill (after success verification, before reporting back to the user) so that the user's next instruction starts inside the project.",{"type":47,"tag":48,"props":2022,"children":2023},{},[2024,2026,2032,2034,2039,2041,2047],{"type":52,"value":2025},"If you also have access to a tool that changes Claude Code's persistent working directory (e.g. a dedicated ",{"type":47,"tag":55,"props":2027,"children":2029},{"className":2028},[],[2030],{"type":52,"value":2031},"cwd",{"type":52,"value":2033}," \u002F project-root tool exposed by the host), use it in addition to the shell ",{"type":47,"tag":55,"props":2035,"children":2037},{"className":2036},[],[2038],{"type":52,"value":1976},{"type":52,"value":2040}," so that all tools — not just ",{"type":47,"tag":55,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":52,"value":2046},"Bash",{"type":52,"value":2048}," — operate from the new location.",{"type":47,"tag":62,"props":2050,"children":2052},{"id":2051},"step-7-report-back-to-the-user",[2053],{"type":52,"value":2054},"Step 7: Report back to the user",{"type":47,"tag":48,"props":2056,"children":2057},{},[2058],{"type":52,"value":2059},"Report:",{"type":47,"tag":623,"props":2061,"children":2062},{},[2063,2068,2073,2085],{"type":47,"tag":627,"props":2064,"children":2065},{},[2066],{"type":52,"value":2067},"The directory where the project was extracted (and confirm that the working directory is now set to it)",{"type":47,"tag":627,"props":2069,"children":2070},{},[2071],{"type":52,"value":2072},"The selected dependencies",{"type":47,"tag":627,"props":2074,"children":2075},{},[2076,2078,2083],{"type":52,"value":2077},"The resolved ",{"type":47,"tag":55,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":52,"value":78},{"type":52,"value":2084}," (and how it was detected)",{"type":47,"tag":627,"props":2086,"children":2087},{},[2088,2090,2096,2097,2103,2105,2110],{"type":52,"value":2089},"Any next steps (e.g., ",{"type":47,"tag":55,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":52,"value":2095},".\u002Fmvnw spring-boot:run",{"type":52,"value":245},{"type":47,"tag":55,"props":2098,"children":2100},{"className":2099},[],[2101],{"type":52,"value":2102},".\u002Fgradlew bootRun",{"type":52,"value":2104}," — note that ",{"type":47,"tag":55,"props":2106,"children":2108},{"className":2107},[],[2109],{"type":52,"value":1976},{"type":52,"value":2111}," is no longer needed because Step 6 already moved into the project)",{"type":47,"tag":2113,"props":2114,"children":2115},"style",{},[2116],{"type":52,"value":2117},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2119,"total":1305},[2120,2126,2140],{"slug":4,"name":4,"fn":5,"description":6,"org":2121,"tags":2122,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2123,2124,2125],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"slug":2127,"name":2127,"fn":2128,"description":2129,"org":2130,"tags":2131,"stars":21,"repoUrl":22,"updatedAt":2139},"quickfix","apply fixes for Spring Boot errors","Retrieves the explanation and fix instructions for a specific Spring Boot diagnostic error code and applies the fix to a specific file. Use this when you encounter a Spring Boot warning or error and need to know how to fix it.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2132,2135,2138],{"name":2133,"slug":2134,"type":16},"Code Analysis","code-analysis",{"name":2136,"slug":2137,"type":16},"Debugging","debugging",{"name":9,"slug":8,"type":16},"2026-07-16T06:02:39.511371",{"slug":2141,"name":2141,"fn":2142,"description":2143,"org":2144,"tags":2145,"stars":21,"repoUrl":22,"updatedAt":2152},"validate","validate Spring Boot project changes","MUST be used whenever a user or agent asks to find problems, check for issues, or validate changes in a Spring Boot project. Uses the spring-tools MCP server to check for validation problems in the project's source files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2146,2147,2148,2149],{"name":2133,"slug":2134,"type":16},{"name":2136,"slug":2137,"type":16},{"name":9,"slug":8,"type":16},{"name":2150,"slug":2151,"type":16},"Testing","testing","2026-07-16T06:02:21.658475",{"items":2154,"total":1305},[2155,2161,2167],{"slug":4,"name":4,"fn":5,"description":6,"org":2156,"tags":2157,"stars":21,"repoUrl":22,"updatedAt":23},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2158,2159,2160],{"name":18,"slug":19,"type":16},{"name":14,"slug":15,"type":16},{"name":9,"slug":8,"type":16},{"slug":2127,"name":2127,"fn":2128,"description":2129,"org":2162,"tags":2163,"stars":21,"repoUrl":22,"updatedAt":2139},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2164,2165,2166],{"name":2133,"slug":2134,"type":16},{"name":2136,"slug":2137,"type":16},{"name":9,"slug":8,"type":16},{"slug":2141,"name":2141,"fn":2142,"description":2143,"org":2168,"tags":2169,"stars":21,"repoUrl":22,"updatedAt":2152},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2170,2171,2172,2173],{"name":2133,"slug":2134,"type":16},{"name":2136,"slug":2137,"type":16},{"name":9,"slug":8,"type":16},{"name":2150,"slug":2151,"type":16}]