wize-dev-kit 0.1.3 → 0.1.4

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 CHANGED
@@ -5,6 +5,25 @@ Format inspired by [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.1.4] — 2026-06-01
9
+
10
+ ### Added
11
+
12
+ - **`user_name` prompt at install time.** The installer asks "How should the agents call you?" (default = `$USER`), and persists the answer to `.wize/config/user.toml` under `[user] name`. Wizer and `wize-help` read this file and greet the user by name (e.g., *"Welcome back, [USER_NAME]. {project} — {profiles}. Next: …"*).
13
+ - **Opt-in suggested `.gitignore` block.** The installer asks whether to apply the suggested entries. When accepted, an idempotent block is injected between `# >>> wize-dev-kit (managed) >>>` and `# <<< wize-dev-kit (managed) <<<` markers covering: per-developer files (`user.toml`, `scratch/`, `.local/`, `quick-dev-log.md`) and the generated IDE adapter outputs (`.claude/skills/wize-*`, `.agent/skills/wize-*`, `.cursor/rules/wize-*.mdc`, etc.). Re-running install only updates lines between the markers; everything outside is untouched. Declining keeps `.gitignore` exactly as it was.
14
+ - `tools/installer/setup-helpers.js`: pure-ish helpers for `applyGitignore()` (create / append / replace / unchanged) and `generateUserToml()`.
15
+ - 8 new unit tests covering gitignore idempotency (create, append, idempotent re-run, stale-block replace, dry-run) and user.toml generation (name, escaping, optional role). Total: 33 passing.
16
+
17
+ ### Changed
18
+
19
+ - Wizer (orchestrator) persona and `wize-help` skill now instruct the agent to read `.wize/config/user.toml` and use `[user] name` when greeting.
20
+ - `project.toml` template comment clarifies "personal preferences live in user.toml".
21
+
22
+ ### Recommended layout (for a team repo)
23
+
24
+ Commit: `.wize/config/project.toml`, `.wize/config/tea.toml`, `.wize/planning/`, `.wize/solutioning/`, `.wize/implementation/tea/`, `.wize/implementation/retrospective/`, `.wize/knowledge/`, `.wize/custom/`, `AGENTS.md`.
25
+ Ignore (handled by the suggested block): `.wize/config/user.toml`, `.wize/scratch/`, `.wize/.local/`, `.wize/implementation/quick-dev-log.md`, and all generated adapter outputs (each developer runs `npx wize-dev-kit install` for their own IDE target).
26
+
8
27
  ## [0.1.3] — 2026-06-01
9
28
 
10
29
  ### Added
@@ -83,7 +102,8 @@ Format inspired by [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
83
102
  - Inspired by [BMAD Method v6.8.0](https://github.com/bmad-code-org/BMAD-METHOD).
84
103
  - WDS module inspired by [bmad-method-wds-expansion](https://github.com/bmad-code-org/bmad-method-wds-expansion).
85
104
 
86
- [Unreleased]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.3...HEAD
105
+ [Unreleased]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.4...HEAD
106
+ [0.1.4]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.3...v0.1.4
87
107
  [0.1.3]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.2...v0.1.3
88
108
  [0.1.2]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.1...v0.1.2
89
109
  [0.1.1]: https://github.com/qwize-br/wize-development-kit/compare/v0.1.0...v0.1.1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "wize-dev-kit",
4
- "version": "0.1.3",
4
+ "version": "0.1.4",
5
5
  "description": "Full-lifecycle AI-assisted development kit with Test Architect and Whiteport Design Studio embedded. Inspired by BMAD Method and WDS.",
6
6
  "keywords": [
7
7
  "ai",
@@ -26,6 +26,7 @@ Read these files if they exist (they may not — that's information too):
26
26
  | Path | Tells you |
27
27
  |---|---|
28
28
  | `.wize/config/project.toml` | Active profiles, IDE targets, communication & document languages, project name. |
29
+ | `.wize/config/user.toml` | Per-developer preferences. Use `[user] name` to greet the user by name. Use `[preferences] communication` to override the project language if present. |
29
30
  | `.wize/config/tea.toml` | TEA gate policy (advisory vs enforcing). |
30
31
  | `.wize/planning/brief.md` | Whether Phase 1 (Pepper) started. |
31
32
  | `.wize/planning/research.md` | Whether research was done. |
@@ -63,14 +64,20 @@ For brownfield repos where `.wize/knowledge/document-project/` is missing, prepe
63
64
 
64
65
  ## Step 3 — respond
65
66
 
66
- Default response shape (3 lines):
67
+ Default response shape (3 lines). When `user.toml` provides a `[user] name`, include it in the greeting:
67
68
 
68
69
  ```
69
- Welcome back. {project name} — {profiles, e.g., "Core + Web"}.
70
+ Welcome back{{, <user.name> when present}}. {project name} — {profiles, e.g., "Core + Web"}.
70
71
  You're at: {phase + last completed artifact}.
71
72
  Next: /{next workflow} ({persona}).
72
73
  ```
73
74
 
75
+ Concrete example with personalization filled in:
76
+
77
+ > Welcome back, [USER_NAME]. wize-development-kit — Core + Web.
78
+ > You're at: Phase 3 closeout — architecture signed, no risk profile yet.
79
+ > Next: `/wize-tea-risk` (Hawkeye).
80
+
74
81
  For `status`, return a markdown table:
75
82
 
76
83
  ```
@@ -17,6 +17,14 @@ I am **Wizer**. I am the host of this development kit. I know who you are, what
17
17
  - I speak the user's language (configurable in `.wize/config/project.toml`).
18
18
  - I never narrate my reasoning aloud — I just route.
19
19
 
20
+ ## Personalization
21
+
22
+ Before greeting, read `.wize/config/user.toml` if it exists. If it has `[user] name = "…"`, call the user by that name. If it also has `role = "…"`, factor that into how technical/strategic you frame follow-ups (a PM gets framing, a developer gets file paths).
23
+
24
+ If `user.toml` is missing or has no `name`, fall back to a neutral greeting.
25
+
20
26
  ## Greet
21
27
 
22
- > "Welcome back. What are we working on?"
28
+ > "Welcome back{{`, ` + user.name when present, else ''}}. What are we working on?"
29
+
30
+ Example with personalization filled in: *"Welcome back, [USER_NAME]. What are we working on?"*
@@ -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. Edit user-level customizations in user.toml.
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 you in the IDE chat.
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'), userToml());
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({