@akanjs/cli 0.0.146 → 0.0.148

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 (28) hide show
  1. package/README.md +7 -26
  2. package/cjs/index.js +186 -21
  3. package/cjs/src/guidelines/cssRule/cssRule.instruction.md +1 -1
  4. package/cjs/src/guidelines/docPageRule/docPageRule.instruction.md +59 -52
  5. package/cjs/src/guidelines/modelConstant/modelConstant.instruction.md +335 -752
  6. package/cjs/src/guidelines/modelTemplate/modelTemplate.instruction.md +418 -391
  7. package/cjs/src/guidelines/modelUnit/modelUnit.instruction.md +0 -292
  8. package/cjs/src/guidelines/scalarModule/scalarModule.instruction.md +84 -0
  9. package/cjs/src/templates/app/main.js +1 -2
  10. package/esm/index.js +194 -29
  11. package/esm/src/guidelines/cssRule/cssRule.instruction.md +1 -1
  12. package/esm/src/guidelines/docPageRule/docPageRule.instruction.md +59 -52
  13. package/esm/src/guidelines/modelConstant/modelConstant.instruction.md +335 -752
  14. package/esm/src/guidelines/modelTemplate/modelTemplate.instruction.md +418 -391
  15. package/esm/src/guidelines/modelUnit/modelUnit.instruction.md +0 -292
  16. package/esm/src/guidelines/scalarModule/scalarModule.instruction.md +84 -0
  17. package/esm/src/templates/app/main.js +1 -2
  18. package/package.json +1 -1
  19. package/src/guideline/guideline.command.d.ts +3 -1
  20. package/src/guideline/guideline.prompt.d.ts +15 -1
  21. package/src/guideline/guideline.runner.d.ts +17 -3
  22. package/src/guideline/guideline.script.d.ts +8 -2
  23. package/src/guidelines/cssRule/cssRule.instruction.md +1 -1
  24. package/src/guidelines/docPageRule/docPageRule.instruction.md +59 -52
  25. package/src/guidelines/modelConstant/modelConstant.instruction.md +335 -752
  26. package/src/guidelines/modelTemplate/modelTemplate.instruction.md +418 -391
  27. package/src/guidelines/modelUnit/modelUnit.instruction.md +0 -292
  28. package/src/guidelines/scalarModule/scalarModule.instruction.md +84 -0
package/esm/index.js CHANGED
@@ -589,7 +589,7 @@ var withBase = (appName, config, libs, routes = []) => {
589
589
  eslint: { ...config.eslint, ignoreDuringBuilds: true },
590
590
  env: {
591
591
  ...config.env,
592
- basePaths: routes.map(({ basePath: basePath2 }) => basePath2).join(",")
592
+ basePaths: [...new Set(routes.map(({ basePath: basePath2 }) => basePath2))].join(",")
593
593
  },
594
594
  transpilePackages: ["swiper", "ssr-window", "dom7"],
595
595
  reactStrictMode: commandType === "start" ? false : true,
@@ -755,6 +755,7 @@ CMD ["npm", "start"]`,
755
755
  config.libs ?? [],
756
756
  config.frontend?.routes
757
757
  ),
758
+ routes: config.frontend?.routes,
758
759
  explicitDependencies: config.frontend?.explicitDependencies ?? []
759
760
  },
760
761
  mobile: {
@@ -1238,7 +1239,10 @@ ${errorMessages}`);
1238
1239
  ];
1239
1240
  const errors = diagnostics.filter((diagnostic) => diagnostic.category === ts3.DiagnosticCategory.Error);
1240
1241
  const warnings = diagnostics.filter((diagnostic) => diagnostic.category === ts3.DiagnosticCategory.Warning);
1241
- return { diagnostics, errors, warnings };
1242
+ const fileDiagnostics = diagnostics.filter((diagnostic) => diagnostic.file?.fileName === filePath);
1243
+ const fileErrors = fileDiagnostics.filter((diagnostic) => diagnostic.category === ts3.DiagnosticCategory.Error);
1244
+ const fileWarnings = fileDiagnostics.filter((diagnostic) => diagnostic.category === ts3.DiagnosticCategory.Warning);
1245
+ return { diagnostics, errors, warnings, fileDiagnostics, fileErrors, fileWarnings };
1242
1246
  }
