@gurulu/cli 1.3.0 → 1.4.0

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/dist/bin.js CHANGED
@@ -25710,15 +25710,19 @@ function sdkFor(framework) {
25710
25710
  return "@gurulu/web";
25711
25711
  }
25712
25712
  }
25713
- function snippetWeb(workspaceKey) {
25713
+ function autocaptureLine(jsError, indent) {
25714
+ return jsError ? `
25715
+ ${indent}autocapture: { js_error: true }, // hata takibi açık` : "";
25716
+ }
25717
+ function snippetWeb(workspaceKey, jsError = false) {
25714
25718
  return `import gurulu from '@gurulu/web';
25715
25719
 
25716
25720
  gurulu.init({
25717
25721
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
25718
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io
25722
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io${autocaptureLine(jsError, " ")}
25719
25723
  });`;
25720
25724
  }
25721
- function snippetNext(workspaceKey) {
25725
+ function snippetNext(workspaceKey, jsError = false) {
25722
25726
  return `// src/app/gurulu-provider.tsx
25723
25727
  'use client';
25724
25728
  import { useEffect } from 'react';
@@ -25728,7 +25732,7 @@ export function GuruluProvider({ children }: { children: React.ReactNode }) {
25728
25732
  useEffect(() => {
25729
25733
  gurulu.init({
25730
25734
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
25731
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,
25735
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,${autocaptureLine(jsError, " ")}
25732
25736
  });
25733
25737
  }, []);
25734
25738
  return <>{children}</>;
@@ -25807,7 +25811,7 @@ function placementHintFor(framework) {
25807
25811
  return "Initialize the SDK at your app entry point.";
25808
25812
  }
25809
25813
  }
25810
- function initSnippetFor(framework, sdk, workspaceKey) {
25814
+ function initSnippetFor(framework, sdk, workspaceKey, jsError = false) {
25811
25815
  if (sdk === "@gurulu/node") {
25812
25816
  if (framework === "express")
25813
25817
  return snippetExpress();
@@ -25816,8 +25820,8 @@ function initSnippetFor(framework, sdk, workspaceKey) {
25816
25820
  return snippetNode();
25817
25821
  }
25818
25822
  if (framework === "next")
25819
- return snippetNext(workspaceKey);
25820
- return snippetWeb(workspaceKey);
25823
+ return snippetNext(workspaceKey, jsError);
25824
+ return snippetWeb(workspaceKey, jsError);
25821
25825
  }
25822
25826
  function envKeysFor(sdk, framework) {
25823
25827
  if (sdk === "@gurulu/node") {
@@ -25843,7 +25847,7 @@ function buildInstallPlan(detected, ctx = {}) {
25843
25847
  sdk,
25844
25848
  packageManager: detected.packageManager,
25845
25849
  installCommand: installCmdFor(detected.packageManager, sdk),
25846
- initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey),
25850
+ initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey, ctx.autocaptureJsError),
25847
25851
  envKeys: envKeysFor(sdk, detected.framework),
25848
25852
  placementHint: placementHintFor(detected.framework),
25849
25853
  framework: detected.framework
@@ -26478,11 +26482,14 @@ ${stderr}`.trim().slice(0, MAX_OBS);
26478
26482
  }
26479
26483
  function buildWireSystemPrompt() {
26480
26484
  return [
26481
- "You are Gurulu's capture wire agent. Add the approved analytics events to the user's code.",
26485
+ "You are Gurulu's capture wire agent. Add the approved analytics events to the user's code,",
26486
+ "plus any additional wiring tasks given (e.g. wrapping an LLM client, mounting a provider).",
26482
26487
  "Tools (one JSON action per turn): read{path} | edit{path,find,replace} | bash{cmd} | done{summary}.",
26483
26488
  "HARD RULES:",
26484
26489
  "- ADDITIVE-ONLY: every edit `replace` MUST contain `find` verbatim — you may only ADD code,",
26485
- " never delete or rewrite existing code. Edits violating this are rejected.",
26490
+ ' never delete or rewrite existing code. Edits violating this are rejected. To "wrap" an existing',
26491
+ " expression, keep the original verbatim inside the new wrapper (e.g. find `new OpenAI(cfg)` →",
26492
+ " replace `wrapOpenAI(new OpenAI(cfg))`), and add the import additively.",
26486
26493
  "- `find` must be an EXACT, UNIQUE snippet copied from a file you have read (read before edit).",
26487
26494
  "- Use the exact provided event_key (snake_case). Wire gurulu.track(...) at the right place and",
26488
26495
  " gurulu.identify(...) at the auth point if given.",
@@ -26490,21 +26497,23 @@ function buildWireSystemPrompt() {
26490
26497
  " `pnpm run lint`) or a checker binary (`tsc --noEmit`, `biome check`, `eslint .`). Installing or",
26491
26498
  " fetching packages (`npm install`, `npx`, `bunx`, `pnpm dlx`, `add`, `exec`) is REJECTED by the guard.",
26492
26499
  "- After wiring, run the project typecheck/build to verify; if it breaks, fix additively.",
26493
- "- When all events are wired and verify passes, emit done{summary}. Keep edits minimal."
26500
+ "- When all events AND additional tasks are done and verify passes, emit done{summary}. Keep edits minimal."
26494
26501
  ].join(`
26495
26502
  `);
26496
26503
  }
26497
- function buildWireUserPrompt(events, identifyHint, files) {
26498
- const evLines = events.map((e2) => `- ${e2.event_key} (${e2.event_type})${e2.capture_hint ? ` @ ${e2.capture_hint}` : ""}: ${e2.reason}`).join(`
26504
+ function buildWireUserPrompt(events, identifyHint, files, extraTasks = []) {
26505
+ const sections = [];
26506
+ if (events.length > 0) {
26507
+ const evLines = events.map((e2) => `- ${e2.event_key} (${e2.event_type})${e2.capture_hint ? ` @ ${e2.capture_hint}` : ""}: ${e2.reason}`).join(`
26499
26508
  `);
26500
- return [
26501
- "Wire these events into the codebase:",
26502
- evLines,
26503
- identifyHint ? `identify() at: ${identifyHint}` : "No identify hint.",
26504
- "",
26505
- `Project files (read the relevant ones): ${files.join(", ")}`,
26506
- "Start by reading the files you need, then edit additively."
26507
- ].join(`
26509
+ sections.push("Wire these events into the codebase:", evLines, identifyHint ? `identify() at: ${identifyHint}` : "No identify hint.");
26510
+ }
26511
+ if (extraTasks.length > 0) {
26512
+ sections.push("Additional wiring tasks:", extraTasks.map((t2, i2) => `${i2 + 1}. ${t2}`).join(`
26513
+ `));
26514
+ }
26515
+ sections.push("", `Project files (read the relevant ones): ${files.join(", ")}`, "Start by reading the files you need, then edit additively.");
26516
+ return sections.join(`
26508
26517
  `);
26509
26518
  }
26510
26519
 
@@ -26513,7 +26522,10 @@ var MAX_STEPS = 25;
26513
26522
  async function runWireAgent(client, input, snapshots) {
26514
26523
  const messages = [
26515
26524
  { role: "system", content: buildWireSystemPrompt() },
26516
- { role: "user", content: buildWireUserPrompt(input.events, input.identifyHint, input.files) }
26525
+ {
26526
+ role: "user",
26527
+ content: buildWireUserPrompt(input.events, input.identifyHint, input.files, input.extraTasks ?? [])
26528
+ }
26517
26529
  ];
26518
26530
  const edits = [];
26519
26531
  const changed = new Set;
@@ -26674,8 +26686,6 @@ async function runWizard(opts) {
26674
26686
  }
26675
26687
  }
26676
26688
  const project = { ...detected, framework };
26677
- const plan = buildInstallPlan(project, { writeKey, workspaceId });
26678
- const isNode = plan.sdk === "@gurulu/node";
26679
26689
  const authed = Boolean(auth.apiKey);
26680
26690
  let approvedEvents = [];
26681
26691
  let identifyHint = null;
@@ -26695,6 +26705,13 @@ async function runWizard(opts) {
26695
26705
  if (authed) {
26696
26706
  featuresResult = await runFeatures(client, project, { yes: opts.yes, authed });
26697
26707
  }
26708
+ const errorSelected = featuresResult.selected.some((f3) => f3.key === "error");
26709
+ const plan = buildInstallPlan(project, {
26710
+ writeKey,
26711
+ workspaceId,
26712
+ autocaptureJsError: errorSelected
26713
+ });
26714
+ const isNode = plan.sdk === "@gurulu/node";
26698
26715
  phase(4, "SDK kurulumu");
26699
26716
  let installed = false;
26700
26717
  if (opts.noInstall) {
@@ -26720,6 +26737,14 @@ async function runWizard(opts) {
26720
26737
  snippet: plan.initSnippet,
26721
26738
  placementHint: plan.placementHint
26722
26739
  });
26740
+ const extraTasks = [];
26741
+ const llmSelected = featuresResult.selected.some((f3) => f3.key === "llm");
26742
+ if (llmSelected && detected.llmFrameworks.length > 0) {
26743
+ extraTasks.push(`Wrap the project's LLM client(s) [${detected.llmFrameworks.join(", ")}] with @gurulu/node so ` + "every call is auto-captured. Find where the OpenAI/Anthropic client is instantiated and wrap " + "it in place additively: `import { wrapOpenAI } from '@gurulu/node';` then " + "`const client = wrapOpenAI(new OpenAI({...}))` (use wrapAnthropic for Anthropic SDK). " + "Keep the original instantiation verbatim inside the wrapper.");
26744
+ }
26745
+ if (inj.strategy === "create-module" && inj.file && (project.framework === "next" || project.framework === "nuxt")) {
26746
+ extraTasks.push(project.framework === "next" ? `Mount the Gurulu provider created at \`${inj.file}\` into the app root. Edit app/layout.tsx ` + "(App Router) or pages/_app.tsx (Pages Router) to import { GuruluProvider } from that module " + "and wrap the children additively: `<GuruluProvider>{children}</GuruluProvider>`." : `Register the Nuxt plugin created at \`${inj.file}\` so it loads on the client. If it is under ` + "plugins/ Nuxt auto-registers it; otherwise add it to the plugins array in nuxt.config.ts additively.");
26747
+ }
26723
26748
  const envFile = isNode ? ".env" : ".env.local";
26724
26749
  const vars = [];
26725
26750
  for (const k2 of plan.envKeys) {
@@ -26756,16 +26781,19 @@ async function runWizard(opts) {
26756
26781
  s2.stop(`${res.registered.length} yeni event verification queue'ya eklendi${res.failed.length > 0 ? ` (${res.failed.length} başarısız)` : ""}`);
26757
26782
  }
26758
26783
  let wiredCount = 0;
26759
- if (approvedEvents.length > 0) {
26784
+ const hasWireWork = approvedEvents.length > 0 || extraTasks.length > 0;
26785
+ if (hasWireWork) {
26760
26786
  if (opts.noAi) {
26761
- p4.log.message(`Capture şu çağrıları ekle:
26787
+ if (approvedEvents.length > 0) {
26788
+ p4.log.message(`Capture — şu çağrıları ekle:
26762
26789
  ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26790
+ }
26763
26791
  } else {
26764
26792
  const wireFiles = gatherContext({ cwd: opts.cwd }).files.map((f3) => f3.path);
26765
26793
  const snapshots = new Map;
26766
26794
  const s2 = p4.spinner();
26767
26795
  s2.start("AI capture wiring (kod düzenleniyor)…");
26768
- const outcome = await runWireAgent(client, { cwd: opts.cwd, events: approvedEvents, identifyHint, files: wireFiles }, snapshots);
26796
+ const outcome = await runWireAgent(client, { cwd: opts.cwd, events: approvedEvents, identifyHint, files: wireFiles, extraTasks }, snapshots);
26769
26797
  s2.stop(`wire: ${outcome.changedFiles.length} dosya / ${outcome.steps} adım (${outcome.stoppedReason})`);
26770
26798
  if (outcome.changedFiles.length > 0) {
26771
26799
  p4.log.message(formatWireDiff(opts.cwd, snapshots));
@@ -26774,12 +26802,16 @@ ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26774
26802
  });
26775
26803
  if (p4.isCancel(keep) || !keep) {
26776
26804
  restoreSnapshots(opts.cwd, snapshots);
26777
- p4.log.info("Wire geri alındı — capture snippet rehberi:");
26778
- p4.log.message(captureGuide(approvedEvents, identifyHint, isNode));
26805
+ if (approvedEvents.length > 0) {
26806
+ p4.log.info("Wire geri alındı — capture snippet rehberi:");
26807
+ p4.log.message(captureGuide(approvedEvents, identifyHint, isNode));
26808
+ } else {
26809
+ p4.log.info("Wire geri alındı — etkinleştirme snippet'leri yukarıda.");
26810
+ }
26779
26811
  } else {
26780
26812
  wiredCount = outcome.changedFiles.length;
26781
26813
  }
26782
- } else {
26814
+ } else if (approvedEvents.length > 0) {
26783
26815
  p4.log.message(`Capture (AI gömemedi → snippet-göster) — şu çağrıları ekle:
26784
26816
  ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26785
26817
  }
@@ -26796,9 +26828,9 @@ ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26796
26828
  }
26797
26829
  if (approvedEvents.length > 0) {
26798
26830
  lines.push(`✓ ${approvedEvents.length} event planlandı, ${registeredCount} yeni registry kuyruğunda`);
26799
- if (wiredCount > 0)
26800
- lines.push(`✓ ${wiredCount} dosya AI ile capture wire edildi`);
26801
26831
  }
26832
+ if (wiredCount > 0)
26833
+ lines.push(`✓ ${wiredCount} dosya AI ile wire edildi (capture/LLM/provider)`);
26802
26834
  if (featuresResult.registered && featuresResult.selected.length > 0) {
26803
26835
  lines.push(`✓ özellikler: ${featuresResult.selected.map((f3) => f3.key).join(", ")} kuruldu`);
26804
26836
  }
package/dist/index.js CHANGED
@@ -25287,15 +25287,19 @@ function sdkFor(framework) {
25287
25287
  return "@gurulu/web";
25288
25288
  }
25289
25289
  }
25290
- function snippetWeb(workspaceKey) {
25290
+ function autocaptureLine(jsError, indent) {
25291
+ return jsError ? `
25292
+ ${indent}autocapture: { js_error: true }, // hata takibi açık` : "";
25293
+ }
25294
+ function snippetWeb(workspaceKey, jsError = false) {
25291
25295
  return `import gurulu from '@gurulu/web';
25292
25296
 
25293
25297
  gurulu.init({
25294
25298
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
25295
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io
25299
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io${autocaptureLine(jsError, " ")}
25296
25300
  });`;
25297
25301
  }
25298
- function snippetNext(workspaceKey) {
25302
+ function snippetNext(workspaceKey, jsError = false) {
25299
25303
  return `// src/app/gurulu-provider.tsx
25300
25304
  'use client';
25301
25305
  import { useEffect } from 'react';
@@ -25305,7 +25309,7 @@ export function GuruluProvider({ children }: { children: React.ReactNode }) {
25305
25309
  useEffect(() => {
25306
25310
  gurulu.init({
25307
25311
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
25308
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,
25312
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,${autocaptureLine(jsError, " ")}
25309
25313
  });
25310
25314
  }, []);
25311
25315
  return <>{children}</>;
@@ -25384,7 +25388,7 @@ function placementHintFor(framework) {
25384
25388
  return "Initialize the SDK at your app entry point.";
25385
25389
  }
25386
25390
  }
25387
- function initSnippetFor(framework, sdk, workspaceKey) {
25391
+ function initSnippetFor(framework, sdk, workspaceKey, jsError = false) {
25388
25392
  if (sdk === "@gurulu/node") {
25389
25393
  if (framework === "express")
25390
25394
  return snippetExpress();
@@ -25393,8 +25397,8 @@ function initSnippetFor(framework, sdk, workspaceKey) {
25393
25397
  return snippetNode();
25394
25398
  }
25395
25399
  if (framework === "next")
25396
- return snippetNext(workspaceKey);
25397
- return snippetWeb(workspaceKey);
25400
+ return snippetNext(workspaceKey, jsError);
25401
+ return snippetWeb(workspaceKey, jsError);
25398
25402
  }
25399
25403
  function envKeysFor(sdk, framework) {
25400
25404
  if (sdk === "@gurulu/node") {
@@ -25420,7 +25424,7 @@ function buildInstallPlan(detected, ctx = {}) {
25420
25424
  sdk,
25421
25425
  packageManager: detected.packageManager,
25422
25426
  installCommand: installCmdFor(detected.packageManager, sdk),
25423
- initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey),
25427
+ initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey, ctx.autocaptureJsError),
25424
25428
  envKeys: envKeysFor(sdk, detected.framework),
25425
25429
  placementHint: placementHintFor(detected.framework),
25426
25430
  framework: detected.framework
@@ -26055,11 +26059,14 @@ ${stderr}`.trim().slice(0, MAX_OBS);
26055
26059
  }
26056
26060
  function buildWireSystemPrompt() {
26057
26061
  return [
26058
- "You are Gurulu's capture wire agent. Add the approved analytics events to the user's code.",
26062
+ "You are Gurulu's capture wire agent. Add the approved analytics events to the user's code,",
26063
+ "plus any additional wiring tasks given (e.g. wrapping an LLM client, mounting a provider).",
26059
26064
  "Tools (one JSON action per turn): read{path} | edit{path,find,replace} | bash{cmd} | done{summary}.",
26060
26065
  "HARD RULES:",
26061
26066
  "- ADDITIVE-ONLY: every edit `replace` MUST contain `find` verbatim — you may only ADD code,",
26062
- " never delete or rewrite existing code. Edits violating this are rejected.",
26067
+ ' never delete or rewrite existing code. Edits violating this are rejected. To "wrap" an existing',
26068
+ " expression, keep the original verbatim inside the new wrapper (e.g. find `new OpenAI(cfg)` →",
26069
+ " replace `wrapOpenAI(new OpenAI(cfg))`), and add the import additively.",
26063
26070
  "- `find` must be an EXACT, UNIQUE snippet copied from a file you have read (read before edit).",
26064
26071
  "- Use the exact provided event_key (snake_case). Wire gurulu.track(...) at the right place and",
26065
26072
  " gurulu.identify(...) at the auth point if given.",
@@ -26067,21 +26074,23 @@ function buildWireSystemPrompt() {
26067
26074
  " `pnpm run lint`) or a checker binary (`tsc --noEmit`, `biome check`, `eslint .`). Installing or",
26068
26075
  " fetching packages (`npm install`, `npx`, `bunx`, `pnpm dlx`, `add`, `exec`) is REJECTED by the guard.",
26069
26076
  "- After wiring, run the project typecheck/build to verify; if it breaks, fix additively.",
26070
- "- When all events are wired and verify passes, emit done{summary}. Keep edits minimal."
26077
+ "- When all events AND additional tasks are done and verify passes, emit done{summary}. Keep edits minimal."
26071
26078
  ].join(`
26072
26079
  `);
26073
26080
  }
26074
- function buildWireUserPrompt(events, identifyHint, files) {
26075
- const evLines = events.map((e2) => `- ${e2.event_key} (${e2.event_type})${e2.capture_hint ? ` @ ${e2.capture_hint}` : ""}: ${e2.reason}`).join(`
26081
+ function buildWireUserPrompt(events, identifyHint, files, extraTasks = []) {
26082
+ const sections = [];
26083
+ if (events.length > 0) {
26084
+ const evLines = events.map((e2) => `- ${e2.event_key} (${e2.event_type})${e2.capture_hint ? ` @ ${e2.capture_hint}` : ""}: ${e2.reason}`).join(`
26076
26085
  `);
26077
- return [
26078
- "Wire these events into the codebase:",
26079
- evLines,
26080
- identifyHint ? `identify() at: ${identifyHint}` : "No identify hint.",
26081
- "",
26082
- `Project files (read the relevant ones): ${files.join(", ")}`,
26083
- "Start by reading the files you need, then edit additively."
26084
- ].join(`
26086
+ sections.push("Wire these events into the codebase:", evLines, identifyHint ? `identify() at: ${identifyHint}` : "No identify hint.");
26087
+ }
26088
+ if (extraTasks.length > 0) {
26089
+ sections.push("Additional wiring tasks:", extraTasks.map((t2, i2) => `${i2 + 1}. ${t2}`).join(`
26090
+ `));
26091
+ }
26092
+ sections.push("", `Project files (read the relevant ones): ${files.join(", ")}`, "Start by reading the files you need, then edit additively.");
26093
+ return sections.join(`
26085
26094
  `);
26086
26095
  }
26087
26096
 
@@ -26090,7 +26099,10 @@ var MAX_STEPS = 25;
26090
26099
  async function runWireAgent(client, input, snapshots) {
26091
26100
  const messages = [
26092
26101
  { role: "system", content: buildWireSystemPrompt() },
26093
- { role: "user", content: buildWireUserPrompt(input.events, input.identifyHint, input.files) }
26102
+ {
26103
+ role: "user",
26104
+ content: buildWireUserPrompt(input.events, input.identifyHint, input.files, input.extraTasks ?? [])
26105
+ }
26094
26106
  ];
26095
26107
  const edits = [];
26096
26108
  const changed = new Set;
@@ -26251,8 +26263,6 @@ async function runWizard(opts) {
26251
26263
  }
26252
26264
  }
26253
26265
  const project = { ...detected, framework };
26254
- const plan = buildInstallPlan(project, { writeKey, workspaceId });
26255
- const isNode = plan.sdk === "@gurulu/node";
26256
26266
  const authed = Boolean(auth.apiKey);
26257
26267
  let approvedEvents = [];
26258
26268
  let identifyHint = null;
@@ -26272,6 +26282,13 @@ async function runWizard(opts) {
26272
26282
  if (authed) {
26273
26283
  featuresResult = await runFeatures(client, project, { yes: opts.yes, authed });
26274
26284
  }
26285
+ const errorSelected = featuresResult.selected.some((f3) => f3.key === "error");
26286
+ const plan = buildInstallPlan(project, {
26287
+ writeKey,
26288
+ workspaceId,
26289
+ autocaptureJsError: errorSelected
26290
+ });
26291
+ const isNode = plan.sdk === "@gurulu/node";
26275
26292
  phase(4, "SDK kurulumu");
26276
26293
  let installed = false;
26277
26294
  if (opts.noInstall) {
@@ -26297,6 +26314,14 @@ async function runWizard(opts) {
26297
26314
  snippet: plan.initSnippet,
26298
26315
  placementHint: plan.placementHint
26299
26316
  });
26317
+ const extraTasks = [];
26318
+ const llmSelected = featuresResult.selected.some((f3) => f3.key === "llm");
26319
+ if (llmSelected && detected.llmFrameworks.length > 0) {
26320
+ extraTasks.push(`Wrap the project's LLM client(s) [${detected.llmFrameworks.join(", ")}] with @gurulu/node so ` + "every call is auto-captured. Find where the OpenAI/Anthropic client is instantiated and wrap " + "it in place additively: `import { wrapOpenAI } from '@gurulu/node';` then " + "`const client = wrapOpenAI(new OpenAI({...}))` (use wrapAnthropic for Anthropic SDK). " + "Keep the original instantiation verbatim inside the wrapper.");
26321
+ }
26322
+ if (inj.strategy === "create-module" && inj.file && (project.framework === "next" || project.framework === "nuxt")) {
26323
+ extraTasks.push(project.framework === "next" ? `Mount the Gurulu provider created at \`${inj.file}\` into the app root. Edit app/layout.tsx ` + "(App Router) or pages/_app.tsx (Pages Router) to import { GuruluProvider } from that module " + "and wrap the children additively: `<GuruluProvider>{children}</GuruluProvider>`." : `Register the Nuxt plugin created at \`${inj.file}\` so it loads on the client. If it is under ` + "plugins/ Nuxt auto-registers it; otherwise add it to the plugins array in nuxt.config.ts additively.");
26324
+ }
26300
26325
  const envFile = isNode ? ".env" : ".env.local";
26301
26326
  const vars = [];
26302
26327
  for (const k2 of plan.envKeys) {
@@ -26333,16 +26358,19 @@ async function runWizard(opts) {
26333
26358
  s2.stop(`${res.registered.length} yeni event verification queue'ya eklendi${res.failed.length > 0 ? ` (${res.failed.length} başarısız)` : ""}`);
26334
26359
  }
26335
26360
  let wiredCount = 0;
26336
- if (approvedEvents.length > 0) {
26361
+ const hasWireWork = approvedEvents.length > 0 || extraTasks.length > 0;
26362
+ if (hasWireWork) {
26337
26363
  if (opts.noAi) {
26338
- p4.log.message(`Capture şu çağrıları ekle:
26364
+ if (approvedEvents.length > 0) {
26365
+ p4.log.message(`Capture — şu çağrıları ekle:
26339
26366
  ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26367
+ }
26340
26368
  } else {
26341
26369
  const wireFiles = gatherContext({ cwd: opts.cwd }).files.map((f3) => f3.path);
26342
26370
  const snapshots = new Map;
26343
26371
  const s2 = p4.spinner();
26344
26372
  s2.start("AI capture wiring (kod düzenleniyor)…");
26345
- const outcome = await runWireAgent(client, { cwd: opts.cwd, events: approvedEvents, identifyHint, files: wireFiles }, snapshots);
26373
+ const outcome = await runWireAgent(client, { cwd: opts.cwd, events: approvedEvents, identifyHint, files: wireFiles, extraTasks }, snapshots);
26346
26374
  s2.stop(`wire: ${outcome.changedFiles.length} dosya / ${outcome.steps} adım (${outcome.stoppedReason})`);
26347
26375
  if (outcome.changedFiles.length > 0) {
26348
26376
  p4.log.message(formatWireDiff(opts.cwd, snapshots));
@@ -26351,12 +26379,16 @@ ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26351
26379
  });
26352
26380
  if (p4.isCancel(keep) || !keep) {
26353
26381
  restoreSnapshots(opts.cwd, snapshots);
26354
- p4.log.info("Wire geri alındı — capture snippet rehberi:");
26355
- p4.log.message(captureGuide(approvedEvents, identifyHint, isNode));
26382
+ if (approvedEvents.length > 0) {
26383
+ p4.log.info("Wire geri alındı — capture snippet rehberi:");
26384
+ p4.log.message(captureGuide(approvedEvents, identifyHint, isNode));
26385
+ } else {
26386
+ p4.log.info("Wire geri alındı — etkinleştirme snippet'leri yukarıda.");
26387
+ }
26356
26388
  } else {
26357
26389
  wiredCount = outcome.changedFiles.length;
26358
26390
  }
26359
- } else {
26391
+ } else if (approvedEvents.length > 0) {
26360
26392
  p4.log.message(`Capture (AI gömemedi → snippet-göster) — şu çağrıları ekle:
26361
26393
  ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26362
26394
  }
@@ -26373,9 +26405,9 @@ ${captureGuide(approvedEvents, identifyHint, isNode)}`);
26373
26405
  }
26374
26406
  if (approvedEvents.length > 0) {
26375
26407
  lines.push(`✓ ${approvedEvents.length} event planlandı, ${registeredCount} yeni registry kuyruğunda`);
26376
- if (wiredCount > 0)
26377
- lines.push(`✓ ${wiredCount} dosya AI ile capture wire edildi`);
26378
26408
  }
26409
+ if (wiredCount > 0)
26410
+ lines.push(`✓ ${wiredCount} dosya AI ile wire edildi (capture/LLM/provider)`);
26379
26411
  if (featuresResult.registered && featuresResult.selected.length > 0) {
26380
26412
  lines.push(`✓ özellikler: ${featuresResult.selected.map((f3) => f3.key).join(", ")} kuruldu`);
26381
26413
  }
@@ -7,6 +7,12 @@ export interface InstallPlanContext {
7
7
  workspaceId?: string;
8
8
  /** Server-side projeler için API key (sk_xxx). */
9
9
  apiKey?: string;
10
+ /**
11
+ * "Hata takibi" özelliği seçildiyse browser init snippet'ine
12
+ * `autocapture: { js_error: true }` eklenir (default autocapture kapalı —
13
+ * registry'ye event kurmak yetmez, SDK'da da açılmalı). Sadece browser SDK.
14
+ */
15
+ autocaptureJsError?: boolean;
10
16
  }
11
17
  export interface InstallPlan {
12
18
  sdk: SdkPackage;
@@ -1 +1 @@
1
- {"version":3,"file":"install-plan.d.ts","sourceRoot":"","sources":["../../src/lib/install-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;AAwKD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,GAAG,GAAE,kBAAuB,GAC3B,WAAW,CAYb"}
1
+ {"version":3,"file":"install-plan.d.ts","sourceRoot":"","sources":["../../src/lib/install-plan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,UAAU,CAAC;IAChB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,SAAS,CAAC;CACtB;AAmLD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,eAAe,EACzB,GAAG,GAAE,kBAAuB,GAC3B,WAAW,CAYb"}
@@ -23,15 +23,19 @@ function sdkFor(framework) {
23
23
  return "@gurulu/web";
24
24
  }
25
25
  }
26
- function snippetWeb(workspaceKey) {
26
+ function autocaptureLine(jsError, indent) {
27
+ return jsError ? `
28
+ ${indent}autocapture: { js_error: true }, // hata takibi açık` : "";
29
+ }
30
+ function snippetWeb(workspaceKey, jsError = false) {
27
31
  return `import gurulu from '@gurulu/web';
28
32
 
29
33
  gurulu.init({
30
34
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
31
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io
35
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT, // optional, defaults to https://ingest.gurulu.io${autocaptureLine(jsError, " ")}
32
36
  });`;
33
37
  }
34
- function snippetNext(workspaceKey) {
38
+ function snippetNext(workspaceKey, jsError = false) {
35
39
  return `// src/app/gurulu-provider.tsx
36
40
  'use client';
37
41
  import { useEffect } from 'react';
@@ -41,7 +45,7 @@ export function GuruluProvider({ children }: { children: React.ReactNode }) {
41
45
  useEffect(() => {
42
46
  gurulu.init({
43
47
  workspaceKey: process.env.NEXT_PUBLIC_GURULU_WORKSPACE ?? '${workspaceKey}',
44
- endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,
48
+ endpoint: process.env.NEXT_PUBLIC_GURULU_ENDPOINT,${autocaptureLine(jsError, " ")}
45
49
  });
46
50
  }, []);
47
51
  return <>{children}</>;
@@ -120,7 +124,7 @@ function placementHintFor(framework) {
120
124
  return "Initialize the SDK at your app entry point.";
121
125
  }
122
126
  }
123
- function initSnippetFor(framework, sdk, workspaceKey) {
127
+ function initSnippetFor(framework, sdk, workspaceKey, jsError = false) {
124
128
  if (sdk === "@gurulu/node") {
125
129
  if (framework === "express")
126
130
  return snippetExpress();
@@ -129,8 +133,8 @@ function initSnippetFor(framework, sdk, workspaceKey) {
129
133
  return snippetNode();
130
134
  }
131
135
  if (framework === "next")
132
- return snippetNext(workspaceKey);
133
- return snippetWeb(workspaceKey);
136
+ return snippetNext(workspaceKey, jsError);
137
+ return snippetWeb(workspaceKey, jsError);
134
138
  }
135
139
  function envKeysFor(sdk, framework) {
136
140
  if (sdk === "@gurulu/node") {
@@ -156,7 +160,7 @@ function buildInstallPlan(detected, ctx = {}) {
156
160
  sdk,
157
161
  packageManager: detected.packageManager,
158
162
  installCommand: installCmdFor(detected.packageManager, sdk),
159
- initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey),
163
+ initSnippet: initSnippetFor(detected.framework, sdk, workspaceKey, ctx.autocaptureJsError),
160
164
  envKeys: envKeysFor(sdk, detected.framework),
161
165
  placementHint: placementHintFor(detected.framework),
162
166
  framework: detected.framework
@@ -17,6 +17,6 @@ export interface ToolDeps {
17
17
  export declare function executeTool(action: AgentAction, deps: ToolDeps): Promise<ToolResult>;
18
18
  /** Wire agent system prompt (commandments) — pure. */
19
19
  export declare function buildWireSystemPrompt(): string;
20
- /** İlk user mesajı — onaylı plan + dosya listesi (pure). */
21
- export declare function buildWireUserPrompt(events: PlannedEvent[], identifyHint: string | null, files: string[]): string;
20
+ /** İlk user mesajı — onaylı plan + ek görevler + dosya listesi (pure). */
21
+ export declare function buildWireUserPrompt(events: PlannedEvent[], identifyHint: string | null, files: string[], extraTasks?: string[]): string;
22
22
  //# sourceMappingURL=agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/wizard/agent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuC/D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrF;AAuBD,kEAAkE;AAClE,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C1F;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,IAAI,MAAM,CAgB9C;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EAAE,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,KAAK,EAAE,MAAM,EAAE,GACd,MAAM,CAeR"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/wizard/agent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuC/D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrF;AAuBD,kEAAkE;AAClE,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C1F;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,IAAI,MAAM,CAmB9C;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EAAE,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,GAAE,MAAM,EAAO,GACxB,MAAM,CA2BR"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/wizard/run.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkOlE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/wizard/run.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAsBD,wBAAsB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiRlE"}
@@ -17,6 +17,8 @@ export interface WireInput {
17
17
  events: PlannedEvent[];
18
18
  identifyHint: string | null;
19
19
  files: string[];
20
+ /** Feature/inject kaynaklı ek wire görevleri (LLM client sarma · provider mount). */
21
+ extraTasks?: string[];
20
22
  }
21
23
  /**
22
24
  * Agent döngüsü. `snapshots` (file → pre-edit içerik) revert için doldurulur.
@@ -1 +1 @@
1
- {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/wizard/wire.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI/E,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,WAAW,CAAC,CAiEtB;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAIlF;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,MAAM,CAiB7F;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQlF"}
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/wizard/wire.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAoB,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI/E,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;CAClD;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,SAAS,EAChB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,WAAW,CAAC,CAyEtB;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAIlF;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,MAAM,CAiB7F;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAQlF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gurulu/cli",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "private": false,
5
5
  "license": "BUSL-1.1",
6
6
  "publishConfig": {