@jskit-ai/create-app 0.1.67 → 0.1.69

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jskit-ai/create-app",
3
- "version": "0.1.67",
3
+ "version": "0.1.69",
4
4
  "description": "Scaffold minimal JSKIT app shells.",
5
5
  "type": "module",
6
6
  "files": [
@@ -220,7 +220,9 @@ function printUsage(stream = process.stderr) {
220
220
  stream.write("Usage: jskit-create-app [app-name] [options]\n");
221
221
  stream.write("\n");
222
222
  stream.write("Options:\n");
223
- stream.write(` --template <name> Template folder under templates/ (default: ${DEFAULT_TEMPLATE})\n`);
223
+ stream.write(
224
+ ` --template <name> Template folder under templates/ (default: ${DEFAULT_TEMPLATE}; use ai-seed for the minimal AI seed flow)\n`
225
+ );
224
226
  stream.write(" --title <text> App title used for template replacements\n");
225
227
  stream.write(" --target <path> Target directory (default: ./<app-name>)\n");
226
228
  stream.write(" --initial-bundles <preset> Optional bundle preset: none | auth (default: none)\n");
@@ -609,6 +611,9 @@ export async function runCli(
609
611
  });
610
612
 
611
613
  const targetLabel = toRelativeTargetLabel(path.resolve(cwd), result.targetDirectory);
614
+ const normalizedTemplateName = normalizeTemplatePathSegments(result.template).join("/");
615
+ const isAiSeedTemplate = normalizedTemplateName === "ai-seed";
616
+ const wrotePackageJson = result.touchedFiles.includes("package.json");
612
617
  if (result.dryRun) {
613
618
  stdout.write(
614
619
  `[dry-run] Would create app "${result.appName}" from template "${result.template}" at ${targetLabel}.\n`
@@ -625,10 +630,17 @@ export async function runCli(
625
630
  stdout.write("\n");
626
631
  stdout.write("Next steps:\n");
627
632
  stdout.write(`- cd ${shellQuote(targetLabel)}\n`);
628
- stdout.write("- npm install\n");
629
- stdout.write("- npm run dev\n");
633
+ if (isAiSeedTemplate) {
634
+ stdout.write("- hand the repo to your AI agent and have it read AGENTS.md\n");
635
+ stdout.write(
636
+ `- once the Stage 1 shape is clear, let it run npx @jskit-ai/create-app ${shellQuote(result.appName)} --target . --force --tenancy-mode <mode>\n`
637
+ );
638
+ } else if (wrotePackageJson) {
639
+ stdout.write("- npm install\n");
640
+ stdout.write("- npm run dev\n");
641
+ }
630
642
 
631
- if (result.selectedSetupCommands.length > 0) {
643
+ if (!isAiSeedTemplate && result.selectedSetupCommands.length > 0) {
632
644
  stdout.write("\n");
633
645
  stdout.write(`Initial framework setup commands (${result.initialBundles}):\n`);
634
646
  for (const command of result.selectedSetupCommands) {
@@ -0,0 +1,38 @@
1
+ # AI Seed Instructions
2
+
3
+ This workspace is intentionally only a JSKIT seed scaffold. It is not a real JSKIT app yet.
4
+
5
+ Use this file only for the initial JSKIT setup conversation.
6
+
7
+ If you need more JSKIT documentation before the real scaffold exists, use:
8
+
9
+ - `https://github.com/mobily-enterprises/jskit-ai/blob/main/packages/agent-docs/site/guide/index.md`
10
+ - `https://github.com/mobily-enterprises/jskit-ai/blob/main/packages/agent-docs/site/guide/app-setup/initial-scaffolding.md`
11
+ - `https://github.com/mobily-enterprises/jskit-ai/blob/main/packages/agent-docs/site/guide/app-setup/quickstart.md`
12
+ - `https://github.com/mobily-enterprises/jskit-ai/blob/main/packages/agent-docs/site/guide/app-setup/working-with-the-jskit-cli.md`
13
+
14
+ What to do now:
15
+
16
+ 1. Ask only the Stage 1 setup questions first:
17
+ - app purpose
18
+ - tenancy mode: `none`, `personal`, or `workspaces`
19
+ - database engine: MySQL or Postgres
20
+ - auth provider
21
+ - whether the baseline should include users, console, workspaces, realtime, or assistant
22
+ 2. If a database-backed baseline is selected, do not stop at the engine name. Confirm one of these is true before moving on:
23
+ - the target database already exists and the app connection values are known
24
+ - or the developer has enough local admin or create-database access for the chosen engine to create it now
25
+ 3. Once the baseline package stack is clear, ask plainly for the exact local development setup values needed for the next chosen install step. Use the real env var names or option names instead of vague requests for "credentials".
26
+ 4. Treat those values as routine local development setup inputs, not production secrets. Examples:
27
+ - `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`
28
+ - `AUTH_SUPABASE_URL`, `AUTH_SUPABASE_PUBLISHABLE_KEY`, `APP_PUBLIC_URL`
29
+ - `OPENAI_API_KEY` if assistant support is selected
30
+ 5. For MySQL or Postgres, if the database does not exist yet, ask for whatever local admin or create-database access is needed to create it, then make sure the database exists before promoting the scaffold. Do not move on while the database is still hypothetical.
31
+ 6. If assistant support is selected, explain that `OPENAI_API_KEY` can be given now or wired later; the scaffold can still be created first.
32
+ 7. Do not hand-write JSKIT runtime files or invent file topology in this seed workspace.
33
+ 8. Once the Stage 1 decisions are clear, promote this directory into the real app scaffold by running:
34
+ `npx @jskit-ai/create-app <app-name> --target . --force --tenancy-mode <mode>`
35
+ Use the current directory name as `<app-name>` unless the developer explicitly wants a different app name.
36
+ 9. After that, run `npm install`.
37
+ 10. Then stop, re-read the overwritten `AGENTS.md`, and continue with the normal JSKIT app workflow from that file. Do not rely on memory from the seed stage.
38
+ 11. Do not install JSKIT runtime packages until the new app `AGENTS.md` has been re-read.
@@ -101,6 +101,14 @@ test("latest JSKIT scaffold files are present at the app root", async () => {
101
101
  }
102
102
  });
103
103
 
104
+ test("starter shell keeps the default hosted CI workflow simple", async () => {
105
+ const workflowSource = await readFile(path.join(APP_ROOT, ".github", "workflows", "verify.yml"), "utf8");
106
+
107
+ assert.match(workflowSource, /run: npm run verify/);
108
+ assert.doesNotMatch(workflowSource, /jskit app verify --against/);
109
+ assert.doesNotMatch(workflowSource, /jskit app verify-ui/);
110
+ });
111
+
104
112
  test("starter shell does not include the app.manifest scaffold", async () => {
105
113
  await assert.rejects(access(path.join(APP_ROOT, "framework/app.manifest.mjs")), /ENOENT/);
106
114
  });