Stories #18-21 complete: - Apache Velocity replaces Handlebars for QQQ consistency - StringTool with $str.camel(), pascal(), replace() helpers - Computed variables ($str.replace($packageName, '.', '/')) - Transform executor for rename/delete operations - Manifest schema v2 with minimumQctlVersion check
11 KiB
qctl Roadmap
Vision
qctl is the unified CLI for QRun platform developers. It enables the complete developer lifecycle: create projects, manage dependencies, build/deploy applications, and operate running services.
Core Integration
Voyage - The QRun platform backend that qctl integrates with for:
- Template registry (qqq)
- Package registry (qbit)
- Artifact storage & deployment (qrun)
- Service orchestration & observability (qrun)
User Journeys
Journey 1: Create a New QQQ Application
Goal: Developer creates a new QQQ application from a template and has a running local dev environment.
User Flow:
# Step 1: See available templates
$ qctl qqq list
Available templates:
qqq-web-api Web API application with Javalin middleware
qqq-cli-tool Command-line tool with Picocli
qqq-batch Batch processing application
qqq-full-stack Full-stack with React frontend
# Step 2: Initialize a new project
$ qctl qqq init qqq-web-api my-app
? Java package [com.example.myapp]: com.acme.orders
? Maven groupId [com.acme]: com.acme
? Maven artifactId [my-app]: orders-service
? Application name [myApp]: ordersApp
? Application label [My App]: Orders Service
Creating project from template: qqq-web-api
Cloning template...
Rendering files with Velocity...
Moving src/main/java/com/example/orders → src/main/java/com/acme/orders
Moving src/test/java/com/example/orders → src/test/java/com/acme/orders
Running post-gen hook: build
> mvn clean verify -DskipTests
[BUILD SUCCESS]
Project created: ./my-app
Next steps:
cd my-app
mvn spring-boot:run
# Step 3: Run locally
$ cd my-app && mvn spring-boot:run
[INFO] Started OrdersApp in 2.3s
Required Capabilities:
| Capability | Description | Status |
|---|---|---|
| Template listing | Fetch templates from Voyage (or local cache) | POC - needs Voyage integration |
| Template selection | Interactive or CLI arg | POC - needs polish |
| Prompt collection | Interactive prompts from manifest | POC - needs validation |
| CLI var overrides | --var key=value for non-interactive |
POC - needs testing |
| Velocity rendering | Render file contents with Velocity | TODO (currently Handlebars) |
| Path rendering | Render file/dir names with variables | POC - switch to Velocity |
| Computed variables | Derive packagePath from packageName |
TODO |
| Directory transforms | Move directories per manifest rules | TODO |
| Post-gen hooks | Run shell commands after render | POC - needs phases |
| Dry-run mode | Show what would be created | POC - needs refinement |
| Force overwrite | --force to overwrite existing |
POC - needs merge mode |
| Error handling | Clear errors with recovery suggestions | TODO |
| Template caching | Cache templates with TTL | TODO |
Design Decision: Template Engine
Decision: Use Apache Velocity instead of Handlebars for consistency with QQQ's existing template/report system.
- QQQ already uses Velocity for template rendering
- Template authors familiar with QQQ will know Velocity syntax (
$variable,#if...#end) - More powerful than Handlebars (full control flow, macros)
- Requires migration from current Handlebars implementation
Design Decision: Template Transformation
Decision: Hybrid approach with Velocity rendering + structural transformations.
- Velocity for content: Templates use
$packageName,$groupIdin source files - Manifest rules for structure: Define path transformations and directory moves
- Computed variables: Derive
packagePathfrompackageNameautomatically
Template Manifest Example:
name: qqq-web-api
prompts:
- name: packageName
message: "Java package"
default: "com.example.myapp"
- name: groupId
message: "Maven groupId"
default: "com.example"
- name: artifactId
message: "Maven artifactId"
default: "my-qqq-app"
- name: appName
message: "Application name"
default: "myApp"
computed:
packagePath: "${packageName.replace('.', '/')}"
transforms:
- type: move
from: "src/main/java/com/example/orders"
to: "src/main/java/${packagePath}"
- type: move
from: "src/test/java/com/example/orders"
to: "src/test/java/${packagePath}"
postGen:
- name: build
command: "mvn clean verify -DskipTests"
Journey 2: Add QBit Dependencies
Goal: Developer finds and adds QQQ modules (qbits) to their project.
# Search for authentication modules
qctl qbit search auth
# Add the SSO qbit to project
qctl qbit add @qrun/auth-sso
# See what's installed
qctl qbit list
# Update to latest versions
qctl qbit update
Required Capabilities:
- Search Voyage registry by keyword/tag
- View qbit details (description, version, dependencies)
- Add qbit with version constraint (
@qrun/auth-sso@^2.0) - Resolve dependency tree (handle conflicts)
- Generate/update lockfile (
qbits.lock) - Vendor packages to
vendor/qbits/ - Integrity verification (sha512)
Journey 3: Build & Deploy Application
Goal: Developer packages their application and deploys it to an environment.
# Build OCI image
qctl qrun package
# Deploy to dev environment
qctl qrun publish --env dev
# Deploy to production
qctl qrun publish --env prod --channel stable
Required Capabilities:
- Build OCI image via Jib
- Push to Voyage artifact registry
- Create release record with metadata
- Deploy to target environment via Voyage
- Support release channels (dev, beta, stable)
- Rollback to previous version
Journey 4: Operate Running Services
Goal: Developer monitors and manages their deployed applications.
# Check service status
qctl qrun status --app my-app --env prod
# View logs
qctl qrun logs --app my-app --env prod --follow
# Restart service
qctl qrun restart --app my-app --env prod
# Stop service (maintenance)
qctl qrun stop --app my-app --env prod
# Start service
qctl qrun start --app my-app --env prod
Required Capabilities:
- Query Voyage for service status (replicas, health, version)
- Stream logs from Voyage
- Stop/start/restart services via Voyage API
- View deployment history
- Scale replicas up/down
Milestones
v0.2.0 - Create & Manage
Focus: Complete "Create New Application" and "Add Dependencies" journeys.
Epic: qqq - Template System
| Feature | Description |
|---|---|
| Velocity engine | Replace Handlebars with Apache Velocity |
| Computed variables | Auto-derive packagePath from packageName |
| Directory transforms | Move folders per manifest transforms rules |
| Template manifest v2 | Add computed and transforms sections |
| Migrate templates | Update templates-hub to Velocity syntax |
| Voyage mock integration | Template listing from mock API |
| Prompt validation | Validate required fields, types, constraints |
| Error messages | Clear errors with recovery suggestions |
| Merge mode | --merge for selective regeneration |
Epic: qbit - Package Management
| Feature | Description |
|---|---|
| qbit search | Search against Voyage mock registry |
| qbit add | Add package with version constraints |
| qbit remove | Remove package, update lockfile |
| qbit update | Update packages to latest |
| qbit list | List installed packages |
| SemVer resolution | Constraint solving (^, ~, exact) |
| Conflict detection | Identify and report version conflicts |
| Vendor layout | Download to vendor/qbits/ |
| Integrity verification | SHA-512 hash checks |
v0.3.0 - Deploy & Operate
Focus: Complete "Deploy Application" and "Operate Services" journeys.
Epic: qrun - Build & Publish
| Feature | Description |
|---|---|
| Jib integration | OCI image building |
| qrun package | Build container image |
| qrun publish | Push to Voyage registry |
| OCI labels | Inject standard and custom labels |
| Digest verification | Verify image after push |
| Release channels | stable/beta/alpha support |
| qrun rollback | Rollback to previous version |
Epic: qrun - Service Operations
| Feature | Description |
|---|---|
| qrun status | Service status from Voyage |
| qrun logs | Stream logs with --follow |
| qrun stop | Stop service |
| qrun start | Start service |
| qrun restart | Restart service |
| Deployment history | View past deployments |
| qrun scale | Scale replicas up/down |
v1.0.0 - Production Ready
Focus: AI planning, security hardening, enterprise features.
Epic: qstudio - AI Planning
| Feature | Description |
|---|---|
| Code indexing | Local codebase analysis |
| qstudio plan | Generate implementation plan |
| Path policies | Allow/deny path lists |
| Ledger storage | Track plan history |
Epic: Authentication & Security
| Feature | Description |
|---|---|
| OIDC device flow | Full authentication flow |
| Service accounts | CI/CD support |
| Signature enforcement | Require signed packages/images |
| OS keychain | Secure credential storage |
Epic: Enterprise Features
| Feature | Description |
|---|---|
| SSO integration | SAML/OIDC enterprise SSO |
| RBAC | Team-based access control |
| Audit logging | Compliance audit trail |
| Org management | Organization/team management |
Voyage Integration
Voyage is the QRun platform backend (currently in development). Until Voyage is ready, qctl will:
- Use mock APIs for development and testing
- Support local/offline modes where possible
- Design against Voyage's planned API contracts (standard QQQ data model)
Voyage will provide a versioned API that drives templates, qbits, artifacts, and service orchestration.
Voyage API Dependencies (Planned)
qctl requires these Voyage API endpoints:
Templates (qqq)
GET /v1/templates- List available templatesGET /v1/templates/{id}- Get template detailsGET /v1/templates/{id}/versions/{version}- Download template
Packages (qbit)
GET /v1/qbits?q={query}- Search packagesGET /v1/qbits/{id}- Get package detailsGET /v1/qbits/{id}/versions/{version}- Download package
Artifacts (qrun)
POST /v1/artifacts- Register artifactGET /v1/artifacts/{id}- Get artifact infoPOST /v1/releases- Create releasePOST /v1/deployments- Deploy to environment
Services (qrun)
GET /v1/apps/{app}/status- Service statusGET /v1/apps/{app}/logs- Service logsPOST /v1/apps/{app}/restart- Restart servicePOST /v1/apps/{app}/stop- Stop servicePOST /v1/apps/{app}/start- Start servicePOST /v1/apps/{app}/scale- Scale replicas
GitHub Issues Structure
Each milestone will have:
- 1 Epic issue tracking the user journey
- Story issues for each capability (linked to epic)
- Labels:
epic,story,module:qqq|qbit|qrun|qstudio
Example:
Epic: [v0.2.0] Create New Application Journey
├── Story: Template registry integration with Voyage
├── Story: Add web-api template
├── Story: Add cli-tool template
├── Story: Add batch-processor template
├── Story: Implement qqq upgrade command
└── Story: Enhanced post-init hooks