nowaikit 4.12.1 → 4.15.1

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.
Files changed (54) hide show
  1. package/README.md +12 -5
  2. package/dist/cli/auth.d.ts +13 -0
  3. package/dist/cli/auth.d.ts.map +1 -1
  4. package/dist/cli/auth.js +257 -54
  5. package/dist/cli/auth.js.map +1 -1
  6. package/dist/cli/detect-clients.d.ts.map +1 -1
  7. package/dist/cli/detect-clients.js +78 -2
  8. package/dist/cli/detect-clients.js.map +1 -1
  9. package/dist/cli/setup.d.ts.map +1 -1
  10. package/dist/cli/setup.js +243 -45
  11. package/dist/cli/setup.js.map +1 -1
  12. package/dist/servicenow/client.d.ts +49 -1
  13. package/dist/servicenow/client.d.ts.map +1 -1
  14. package/dist/servicenow/client.js +346 -40
  15. package/dist/servicenow/client.js.map +1 -1
  16. package/dist/servicenow/instances.d.ts.map +1 -1
  17. package/dist/servicenow/instances.js +56 -4
  18. package/dist/servicenow/instances.js.map +1 -1
  19. package/dist/servicenow/types.d.ts +17 -0
  20. package/dist/servicenow/types.d.ts.map +1 -1
  21. package/dist/tools/app-studio.d.ts.map +1 -1
  22. package/dist/tools/app-studio.js +80 -9
  23. package/dist/tools/app-studio.js.map +1 -1
  24. package/dist/tools/change.d.ts.map +1 -1
  25. package/dist/tools/change.js +3 -1
  26. package/dist/tools/change.js.map +1 -1
  27. package/dist/tools/core.d.ts.map +1 -1
  28. package/dist/tools/core.js +28 -2
  29. package/dist/tools/core.js.map +1 -1
  30. package/dist/tools/decision.d.ts.map +1 -1
  31. package/dist/tools/decision.js +19 -0
  32. package/dist/tools/decision.js.map +1 -1
  33. package/dist/tools/incident.d.ts.map +1 -1
  34. package/dist/tools/incident.js +5 -3
  35. package/dist/tools/incident.js.map +1 -1
  36. package/dist/tools/index.d.ts +159 -0
  37. package/dist/tools/index.d.ts.map +1 -1
  38. package/dist/tools/index.js +2 -2
  39. package/dist/tools/index.js.map +1 -1
  40. package/dist/tools/knowledge.d.ts.map +1 -1
  41. package/dist/tools/knowledge.js +12 -1
  42. package/dist/tools/knowledge.js.map +1 -1
  43. package/dist/tools/notification.d.ts +169 -0
  44. package/dist/tools/notification.d.ts.map +1 -1
  45. package/dist/tools/notification.js +88 -9
  46. package/dist/tools/notification.js.map +1 -1
  47. package/dist/tools/problem.d.ts.map +1 -1
  48. package/dist/tools/problem.js +3 -1
  49. package/dist/tools/problem.js.map +1 -1
  50. package/dist/tools/updateset.d.ts.map +1 -1
  51. package/dist/tools/updateset.js +62 -38
  52. package/dist/tools/updateset.js.map +1 -1
  53. package/dist/tools-manifest.json +98 -11
  54. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"detect-clients.js","sourceRoot":"","sources":["../../src/cli/detect-clients.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect-clients.js","sourceRoot":"","sources":["../../src/cli/detect-clients.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAkXA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqxB7E"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AA8fA,wBAAsB,QAAQ,CAAC,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAs2B7E"}
package/dist/cli/setup.js CHANGED
@@ -346,6 +346,125 @@ async function fetchOpenAIModels(apiKey) {
346
346
  return [];
347
347
  }
348
348
  }
349
+ /**
350
+ * Print the exact steps to register the NowAIKit OAuth app on the instance. For the CLI the redirect
351
+ * is the local loopback the login listens on; the gateway path uses one HTTPS redirect instead
352
+ * (see AUTH-MODES.md). Kept as concrete, do-able steps so setup never assumes an app that isn't there.
353
+ */
354
+ function printOAuthAppSteps(instanceUrl) {
355
+ console.log('');
356
+ box([
357
+ accent('Create an OAuth app (one time, ~2 minutes)'),
358
+ dim('Any OAuth app works — it does not have to be a NowAIKit one.'),
359
+ ], accent);
360
+ console.log('');
361
+ console.log(' ' + brand('1.') + ' Open ' + accent(`${instanceUrl}/nav_to.do?uri=oauth_entity_list.do`));
362
+ console.log(' ' + dim('System OAuth > Application Registry'));
363
+ console.log(' ' + brand('2.') + ' New > ' + accent('Create an OAuth API endpoint for external clients'));
364
+ console.log(' ' + brand('3.') + ' Name: ' + accent('NowAIKit') + dim(' (any name) Grant type: ') + accent('Authorization Code'));
365
+ console.log(' ' + brand('4.') + ' Redirect URL: ' + accent('http://localhost:8765/callback'));
366
+ console.log(' ' + dim('(this is the CLI loopback; the gateway path uses its own https callback)'));
367
+ console.log(' ' + brand('5.') + ' Save, then open the record and copy the ' + accent('Client ID') + ' and ' + accent('Client Secret') + '.');
368
+ console.log('');
369
+ console.log(' ' + dim('Already have an OAuth app? Just add the redirect URL above to it and reuse its Client ID / Secret.'));
370
+ console.log('');
371
+ }
372
+ /**
373
+ * Look for an OAuth app already registered on the instance for the CLI loopback, so the user does not
374
+ * have to know whether an admin created one. Returns the app if found, 'forbidden' when the account
375
+ * cannot read oauth_entity (i.e. not an admin, so we cannot detect), or null when none exists.
376
+ * oauth_entity is admin-only, so this only detects for privileged accounts — regular users cannot.
377
+ */
378
+ async function findExistingOAuthApp(instanceUrl, user, pass) {
379
+ const authz = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64');
380
+ const q = encodeURIComponent('type=client^active=true^redirect_urlLIKElocalhost:8765');
381
+ const resp = await fetch(`${instanceUrl}/api/now/table/oauth_entity?sysparm_query=${q}&sysparm_fields=client_id,client_secret&sysparm_limit=1`, { headers: { Authorization: authz, Accept: 'application/json' } });
382
+ if (resp.status === 401)
383
+ throw new Error('Sign-in failed (401). Check the username and password.');
384
+ if (resp.status === 403)
385
+ return 'forbidden';
386
+ if (!resp.ok)
387
+ return null;
388
+ const data = await resp.json();
389
+ const r = data.result?.[0];
390
+ if (!r || !r.client_id)
391
+ return null;
392
+ return { clientId: r.client_id, clientSecret: r.client_secret || '' };
393
+ }
394
+ /**
395
+ * Auto-provision an OAuth app on the instance via the Table API so the customer never opens the OAuth
396
+ * UI. Needs a one-time admin sign-in. Creates an Authorization Code client with the redirect pre-set,
397
+ * then reads back the generated client id/secret. Throws a readable reason (bad login, missing role,
398
+ * masked secret) so the caller can fall back to the manual steps.
399
+ */
400
+ /**
401
+ * Detect whether the instance supports modern OAuth (public client + PKCE, and CIMD) by probing the
402
+ * dictionary for the oauth_entity fields present on Australia+ releases. Returns all-false on any error
403
+ * so setup safely uses the older confidential-client path on instances that predate this.
404
+ */
405
+ async function detectModernOAuth(instanceUrl, user, pass) {
406
+ const authz = 'Basic ' + Buffer.from(`${user}:${pass}`).toString('base64');
407
+ try {
408
+ const q = encodeURIComponent('name=oauth_entity^elementINuse_pkce,public_client,auth_cimd_client');
409
+ const resp = await fetch(`${instanceUrl}/api/now/table/sys_dictionary?sysparm_query=${q}&sysparm_fields=element&sysparm_limit=5`, { headers: { Authorization: authz, Accept: 'application/json' } });
410
+ if (!resp.ok)
411
+ return { publicPkce: false, cimd: false };
412
+ const data = await resp.json();
413
+ const els = new Set((data.result || []).map(r => r.element));
414
+ return { publicPkce: els.has('use_pkce') && els.has('public_client'), cimd: els.has('auth_cimd_client') };
415
+ }
416
+ catch {
417
+ return { publicPkce: false, cimd: false };
418
+ }
419
+ }
420
+ async function provisionOAuthApp(instanceUrl, adminUser, adminPass, redirectUrl, opts = {}) {
421
+ const authz = 'Basic ' + Buffer.from(`${adminUser}:${adminPass}`).toString('base64');
422
+ // On instances with modern OAuth (public client + PKCE), create a PUBLIC client with no secret. That
423
+ // removes the masked-secret readback problem entirely and matches how CIMD/MCP clients authenticate.
424
+ const body = {
425
+ name: 'NowAIKit',
426
+ type: 'client',
427
+ active: 'true',
428
+ default_grant_type: 'authorization_code',
429
+ redirect_url: redirectUrl,
430
+ access_token_lifespan: '1800',
431
+ refresh_token_lifespan: '8640000',
432
+ };
433
+ if (opts.publicPkce) {
434
+ body.public_client = 'true';
435
+ body.use_pkce = 'true';
436
+ }
437
+ const resp = await fetch(`${instanceUrl}/api/now/table/oauth_entity?sysparm_fields=sys_id,client_id,client_secret`, {
438
+ method: 'POST',
439
+ headers: { Authorization: authz, 'Content-Type': 'application/json', Accept: 'application/json' },
440
+ body: JSON.stringify(body),
441
+ });
442
+ if (resp.status === 401)
443
+ throw new Error('Admin sign-in failed (401). Check the username and password.');
444
+ if (resp.status === 403)
445
+ throw new Error('This account cannot create OAuth apps (403). It needs admin with security_admin elevation.');
446
+ if (!resp.ok)
447
+ throw new Error(`Could not create the OAuth app: ${resp.status} ${resp.statusText}`);
448
+ const data = await resp.json();
449
+ const clientId = data.result?.client_id || '';
450
+ let clientSecret = data.result?.client_secret || '';
451
+ if (!clientId)
452
+ throw new Error('The instance did not return a client id for the new app.');
453
+ // Public + PKCE client: no secret needed, the CLI login uses PKCE.
454
+ if (opts.publicPkce)
455
+ return { clientId, clientSecret: '' };
456
+ // Confidential client: some instances mask client_secret in the create response; re-read it by sys_id.
457
+ if (!clientSecret && data.result?.sys_id) {
458
+ const re = await fetch(`${instanceUrl}/api/now/table/oauth_entity/${data.result.sys_id}?sysparm_fields=client_secret`, { headers: { Authorization: authz, Accept: 'application/json' } });
459
+ if (re.ok) {
460
+ const d = await re.json();
461
+ clientSecret = d.result?.client_secret || '';
462
+ }
463
+ }
464
+ if (!clientSecret)
465
+ throw new Error('Created the app but could not read its client secret. Open the record and copy it, then re-run and paste it.');
466
+ return { clientId, clientSecret };
467
+ }
349
468
  // ═══════════════════════════════════════════════════════════════════════════════
350
469
  // MAIN SETUP FLOW
351
470
  // ═══════════════════════════════════════════════════════════════════════════════
@@ -479,7 +598,7 @@ export async function runSetup(options = {}) {
479
598
  step(2, 'Authentication');
480
599
  sectionLabel('Choose how to authenticate with ServiceNow');
481
600
  console.log('');
482
- const authMethod = await select({
601
+ let authMethod = await select({
483
602
  message: brand('?') + ' Auth method' + brand(':'),
484
603
  choices: [
485
604
  { name: `${brand('🔑')} Basic ${dim('(username + password) — good for dev/PDI')}`, value: 'basic' },
@@ -509,6 +628,9 @@ export async function runSetup(options = {}) {
509
628
  let userPassword;
510
629
  let clientId;
511
630
  let clientSecret;
631
+ // True once we've already made a successful authenticated call during OAuth setup (provisioning or
632
+ // reading an existing app), so the separate "Testing Connection" step is redundant and can be skipped.
633
+ let connectionVerified = false;
512
634
  if (authMode === 'per-user') {
513
635
  box([
514
636
  warn('Per-user mode selected'),
@@ -522,21 +644,122 @@ export async function runSetup(options = {}) {
522
644
  userPassword = await password({ message: brand('?') + ' Password' + brand(':'), mask: '•' });
523
645
  }
524
646
  else {
525
- sectionLabel('OAuth 2.0 credentials');
526
- console.log('');
527
- clientId = await input({ message: brand('?') + ' Client ID' + brand(':') });
528
- clientSecret = await password({ message: brand('?') + ' Client Secret' + brand(':'), mask: '•' });
647
+ sectionLabel('OAuth 2.0 sign-in');
648
+ console.log(' ' + dim('NowAIKit checks the instance for an OAuth app, so you do not have to know if one exists.'));
529
649
  console.log('');
530
- sectionLabel('Service account for token generation');
531
- console.log('');
532
- username = await input({ message: brand('?') + ' Username' + brand(':') });
533
- userPassword = await password({ message: brand('?') + ' Password' + brand(':'), mask: '•' });
650
+ // Detection-first: sign in once, then look for an existing app. This sign-in doubles as the
651
+ // setup connection-test account and, if the account is an admin, is used to create the app.
652
+ const signInUser = await input({ message: brand('?') + ' ServiceNow username' + brand(':') });
653
+ const signInPass = await password({ message: brand('?') + ' ServiceNow password' + brand(':'), mask: '•' });
654
+ // Detect modern OAuth (public client + PKCE, CIMD) so we can provision a secret-less client where
655
+ // supported, and point the customer at the zero-registration CIMD path on newer releases.
656
+ const caps = await detectModernOAuth(instanceUrl, signInUser, signInPass);
657
+ if (caps.cimd) {
658
+ console.log(' ' + dim('This instance supports CIMD (zero-registration OAuth). See OAUTH-ARCHITECTURE.md for the gateway path.'));
659
+ }
660
+ const detect = ora(' Checking the instance for an OAuth app…').start();
661
+ let found = null;
662
+ try {
663
+ found = await findExistingOAuthApp(instanceUrl, signInUser, signInPass);
664
+ }
665
+ catch (e) {
666
+ detect.fail(err(' ' + (e instanceof Error ? e.message : String(e))));
667
+ }
668
+ if (found && found !== 'forbidden' && found.clientId) {
669
+ clientId = found.clientId;
670
+ clientSecret = found.clientSecret;
671
+ username = signInUser;
672
+ userPassword = signInPass;
673
+ connectionVerified = true; // findExistingOAuthApp already made an authenticated call with these creds
674
+ if (clientSecret) {
675
+ detect.succeed(success(' Found an existing OAuth app — using it ') + dim(`(Client ID ${clientId})`));
676
+ }
677
+ else if (caps.publicPkce) {
678
+ detect.succeed(success(' Found a public OAuth app — using it with PKCE ') + dim(`(Client ID ${clientId})`));
679
+ }
680
+ else {
681
+ detect.succeed(success(' Found an OAuth app ') + dim(`(Client ID ${clientId})`));
682
+ console.log(' ' + dim('Could not read its secret over the API. Paste it, or leave blank to use PKCE.'));
683
+ clientSecret = await password({ message: brand('?') + ' Client Secret (blank = PKCE)' + brand(':'), mask: '•' });
684
+ }
685
+ }
686
+ else {
687
+ if (found === 'forbidden') {
688
+ detect.info(dim(' This account cannot list OAuth apps (not an admin), so auto-detection is off.'));
689
+ }
690
+ else {
691
+ detect.info(dim(' No OAuth app found on the instance.'));
692
+ }
693
+ console.log('');
694
+ const how = await select({
695
+ message: brand('?') + ' How do you want to set up OAuth' + brand('?'),
696
+ choices: [
697
+ { name: `${success('✨')} Create it for me ${dim('— needs the sign-in above to be an ADMIN')}`, value: 'auto' },
698
+ { name: `${accent('🔑')} I have the Client ID and Secret ${dim('— enter them')}`, value: 'have' },
699
+ { name: `${accent('🔧')} Show me the manual steps ${dim('(needs an admin)')}`, value: 'manual' },
700
+ { name: `${brand('🔒')} Skip OAuth — username/password ${dim('(no app, any user)')}`, value: 'basic' },
701
+ ],
702
+ });
703
+ if (how === 'auto') {
704
+ const spin = ora(' Creating the OAuth app on the instance…').start();
705
+ try {
706
+ const app = await provisionOAuthApp(instanceUrl, signInUser, signInPass, 'http://localhost:8765/callback', { publicPkce: caps.publicPkce });
707
+ clientId = app.clientId;
708
+ clientSecret = app.clientSecret;
709
+ spin.succeed(success(' OAuth app created — Client ID ') + accent(clientId) + (caps.publicPkce ? dim(' (public client, PKCE)') : ''));
710
+ username = signInUser;
711
+ userPassword = signInPass;
712
+ connectionVerified = true; // the create call itself proved the instance + admin creds work
713
+ }
714
+ catch (e) {
715
+ spin.fail(err(' ' + (e instanceof Error ? e.message : String(e))));
716
+ console.log('');
717
+ console.log(' ' + dim('Create it by hand with these steps, then enter the Client ID / Secret below:'));
718
+ printOAuthAppSteps(instanceUrl);
719
+ }
720
+ }
721
+ else if (how === 'manual') {
722
+ printOAuthAppSteps(instanceUrl);
723
+ }
724
+ else if (how === 'basic') {
725
+ console.log('');
726
+ box([
727
+ warn('Skipping OAuth, using username/password (works without an app).'),
728
+ dim('On SSO-only instances you will need the OAuth app or Entra instead — see AUTH-MODES.md.'),
729
+ ], warn);
730
+ console.log('');
731
+ authMethod = 'basic';
732
+ username = signInUser;
733
+ userPassword = signInPass;
734
+ }
735
+ // 'have' falls through to the Client ID / Secret prompt below.
736
+ }
737
+ if (authMethod === 'oauth') {
738
+ if (!clientId) {
739
+ clientId = await input({ message: brand('?') + ' Client ID' + brand(':') });
740
+ clientSecret = await password({ message: brand('?') + ' Client Secret' + brand(':'), mask: '•' });
741
+ }
742
+ // The sign-in above already serves as the setup-test / service account for per-user mode.
743
+ if (!username) {
744
+ username = signInUser;
745
+ userPassword = signInPass;
746
+ }
747
+ }
534
748
  }
535
749
  // ─── Step 4: Test Connection ──────────────────────────────────────────────
536
750
  step(4, 'Testing Connection');
537
751
  let connected = false;
752
+ // Already proven during OAuth setup (we provisioned or read an app with these creds) — no re-test.
753
+ if (connectionVerified) {
754
+ console.log(' ' + success('✓') + dim(' Connection already verified during sign-in.'));
755
+ connected = true;
756
+ }
538
757
  while (!connected) {
539
- const { ok } = await testConnection(instanceUrl, authMethod, {
758
+ // A public OAuth client (PKCE, no secret) can't be exercised by the setup-time password grant —
759
+ // the per-user token comes later from `nowaikit auth login`. Verify the instance and the
760
+ // service-account credentials with basic auth instead. The saved config stays OAuth.
761
+ const testMethod = (authMethod === 'oauth' && !clientSecret) ? 'basic' : authMethod;
762
+ const { ok } = await testConnection(instanceUrl, testMethod, {
540
763
  username,
541
764
  password: userPassword,
542
765
  clientId,
@@ -773,7 +996,7 @@ export async function runSetup(options = {}) {
773
996
  choices: providerChoices,
774
997
  default: localProviders.ollama.running ? 'ollama'
775
998
  : localProviders.lmstudio.running ? 'lmstudio'
776
- : undefined,
999
+ : 'skip',
777
1000
  });
778
1001
  if (selectedProvider !== 'skip') {
779
1002
  aiProvider = selectedProvider;
@@ -869,16 +1092,10 @@ export async function runSetup(options = {}) {
869
1092
  });
870
1093
  console.log(` ${success('✓')} Google Gemini configured with ${accent(aiModel)}`);
871
1094
  }
872
- // Custom base URL option for advanced users
873
- const useCustomUrl = await confirm({
874
- message: brand('?') + ' Use a custom API endpoint URL' + brand('?'),
875
- default: false,
876
- });
877
- if (useCustomUrl) {
878
- aiBaseUrl = await input({
879
- message: brand('?') + ' Custom endpoint URL' + brand(':'),
880
- });
881
- }
1095
+ // Advanced: a custom AI base URL (proxy / OpenAI-compatible endpoint) can be set via
1096
+ // NOWAIKIT_AI_BASE_URL. No prompt here — it keeps setup short for the common case.
1097
+ if (process.env.NOWAIKIT_AI_BASE_URL)
1098
+ aiBaseUrl = process.env.NOWAIKIT_AI_BASE_URL;
882
1099
  }
883
1100
  else {
884
1101
  console.log(` ${dim('→')} AI provider skipped — use --provider flag or environment variables when running capabilities.`);
@@ -920,24 +1137,8 @@ export async function runSetup(options = {}) {
920
1137
  console.log(dim(' Generate reports: ') + brand('npx nowaikit report scan-health --format pdf'));
921
1138
  console.log(dim(' Supports: ') + accent('Anthropic') + dim(', ') + accent('OpenAI') + dim(', ') + accent('Ollama') + dim(' (BYOK — bring your own key)'));
922
1139
  console.log('');
923
- const showMoreCaps = await confirm({
924
- message: brand('?') + ' Would you like to list all 26 capabilities in detail' + brand('?'),
925
- default: false,
926
- });
927
- if (showMoreCaps) {
928
- console.log('');
929
- try {
930
- const { getCapabilityMeta } = await import('../prompts/index.js');
931
- const caps = getCapabilityMeta();
932
- for (const c of caps) {
933
- console.log(` ${brand('/' + c.name.padEnd(24))} ${dim(c.description)}`);
934
- }
935
- }
936
- catch {
937
- console.log(dim(' (Capability metadata not available — run ') + brand('npx nowaikit capabilities') + dim(' to see the full list)'));
938
- }
939
- console.log('');
940
- }
1140
+ console.log(dim(' See all 26 in detail any time: ') + brand('npx nowaikit capabilities'));
1141
+ console.log('');
941
1142
  }
942
1143
  else {
943
1144
  console.log(` ${dim('▸')} ${dim('Apex AI Skills disabled — 26 capabilities not loaded.')}`);
@@ -1129,11 +1330,8 @@ async function runAutoConfiguration(instance, mcpEnabled, sdkEnabled, chosenClie
1129
1330
  console.log(` ${dim('→')} ${dim('Starter file already exists:')} ${accent(examplePath)}`);
1130
1331
  }
1131
1332
  else {
1132
- const shouldCreate = await confirm({
1133
- message: brand('?') + ' Create a starter ' + brand('nowaikit-example.ts') + ' in the current directory' + brand('?'),
1134
- default: true,
1135
- });
1136
- if (shouldCreate) {
1333
+ // Just create it (no prompt) — it's harmless, never overwrites, and only runs when SDK is enabled.
1334
+ {
1137
1335
  const instanceUrl = instance.instanceUrl;
1138
1336
  const starter = [
1139
1337
  `/**`,
@@ -1172,7 +1370,7 @@ async function runAutoConfiguration(instance, mcpEnabled, sdkEnabled, chosenClie
1172
1370
  `console.log('Created incident:', newIncident.sys_id);`,
1173
1371
  ].join('\n');
1174
1372
  writeFileSync(examplePath, starter, 'utf8');
1175
- console.log(` ${success('✓')} Created starter file: ${accent(examplePath)}`);
1373
+ console.log(` ${success('✓')} Created starter file: ${accent(examplePath)} ${dim('(delete if you do not need it)')}`);
1176
1374
  }
1177
1375
  }
1178
1376
  console.log('');