1243
1247
  /**
1244
1248
  * Format diagnostics for console output
@@ -1665,9 +1669,9 @@ var Executor = class _Executor {
1665
1669
  typeCheck(filePath) {
1666
1670
  const path9 = this.getPath(filePath);
1667
1671
  const typeChecker = this.getTypeChecker();
1668
- const { diagnostics, errors, warnings } = typeChecker.check(path9);
1669
- const message = typeChecker.formatDiagnostics(diagnostics);
1670
- return { diagnostics, errors, warnings, message };
1672
+ const { fileDiagnostics, fileErrors, fileWarnings } = typeChecker.check(path9);
1673
+ const message = typeChecker.formatDiagnostics(fileDiagnostics);
1674
+ return { fileDiagnostics, fileErrors, fileWarnings, message };
1671
1675
  }
1672
1676
  getLinter() {
1673
1677
  this.linter ??= new Linter(this.cwdPath);
@@ -3097,7 +3101,7 @@ ${validate.map((v) => `- ${v}`).join("\n")}`;
3097
3101
  writes.map(async ({ filePath }) => {
3098
3102
  const typeCheckResult = executor.typeCheck(filePath);
3099
3103
  const lintResult = await executor.lint(filePath);
3100
- const needFix2 = !!typeCheckResult.errors.length || !!lintResult.errors.length;
3104
+ const needFix2 = !!typeCheckResult.fileErrors.length || !!lintResult.errors.length;
3101
3105
  return { filePath, typeCheckResult, lintResult, needFix: needFix2 };
3102
3106
  })
3103
3107
  );
@@ -3131,7 +3135,7 @@ ${fileCheck.lintResult.message}`
3131
3135
  throw new Error("Failed to create scalar");
3132
3136
  }
3133
3137
  #getTypescriptCodes(text) {
3134
- const codes = text.match(/```typescript([\s\S]*?)```/g);
3138
+ const codes = text.match(/```(typescript|tsx)([\s\S]*?)```/g);
3135
3139
  if (!codes)
3136
3140
  return [];
3137
3141
  const result = codes.map((code) => {
@@ -3239,7 +3243,7 @@ var Builder = class {
3239
3243
  };
3240
3244
 
3241
3245
  // pkgs/@akanjs/devkit/src/prompter.ts
3242
- import { select as select4 } from "@inquirer/prompts";
3246
+ import { input as input3, select as select4 } from "@inquirer/prompts";
3243
3247
  import fsPromise2 from "fs/promises";
3244
3248
  var Prompter = class {
3245
3249
  static async selectGuideline() {
@@ -3256,6 +3260,9 @@ var Prompter = class {
3256
3260
  const content = await fsPromise2.readFile(filePath, "utf-8");
3257
3261
  return content;
3258
3262
  }
3263
+ static async getUpdateRequest(guideName) {
3264
+ return await input3({ message: `What do you want to update in ${guideName}?` });
3265
+ }
3259
3266
  async makeTsFileUpdatePrompt({ context: context2, request }) {
3260
3267
  return `You are a senior developer writing TypeScript-based programs using Akan.js, an in-house framework. Here's an overview of the Akan.js framework:
3261
3268
  ${await this.getDocumentation("framework")}
@@ -3417,7 +3424,7 @@ var LibraryScript = class {
3417
3424
  };
3418
3425
 
3419
3426
  // pkgs/@akanjs/cli/src/application/application.runner.ts
3420
- import { confirm as confirm2, input as input3 } from "@inquirer/prompts";
3427
+ import { confirm as confirm2, input as input4 } from "@inquirer/prompts";
3421
3428
  import { StringOutputParser } from "@langchain/core/output_parsers";
3422
3429
  import { PromptTemplate as PromptTemplate2 } from "@langchain/core/prompts";
3423
3430
  import { RunnableSequence as RunnableSequence2 } from "@langchain/core/runnables";
@@ -3572,6 +3579,8 @@ var ApplicationRunner = class {
3572
3579
  async #getViteConfig(app, command) {
3573
3580
  const { env } = await this.#prepareCommand(app, command, "csr");
3574
3581
  const tsconfig = app.workspace.getTsConfig();
3582
+ const akanConfig = await app.getConfig();
3583
+ const basePaths = akanConfig.frontend.routes ? [...new Set(akanConfig.frontend.routes.map(({ basePath: basePath2 }) => basePath2))].join(",") : void 0;
3575
3584
  const processEnv = env;
3576
3585
  const akanjsPrefix = process.env.USE_AKANJS_PKGS === "true" ? `${app.workspace.workspaceRoot}/pkgs/` : "";
3577
3586
  const config = vite.defineConfig({
@@ -3635,7 +3644,8 @@ var ApplicationRunner = class {
3635
3644
  APP_OPERATION_MODE: processEnv.APP_OPERATION_MODE ?? "local",
3636
3645
  AKAN_WORKSPACE_ROOT: app.workspace.workspaceRoot,
3637
3646
  AKAN_APP_ROOT: app.cwdPath,
3638
- RENDER_ENV: "csr"
3647
+ RENDER_ENV: "csr",
3648
+ basePaths
3639
3649
  },
3640
3650
  "process.platform": JSON.stringify("browser"),
3641
3651
  "process.version": JSON.stringify(process.version)
@@ -3877,8 +3887,8 @@ var ApplicationRunner = class {
3877
3887
  if (!openAIApiKey)
3878
3888
  throw new Error("OPENAI_API_KEY is not set");
3879
3889
  const chatModel = new ChatOpenAI3({ modelName: "gpt-4o", openAIApiKey });
3880
- const projectName = await input3({ message: "please enter project name." });
3881
- const projectDesc = await input3({ message: "please enter project description. (40 ~ 60 characters)" });
3890
+ const projectName = await input4({ message: "please enter project name." });
3891
+ const projectDesc = await input4({ message: "please enter project description. (40 ~ 60 characters)" });
3882
3892
  const spinner = ora3("Gerating project files...");
3883
3893
  const mainPrompt = PromptTemplate2.fromTemplate(`prompt.requestApplication()`);
3884
3894
  const chain = RunnableSequence2.from([mainPrompt, chatModel, new StringOutputParser()]);
@@ -3945,7 +3955,11 @@ var ApplicationScript = class {
3945
3955
  await this.syncApplication(app);
3946
3956
  if (app.workspace.getBaseDevEnv().env === "local")
3947
3957
  await this.dbup(app.workspace);
3948
- await Promise.all([this.startBackend(app, { open: open2, sync: false }), this.startFrontend(app, { open: open2, sync: false })]);
3958
+ await Promise.all([
3959
+ this.startBackend(app, { open: open2, sync: false }),
3960
+ this.startFrontend(app, { open: open2, sync: false }),
3961
+ this.startCsr(app, { open: open2, sync: false })
3962
+ ]);
3949
3963
  }
3950
3964
  async buildBackend(app, { sync = true } = {}) {
3951
3965
  if (sync)
@@ -5486,7 +5500,9 @@ var GuidelinePrompt = class extends Prompter {
5486
5500
  });
5487
5501
  const paths = [];
5488
5502
  for await (const path9 of matchingPaths) {
5489
- if (filterText && !fs16.readFileSync(path9, "utf-8").includes(filterText))
5503
+ const fileContent = fs16.readFileSync(path9, "utf-8");
5504
+ const textFilter = filterText ? new RegExp(filterText) : null;
5505
+ if (filterText && !textFilter?.test(fileContent))
5490
5506
  continue;
5491
5507
  paths.push(path9);
5492
5508
  }
@@ -5539,10 +5555,39 @@ ${guideJson.update.rules.map((rule) => `- ${rule}`).join("\n")}
5539
5555
 
5540
5556
  => Now, you need to write the file content here. Let's go.
5541
5557
  `;
5542
- return { request, writePath };
5558
+ return { guideJson, request, writePath };
5543
5559
  }
5544
- async requestUpdateDocumentPage(page) {
5545
- const writePath = `apps/angelo/app/${page}`;
5560
+ async requestUpdateInstruction(updateRequest) {
5561
+ const guideJson = await Prompter.getGuideJson(this.name);
5562
+ const resultPath = `${__dirname}/src/guidelines/${this.name}/${guideJson.update.filePath}`;
5563
+ const writePath = `${this.workspace.workspaceRoot}/pkgs/@akanjs/cli/src/guidelines/${this.name}/${guideJson.update.filePath}`;
5564
+ const isResultExists = this.workspace.exists(writePath);
5565
+ if (!isResultExists)
5566
+ throw new Error(`${guideJson.update.filePath} file does not exist. Please create it first.`);
5567
+ const existingResult = this.workspace.readFile(resultPath);
5568
+ const request = `
5569
+ I am a developer of akanjs framework, a full-stack framework for building web applications.
5570
+ I want to update a ${guideJson.update.filePath} file for ${guideJson.description}.
5571
+ This file is a programming guideline for Akan.js framwork users.
5572
+
5573
+ # ${guideJson.title} Workflow
5574
+ - 1. Read already-written ${guideJson.update.filePath} file.
5575
+ - 2. Write the updated file content of the ${guideJson.update.filePath} with the update request.
5576
+
5577
+ ## 1. Read already-written ${guideJson.update.filePath} file.
5578
+ \`\`\`markdown
5579
+ ${existingResult}
5580
+ \`\`\`
5581
+
5582
+ ## 2. Write the updated file content of the ${guideJson.update.filePath} with the update request.
5583
+ Request: ${updateRequest}
5584
+
5585
+ => Now, you need to write the file content here. Let's go.
5586
+ `;
5587
+ return { guideJson, request, writePath };
5588
+ }
5589
+ async requestCreateDocumentPage(page) {
5590
+ const writePath = `apps/angelo/app${page}`;
5546
5591
  if (!this.workspace.exists(writePath))
5547
5592
  this.workspace.writeFile(
5548
5593
  writePath,
@@ -5584,6 +5629,69 @@ Please return only the file result in the following format for easy parsing.
5584
5629
  // File: ${writePath}
5585
5630
  ...pageContent
5586
5631
  \`\`\`
5632
+ `;
5633
+ return { request, writePath };
5634
+ }
5635
+ async requestUpdateDocumentPage(page, updateRequest) {
5636
+ const writePath = `apps/angelo/app${page}`;
5637
+ if (!this.workspace.exists(writePath))
5638
+ this.workspace.writeFile(
5639
+ writePath,
5640
+ `export default function Page() {
5641
+ return <div>No Content</div>;
5642
+ }
5643
+ `
5644
+ );
5645
+ const instruction = await Prompter.getInstruction(this.name);
5646
+ const pageContent = this.workspace.getLocalFile(writePath);
5647
+ const request = `
5648
+ I'm updating a documentation website for the Akan.js framework.
5649
+
5650
+ I want to update the Next.js server-side page located at ${writePath}.
5651
+ Below is the content of the currently written page. You should update stale infos and preserve the existing content.
5652
+ \`\`\`tsx
5653
+ // File: ${writePath}
5654
+ ${pageContent.content}
5655
+ \`\`\`
5656
+
5657
+ The existing instruction is below.
5658
+ \`\`\`markdown
5659
+ ${instruction}
5660
+ \`\`\`
5661
+
5662
+ Please update this page with the request below.
5663
+ ${updateRequest}
5664
+
5665
+ Please return only the file result in the following format for easy parsing.
5666
+ \`\`\`tsx
5667
+ // File: ${writePath}
5668
+ ...pageContent
5669
+ \`\`\`
5670
+ `;
5671
+ return { request, writePath };
5672
+ }
5673
+ async requestReapplyInstruction(filePath) {
5674
+ const guideJson = await Prompter.getGuideJson(this.name);
5675
+ const writePath = `${this.workspace.workspaceRoot}/pkgs/@akanjs/cli/src/guidelines/${this.name}/${guideJson.update.filePath}`;
5676
+ if (!guideJson.page)
5677
+ throw new Error(`${this.name} does not have a page.`);
5678
+ const pagePath = `apps/angelo/app${guideJson.page}`;
5679
+ const pageFile = this.workspace.getLocalFile(pagePath);
5680
+ const request = `
5681
+ I want to apply information in the Next.js page to markdown instruction file.
5682
+
5683
+ Here's the newest information in the Next.js page.
5684
+ \`\`\`tsx
5685
+ // File: ${pagePath}
5686
+ ${pageFile.content}
5687
+ \`\`\`
5688
+
5689
+ Here's the existing instruction file.
5690
+ \`\`\`markdown
5691
+ ${await Prompter.getInstruction(this.name)}
5692
+ \`\`\`
5693
+
5694
+ Please update the instruction file with the information in the Next.js page.
5587
5695
  `;
5588
5696
  return { request, writePath };
5589
5697
  }
@@ -5594,19 +5702,45 @@ var GuidelineRunner = class {
5594
5702
  async generateInstruction(workspace, guideName) {
5595
5703
  const session = new AiSession("generateInstruction", { workspace, cacheKey: guideName });
5596
5704
  const prompt = new GuidelinePrompt(workspace, guideName);
5597
- const { request, writePath } = await prompt.requestCreateInstruction();
5705
+ const { guideJson, request, writePath } = await prompt.requestCreateInstruction();
5706
+ const guidelineContent = await session.editMarkdown(request);
5707
+ workspace.writeFile(writePath, guidelineContent);
5708
+ return { guideJson, session };
5709
+ }
5710
+ async updateInstruction(workspace, guideName, { updateRequest }) {
5711
+ const session = new AiSession("updateInstruction", { workspace, cacheKey: guideName });
5712
+ const prompt = new GuidelinePrompt(workspace, guideName);
5713
+ const { guideJson, request, writePath } = await prompt.requestUpdateInstruction(updateRequest);
5598
5714
  const guidelineContent = await session.editMarkdown(request);
5599
5715
  workspace.writeFile(writePath, guidelineContent);
5716
+ return { guideJson, session };
5600
5717
  }
5601
- async deployDocPage(workspace, guideName) {
5718
+ async generateDocument(workspace, guideName) {
5602
5719
  const session = new AiSession("deployDocPages", { workspace, cacheKey: guideName });
5603
5720
  const guideJson = await Prompter.getGuideJson(guideName);
5604
5721
  const prompt = new GuidelinePrompt(workspace, guideName);
5605
5722
  if (!guideJson.page)
5606
5723
  return Promise.resolve({});
5607
- const { request } = await prompt.requestUpdateDocumentPage(guideJson.page);
5724
+ const { request } = await prompt.requestCreateDocumentPage(guideJson.page);
5608
5725
  await session.writeTypescripts(request, workspace);
5609
5726
  }
5727
+ async updateDocument(workspace, guideName, { updateRequest, session }) {
5728
+ const guideJson = await Prompter.getGuideJson(guideName);
5729
+ if (!guideJson.page)
5730
+ throw new Error(`${guideName} does not have a page.`);
5731
+ const prompt = new GuidelinePrompt(workspace, guideName);
5732
+ const { request, writePath } = await prompt.requestUpdateDocumentPage(guideJson.page, updateRequest);
5733
+ const guidelineContent = await session.editMarkdown(request);
5734
+ workspace.writeFile(writePath, guidelineContent);
5735
+ }
5736
+ async reapplyInstruction(workspace, guideName) {
5737
+ const session = new AiSession("reapplyInstruction", { workspace, cacheKey: guideName });
5738
+ const guideJson = await Prompter.getGuideJson(guideName);
5739
+ const prompt = new GuidelinePrompt(workspace, guideName);
5740
+ const { request, writePath } = await prompt.requestReapplyInstruction(guideJson.update.filePath);
5741
+ const guidelineContent = await session.editMarkdown(request);
5742
+ workspace.writeFile(writePath, guidelineContent);
5743
+ }
5610
5744
  };
5611
5745
 
5612
5746
  // pkgs/@akanjs/cli/src/guideline/guideline.script.ts
@@ -5616,9 +5750,23 @@ var GuidelineScript = class {
5616
5750
  const guideName = name ?? await Prompter.selectGuideline();
5617
5751
  await this.#runner.generateInstruction(workspace, guideName);
5618
5752
  }
5619
- async deployDocPage(workspace, name = null) {
5753
+ async updateInstruction(workspace, name = null, updateRequest) {
5754
+ const guideName = name ?? await Prompter.selectGuideline();
5755
+ const { guideJson, session } = await this.#runner.updateInstruction(workspace, guideName, { updateRequest });
5756
+ if (guideJson.page)
5757
+ await this.updateDocument(workspace, guideName, { updateRequest, session });
5758
+ }
5759
+ async generateDocument(workspace, name = null) {
5760
+ const guideName = name ?? await Prompter.selectGuideline();
5761
+ await this.#runner.generateDocument(workspace, guideName);
5762
+ }
5763
+ async updateDocument(workspace, name = null, { updateRequest, session }) {
5620
5764
  const guideName = name ?? await Prompter.selectGuideline();
5621
- await this.#runner.deployDocPage(workspace, guideName);
5765
+ await this.#runner.updateDocument(workspace, guideName, { updateRequest, session });
5766
+ }
5767
+ async reapplyInstruction(workspace, name = null) {
5768
+ const guideName = name ?? await Prompter.selectGuideline();
5769
+ await this.#runner.reapplyInstruction(workspace, guideName);
5622
5770
  }
5623
5771
  };
5624
5772
 
@@ -5628,8 +5776,14 @@ var GuidelineCommand = class {
5628
5776
  async generateInstruction(name, workspace) {
5629
5777
  await this.guidelineScript.generateInstruction(workspace, name);
5630
5778
  }
5631
- async deployDoc(name, workspace) {
5632
- await this.guidelineScript.deployDocPage(workspace, name);
5779
+ async updateInstruction(name, request, workspace) {
5780
+ await this.guidelineScript.updateInstruction(workspace, name, request);
5781
+ }
5782
+ async generateDocument(name, workspace) {
5783
+ await this.guidelineScript.generateDocument(workspace, name);
5784
+ }
5785
+ async reapplyInstruction(name, workspace) {
5786
+ await this.guidelineScript.reapplyInstruction(workspace, name);
5633
5787
  }
5634
5788
  };
5635
5789
  __decorateClass([
@@ -5637,11 +5791,22 @@ __decorateClass([
5637
5791
  __decorateParam(0, Argument("name", { ask: "name of the instruction", nullable: true })),
5638
5792
  __decorateParam(1, Workspace())
5639
5793
  ], GuidelineCommand.prototype, "generateInstruction", 1);
5794
+ __decorateClass([
5795
+ Target.Public(),
5796
+ __decorateParam(0, Argument("name", { ask: "name of the instruction", nullable: true })),
5797
+ __decorateParam(1, Option("request", { ask: "What do you want to update?" })),
5798
+ __decorateParam(2, Workspace())
5799
+ ], GuidelineCommand.prototype, "updateInstruction", 1);
5800
+ __decorateClass([
5801
+ Target.Public(),
5802
+ __decorateParam(0, Argument("name", { ask: "name of the instruction", nullable: true })),
5803
+ __decorateParam(1, Workspace())
5804
+ ], GuidelineCommand.prototype, "generateDocument", 1);
5640
5805
  __decorateClass([
5641
5806
  Target.Public(),
5642
5807
  __decorateParam(0, Argument("name", { ask: "name of the instruction", nullable: true })),
5643
5808
  __decorateParam(1, Workspace())
5644
- ], GuidelineCommand.prototype, "deployDoc", 1);
5809
+ ], GuidelineCommand.prototype, "reapplyInstruction", 1);
5645
5810
  GuidelineCommand = __decorateClass([
5646
5811
  Commands()
5647
5812
  ], GuidelineCommand);
@@ -5650,7 +5815,7 @@ GuidelineCommand = __decorateClass([
5650
5815
  import pluralize2 from "pluralize";
5651
5816
 
5652
5817
  // pkgs/@akanjs/cli/src/scalar/scalar.prompt.ts
5653
- import { input as input4 } from "@inquirer/prompts";
5818
+ import { input as input5 } from "@inquirer/prompts";
5654
5819
  var ScalarPrompt = class extends Prompter {
5655
5820
  constructor(sys3, name) {
5656
5821
  super();
@@ -5658,13 +5823,13 @@ var ScalarPrompt = class extends Prompter {
5658
5823
  this.name = name;
5659
5824
  }
5660
5825
  async requestUpdateConstant() {
5661
- const request = await input4({ message: `What do you want to change?` });
5826
+ const request = await input5({ message: `What do you want to change?` });
5662
5827
  return { request, validate: void 0 };
5663
5828
  }
5664
5829
  async requestCreateConstant() {
5665
5830
  const constantFiles = await this.sys.getConstantFilesWithLibs();
5666
- const description = await input4({ message: "description of scalar scalar" });
5667
- const schemaDescription = await input4({ message: "schema description of scalar scalar" });
5831
+ const description = await input5({ message: "description of scalar scalar" });
5832
+ const schemaDescription = await input5({ message: "schema description of scalar scalar" });
5668
5833
  await this.sys.applyTemplate({
5669
5834
  basePath: "./lib/__scalar",
5670
5835
  template: "__scalar",
@@ -180,7 +180,7 @@ export const Card = ({ className, project, href }: ModelProps<"project", cnst.Li
180
180
  className={clsx(
181
181
  "border-base-300 bg-base-100 flex flex-col gap-3 rounded-lg border-2 p-4",
182
182
  "hover:border-primary transition-all hover:shadow-md",
183
- "focus:ring-primary focus:outline-hidden focus:ring-2",
183
+ "focus:ring-primary focus:ring-2 focus:outline-hidden",
184
184
  className
185
185
  )}
186
186
  >