project-iris 0.0.12 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +214 -323
- package/bin/cli.js +21 -0
- package/flows/aidlc/README.md +372 -0
- package/flows/aidlc/agents/construction-agent.md +79 -0
- package/flows/aidlc/agents/inception-agent.md +97 -0
- package/flows/aidlc/agents/master-agent.md +61 -0
- package/flows/aidlc/agents/operations-agent.md +89 -0
- package/flows/aidlc/commands/construction-agent.md +63 -0
- package/flows/aidlc/commands/inception-agent.md +55 -0
- package/flows/aidlc/commands/master-agent.md +47 -0
- package/flows/aidlc/commands/operations-agent.md +77 -0
- package/flows/aidlc/context-config.yaml +67 -0
- package/flows/aidlc/memory-bank.yaml +104 -0
- package/flows/aidlc/quick-start.md +322 -0
- package/flows/aidlc/skills/construction/bolt-list.md +163 -0
- package/flows/aidlc/skills/construction/bolt-replan.md +345 -0
- package/flows/aidlc/skills/construction/bolt-start.md +442 -0
- package/flows/aidlc/skills/construction/bolt-status.md +185 -0
- package/flows/aidlc/skills/construction/navigator.md +196 -0
- package/flows/aidlc/skills/inception/bolt-plan.md +372 -0
- package/flows/aidlc/skills/inception/context.md +171 -0
- package/flows/aidlc/skills/inception/intent-create.md +211 -0
- package/flows/aidlc/skills/inception/intent-list.md +124 -0
- package/flows/aidlc/skills/inception/navigator.md +207 -0
- package/flows/aidlc/skills/inception/requirements.md +227 -0
- package/flows/aidlc/skills/inception/review.md +248 -0
- package/flows/aidlc/skills/inception/story-create.md +304 -0
- package/flows/aidlc/skills/inception/units.md +278 -0
- package/flows/aidlc/skills/master/analyze-context.md +239 -0
- package/flows/aidlc/skills/master/answer-question.md +141 -0
- package/flows/aidlc/skills/master/explain-flow.md +158 -0
- package/flows/aidlc/skills/master/project-init.md +281 -0
- package/flows/aidlc/skills/master/route-request.md +126 -0
- package/flows/aidlc/skills/operations/build.md +237 -0
- package/flows/aidlc/skills/operations/deploy.md +259 -0
- package/flows/aidlc/skills/operations/monitor.md +265 -0
- package/flows/aidlc/skills/operations/navigator.md +209 -0
- package/flows/aidlc/skills/operations/verify.md +224 -0
- package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt.md +3 -3
- package/{dist → flows/aidlc}/templates/construction/bolt-types/spike-bolt.md +2 -2
- package/flows/aidlc/templates/construction/construction-log-template.md +129 -0
- package/flows/aidlc/templates/construction/standards/coding-standards.md +29 -0
- package/flows/aidlc/templates/construction/standards/system-architecture.md +22 -0
- package/flows/aidlc/templates/construction/standards/tech-stack.md +19 -0
- package/flows/aidlc/templates/inception/inception-log-template.md +134 -0
- package/flows/aidlc/templates/inception/project/README.md +55 -0
- package/flows/aidlc/templates/standards/catalog.yaml +345 -0
- package/flows/aidlc/templates/standards/coding-standards.guide.md +553 -0
- package/flows/aidlc/templates/standards/data-stack.guide.md +162 -0
- package/flows/aidlc/templates/standards/tech-stack.guide.md +280 -0
- package/lib/InstallerFactory.js +36 -0
- package/lib/analytics/env-detector.js +92 -0
- package/lib/analytics/index.js +22 -0
- package/lib/analytics/machine-id.js +33 -0
- package/lib/analytics/tracker.js +232 -0
- package/lib/cli-utils.js +342 -0
- package/lib/constants.js +32 -0
- package/lib/installer.js +402 -0
- package/lib/installers/AntigravityInstaller.js +22 -0
- package/lib/installers/ClaudeInstaller.js +85 -0
- package/lib/installers/ClineInstaller.js +21 -0
- package/lib/installers/CodexInstaller.js +21 -0
- package/lib/installers/CopilotInstaller.js +113 -0
- package/lib/installers/CursorInstaller.js +63 -0
- package/lib/installers/GeminiInstaller.js +75 -0
- package/lib/installers/KiroInstaller.js +22 -0
- package/lib/installers/OpenCodeInstaller.js +22 -0
- package/lib/installers/RooInstaller.js +22 -0
- package/lib/installers/ToolInstaller.js +73 -0
- package/lib/installers/WindsurfInstaller.js +22 -0
- package/lib/markdown-validator.ts +175 -0
- package/lib/yaml-validator.ts +99 -0
- package/package.json +105 -32
- package/scripts/artifact-validator.js +594 -0
- package/scripts/bolt-complete.js +606 -0
- package/scripts/status-integrity.js +598 -0
- package/dist/bridge/agent-runner.js +0 -190
- package/dist/bridge/connector-factory.js +0 -31
- package/dist/bridge/connectors/antigravity-connector.js +0 -18
- package/dist/bridge/connectors/cursor-connector.js +0 -31
- package/dist/bridge/connectors/in-process-connector.js +0 -29
- package/dist/bridge/connectors/vscode-connector.js +0 -31
- package/dist/bridge/connectors/windsurf-connector.js +0 -23
- package/dist/bridge/filesystem-connector.js +0 -110
- package/dist/bridge/helper.js +0 -203
- package/dist/bridge/types.js +0 -10
- package/dist/cli.js +0 -40
- package/dist/commands/ask.js +0 -259
- package/dist/commands/bridge.js +0 -88
- package/dist/commands/create.js +0 -25
- package/dist/commands/develop.js +0 -141
- package/dist/commands/doctor.js +0 -102
- package/dist/commands/flow.js +0 -301
- package/dist/commands/framework.js +0 -273
- package/dist/commands/generate.js +0 -59
- package/dist/commands/install.js +0 -100
- package/dist/commands/pack.js +0 -33
- package/dist/commands/phase.js +0 -38
- package/dist/commands/run.js +0 -199
- package/dist/commands/status.js +0 -114
- package/dist/commands/uninstall.js +0 -14
- package/dist/commands/use.js +0 -20
- package/dist/commands/validate.js +0 -102
- package/dist/framework/framework-loader.js +0 -97
- package/dist/framework/framework-paths.js +0 -48
- package/dist/framework/framework-types.js +0 -15
- package/dist/iris/artifact-checker.js +0 -78
- package/dist/iris/artifacts/config.js +0 -68
- package/dist/iris/artifacts/generator.js +0 -88
- package/dist/iris/artifacts/types.js +0 -1
- package/dist/iris/bundle.js +0 -44
- package/dist/iris/doctrine/collector.js +0 -124
- package/dist/iris/fixer.js +0 -149
- package/dist/iris/flows/manifest.js +0 -124
- package/dist/iris/framework-context.js +0 -49
- package/dist/iris/framework-manager.js +0 -215
- package/dist/iris/fs/atomic.js +0 -22
- package/dist/iris/guard.js +0 -38
- package/dist/iris/importers/index.js +0 -9
- package/dist/iris/importers/types.js +0 -8
- package/dist/iris/importers/writer.js +0 -139
- package/dist/iris/include.js +0 -49
- package/dist/iris/installer.js +0 -334
- package/dist/iris/interactive/env.js +0 -21
- package/dist/iris/interactive/intent-interview.js +0 -345
- package/dist/iris/interactive/intent-schema.js +0 -28
- package/dist/iris/interactive/interview-io.js +0 -22
- package/dist/iris/interview/config.js +0 -71
- package/dist/iris/interview/types.js +0 -16
- package/dist/iris/interview/utils.js +0 -38
- package/dist/iris/manifest.js +0 -54
- package/dist/iris/packer.js +0 -325
- package/dist/iris/parsers/unit-parser.js +0 -43
- package/dist/iris/paths.js +0 -18
- package/dist/iris/policy.js +0 -133
- package/dist/iris/proc.js +0 -56
- package/dist/iris/report.js +0 -53
- package/dist/iris/resolver.js +0 -66
- package/dist/iris/router.js +0 -114
- package/dist/iris/routes.js +0 -189
- package/dist/iris/run-state.js +0 -146
- package/dist/iris/state.js +0 -113
- package/dist/iris/templates.js +0 -70
- package/dist/iris/tmp.js +0 -24
- package/dist/iris/uninstaller.js +0 -181
- package/dist/iris/utils/interpolate.js +0 -42
- package/dist/iris/validator.js +0 -391
- package/dist/iris/workflow/config.js +0 -51
- package/dist/iris/workflow/engine.js +0 -129
- package/dist/iris/workflow/steps.js +0 -448
- package/dist/iris/workflow/types.js +0 -1
- package/dist/iris_bundle/frameworks/iris-core/framework.yaml +0 -9
- package/dist/iris_bundle/frameworks/iris-core/memory/memory-bank.yaml +0 -1
- package/dist/iris_bundle/frameworks/iris-core/policy.yaml +0 -7
- package/dist/iris_bundle/frameworks/iris-core/templates/config/memory-bank.yaml +0 -1
- package/dist/iris_bundle/frameworks/iris-core/templates/construction/bolt-types/spike-bolt.md +0 -240
- package/dist/lib.js +0 -96
- package/dist/templates/construction/bolt-template.md +0 -226
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -49
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -55
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -67
- package/dist/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -62
- package/dist/templates/construction/bolt-types/ddd-construction-bolt.md +0 -528
- package/dist/templates/construction/bolt-types/simple-construction-bolt.md +0 -347
- package/dist/templates/inception/requirements-template.md +0 -144
- package/dist/templates/inception/stories-template.md +0 -38
- package/dist/templates/inception/story-template.md +0 -147
- package/dist/templates/inception/system-context-template.md +0 -29
- package/dist/templates/inception/unit-brief-template.md +0 -177
- package/dist/templates/inception/units-template.md +0 -52
- package/dist/utils/exit-codes.js +0 -7
- package/dist/utils/logo.js +0 -17
- package/dist/workflows/bolt-execution.js +0 -238
- package/dist/workflows/bolt-plan.js +0 -221
- package/dist/workflows/intent-inception.js +0 -285
- package/dist/workflows/memory-bank-generator.js +0 -180
- package/dist/workflows/reporting.js +0 -74
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/adr-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-01-domain-model-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-02-technical-design-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/ddd-construction-bolt/ddd-03-test-report-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/construction/bolt-types/simple-construction-bolt.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/requirements-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/stories-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/story-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/system-context-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/unit-brief-template.md +0 -0
- /package/{dist/iris_bundle/frameworks/iris-core → flows/aidlc}/templates/inception/units-template.md +0 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Tech Stack Facilitation Guide
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
Define the technology choices that will guide code generation, architecture decisions, and ensure consistency across all AI agents working on the project.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Facilitation Approach
|
|
10
|
+
|
|
11
|
+
You are collaborating with a peer to discover their tech stack preferences. This is a conversation, not a form to fill out.
|
|
12
|
+
|
|
13
|
+
**Adapt your style:**
|
|
14
|
+
|
|
15
|
+
- If they mention specific technologies confidently → treat them as experienced, be concise
|
|
16
|
+
- If they seem uncertain → provide more context, examples, and recommendations
|
|
17
|
+
- If they have strong preferences → respect them, ask about tradeoffs they've considered
|
|
18
|
+
|
|
19
|
+
**Your role:**
|
|
20
|
+
|
|
21
|
+
- Guide discovery, don't dictate choices
|
|
22
|
+
- Surface tradeoffs they may not have considered
|
|
23
|
+
- Ensure choices are coherent (no conflicting technologies)
|
|
24
|
+
- Capture rationale, not just the choice
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Discovery Areas
|
|
29
|
+
|
|
30
|
+
### 1. Languages
|
|
31
|
+
|
|
32
|
+
**Goal**: Understand what programming language(s) they'll use.
|
|
33
|
+
|
|
34
|
+
**Open with context:**
|
|
35
|
+
> "Let's start with languages. This affects everything else - framework options, available libraries, team hiring, and performance characteristics."
|
|
36
|
+
|
|
37
|
+
**Explore:**
|
|
38
|
+
|
|
39
|
+
- What languages is the team already comfortable with?
|
|
40
|
+
- Are there languages they want to learn vs. use productively?
|
|
41
|
+
- Is type safety important? (catches bugs early vs. development speed)
|
|
42
|
+
- What's the runtime environment? (Browser, Node.js, Edge functions, Native)
|
|
43
|
+
- Any organizational standards or constraints?
|
|
44
|
+
|
|
45
|
+
**If they're unsure, guide by use case:**
|
|
46
|
+
|
|
47
|
+
| Use Case | Recommendation | Why |
|
|
48
|
+
|----------|----------------|-----|
|
|
49
|
+
| Web app (full-stack) | TypeScript | Type safety, React/Next.js ecosystem, great tooling |
|
|
50
|
+
| API service | TypeScript or Go | TS for ecosystem, Go for performance |
|
|
51
|
+
| ML/AI/Data | Python | Libraries (PyTorch, pandas), community |
|
|
52
|
+
| High-performance systems | Go or Rust | Go for simplicity, Rust for safety |
|
|
53
|
+
| Scripts/automation | Python or TypeScript | Readability, quick iteration |
|
|
54
|
+
|
|
55
|
+
**Common signals to listen for:**
|
|
56
|
+
|
|
57
|
+
- "We're a React shop" → TypeScript
|
|
58
|
+
- "We do ML/AI" → Python, possibly with TypeScript frontend
|
|
59
|
+
- "Performance is critical" → Go, Rust, or optimized Node.js
|
|
60
|
+
- "Small team, move fast" → TypeScript or Python
|
|
61
|
+
- "Enterprise environment" → Java/Kotlin or TypeScript
|
|
62
|
+
|
|
63
|
+
**Validate before moving on:**
|
|
64
|
+
> "So we're going with {language}. This means {implication}. Sound right?"
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### 2. Framework
|
|
69
|
+
|
|
70
|
+
**Goal**: Understand their application framework choice.
|
|
71
|
+
|
|
72
|
+
**Context to share:**
|
|
73
|
+
> "Your framework shapes project structure, available patterns, and deployment options. It's one of the hardest things to change later."
|
|
74
|
+
|
|
75
|
+
**Explore:**
|
|
76
|
+
|
|
77
|
+
- What type of application? (Web app, API only, CLI, Mobile)
|
|
78
|
+
- Do they need server-side rendering (SSR) or static generation (SSG)?
|
|
79
|
+
- Is this a new project or adding to existing code?
|
|
80
|
+
- Where will it be deployed? (This affects framework choice)
|
|
81
|
+
- Any real-time requirements? (WebSockets, subscriptions)
|
|
82
|
+
|
|
83
|
+
**Guide by language and use case:**
|
|
84
|
+
|
|
85
|
+
**TypeScript - Web Applications:**
|
|
86
|
+
|
|
87
|
+
| Framework | Best For | Tradeoffs |
|
|
88
|
+
|-----------|----------|-----------|
|
|
89
|
+
| Next.js | Full-stack, SSR/SSG, Vercel deployment | Opinionated, tied to React |
|
|
90
|
+
| Remix | Web standards, nested routing, great DX | Smaller ecosystem |
|
|
91
|
+
| Astro | Content-heavy sites, partial hydration | Less suited for highly interactive apps |
|
|
92
|
+
| SvelteKit | Performance, smaller bundle, great DX | Smaller ecosystem than React |
|
|
93
|
+
|
|
94
|
+
**TypeScript - API Only:**
|
|
95
|
+
|
|
96
|
+
| Framework | Best For | Tradeoffs |
|
|
97
|
+
|-----------|----------|-----------|
|
|
98
|
+
| Fastify | Performance, low overhead | Less opinionated |
|
|
99
|
+
| NestJS | Enterprise, structured, dependency injection | More boilerplate |
|
|
100
|
+
| Hono | Edge functions, ultra-lightweight | Newer, smaller ecosystem |
|
|
101
|
+
| Express | Simple, huge middleware ecosystem | Older patterns, callback-heavy |
|
|
102
|
+
|
|
103
|
+
**Python - APIs:**
|
|
104
|
+
|
|
105
|
+
| Framework | Best For | Tradeoffs |
|
|
106
|
+
|-----------|----------|-----------|
|
|
107
|
+
| FastAPI | Modern async, auto-docs, type hints | Async complexity |
|
|
108
|
+
| Django | Batteries-included, ORM, admin | Heavier, monolithic |
|
|
109
|
+
| Flask | Minimal, flexible | Need to add everything yourself |
|
|
110
|
+
|
|
111
|
+
**Go - APIs:**
|
|
112
|
+
|
|
113
|
+
| Framework | Best For | Tradeoffs |
|
|
114
|
+
|-----------|----------|-----------|
|
|
115
|
+
| Gin | Fast, popular, good docs | |
|
|
116
|
+
| Echo | Similar to Gin, slightly different API | |
|
|
117
|
+
| Chi | Lightweight, idiomatic Go | Less batteries included |
|
|
118
|
+
| Standard library | Maximum control | More code to write |
|
|
119
|
+
|
|
120
|
+
**Questions to surface tradeoffs:**
|
|
121
|
+
|
|
122
|
+
- "Next.js is great but ties you to React. Is that okay?"
|
|
123
|
+
- "FastAPI requires understanding async Python. Is the team comfortable with that?"
|
|
124
|
+
- "NestJS has more structure but also more boilerplate. Do you prefer convention or flexibility?"
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
### 3. Authentication
|
|
129
|
+
|
|
130
|
+
**Goal**: Understand authentication needs.
|
|
131
|
+
|
|
132
|
+
**Optional - some projects don't need auth initially.**
|
|
133
|
+
|
|
134
|
+
**Explore:**
|
|
135
|
+
|
|
136
|
+
- Do they need user authentication?
|
|
137
|
+
- What methods? (Email/password, social login, magic links, SSO)
|
|
138
|
+
- Is this B2C (end users) or B2B (enterprise SSO)?
|
|
139
|
+
- Any compliance requirements? (MFA, audit logs)
|
|
140
|
+
|
|
141
|
+
**Options:**
|
|
142
|
+
|
|
143
|
+
| Solution | Best For | Tradeoffs |
|
|
144
|
+
|----------|----------|-----------|
|
|
145
|
+
| Supabase Auth | Supabase users, quick setup | Tied to Supabase |
|
|
146
|
+
| NextAuth.js | Next.js apps, flexible | Configuration complexity |
|
|
147
|
+
| Clerk | Quick setup, beautiful UI | Cost at scale |
|
|
148
|
+
| Auth0 | Enterprise, SSO | Cost, complexity |
|
|
149
|
+
| Lucia | Lightweight, self-hosted | More DIY |
|
|
150
|
+
| Custom | Full control | Security responsibility |
|
|
151
|
+
|
|
152
|
+
**If using Supabase for database:**
|
|
153
|
+
> "Since you're using Supabase for the database, Supabase Auth integrates seamlessly. It handles email/password, social providers, and row-level security. Worth considering unless you have specific needs."
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
### 4. Infrastructure & Deployment
|
|
158
|
+
|
|
159
|
+
**Goal**: Understand how they'll deploy and operate.
|
|
160
|
+
|
|
161
|
+
**Explore:**
|
|
162
|
+
|
|
163
|
+
- Where do they want to deploy? (Cloud provider preference?)
|
|
164
|
+
- Serverless vs. containers vs. VMs?
|
|
165
|
+
- Who manages infrastructure? (Solo dev, dedicated DevOps, managed service)
|
|
166
|
+
- Budget constraints?
|
|
167
|
+
- Any existing infrastructure to integrate with?
|
|
168
|
+
|
|
169
|
+
**Guide by context:**
|
|
170
|
+
|
|
171
|
+
| Context | Recommendation | Why |
|
|
172
|
+
|---------|----------------|-----|
|
|
173
|
+
| Solo dev, startup | Vercel, Railway, Render | Minimal ops, fast deployment |
|
|
174
|
+
| Next.js app | Vercel | Optimized for Next.js |
|
|
175
|
+
| Need containers | Fly.io, Railway, Render | Simple container hosting |
|
|
176
|
+
| Enterprise/compliance | AWS, GCP, Azure | Full control, compliance certifications |
|
|
177
|
+
| Cost-sensitive at scale | Fly.io, self-managed k8s | Lower costs, more ops |
|
|
178
|
+
| Already in AWS | AWS ecosystem | Consistency, existing knowledge |
|
|
179
|
+
|
|
180
|
+
**Serverless vs. Containers:**
|
|
181
|
+
|
|
182
|
+
- **Serverless** (Vercel, Lambda): Pay-per-use, auto-scaling, cold starts
|
|
183
|
+
- **Containers** (Fly.io, ECS): Predictable performance, more control
|
|
184
|
+
- **VMs** (EC2): Full control, predictable costs at scale
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### 5. Package Manager
|
|
189
|
+
|
|
190
|
+
**Goal**: Quick decision on package management.
|
|
191
|
+
|
|
192
|
+
**For JavaScript/TypeScript:**
|
|
193
|
+
|
|
194
|
+
| Manager | Best For |
|
|
195
|
+
|---------|----------|
|
|
196
|
+
| pnpm | Monorepos, disk efficiency, speed |
|
|
197
|
+
| npm | Default, widest compatibility |
|
|
198
|
+
| yarn | Existing yarn projects |
|
|
199
|
+
| bun | Experimental, very fast |
|
|
200
|
+
|
|
201
|
+
**Default recommendation:** pnpm (fast, efficient, great monorepo support)
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Completing the Discovery
|
|
206
|
+
|
|
207
|
+
Once you've explored all relevant areas, summarize:
|
|
208
|
+
|
|
209
|
+
```markdown
|
|
210
|
+
## Tech Stack Summary
|
|
211
|
+
|
|
212
|
+
Based on our conversation, here's what I understand:
|
|
213
|
+
|
|
214
|
+
**Languages**: {choice}
|
|
215
|
+
{brief rationale}
|
|
216
|
+
|
|
217
|
+
**Framework**: {choice}
|
|
218
|
+
{brief rationale}
|
|
219
|
+
|
|
220
|
+
**Authentication**: {choice or "TBD"}
|
|
221
|
+
{brief rationale if applicable}
|
|
222
|
+
|
|
223
|
+
**Infrastructure**: {choice}
|
|
224
|
+
{brief rationale}
|
|
225
|
+
|
|
226
|
+
**Package Manager**: {choice}
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
Does this capture your tech stack accurately? Any adjustments needed?
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Output Generation
|
|
236
|
+
|
|
237
|
+
After confirmation, create `standards/tech-stack.md`:
|
|
238
|
+
|
|
239
|
+
```markdown
|
|
240
|
+
# Tech Stack
|
|
241
|
+
|
|
242
|
+
## Overview
|
|
243
|
+
{1-2 sentence summary of the stack and why it fits the project}
|
|
244
|
+
|
|
245
|
+
## Languages
|
|
246
|
+
{language(s)}
|
|
247
|
+
|
|
248
|
+
{Rationale - why this choice, what it enables}
|
|
249
|
+
|
|
250
|
+
## Framework
|
|
251
|
+
{framework}
|
|
252
|
+
|
|
253
|
+
{Rationale - why this choice, deployment implications}
|
|
254
|
+
|
|
255
|
+
## Authentication
|
|
256
|
+
{auth solution or "TBD"}
|
|
257
|
+
|
|
258
|
+
{Rationale if selected}
|
|
259
|
+
|
|
260
|
+
## Infrastructure & Deployment
|
|
261
|
+
{infrastructure choice}
|
|
262
|
+
|
|
263
|
+
{Rationale - deployment strategy, scaling approach}
|
|
264
|
+
|
|
265
|
+
## Package Manager
|
|
266
|
+
{package manager}
|
|
267
|
+
|
|
268
|
+
## Decision Relationships
|
|
269
|
+
{Note any important connections between choices}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Notes for Agent
|
|
275
|
+
|
|
276
|
+
- **Don't ask all questions linearly** - adapt based on what they've already told you
|
|
277
|
+
- **Skip irrelevant decisions** - CLI tools don't need authentication discussion
|
|
278
|
+
- **Capture rationale** - "why" is as important as "what"
|
|
279
|
+
- **Respect existing choices** - if they say "we're using X", don't try to change their mind unless there's a real issue
|
|
280
|
+
- **It's okay to leave things TBD** - not every decision needs to be made upfront
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const ClaudeInstaller = require('./installers/ClaudeInstaller');
|
|
2
|
+
const CursorInstaller = require('./installers/CursorInstaller');
|
|
3
|
+
const CopilotInstaller = require('./installers/CopilotInstaller');
|
|
4
|
+
const AntigravityInstaller = require('./installers/AntigravityInstaller');
|
|
5
|
+
const WindsurfInstaller = require('./installers/WindsurfInstaller');
|
|
6
|
+
const ClineInstaller = require('./installers/ClineInstaller');
|
|
7
|
+
const RooInstaller = require('./installers/RooInstaller');
|
|
8
|
+
const KiroInstaller = require('./installers/KiroInstaller');
|
|
9
|
+
const GeminiInstaller = require('./installers/GeminiInstaller');
|
|
10
|
+
const CodexInstaller = require('./installers/CodexInstaller');
|
|
11
|
+
const OpenCodeInstaller = require('./installers/OpenCodeInstaller');
|
|
12
|
+
|
|
13
|
+
class InstallerFactory {
|
|
14
|
+
static getInstallers() {
|
|
15
|
+
return [
|
|
16
|
+
new ClaudeInstaller(),
|
|
17
|
+
new CursorInstaller(),
|
|
18
|
+
new CopilotInstaller(),
|
|
19
|
+
new AntigravityInstaller(),
|
|
20
|
+
new WindsurfInstaller(),
|
|
21
|
+
new ClineInstaller(),
|
|
22
|
+
new RooInstaller(),
|
|
23
|
+
new KiroInstaller(),
|
|
24
|
+
new GeminiInstaller(),
|
|
25
|
+
new CodexInstaller(),
|
|
26
|
+
new OpenCodeInstaller()
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static getInstaller(key) {
|
|
31
|
+
const installers = this.getInstallers();
|
|
32
|
+
return installers.find(i => i.key === key);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
module.exports = InstallerFactory;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects shell environment and telemetry opt-out settings.
|
|
5
|
+
* Used to enrich analytics events and respect user privacy preferences.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Detect the user's shell/terminal environment
|
|
10
|
+
*
|
|
11
|
+
* @returns {string} Shell name (zsh, bash, powershell, cmd, fish, etc.) or 'unknown'
|
|
12
|
+
*/
|
|
13
|
+
function detectShell() {
|
|
14
|
+
if (process.platform === 'win32') {
|
|
15
|
+
const comspec = (process.env.ComSpec || '').toLowerCase();
|
|
16
|
+
if (comspec.includes('powershell') || comspec.includes('pwsh')) {
|
|
17
|
+
return 'powershell';
|
|
18
|
+
}
|
|
19
|
+
if (comspec.includes('cmd')) {
|
|
20
|
+
return 'cmd';
|
|
21
|
+
}
|
|
22
|
+
return 'unknown';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Unix-like systems (macOS, Linux)
|
|
26
|
+
const shell = process.env.SHELL || '';
|
|
27
|
+
const basename = shell.split('/').pop() || 'unknown';
|
|
28
|
+
return basename;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Check if telemetry is disabled via environment variables or CLI flag
|
|
33
|
+
*
|
|
34
|
+
* Respects:
|
|
35
|
+
* - IRIS_TELEMETRY_DISABLED=1
|
|
36
|
+
* - DO_NOT_TRACK=1
|
|
37
|
+
* - CI environments (CI, GITHUB_ACTIONS, GITLAB_CI, CIRCLECI, JENKINS_URL)
|
|
38
|
+
* - --no-telemetry CLI flag
|
|
39
|
+
*
|
|
40
|
+
* @param {Object} options - Optional overrides
|
|
41
|
+
* @param {boolean} options.noTelemetryFlag - CLI flag state
|
|
42
|
+
* @returns {boolean} True if telemetry should be disabled
|
|
43
|
+
*/
|
|
44
|
+
function isTelemetryDisabled(options = {}) {
|
|
45
|
+
// Check CLI flag first (highest priority)
|
|
46
|
+
if (options.noTelemetryFlag === true) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Check process.argv for --no-telemetry flag
|
|
51
|
+
if (process.argv.includes('--no-telemetry')) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Check explicit opt-out environment variables
|
|
56
|
+
if (process.env.IRIS_TELEMETRY_DISABLED === '1') {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Respect DO_NOT_TRACK standard (https://consoledonottrack.com/)
|
|
61
|
+
if (process.env.DO_NOT_TRACK === '1') {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Auto-disable in CI environments
|
|
66
|
+
if (process.env.CI === 'true') {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (process.env.GITHUB_ACTIONS === 'true') {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (process.env.GITLAB_CI === 'true') {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (process.env.CIRCLECI === 'true') {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (process.env.JENKINS_URL !== undefined) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = {
|
|
90
|
+
detectShell,
|
|
91
|
+
isTelemetryDisabled
|
|
92
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Module
|
|
3
|
+
*
|
|
4
|
+
* Exports the analytics tracker singleton for use throughout the installer.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* const analytics = require('./analytics');
|
|
8
|
+
*
|
|
9
|
+
* // Initialize at startup
|
|
10
|
+
* analytics.init();
|
|
11
|
+
*
|
|
12
|
+
* // Track events
|
|
13
|
+
* analytics.trackInstallerStarted();
|
|
14
|
+
* analytics.trackIdesConfirmed(['claude-code', 'cursor']);
|
|
15
|
+
* analytics.trackFlowSelected('aidlc');
|
|
16
|
+
* analytics.trackInstallationCompleted('claude-code', 'aidlc', 1500, 12);
|
|
17
|
+
* analytics.trackInstallationFailed('cursor', 'file_permission', 'aidlc');
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const tracker = require('./tracker');
|
|
21
|
+
|
|
22
|
+
module.exports = tracker;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machine ID Generation
|
|
3
|
+
*
|
|
4
|
+
* Generates a stable, anonymous machine identifier using a salted SHA-256 hash
|
|
5
|
+
* of the hostname. This ensures:
|
|
6
|
+
* - Same machine always produces same ID
|
|
7
|
+
* - Cannot reverse-lookup the hostname from the hash
|
|
8
|
+
* - No PII is stored or transmitted
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const crypto = require('crypto');
|
|
12
|
+
const os = require('os');
|
|
13
|
+
|
|
14
|
+
// Constant salt prevents rainbow table attacks
|
|
15
|
+
// Do not change this value - it would break ID consistency
|
|
16
|
+
const SALT = 'iris-analytics-v1';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate a stable machine identifier
|
|
20
|
+
*
|
|
21
|
+
* @returns {string} SHA-256 hash of salted hostname (64 hex characters)
|
|
22
|
+
*/
|
|
23
|
+
function getMachineId() {
|
|
24
|
+
const hostname = os.hostname();
|
|
25
|
+
return crypto
|
|
26
|
+
.createHash('sha256')
|
|
27
|
+
.update(SALT + hostname)
|
|
28
|
+
.digest('hex');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = {
|
|
32
|
+
getMachineId
|
|
33
|
+
};
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics Tracker
|
|
3
|
+
*
|
|
4
|
+
* Mixpanel-based analytics for the iris installer.
|
|
5
|
+
* Tracks anonymous usage patterns while respecting privacy.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Fire-and-forget event delivery (non-blocking)
|
|
9
|
+
* - Silent failures (never breaks installation)
|
|
10
|
+
* - Privacy-first (no PII, respects opt-out)
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const crypto = require('crypto');
|
|
14
|
+
const { getMachineId } = require('./machine-id');
|
|
15
|
+
const { detectShell, isTelemetryDisabled } = require('./env-detector');
|
|
16
|
+
|
|
17
|
+
// Mixpanel project token
|
|
18
|
+
// This is safe to embed - analytics tokens are public by design
|
|
19
|
+
const MIXPANEL_TOKEN = 'aca20c9ced2bd92e83660b9ebe33ded6';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* AnalyticsTracker - Singleton class for event tracking
|
|
23
|
+
*/
|
|
24
|
+
class AnalyticsTracker {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.mixpanel = null;
|
|
27
|
+
this.enabled = false;
|
|
28
|
+
this.machineId = null;
|
|
29
|
+
this.sessionId = null;
|
|
30
|
+
this.baseProperties = null;
|
|
31
|
+
this.initialized = false;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the analytics tracker
|
|
36
|
+
*
|
|
37
|
+
* @param {Object} options - Initialization options
|
|
38
|
+
* @param {boolean} options.noTelemetry - CLI flag to disable telemetry
|
|
39
|
+
* @returns {boolean} True if analytics is enabled
|
|
40
|
+
*/
|
|
41
|
+
init(options = {}) {
|
|
42
|
+
if (this.initialized) {
|
|
43
|
+
return this.enabled;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
this.initialized = true;
|
|
47
|
+
|
|
48
|
+
// Check if telemetry is disabled
|
|
49
|
+
if (isTelemetryDisabled({ noTelemetryFlag: options.noTelemetry })) {
|
|
50
|
+
this.enabled = false;
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
// Lazy-load Mixpanel to avoid blocking if not needed
|
|
56
|
+
const Mixpanel = require('mixpanel');
|
|
57
|
+
this.mixpanel = Mixpanel.init(MIXPANEL_TOKEN, {
|
|
58
|
+
protocol: 'https',
|
|
59
|
+
host: 'api-eu.mixpanel.com', // EU endpoint for GDPR compliance
|
|
60
|
+
// Note: geolocate: true enables IP-based geolocation for analytics.
|
|
61
|
+
// This data is used solely for aggregate usage insights (e.g., country-level
|
|
62
|
+
// adoption patterns). No personal identifiers are collected. Users can
|
|
63
|
+
// opt out via the --no-telemetry flag or IRIS_NO_TELEMETRY env var.
|
|
64
|
+
geolocate: true
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Generate IDs
|
|
68
|
+
this.machineId = getMachineId();
|
|
69
|
+
this.sessionId = crypto.randomUUID();
|
|
70
|
+
|
|
71
|
+
// Build base properties included with every event
|
|
72
|
+
this.baseProperties = {
|
|
73
|
+
distinct_id: this.machineId,
|
|
74
|
+
session_id: this.sessionId,
|
|
75
|
+
$os: process.platform,
|
|
76
|
+
shell: detectShell(),
|
|
77
|
+
node_version: process.version,
|
|
78
|
+
iris_version: this._getVersion()
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
this.enabled = true;
|
|
82
|
+
return true;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
// Silent failure - analytics should never break installation
|
|
85
|
+
this.enabled = false;
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get iris version from package.json
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
_getVersion() {
|
|
95
|
+
try {
|
|
96
|
+
const pkg = require('../../package.json');
|
|
97
|
+
return pkg.version || 'unknown';
|
|
98
|
+
} catch {
|
|
99
|
+
return 'unknown';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Track an event (fire-and-forget)
|
|
105
|
+
* @private
|
|
106
|
+
*
|
|
107
|
+
* @param {string} eventName - Name of the event
|
|
108
|
+
* @param {Object} properties - Additional event properties
|
|
109
|
+
* @param {boolean} waitForDelivery - Wait for event to be sent
|
|
110
|
+
* @returns {Promise<void>} Resolves when event is sent (if waitForDelivery is true)
|
|
111
|
+
*/
|
|
112
|
+
track(eventName, properties = {}, waitForDelivery = false) {
|
|
113
|
+
if (!this.enabled || !this.mixpanel) {
|
|
114
|
+
return waitForDelivery ? Promise.resolve() : undefined;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const eventData = {
|
|
118
|
+
...this.baseProperties,
|
|
119
|
+
...properties
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
if (waitForDelivery) {
|
|
123
|
+
return new Promise((resolve) => {
|
|
124
|
+
try {
|
|
125
|
+
this.mixpanel.track(eventName, eventData, () => {
|
|
126
|
+
// Resolve regardless of error - silent failure
|
|
127
|
+
resolve();
|
|
128
|
+
});
|
|
129
|
+
} catch {
|
|
130
|
+
resolve();
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
try {
|
|
136
|
+
this.mixpanel.track(eventName, eventData);
|
|
137
|
+
} catch {
|
|
138
|
+
// Silent failure
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Track installer_started event
|
|
144
|
+
* Called when the installer begins
|
|
145
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
146
|
+
*/
|
|
147
|
+
trackInstallerStarted() {
|
|
148
|
+
// Wait for delivery - critical funnel event
|
|
149
|
+
return this.track('installer_started', {}, true);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Track ides_confirmed event
|
|
154
|
+
* Called after user confirms IDE/tool selection
|
|
155
|
+
*
|
|
156
|
+
* @param {string[]} ides - Array of selected IDE keys (e.g., ['claude-code', 'cursor'])
|
|
157
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
158
|
+
*/
|
|
159
|
+
trackIdesConfirmed(ides) {
|
|
160
|
+
// Wait for delivery - critical funnel event
|
|
161
|
+
return this.track('ides_confirmed', {
|
|
162
|
+
ide_count: ides.length,
|
|
163
|
+
ides: ides
|
|
164
|
+
}, true);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Track flow_selected event
|
|
169
|
+
* Called after user selects an SDLC flow
|
|
170
|
+
*
|
|
171
|
+
* @param {string} flow - Flow key (e.g., 'aidlc', 'agile')
|
|
172
|
+
* @returns {Promise<void>} Resolves when event is sent
|
|
173
|
+
*/
|
|
174
|
+
trackFlowSelected(flow) {
|
|
175
|
+
// Wait for delivery - critical funnel event
|
|
176
|
+
return this.track('flow_selected', {
|
|
177
|
+
flow: flow
|
|
178
|
+
}, true);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Track installation_completed event
|
|
183
|
+
* Called after successful installation for an IDE
|
|
184
|
+
*
|
|
185
|
+
* @param {string} ide - IDE key (e.g., 'claude-code')
|
|
186
|
+
* @param {string} flow - Flow key (e.g., 'aidlc')
|
|
187
|
+
* @param {number} durationMs - Installation duration in milliseconds
|
|
188
|
+
* @param {number} filesCreated - Number of files created
|
|
189
|
+
*/
|
|
190
|
+
trackInstallationCompleted(ide, flow, durationMs, filesCreated) {
|
|
191
|
+
this.track('installation_completed', {
|
|
192
|
+
ide: ide,
|
|
193
|
+
flow: flow,
|
|
194
|
+
duration_ms: durationMs,
|
|
195
|
+
files_created: filesCreated
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Track installation_failed event
|
|
201
|
+
* Called after failed installation for an IDE
|
|
202
|
+
*
|
|
203
|
+
* @param {string} ide - IDE key (e.g., 'claude-code')
|
|
204
|
+
* @param {string} errorCategory - Error category (e.g., 'file_permission', 'network', 'unknown')
|
|
205
|
+
* @param {string} [flow] - Flow key (optional, may not be selected yet)
|
|
206
|
+
*/
|
|
207
|
+
trackInstallationFailed(ide, errorCategory, flow) {
|
|
208
|
+
const properties = {
|
|
209
|
+
ide: ide,
|
|
210
|
+
error_category: errorCategory
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
if (flow) {
|
|
214
|
+
properties.flow = flow;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
this.track('installation_failed', properties);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Check if analytics is enabled
|
|
222
|
+
* @returns {boolean}
|
|
223
|
+
*/
|
|
224
|
+
isEnabled() {
|
|
225
|
+
return this.enabled;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Export singleton instance
|
|
230
|
+
const tracker = new AnalyticsTracker();
|
|
231
|
+
|
|
232
|
+
module.exports = tracker;
|