wize-dev-kit 0.1.3 → 0.1.5
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/CHANGELOG.md +59 -1
- package/package.json +1 -1
- package/src/app-overlay/playbooks/apple-hig.md +112 -0
- package/src/app-overlay/playbooks/detox-maestro.md +179 -0
- package/src/app-overlay/playbooks/device-matrix.md +121 -0
- package/src/app-overlay/playbooks/material-design-3.md +135 -0
- package/src/app-overlay/playbooks/mobile-perf-budgets.md +145 -0
- package/src/app-overlay/playbooks/permissions-ux.md +147 -0
- package/src/app-overlay/playbooks/touch-targets-and-gestures.md +127 -0
- package/src/app-overlay/stack-catalog.md +178 -0
- package/src/orchestrator-skills/wize-help/skill.md +9 -2
- package/src/orchestrator-skills/wize-orchestrator/persona.md +9 -1
- package/src/web-overlay/playbooks/playwright-vitest.md +211 -0
- package/src/web-overlay/playbooks/responsive-breakpoints.md +104 -0
- package/src/web-overlay/playbooks/semantic-html.md +114 -0
- package/src/web-overlay/playbooks/wcag-aa.md +97 -0
- package/src/web-overlay/playbooks/web-perf-budgets.md +140 -0
- package/src/web-overlay/stack-catalog.md +208 -0
- package/tools/installer/setup-helpers.js +105 -0
- package/tools/installer/wize-cli.js +26 -9
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
catalog: web-stack
|
|
3
|
+
owner: wize-agent-architect # Tony (with Fury on strategy)
|
|
4
|
+
applies_when: web-overlay active
|
|
5
|
+
status: ready
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Web Stack Catalog — Tony's Reference
|
|
9
|
+
|
|
10
|
+
Tony reads this during the architecture interview. The catalog is opinionated but lists trade-offs honestly; the final pick depends on the PRD audience, Fury's NFR budget, and team comfort.
|
|
11
|
+
|
|
12
|
+
## 1. Decision dimensions
|
|
13
|
+
|
|
14
|
+
Pick by **dimension order**, not "which framework I like":
|
|
15
|
+
|
|
16
|
+
1. **Audience reach** — public marketing + SEO, or authenticated app?
|
|
17
|
+
2. **Latency budget** — sub-1s LCP on 3G, or richer-but-slower OK?
|
|
18
|
+
3. **Team familiarity** — favor the boring choice the team has shipped before.
|
|
19
|
+
4. **Backend coupling** — separate API, fullstack monolith, or BaaS?
|
|
20
|
+
5. **Deploy target** — edge platform, container, or self-managed?
|
|
21
|
+
|
|
22
|
+
## 2. Front-end frameworks
|
|
23
|
+
|
|
24
|
+
### Next.js (React)
|
|
25
|
+
|
|
26
|
+
| | |
|
|
27
|
+
|---|---|
|
|
28
|
+
| **Pick when** | SEO-critical pages + product app in one codebase. Strong ecosystem. |
|
|
29
|
+
| **Strengths** | App Router (RSC), edge runtime, ISR, large hiring pool. |
|
|
30
|
+
| **Costs** | RSC mental model still maturing; vendor lock-in toward Vercel optional but present. |
|
|
31
|
+
| **Bundle baseline** | React runtime ~45 KB gz + framework code. |
|
|
32
|
+
| **Best for** | Public products needing SEO + auth product behind same domain. |
|
|
33
|
+
|
|
34
|
+
### Nuxt 3 (Vue)
|
|
35
|
+
|
|
36
|
+
| | |
|
|
37
|
+
|---|---|
|
|
38
|
+
| **Pick when** | Vue-shop wanting Next-tier DX. |
|
|
39
|
+
| **Strengths** | Composition API ergonomics, auto-imports, modules ecosystem. |
|
|
40
|
+
| **Costs** | Smaller third-party SDK coverage than React. |
|
|
41
|
+
| **Bundle baseline** | Vue runtime ~30 KB gz. |
|
|
42
|
+
| **Best for** | Marketing + dashboard hybrid where Vue is the team's stack. |
|
|
43
|
+
|
|
44
|
+
### SvelteKit
|
|
45
|
+
|
|
46
|
+
| | |
|
|
47
|
+
|---|---|
|
|
48
|
+
| **Pick when** | Smallest runtime + fastest TTI. |
|
|
49
|
+
| **Strengths** | Compile-to-no-runtime, intuitive reactivity, edge-first. |
|
|
50
|
+
| **Costs** | Smaller hiring pool, fewer enterprise integrations. |
|
|
51
|
+
| **Bundle baseline** | ~0 KB framework runtime; only your code. |
|
|
52
|
+
| **Best for** | Latency-sensitive products, content-heavy + interactive. |
|
|
53
|
+
|
|
54
|
+
### Astro
|
|
55
|
+
|
|
56
|
+
| | |
|
|
57
|
+
|---|---|
|
|
58
|
+
| **Pick when** | Content-first (docs, marketing, blog) with islands of interactivity. |
|
|
59
|
+
| **Strengths** | Zero-JS by default; mix frameworks per island. |
|
|
60
|
+
| **Costs** | Not a SPA; not the right tool for heavy state apps. |
|
|
61
|
+
| **Bundle baseline** | ~0 KB unless you opt into an island. |
|
|
62
|
+
| **Best for** | Marketing sites, docs portals, mostly-static products. |
|
|
63
|
+
|
|
64
|
+
### Remix
|
|
65
|
+
|
|
66
|
+
| | |
|
|
67
|
+
|---|---|
|
|
68
|
+
| **Pick when** | Forms + nested routes + progressive enhancement matter. |
|
|
69
|
+
| **Strengths** | Web fundamentals first; great for "works without JS" requirements. |
|
|
70
|
+
| **Costs** | Smaller community than Next; some patterns ported back to Next. |
|
|
71
|
+
| **Bundle baseline** | React runtime + Remix glue. |
|
|
72
|
+
| **Best for** | Form-heavy apps (admin, e-commerce flows). |
|
|
73
|
+
|
|
74
|
+
### SPAs without SSR (CRA-style, Vite + React/Vue/Svelte)
|
|
75
|
+
|
|
76
|
+
| | |
|
|
77
|
+
|---|---|
|
|
78
|
+
| **Pick when** | Authenticated app behind login; SEO not required. |
|
|
79
|
+
| **Strengths** | Simplest mental model; fast iteration. |
|
|
80
|
+
| **Costs** | Slow LCP for first-time visitors; no SEO. |
|
|
81
|
+
| **Best for** | Internal tools, dashboards, B2B authenticated apps. |
|
|
82
|
+
|
|
83
|
+
### Laravel + Vue (Inertia)
|
|
84
|
+
|
|
85
|
+
| | |
|
|
86
|
+
|---|---|
|
|
87
|
+
| **Pick when** | PHP back-end exists + team is PHP-fluent. |
|
|
88
|
+
| **Strengths** | Server-rendered routing + SPA UX; great DX in monolith mode. |
|
|
89
|
+
| **Costs** | PHP hosting realities; smaller real-time ecosystem. |
|
|
90
|
+
| **Best for** | Brownfield Laravel apps modernizing the front-end. |
|
|
91
|
+
|
|
92
|
+
## 3. Back-end / data layer
|
|
93
|
+
|
|
94
|
+
### Supabase
|
|
95
|
+
|
|
96
|
+
| | |
|
|
97
|
+
|---|---|
|
|
98
|
+
| **Pick when** | Need Postgres + auth + storage + realtime with low setup. |
|
|
99
|
+
| **Strengths** | Full Postgres power, RLS, edge functions, GoTrue auth. |
|
|
100
|
+
| **Costs** | Lock-in to Supabase service surface (mitigated by being Postgres underneath). |
|
|
101
|
+
|
|
102
|
+
### PlanetScale / Neon (managed Postgres)
|
|
103
|
+
|
|
104
|
+
| | |
|
|
105
|
+
|---|---|
|
|
106
|
+
| **Pick when** | Need managed serverless Postgres without the rest of Supabase. |
|
|
107
|
+
| **Strengths** | Branching DBs, generous free tiers, edge-friendly. |
|
|
108
|
+
| **Costs** | You ship your own auth, storage, realtime. |
|
|
109
|
+
|
|
110
|
+
### Drizzle ORM
|
|
111
|
+
|
|
112
|
+
| | |
|
|
113
|
+
|---|---|
|
|
114
|
+
| **Pick when** | TypeScript-first ORM, edge-runtime compatibility matters. |
|
|
115
|
+
| **Strengths** | Tiny runtime, SQL-y; great for serverless. |
|
|
116
|
+
| **Costs** | Smaller ecosystem than Prisma. |
|
|
117
|
+
|
|
118
|
+
### Prisma
|
|
119
|
+
|
|
120
|
+
| | |
|
|
121
|
+
|---|---|
|
|
122
|
+
| **Pick when** | Larger team; tooling and migrations are paramount. |
|
|
123
|
+
| **Strengths** | Excellent migrations, generated client, mature ecosystem. |
|
|
124
|
+
| **Costs** | Heavier runtime; edge story improved but not as native as Drizzle. |
|
|
125
|
+
|
|
126
|
+
### tRPC
|
|
127
|
+
|
|
128
|
+
| | |
|
|
129
|
+
|---|---|
|
|
130
|
+
| **Pick when** | Single TS monorepo, server + client share types. |
|
|
131
|
+
| **Strengths** | Type-safe end-to-end; minimal overhead. |
|
|
132
|
+
| **Costs** | Not language-agnostic; OpenAPI shim needed for external consumers. |
|
|
133
|
+
|
|
134
|
+
### GraphQL (Apollo / urql / Relay)
|
|
135
|
+
|
|
136
|
+
| | |
|
|
137
|
+
|---|---|
|
|
138
|
+
| **Pick when** | Many client consumers, federated data sources. |
|
|
139
|
+
| **Strengths** | Per-client shape, schema-first design. |
|
|
140
|
+
| **Costs** | Server complexity; caching nuance; not always worth it for one client. |
|
|
141
|
+
|
|
142
|
+
## 4. Authentication
|
|
143
|
+
|
|
144
|
+
| Choice | Pick when |
|
|
145
|
+
|---|---|
|
|
146
|
+
| Supabase Auth (GoTrue) | Using Supabase already. |
|
|
147
|
+
| Clerk / Auth0 | Need polished UI + SSO out of the box; team avoids auth complexity. |
|
|
148
|
+
| WorkOS | Enterprise SSO + SCIM from day one. |
|
|
149
|
+
| Lucia | Self-hosted, TS, full control, smaller team. |
|
|
150
|
+
| Roll-your-own | Almost never. |
|
|
151
|
+
|
|
152
|
+
## 5. Hosting / deploy
|
|
153
|
+
|
|
154
|
+
| Choice | Pick when |
|
|
155
|
+
|---|---|
|
|
156
|
+
| **Vercel** | Next.js / Nuxt / SvelteKit, edge functions, generous DX. |
|
|
157
|
+
| **Cloudflare Pages + Workers** | Latency, global edge, low cost. |
|
|
158
|
+
| **Fly.io** | Need a real container with TCP, sticky regions. |
|
|
159
|
+
| **Coolify** (self-hosted PaaS) | Want Vercel-ish DX on own infra. |
|
|
160
|
+
| **Render / Railway** | Container apps + databases under one billing. |
|
|
161
|
+
| **Self-hosted Docker** | Heavy compliance constraints. |
|
|
162
|
+
|
|
163
|
+
## 6. Styling
|
|
164
|
+
|
|
165
|
+
| Choice | Pick when |
|
|
166
|
+
|---|---|
|
|
167
|
+
| **Tailwind CSS** | Token-first design system, utility-class team comfort. |
|
|
168
|
+
| **CSS Modules** | Component-scoped, no runtime, easy SSR. |
|
|
169
|
+
| **Vanilla Extract** | Type-safe styling at build time. |
|
|
170
|
+
| **shadcn-ui / Radix Primitives** | Need accessible primitives without ceding design. |
|
|
171
|
+
| **Linaria / Compiled** | CSS-in-JS without runtime cost. |
|
|
172
|
+
|
|
173
|
+
Mantis owns tokens (`.wize/solutioning/design-system/tokens.json`); Tony picks the system that maps those tokens cleanly.
|
|
174
|
+
|
|
175
|
+
## 7. State management
|
|
176
|
+
|
|
177
|
+
| Choice | Pick when |
|
|
178
|
+
|---|---|
|
|
179
|
+
| **React Server Components / Suspense** | Most data is server-derived. |
|
|
180
|
+
| **TanStack Query** | Heavy client-side data + caching. |
|
|
181
|
+
| **Zustand** | Small global state; no boilerplate. |
|
|
182
|
+
| **Jotai** | Atoms feel right for the domain. |
|
|
183
|
+
| **Pinia** (Vue) | Default Vue store. |
|
|
184
|
+
| **Redux Toolkit** | Time-travel, complex async pipelines, large team. |
|
|
185
|
+
|
|
186
|
+
## 8. Forms
|
|
187
|
+
|
|
188
|
+
| Choice | Pick when |
|
|
189
|
+
|---|---|
|
|
190
|
+
| **React Hook Form + Zod** | Type-safe schemas, low re-render count. |
|
|
191
|
+
| **Conform** | Server-progressive enhancement (Remix). |
|
|
192
|
+
| **TanStack Form** | TanStack ecosystem, schema-agnostic. |
|
|
193
|
+
|
|
194
|
+
## 9. Anti-patterns Tony flags fast
|
|
195
|
+
|
|
196
|
+
- Mixing **SSR + heavy client state** without a clear seam.
|
|
197
|
+
- Loading `lodash` for one function.
|
|
198
|
+
- Using **Redux for an app with 3 stores** of 5 keys each.
|
|
199
|
+
- Picking a tech because it's on a HackerNews front page.
|
|
200
|
+
- Defaulting to GraphQL for a one-client app.
|
|
201
|
+
|
|
202
|
+
## 10. Recording the choice
|
|
203
|
+
|
|
204
|
+
Tony writes the chosen stack into:
|
|
205
|
+
|
|
206
|
+
- `.wize/planning/tech-vision.md` (Fury): family + non-negotiables.
|
|
207
|
+
- `.wize/solutioning/architecture.md` (Tony): concrete picks + reasons.
|
|
208
|
+
- `.wize/solutioning/adrs/ADR-001-stack.md`: the trade-off log for future readers.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Setup helpers used by `wize-dev-kit install`:
|
|
2
|
+
// - generateUserToml({ name, role }) → .wize/config/user.toml template
|
|
3
|
+
// - applyGitignore(projectRoot) → idempotent gitignore block injection
|
|
4
|
+
//
|
|
5
|
+
// Both are pure functions where possible; only applyGitignore writes to disk.
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const fs = require('node:fs');
|
|
10
|
+
const path = require('node:path');
|
|
11
|
+
|
|
12
|
+
const GITIGNORE_BEGIN = '# >>> wize-dev-kit (managed) >>>';
|
|
13
|
+
const GITIGNORE_END = '# <<< wize-dev-kit (managed) <<<';
|
|
14
|
+
|
|
15
|
+
const GITIGNORE_BODY = [
|
|
16
|
+
'# Personal / per-developer (do NOT commit)',
|
|
17
|
+
'.wize/config/user.toml',
|
|
18
|
+
'.wize/scratch/',
|
|
19
|
+
'.wize/.local/',
|
|
20
|
+
'.wize/implementation/quick-dev-log.md',
|
|
21
|
+
'',
|
|
22
|
+
'# Generated IDE adapter outputs (regenerate with `npx wize-dev-kit install`)',
|
|
23
|
+
'.claude/skills/wize-*',
|
|
24
|
+
'.agent/skills/wize-*',
|
|
25
|
+
'.agents/skills/wize-*',
|
|
26
|
+
'.kimi/skills/wize-*',
|
|
27
|
+
'.cursor/rules/wize-*.mdc',
|
|
28
|
+
'.windsurf/rules/wize-*.md',
|
|
29
|
+
'.continue/prompts/wize-*.prompt',
|
|
30
|
+
'.opencode/agents/wize-*.md',
|
|
31
|
+
'.opencode/commands/wize-*.md',
|
|
32
|
+
'.wize/agents/wize-*.md'
|
|
33
|
+
].join('\n');
|
|
34
|
+
|
|
35
|
+
function buildGitignoreBlock() {
|
|
36
|
+
return [
|
|
37
|
+
GITIGNORE_BEGIN,
|
|
38
|
+
'# Managed by `npx wize-dev-kit install`. Re-running install will update',
|
|
39
|
+
'# the lines between the markers below; lines outside are untouched.',
|
|
40
|
+
'',
|
|
41
|
+
GITIGNORE_BODY,
|
|
42
|
+
GITIGNORE_END
|
|
43
|
+
].join('\n');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Idempotent: if the block exists, replace it; otherwise append.
|
|
47
|
+
// Returns { changed: boolean, mode: 'created'|'replaced'|'appended'|'unchanged' }.
|
|
48
|
+
function applyGitignore(projectRoot, { dryRun = false } = {}) {
|
|
49
|
+
const file = path.join(projectRoot, '.gitignore');
|
|
50
|
+
const block = buildGitignoreBlock();
|
|
51
|
+
let current = '';
|
|
52
|
+
let exists = fs.existsSync(file);
|
|
53
|
+
if (exists) current = fs.readFileSync(file, 'utf-8');
|
|
54
|
+
|
|
55
|
+
const startIdx = current.indexOf(GITIGNORE_BEGIN);
|
|
56
|
+
const endIdx = current.indexOf(GITIGNORE_END);
|
|
57
|
+
let next;
|
|
58
|
+
let mode;
|
|
59
|
+
|
|
60
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
61
|
+
const before = current.slice(0, startIdx).replace(/\n+$/, '');
|
|
62
|
+
const after = current.slice(endIdx + GITIGNORE_END.length).replace(/^\n+/, '');
|
|
63
|
+
next = [before, block, after].filter(Boolean).join('\n\n');
|
|
64
|
+
if (!next.endsWith('\n')) next += '\n';
|
|
65
|
+
mode = current.includes(block) ? 'unchanged' : 'replaced';
|
|
66
|
+
} else if (exists) {
|
|
67
|
+
next = current.replace(/\n+$/, '') + '\n\n' + block + '\n';
|
|
68
|
+
mode = 'appended';
|
|
69
|
+
} else {
|
|
70
|
+
next = block + '\n';
|
|
71
|
+
mode = 'created';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const changed = next !== current;
|
|
75
|
+
if (changed && !dryRun) fs.writeFileSync(file, next, 'utf-8');
|
|
76
|
+
return { changed, mode };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function generateUserToml({ name = '', role = '' } = {}) {
|
|
80
|
+
const escapedName = String(name).replace(/"/g, '\\"');
|
|
81
|
+
const roleLine = role
|
|
82
|
+
? `role = "${String(role).replace(/"/g, '\\"')}"`
|
|
83
|
+
: `# role = "developer" # optional — "developer", "PM", "designer", etc.`;
|
|
84
|
+
return `# Wize Development Kit — user-level customizations.
|
|
85
|
+
# This file is per-developer; the kit places it in .gitignore so each member
|
|
86
|
+
# of the team gets their own copy. Do NOT commit.
|
|
87
|
+
|
|
88
|
+
[user]
|
|
89
|
+
name = "${escapedName}"
|
|
90
|
+
${roleLine}
|
|
91
|
+
|
|
92
|
+
[preferences]
|
|
93
|
+
# Override project-level language if you prefer another locally:
|
|
94
|
+
# communication = "pt-BR"
|
|
95
|
+
# document_output = "en"
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
module.exports = {
|
|
100
|
+
GITIGNORE_BEGIN,
|
|
101
|
+
GITIGNORE_END,
|
|
102
|
+
buildGitignoreBlock,
|
|
103
|
+
applyGitignore,
|
|
104
|
+
generateUserToml
|
|
105
|
+
};
|
|
@@ -10,9 +10,11 @@
|
|
|
10
10
|
'use strict';
|
|
11
11
|
|
|
12
12
|
const fs = require('node:fs');
|
|
13
|
+
const os = require('node:os');
|
|
13
14
|
const path = require('node:path');
|
|
14
15
|
const readline = require('node:readline');
|
|
15
16
|
const prompts = require('prompts');
|
|
17
|
+
const { applyGitignore, generateUserToml } = require('./setup-helpers.js');
|
|
16
18
|
|
|
17
19
|
const INTERACTIVE = process.stdout.isTTY && process.stdin.isTTY;
|
|
18
20
|
|
|
@@ -228,7 +230,7 @@ function projectToml({ profiles, targets, communication_language, document_outpu
|
|
|
228
230
|
const profileLine = profiles.map(p => `"${p.code}"`).join(', ');
|
|
229
231
|
const targetLine = targets.map(t => `"${t.code}"`).join(', ');
|
|
230
232
|
return `# Wize Development Kit — project config
|
|
231
|
-
# Generated at install.
|
|
233
|
+
# Generated at install. Commit this file. Personal preferences live in user.toml.
|
|
232
234
|
|
|
233
235
|
[project]
|
|
234
236
|
name = "${project_name}"
|
|
@@ -239,7 +241,7 @@ profiles = [${profileLine}]
|
|
|
239
241
|
ide_targets = [${targetLine}]
|
|
240
242
|
|
|
241
243
|
[language]
|
|
242
|
-
# Language used when agents talk to
|
|
244
|
+
# Language used when agents talk to the team in chat.
|
|
243
245
|
communication = "${communication_language}"
|
|
244
246
|
# Language used when agents write artifacts to disk
|
|
245
247
|
# (brief.md, prd.md, architecture.md, gate.md, etc.).
|
|
@@ -271,12 +273,6 @@ gate = { granularity = "per-story" }
|
|
|
271
273
|
`;
|
|
272
274
|
}
|
|
273
275
|
|
|
274
|
-
function userToml() {
|
|
275
|
-
return `# Wize Development Kit — user-level customizations
|
|
276
|
-
# This file is preserved on update; project.toml may be rewritten.
|
|
277
|
-
`;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
276
|
function renderAdapters({ kitRoot, projectRoot, targets, profiles }) {
|
|
281
277
|
const results = [];
|
|
282
278
|
const profileCodes = profiles.map(p => p.code);
|
|
@@ -336,18 +332,39 @@ async function cmdInstall(args) {
|
|
|
336
332
|
communication_language
|
|
337
333
|
);
|
|
338
334
|
|
|
335
|
+
// Personal touch — the user_name lands in .wize/config/user.toml (per-developer).
|
|
336
|
+
const defaultName = (os.userInfo().username || '').trim();
|
|
337
|
+
const user_name = (await prompt(
|
|
338
|
+
`How should the agents call you? [${defaultName || 'leave blank'}]: `
|
|
339
|
+
)).trim() || defaultName;
|
|
340
|
+
|
|
341
|
+
// Gitignore — opt-in, idempotent.
|
|
342
|
+
const wantsGitignore = await confirm(
|
|
343
|
+
'Add the suggested entries to .gitignore (user.toml + scratch + generated adapter outputs)?',
|
|
344
|
+
true
|
|
345
|
+
);
|
|
346
|
+
|
|
339
347
|
console.log('\nCreating .wize/ skeleton...');
|
|
340
348
|
for (const dir of WIZE_DIRS) mkdirp(path.join(cwd, dir));
|
|
341
349
|
|
|
342
350
|
writeIfMissing(path.join(cwd, '.wize/config/project.toml'), projectToml({
|
|
343
351
|
profiles, targets, communication_language, document_output_language, project_name
|
|
344
352
|
}));
|
|
345
|
-
writeIfMissing(path.join(cwd, '.wize/config/user.toml'),
|
|
353
|
+
writeIfMissing(path.join(cwd, '.wize/config/user.toml'), generateUserToml({ name: user_name }));
|
|
346
354
|
writeIfMissing(path.join(cwd, '.wize/config/tea.toml'), teaToml());
|
|
347
355
|
|
|
348
356
|
console.log('✓ .wize/ created');
|
|
349
357
|
console.log(`✓ profiles: ${profiles.map(p => p.code).join(', ')}`);
|
|
350
358
|
console.log(`✓ ide targets: ${targets.map(t => t.code).join(', ')}`);
|
|
359
|
+
if (user_name) console.log(`✓ user.toml: agents will call you "${user_name}"`);
|
|
360
|
+
|
|
361
|
+
if (wantsGitignore) {
|
|
362
|
+
const r = applyGitignore(cwd);
|
|
363
|
+
if (r.changed) console.log(`✓ .gitignore ${r.mode} with the wize-dev-kit block`);
|
|
364
|
+
else console.log(`= .gitignore already up to date`);
|
|
365
|
+
} else {
|
|
366
|
+
console.log('= .gitignore untouched (you opted out of suggested entries)');
|
|
367
|
+
}
|
|
351
368
|
|
|
352
369
|
console.log('\nGenerating IDE adapters...');
|
|
353
370
|
const renderResults = renderAdapters({
|