cawdex 1.35.73 → 1.35.75

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.
@@ -0,0 +1,6 @@
1
+ export interface InstantArtifactResult {
2
+ filePath: string;
3
+ message: string;
4
+ assistantMessage: string;
5
+ }
6
+ export declare function maybeCreateInstantArtifact(input: string, cwd: string, env?: NodeJS.ProcessEnv): InstantArtifactResult | null;
@@ -0,0 +1,397 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const ARTIFACT_TRIGGER = /\b(?:make|create|build|write|generate)\b[\s\S]{0,160}\b(?:website|web\s*site|portfolio|resume\s+(?:site|website)|landing\s+page)\b/i;
4
+ const EXISTING_PROJECT_HINT = /\b(?:repo|repository|codebase|existing|current\s+(?:project|app|site|page)|this\s+(?:project|app|repo|codebase)|component|route|next\.?js|vite|react|vue|svelte|tailwind|package\.json|src\/|app\/|pages\/)\b/i;
5
+ export function maybeCreateInstantArtifact(input, cwd, env = process.env) {
6
+ if (/^(0|false|off|no)$/i.test(env.CAWDEX_INSTANT_ARTIFACTS || ''))
7
+ return null;
8
+ const text = input.trim();
9
+ if (!ARTIFACT_TRIGGER.test(text))
10
+ return null;
11
+ if (!/\b(?:for|named)\b/i.test(text))
12
+ return null;
13
+ if (EXISTING_PROJECT_HINT.test(text))
14
+ return null;
15
+ const name = extractPersonName(text);
16
+ if (!name)
17
+ return null;
18
+ const role = extractRole(text);
19
+ const slug = slugify(`${name} portfolio`);
20
+ const dir = resolveArtifactDirectory(text, cwd, env);
21
+ mkdirSync(dir, { recursive: true });
22
+ const filePath = uniquePath(dir, `${slug}.html`);
23
+ const html = buildPortfolioHtml({ name, role });
24
+ writeFileSync(filePath, html, 'utf8');
25
+ const message = `Created a single-file portfolio website for ${name}.\n` +
26
+ `${filePath}\n\n` +
27
+ `It is ready to open in a browser.`;
28
+ return {
29
+ filePath,
30
+ message,
31
+ assistantMessage: `Created ${filePath} for ${name}, a hypothetical ${role.toLowerCase()}, as a single-file HTML portfolio website.`,
32
+ };
33
+ }
34
+ function extractPersonName(text) {
35
+ const named = text.match(/\bnamed\s+([A-Z][A-Za-z'-]+(?:\s+[A-Z][A-Za-z'-]+){0,3})\b/);
36
+ if (named)
37
+ return titleCaseName(named[1]);
38
+ const afterFor = text.match(/\bfor\s+([A-Z][A-Za-z'-]+(?:\s+[A-Z][A-Za-z'-]+){0,3})\b/);
39
+ if (!afterFor)
40
+ return null;
41
+ const candidate = afterFor[1].trim();
42
+ if (/^(me|us|him|her|them|my|our|a|an|the)$/i.test(candidate))
43
+ return null;
44
+ return titleCaseName(candidate);
45
+ }
46
+ function extractRole(text) {
47
+ const normalized = text.replace(/\s+/g, ' ');
48
+ const explicit = normalized.match(/\b(?:he|she|they)\s+(?:is|are)\s+(?:an?\s+)?([^.,;]+?)(?:\s+looking\b|\s+in\b|\s+from\b|\s+so\b|\s+and\b|[.,;]|$)/i)
49
+ || normalized.match(/\bas\s+(?:an?\s+)?([^.,;]+?)(?:\s+looking\b|\s+in\b|\s+from\b|\s+so\b|\s+and\b|[.,;]|$)/i);
50
+ const raw = explicit?.[1]?.trim();
51
+ if (raw)
52
+ return cleanRole(raw);
53
+ if (/\bdata scientist\b/i.test(text))
54
+ return 'Data Scientist';
55
+ if (/\bgame dev(?:eloper)?\b/i.test(text))
56
+ return 'Game Developer';
57
+ if (/\bsoftware engineers?\b/i.test(text))
58
+ return 'Software Engineer';
59
+ if (/\bdesigner\b/i.test(text))
60
+ return 'Product Designer';
61
+ return 'Software Engineer';
62
+ }
63
+ function cleanRole(raw) {
64
+ const lower = raw
65
+ .replace(/\bsoftware engineers\b/i, 'software engineer')
66
+ .replace(/\bdev\b/i, 'developer')
67
+ .replace(/\s+/g, ' ')
68
+ .trim()
69
+ .toLowerCase();
70
+ return lower
71
+ .split(' ')
72
+ .map((word) => word ? word[0].toUpperCase() + word.slice(1) : word)
73
+ .join(' ');
74
+ }
75
+ function resolveArtifactDirectory(text, cwd, env) {
76
+ if (/\bdesktop\b/i.test(text)) {
77
+ const home = env.USERPROFILE || env.HOME;
78
+ if (home)
79
+ return join(home, 'Desktop');
80
+ }
81
+ return cwd;
82
+ }
83
+ function uniquePath(dir, filename) {
84
+ const dot = filename.lastIndexOf('.');
85
+ const base = dot >= 0 ? filename.slice(0, dot) : filename;
86
+ const ext = dot >= 0 ? filename.slice(dot) : '';
87
+ let candidate = join(dir, filename);
88
+ let suffix = 2;
89
+ while (existsSync(candidate)) {
90
+ candidate = join(dir, `${base}-${suffix}${ext}`);
91
+ suffix++;
92
+ }
93
+ return candidate;
94
+ }
95
+ function slugify(value) {
96
+ const slug = value
97
+ .toLowerCase()
98
+ .replace(/[^a-z0-9]+/g, '-')
99
+ .replace(/^-+|-+$/g, '');
100
+ return slug || 'portfolio';
101
+ }
102
+ function titleCaseName(value) {
103
+ return value
104
+ .trim()
105
+ .split(/\s+/)
106
+ .map((word) => word ? word[0].toUpperCase() + word.slice(1) : word)
107
+ .join(' ');
108
+ }
109
+ function buildPortfolioHtml(profile) {
110
+ const { name, role } = profile;
111
+ const initials = name.split(/\s+/).map((part) => part[0]).join('').slice(0, 3).toUpperCase();
112
+ const specialty = role.toLowerCase().includes('data')
113
+ ? 'predictive systems, decision intelligence, and production analytics'
114
+ : role.toLowerCase().includes('game')
115
+ ? 'gameplay systems, technical art pipelines, and player-first tooling'
116
+ : 'scalable products, resilient platforms, and polished user experiences';
117
+ return `<!doctype html>
118
+ <html lang="en">
119
+ <head>
120
+ <meta charset="utf-8">
121
+ <meta name="viewport" content="width=device-width, initial-scale=1">
122
+ <title>${escapeHtml(name)} | ${escapeHtml(role)}</title>
123
+ <style>
124
+ :root {
125
+ --bg: #08090d;
126
+ --panel: #12141c;
127
+ --ink: #f4f0ff;
128
+ --muted: #aba4bd;
129
+ --line: rgba(255,255,255,.13);
130
+ --hot: #b46cff;
131
+ --aqua: #55e0d2;
132
+ --gold: #f0c66a;
133
+ --danger: #ff5d73;
134
+ }
135
+ * { box-sizing: border-box; }
136
+ html { scroll-behavior: smooth; }
137
+ body {
138
+ margin: 0;
139
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
140
+ background:
141
+ radial-gradient(circle at 15% 10%, rgba(180,108,255,.22), transparent 34rem),
142
+ radial-gradient(circle at 85% 0%, rgba(85,224,210,.16), transparent 30rem),
143
+ linear-gradient(135deg, #08090d 0%, #11121a 48%, #08090d 100%);
144
+ color: var(--ink);
145
+ min-height: 100vh;
146
+ }
147
+ a { color: inherit; }
148
+ .shell { width: min(1180px, calc(100% - 40px)); margin: 0 auto; }
149
+ header {
150
+ position: sticky;
151
+ top: 0;
152
+ z-index: 10;
153
+ backdrop-filter: blur(20px);
154
+ background: rgba(8,9,13,.78);
155
+ border-bottom: 1px solid var(--line);
156
+ }
157
+ nav {
158
+ height: 66px;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: space-between;
162
+ gap: 20px;
163
+ }
164
+ .brand { display: flex; align-items: center; gap: 12px; font-weight: 800; letter-spacing: .08em; }
165
+ .mark {
166
+ width: 38px;
167
+ height: 38px;
168
+ display: grid;
169
+ place-items: center;
170
+ border: 1px solid var(--line);
171
+ background: linear-gradient(135deg, rgba(180,108,255,.28), rgba(85,224,210,.18));
172
+ border-radius: 10px;
173
+ }
174
+ .links { display: flex; align-items: center; gap: 18px; color: var(--muted); font-size: 14px; }
175
+ .links a { text-decoration: none; }
176
+ .hero {
177
+ min-height: 86vh;
178
+ display: grid;
179
+ grid-template-columns: 1.15fr .85fr;
180
+ gap: 48px;
181
+ align-items: center;
182
+ padding: 72px 0 44px;
183
+ }
184
+ .eyebrow { color: var(--aqua); font-weight: 800; text-transform: uppercase; letter-spacing: .18em; font-size: 13px; }
185
+ h1 {
186
+ margin: 14px 0 18px;
187
+ font-size: clamp(48px, 8vw, 104px);
188
+ line-height: .9;
189
+ letter-spacing: 0;
190
+ }
191
+ .lede { color: #d7d0e8; font-size: clamp(18px, 2.2vw, 24px); line-height: 1.45; max-width: 760px; }
192
+ .actions { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 32px; }
193
+ .button {
194
+ text-decoration: none;
195
+ border: 1px solid var(--line);
196
+ border-radius: 8px;
197
+ padding: 13px 17px;
198
+ font-weight: 800;
199
+ background: rgba(255,255,255,.06);
200
+ }
201
+ .button.primary { background: linear-gradient(135deg, var(--hot), var(--aqua)); color: #050609; border: 0; }
202
+ .signal {
203
+ position: relative;
204
+ min-height: 520px;
205
+ border: 1px solid var(--line);
206
+ background: rgba(18,20,28,.76);
207
+ overflow: hidden;
208
+ border-radius: 8px;
209
+ }
210
+ .signal::before {
211
+ content: "";
212
+ position: absolute;
213
+ inset: 0;
214
+ background:
215
+ linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
216
+ linear-gradient(90deg, rgba(255,255,255,.04) 1px, transparent 1px);
217
+ background-size: 34px 34px;
218
+ mask-image: linear-gradient(to bottom, black, transparent);
219
+ }
220
+ .orb {
221
+ position: absolute;
222
+ width: 260px;
223
+ height: 260px;
224
+ border-radius: 50%;
225
+ left: calc(50% - 130px);
226
+ top: calc(50% - 130px);
227
+ background: conic-gradient(from 120deg, var(--hot), var(--aqua), var(--gold), var(--hot));
228
+ filter: saturate(1.2);
229
+ animation: turn 9s linear infinite;
230
+ opacity: .96;
231
+ }
232
+ .orb::after {
233
+ content: "${escapeCss(initials)}";
234
+ position: absolute;
235
+ inset: 22px;
236
+ display: grid;
237
+ place-items: center;
238
+ border-radius: 50%;
239
+ background: #0c0d12;
240
+ color: var(--ink);
241
+ font-size: 64px;
242
+ font-weight: 900;
243
+ }
244
+ .metric {
245
+ position: absolute;
246
+ padding: 14px 16px;
247
+ border: 1px solid var(--line);
248
+ background: rgba(8,9,13,.76);
249
+ border-radius: 8px;
250
+ min-width: 150px;
251
+ }
252
+ .metric strong { display: block; font-size: 24px; color: var(--aqua); }
253
+ .m1 { left: 28px; top: 34px; }
254
+ .m2 { right: 28px; top: 116px; }
255
+ .m3 { left: 42px; bottom: 44px; }
256
+ @keyframes turn { to { transform: rotate(360deg); } }
257
+ section { padding: 72px 0; border-top: 1px solid rgba(255,255,255,.08); }
258
+ .section-head { display: flex; justify-content: space-between; gap: 30px; align-items: end; margin-bottom: 28px; }
259
+ h2 { margin: 0; font-size: clamp(28px, 4vw, 52px); }
260
+ .section-head p { color: var(--muted); max-width: 520px; line-height: 1.6; margin: 0; }
261
+ .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
262
+ .card {
263
+ border: 1px solid var(--line);
264
+ border-radius: 8px;
265
+ background: rgba(18,20,28,.72);
266
+ padding: 24px;
267
+ min-height: 210px;
268
+ }
269
+ .card b { color: var(--gold); }
270
+ .card p { color: var(--muted); line-height: 1.6; }
271
+ .timeline { display: grid; gap: 14px; }
272
+ .row {
273
+ display: grid;
274
+ grid-template-columns: 160px 1fr;
275
+ gap: 18px;
276
+ padding: 18px;
277
+ border: 1px solid var(--line);
278
+ background: rgba(255,255,255,.045);
279
+ border-radius: 8px;
280
+ }
281
+ .row span { color: var(--aqua); font-weight: 800; }
282
+ .row p { margin: 6px 0 0; color: var(--muted); }
283
+ .contact {
284
+ display: grid;
285
+ grid-template-columns: 1fr auto;
286
+ align-items: center;
287
+ gap: 24px;
288
+ border: 1px solid var(--line);
289
+ border-radius: 8px;
290
+ padding: 30px;
291
+ background: linear-gradient(135deg, rgba(180,108,255,.2), rgba(85,224,210,.1));
292
+ }
293
+ footer { color: var(--muted); padding: 28px 0 48px; }
294
+ @media (max-width: 860px) {
295
+ .hero, .grid, .contact { grid-template-columns: 1fr; }
296
+ .signal { min-height: 390px; }
297
+ .links { display: none; }
298
+ .row { grid-template-columns: 1fr; }
299
+ }
300
+ </style>
301
+ </head>
302
+ <body>
303
+ <header>
304
+ <nav class="shell">
305
+ <div class="brand"><span class="mark">${escapeHtml(initials)}</span><span>${escapeHtml(name)}</span></div>
306
+ <div class="links">
307
+ <a href="#work">Work</a>
308
+ <a href="#systems">Systems</a>
309
+ <a href="#contact">Contact</a>
310
+ </div>
311
+ </nav>
312
+ </header>
313
+
314
+ <main class="shell">
315
+ <section class="hero">
316
+ <div>
317
+ <div class="eyebrow">${escapeHtml(role)} / Portfolio</div>
318
+ <h1>${escapeHtml(name)}</h1>
319
+ <p class="lede">${escapeHtml(name)} builds ${escapeHtml(specialty)}. The work feels calm under pressure, exact in execution, and memorable enough to help teams win trust fast.</p>
320
+ <div class="actions">
321
+ <a class="button primary" href="#contact">Start a conversation</a>
322
+ <a class="button" href="#work">View selected work</a>
323
+ </div>
324
+ </div>
325
+ <aside class="signal" aria-label="Portfolio signal graphic">
326
+ <div class="orb"></div>
327
+ <div class="metric m1"><strong>99.9%</strong>Reliability mindset</div>
328
+ <div class="metric m2"><strong>3x</strong>Faster team delivery</div>
329
+ <div class="metric m3"><strong>0 -> 1</strong>Product builder</div>
330
+ </aside>
331
+ </section>
332
+
333
+ <section id="work">
334
+ <div class="section-head">
335
+ <h2>Selected Work</h2>
336
+ <p>Three signature projects that make the hiring case quickly: product judgment, technical depth, and the ability to ship.</p>
337
+ </div>
338
+ <div class="grid">
339
+ <article class="card"><b>Atlas Runtime</b><p>A resilient service platform with observability baked into every deploy, cutting incident triage from hours to minutes.</p></article>
340
+ <article class="card"><b>Signal Studio</b><p>An operator dashboard that turns messy product data into clear decisions with fast filters, useful defaults, and no wasted motion.</p></article>
341
+ <article class="card"><b>Launch Engine</b><p>A reusable delivery pipeline for prototypes, demos, and production launches that keeps polish high without slowing iteration.</p></article>
342
+ </div>
343
+ </section>
344
+
345
+ <section id="systems">
346
+ <div class="section-head">
347
+ <h2>How ${escapeHtml(name.split(' ')[0])} Works</h2>
348
+ <p>Clear architecture, direct communication, and a bias toward working software that users can actually feel.</p>
349
+ </div>
350
+ <div class="timeline">
351
+ <div class="row"><span>Discover</span><div><b>Turn ambiguity into a buildable path.</b><p>Map goals, constraints, risks, and the first useful slice before code starts.</p></div></div>
352
+ <div class="row"><span>Build</span><div><b>Ship the smallest impressive version.</b><p>Focus on the core workflow, strong visual hierarchy, and reliable implementation details.</p></div></div>
353
+ <div class="row"><span>Harden</span><div><b>Make it production credible.</b><p>Add failure states, accessibility, performance passes, and useful handoff documentation.</p></div></div>
354
+ </div>
355
+ </section>
356
+
357
+ <section id="contact">
358
+ <div class="contact">
359
+ <div>
360
+ <div class="eyebrow">Available for high-impact teams</div>
361
+ <h2>Bring ${escapeHtml(name)} into the room when the work needs to ship.</h2>
362
+ </div>
363
+ <a class="button primary" href="mailto:hello@example.com">hello@example.com</a>
364
+ </div>
365
+ </section>
366
+ </main>
367
+ <footer class="shell">Built as a single-file portfolio concept for ${escapeHtml(name)}.</footer>
368
+ <script>
369
+ const signal = document.querySelector('.signal');
370
+ if (signal) {
371
+ signal.addEventListener('pointermove', (event) => {
372
+ const rect = signal.getBoundingClientRect();
373
+ const x = (event.clientX - rect.left) / rect.width - .5;
374
+ const y = (event.clientY - rect.top) / rect.height - .5;
375
+ signal.style.transform = 'perspective(900px) rotateY(' + (x * 7) + 'deg) rotateX(' + (-y * 7) + 'deg)';
376
+ });
377
+ signal.addEventListener('pointerleave', () => {
378
+ signal.style.transform = 'perspective(900px) rotateY(0deg) rotateX(0deg)';
379
+ });
380
+ }
381
+ </script>
382
+ </body>
383
+ </html>
384
+ `;
385
+ }
386
+ function escapeHtml(value) {
387
+ return value
388
+ .replace(/&/g, '&amp;')
389
+ .replace(/</g, '&lt;')
390
+ .replace(/>/g, '&gt;')
391
+ .replace(/"/g, '&quot;')
392
+ .replace(/'/g, '&#39;');
393
+ }
394
+ function escapeCss(value) {
395
+ return value.replace(/["\\]/g, '\\$&');
396
+ }
397
+ //# sourceMappingURL=instant-artifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instant-artifact.js","sourceRoot":"","sources":["../src/instant-artifact.ts"],"names":[],"mappings":"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"}
package/dist/query.js CHANGED
@@ -114,13 +114,13 @@ const FAST_DIRECT_POSITIVE = [
114
114
  /^(?:please\s+)?(?:can|could|would|will)\s+you\s+(?:please\s+)?(?:explain|define|summarize|translate|calculate|compute|write|draft|make|create|tell|give)\b/i,
115
115
  /^(?:please\s+)?(?:tell|give)\s+me\b/i,
116
116
  /^please\s+(?:explain|define|summarize|translate|calculate|compute|write|draft|make|create)\b/i,
117
- /^(?:i\s+need|i(?:'|’)d\s+like|i\s+would\s+like)\s+(?:you\s+to\s+)?(?:explain|define|summarize|translate|calculate|compute|write|draft|make|create)\b/i,
117
+ /^(?:i\s+need|i(?:'|\u2019)d\s+like|i\s+would\s+like)\s+(?:you\s+to\s+)?(?:explain|define|summarize|translate|calculate|compute|write|draft|make|create)\b/i,
118
118
  /^(explain|define|summarize|translate|calculate|compute)\b/i,
119
119
  /^(?:write|draft|make|create)\s+(?:a|an|the)?\s*(?:short\s+)?(?:poem|haiku|joke|story|paragraph|message|email)\b/i,
120
120
  /\b(square root|sqrt)\b/i,
121
121
  /\?$/,
122
122
  ];
123
- const FAST_DIRECT_REPO_OR_TOOL = /\b(repo|repository|codebase|workspace|file|folder|directory|path|terminal|powershell|shell|command|npm|node|python|typescript|javascript|git|commit|diff|pr|pull request|branch|test|build|lint|install|package|debug|error|stack trace|log|fix|implement|refactor|review|audit|security|benchmark|run|execute|read|search|grep|edit|patch|write[- ]file)\b/i;
123
+ const FAST_DIRECT_REPO_OR_TOOL = /\b(repo|repository|codebase|workspace|file|folder|directory|path|terminal|powershell|shell|command|npm|node|python|typescript|javascript|git|commit|diff|pr|pull request|branch|test|build|lint|install|package|debug|error|stack trace|log|fix|implement|refactor|review|audit|security|benchmark|run|execute|read|search|grep|edit|patch|write[- ]file|website|web\s*site|site|portfolio|landing\s+page|web\s+page|html|css|react|vue|svelte|vite|next\.?js|single[- ]file|dashboard|component|form|desktop|save|hireable|resume)\b/i;
124
124
  const FAST_DIRECT_CONTEXTUAL = /^(?:(?:please\s+)?(?:can|could|would|will)\s+you\s+(?:please\s+)?|please\s+)?(continue|carry on|resume|do it|same|again|that|this|those|these|it)\b/i;
125
125
  export function shouldUseFastDirectReply(userQuery, mode, env = process.env) {
126
126
  if (env.CAWDEX_FAST_DIRECT === '0')
@@ -145,7 +145,7 @@ function printInteractiveTurnAccepted(config) {
145
145
  return;
146
146
  if (!process.stdout.isTTY)
147
147
  return;
148
- const line = theme.dim(` submitted to ${config.provider} · ${config.model}. Waiting for model events; Esc or F5 cancels.`);
148
+ const line = theme.dim(` submitted to ${config.provider} | ${config.model}. Waiting for model events; Esc or F5 cancels.`);
149
149
  if (isFooterActive()) {
150
150
  writeScrollableLine(line);
151
151
  }
@@ -1914,7 +1914,7 @@ export async function runQuery(ctx) {
1914
1914
  // Only show if there was meaningful work — multi-second chains. Sub-second
1915
1915
  // chains (slash command rejects, instant returns) don't need a chain line.
1916
1916
  if (chainMs > 1500) {
1917
- console.log(theme.dim(` chain ${formatDuration(chainMs)} · ${turns} ${turns === 1 ? 'turn' : 'turns'}`));
1917
+ console.log(theme.dim(` chain ${formatDuration(chainMs)} | ${turns} ${turns === 1 ? 'turn' : 'turns'}`));
1918
1918
  }
1919
1919
  // /thinking visibility hint. If the user has thinking enabled but the
1920
1920
  // model didn't emit any reasoning tokens this turn AND we haven't