@kybernesis/create 0.1.2 → 0.1.4

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/cli.js CHANGED
@@ -15,7 +15,7 @@ import { upgrade } from "./upgrade.js";
15
15
  const [, , command, ...rest] = process.argv;
16
16
  switch (command) {
17
17
  case "init":
18
- await init(rest.find((a) => !a.startsWith("-")));
18
+ await init(rest.find((a) => !a.startsWith("-")), { engineer: rest.includes("--engineer") });
19
19
  break;
20
20
  case "doctor":
21
21
  await doctor();
@@ -24,20 +24,19 @@ switch (command) {
24
24
  await upgrade(rest.includes("--skip-eval"));
25
25
  break;
26
26
  case undefined:
27
- // `npm create @kybernesis <name>` lands here with the name in rest? No —
28
- // npm create passes extra args as argv; treat a bare arg as init's name.
29
- await init(undefined);
27
+ await init(undefined, { engineer: false });
30
28
  break;
31
29
  default:
32
30
  if (!command.startsWith("-")) {
33
31
  // `npm create @kybernesis acme-agent` → argv[2] is the name.
34
- await init(command);
32
+ await init(command, { engineer: rest.includes("--engineer") });
35
33
  break;
36
34
  }
37
35
  console.log(`
38
36
  ${bold("kyb")} — Kybernesis agent scaffolder & FDE toolkit
39
37
 
40
38
  ${bold("kyb init [name]")} scaffold a full Kybernesis eve agent
39
+ --engineer ${dim("add the engineer layer: workshop sandbox + vision dev loop")}
41
40
  ${bold("kyb doctor")} preflight checks (keys, issuer, envs, discovery)
42
41
  ${bold("kyb upgrade")} bump @kybernesis/* packages, gated on evals
43
42
  --skip-eval ${dim("skip the eval gate")}
package/dist/init.d.ts CHANGED
@@ -1 +1,3 @@
1
- export declare function init(rawName: string | undefined): Promise<void>;
1
+ export declare function init(rawName: string | undefined, options?: {
2
+ engineer?: boolean;
3
+ }): Promise<void>;
package/dist/init.js CHANGED
@@ -3,7 +3,10 @@ import { join, resolve } from "node:path";
3
3
  import { DEFAULT_ISSUER, EVE_VERSION, REGISTRY_URL, ask, bold, closePrompts, green, run, slug, yellow, } from "./util.js";
4
4
  import { envExample, evalFileTs, evalScript, identityMd, rootArcanaTs, subagentAgentTs, subagentArcanaTs, subagentInstructionsMd, } from "./templates.js";
5
5
  const ITEMS = ["enterprise", "arcana", "multiplayer", "evals"];
6
- export async function init(rawName) {
6
+ // Official eve-registry limbs installed alongside the engineer layer.
7
+ const ENGINEER_OFFICIAL_ITEMS = ["extension/agent-browser", "extension/github-tools", "connection/vercel"];
8
+ export async function init(rawName, options) {
9
+ const engineer = options?.engineer === true;
7
10
  const name = slug(rawName ?? (await ask("Agent name (kebab-case)?", "acme-agent")));
8
11
  if (!name) {
9
12
  console.error("An agent name is required.");
@@ -29,6 +32,17 @@ export async function init(rawName) {
29
32
  for (const item of ITEMS) {
30
33
  run("npx", ["eve", "add", `@kybernesis/${item}`, "--overwrite"], { cwd: dir });
31
34
  }
35
+ if (engineer) {
36
+ console.log(bold("\n2b Engineer layer: workshop sandbox + vision dev loop …"));
37
+ run("npx", ["eve", "add", "@kybernesis/engineer", "--overwrite"], { cwd: dir });
38
+ for (const item of ENGINEER_OFFICIAL_ITEMS) {
39
+ // Official items may carry their own interactive setup; a failure here
40
+ // shouldn't kill the scaffold — the FDE can re-run `eve add <item>`.
41
+ const ok = run("npx", ["eve", "add", item, "--overwrite"], { cwd: dir, allowFail: true });
42
+ if (!ok)
43
+ console.log(yellow(` ! ${item} did not install cleanly — re-run: npx eve add ${item}`));
44
+ }
45
+ }
32
46
  console.log(bold("\n3/6 Writing agent identity, memory mount, and eval wiring …"));
33
47
  mkdirSync(join(dir, "agent/instructions"), { recursive: true });
34
48
  writeFileSync(join(dir, "agent/instructions/identity.md"), identityMd(displayName, depts));
@@ -68,7 +82,25 @@ export async function init(rawName) {
68
82
  const infoOk = run("npx", ["eve", "info"], { cwd: dir, allowFail: true, quiet: true });
69
83
  console.log(tsOk && infoOk ? green(" ✓ typecheck + discovery clean") : yellow(" ! verify manually: npm run typecheck && npx eve info"));
70
84
  console.log(`
71
- ${green("✓")} ${bold(name)} scaffolded: governed (enterprise) · remembering (arcana) · multiplayer (slack) · self-testing (evals)${depts.length ? ` · ${depts.length} dept subagent(s)` : ""}
85
+ ${green("✓")} ${bold(name)} scaffolded: governed (enterprise) · remembering (arcana) · multiplayer (slack) · self-testing (evals)${engineer ? " · engineer (workshop + vision loop)" : ""}${depts.length ? ` · ${depts.length} dept subagent(s)` : ""}${engineer ? `
86
+
87
+ ${bold("Engineer notes:")}
88
+ · The workshop sandbox (agent/sandbox/sandbox.ts) bakes Playwright into the
89
+ template at DEPLOY time — a broken bootstrap fails the Vercel build loudly.
90
+ Deployed sessions run under a domain allowlist; extend it deliberately in
91
+ that file when a project needs another host.
92
+ · Vercel connection (preview deploys + link-back), after \`vercel link\`:
93
+ vercel connect create mcp.vercel.com --name vercel
94
+ vercel connect attach mcp.vercel.com/vercel --yes
95
+ then set connect("mcp.vercel.com/vercel") — the UID, not the short name —
96
+ in agent/connections/vercel.ts. First tool use posts an OAuth link in the
97
+ thread (user-scoped); grant "All projects" so the agent can create new ones,
98
+ then narrow the grant in the dashboard once the project exists.
99
+ · File delivery (the deliver tool needs it):
100
+ vercel blob create-store ${name}-deliverables --access public --yes
101
+ links the store and injects BLOB_READ_WRITE_TOKEN automatically.
102
+ · agent-browser / github-tools may need their Connect setup flows — run
103
+ their printed setup commands if tools 401.` : ""}
72
104
 
73
105
  ${bold("Human steps (in order) — the FDE playbook covers each in detail:")}
74
106
  1. Arcana: create workspaces (${name}-company, ${name}-eval${depts.map((d) => `, ${name}-${d}`).join("")}) + scoped kb_ keys; fill .env.local from .env.example
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kybernesis/create",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "The Kybernesis agent scaffolder and FDE toolkit: one command to a governed, remembering, multiplayer, self-testing eve agent — plus doctor and upgrade.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",