Dashboard › cli › Distillation
1e8c4180-386e-4e96-a5b0-9fb5ee7bda1d["lore_tm_v1_gY-00DZDVP8HS55v8POfsndM7GnNPlQTlYuJkXvzxWM","lore_tm_v1_s6L-_nFdCthetPa9l5g14c4i6vZ6yqySw0BquLiFoIg","lore_tm_v1_ymJN4irUUoaobbCGtqcx55WNCEzOd8M7tGpilfYl6ys","lore_tm_v1_5UyEkE1PWFhlNPoLsWsgLeyvLQAbRwg3UlaTJBkAQfk","lore_tm_v1_8LA3y-V0PaSY4fPji1gxUiNHAUrV2BiGUJCm8zu8fVc","lore_tm_v1_5mu9NA7j0aF6mOvtmqfQSW-WZxe91iNRcbEwdt35IkY","lore_tm_v1_ATpTKtYs8KQYofpUFx0P3pMIbXjSOgjFDM6NEe9z_74"]
Date: Sep 8, 2026
sentry project create input shape as one or more [<org>/]<name>:<platform> pairs; the platform is always attached with :, there is no space-separated form, and no --platform / -p flag is supported.web api node are deliberately unsupported because every project must carry its own platform.sentry project create positional must be a [<org>/]<name>:<platform> pair. A lone positional without : receives a friendlier “platform is required” error, while other missing-colon inputs receive the generic pair-syntax error.parsePairedProjectSpec() uses the final : as the name/platform separator, allowing colon-containing project names such as api:europe:node, where the name is api:europe and platform is node.handleCreateProject404() always throws; the prior call required a cast because createProjectWithDsn() had a different return type.--dry-run previews team auto-creation but never actually creates the team. A batch pins teamAutoCreateSlug so real and dry-run behavior agree and all projects reuse the same prospective team.b421031ddb0bdad33ef8451b86f44d45de208b20, “feat(project): create multiple projects in one command (#1191),” by Miguel Betegón and co-authored by Claude Sonnet 5, changed 21 files with 1,263 insertions and 353 deletions. (meaning Aug 3, 2026)packages/cli/src/commands/project/create.ts changed from fixed tuple positionals <name> <platform> to a variadic array with placeholder name:platform and canonical customUsage: ["[<org>/]<name>:<platform>..."]; command brief changed to “Create one or more projects.”parseProjectSpecs() in packages/cli/src/commands/project/create.ts rejects zero specifications with ContextError("Project specification", USAGE_HINT, []), parses every argument through parsePairedProjectSpec(), and rejects multiple explicit orgs with ValidationError listing the conflicting org slugs.parseProjectName() rejects empty names and names matching WHITESPACE_RE = /\s/; it supports parseOrgProjectArg() results of explicit and project-search, rejects org-all as an organization rather than a project name, and uses ValidationError/ContextError for invalid cases.parseProjectPlatform() trims and normalizes platform identifiers with normalizePlatform(), validates them with isValidPlatform(), and throws ValidationError(buildPlatformError(...), "platform") for empty or invalid values. Canonical Sentry identifiers are required, such as python-django rather than django.packages/cli/src/commands/project/create.ts is sequential to respect rate limits. Team selection or auto-creation is reused across the batch, successful earlier creations are emitted before a later error, and partial mutations remain visible.buildProjectCreateOutput() preserves the historical JSON object shape when exactly 1 project was requested and succeeded; complete or partial batch output uses a JSON array. Commands needing one parseable JSON document yield one aggregate value because individual CommandOutput JSON chunks are pretty-printed rather than JSONL.createOneProject() handles --dry-run, team resolution, project creation, and fallback. A non-policy HTTP 403 without explicit --team falls back to the org-scoped project endpoint; an explicit team or MEMBER_PROJECT_CREATION_DISABLED_DETAIL prevents that fallback.projectExistsError() maps HTTP 409 to a sentry project view <org>/<slug> hint; invalid-platform HTTP 400 errors use buildPlatformError(); other API errors remain ApiError so 401–499 user-error silencing applies while 5xx and network errors remain reportable.sentry project create examples, in order: 1. sentry project create project1:javascript — one project with org auto-detected; 2. sentry project create acme/project1:javascript — explicit org; 3. sentry project create project1:javascript project2:python-django worker:node — any number of projects; 4. sentry project create acme/project1:javascript project2:python-django — explicit org for the batch; 5. sentry project create project1:javascript project2:python-django --team backend — specific team; 6. sentry project create project1:javascript project2:python-django --dry-run — preview; 7. sentry project create project1:javascript project2:python-django --json — machine-readable batch output.pnpm exec vitest run test/commands/project/create.test.ts test/lib/complete.test.ts test/lib/completions.test.ts test/lib/help-positional.test.ts test/lib/introspect.test.ts test/script/generate-skill-markdown.test.ts; result: exactly 235 tests passed. Additional checks were pnpm run typecheck, pnpm run lint, pnpm run check:errors, pnpm run check:fragments, and pnpm run check:deps; applicable unit, E2E, generated-file, build, package smoke, CodeQL, Semgrep, Seer, Cursor Bugbot, and Warden checks were green.packages/cli/script/generate-skill.ts now imports extractCommandPathFromHeading() and matchExampleToCommand() from ./generate-skill-markdown.js, replacing local CMD_HEADING_RE parsing and matchCodeToCommand() logic when associating bash code blocks with command paths..gitignore include apps/cli-docs/src/content/docs/commands/, apps/cli-docs/src/content/docs/configuration.md, and apps/cli-docs/public/.well-known/skills/index.json; packages/cli/src/generated/banner-sixel.ts is explicitly retained despite the generated-directory ignore because it is deterministic and statically imported.packages/cli/package.json identifies package sentry version 0.45.0-dev.0, requires Node >=20.0, specifies development runtime Node >=22.15, and uses pnpm@10.11.0.