wholestack 0.6.2 → 0.7.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/cli.js CHANGED
@@ -67,6 +67,7 @@ import {
67
67
  rollbackDeployment,
68
68
  runProver,
69
69
  runRepoAuditStream,
70
+ runVolitionSubcommand,
70
71
  saveKey,
71
72
  searchLessons,
72
73
  stateDir,
@@ -80,7 +81,7 @@ import {
80
81
  webBaseUrl,
81
82
  writeProjectLink,
82
83
  writeWorkingTree
83
- } from "./chunk-UBDW5N5G.js";
84
+ } from "./chunk-NHABZZTE.js";
84
85
 
85
86
  // src/cli.ts
86
87
  import { createInterface } from "readline/promises";
@@ -872,13 +873,34 @@ ${c.bold("OPTIONS")}
872
873
  --theme ${c.dim("<id>")} force a theme id
873
874
  --style ${c.dim("<id>")} force a Launch Style id (e.g. mono-noir, voltage)
874
875
  --color ${c.dim("<d|l>")} force dark or light
876
+ --tier ${c.dim("<t>")} app size: solo\xB7team\xB7enterprise ${c.dim("(default: inferred from the idea)")}
877
+ --feature ${c.dim("<f>")} force a feature on (repeatable); prefix ${c.dim("no-")} to force off
878
+ --mobile add the Capacitor store-shippable iOS/Android shell
879
+ --archetype ${c.dim("<a>")} pin the interior layout: analytics\xB7document-editor\xB7collaboration\xB7kanban\xB7calendar\xB7marketplace\xB7studio
880
+ --vibe ${c.dim("<v>")} look filter: cinematic-dark\xB7editorial-luxe\xB7warm-minimal\xB7bold-brutalist\xB7glass-futuristic\xB7vibrant-playful\xB7corporate-clean
875
881
  --verbose stream the engine's build phases
876
882
  -h, --help show this help
877
883
 
884
+ ${c.bold("FEATURES")} ${c.dim("(for --feature)")}
885
+ ${c.dim("socialAuth \xB7 multiTenant \xB7 billing \xB7 search \xB7 files \xB7 admin \xB7 compliance \xB7 infra \xB7 mobile \xB7 analytics")}
886
+ ${c.dim("e.g. --tier solo --feature billing --feature no-infra (a lean app + payments, no terraform)")}
887
+
878
888
  ${c.bold("NOTES")}
879
889
  \u2022 Delivering code requires a Wholestack membership and spends one build credit per
880
890
  app. Run ${c.cyan("wholestack login")} first. ${c.dim("--boot is free but keeps no code.")}
881
891
  \u2022 Exit code is 0 only when every requested app shipped.`;
892
+ var FEATURE_KEYS = [
893
+ "socialAuth",
894
+ "multiTenant",
895
+ "billing",
896
+ "search",
897
+ "files",
898
+ "admin",
899
+ "compliance",
900
+ "infra",
901
+ "mobile",
902
+ "analytics"
903
+ ];
882
904
  var KNOWN = /* @__PURE__ */ new Set([
883
905
  "--out",
884
906
  "--batch",
@@ -890,6 +912,11 @@ var KNOWN = /* @__PURE__ */ new Set([
890
912
  "--theme",
891
913
  "--style",
892
914
  "--color",
915
+ "--tier",
916
+ "--feature",
917
+ "--mobile",
918
+ "--archetype",
919
+ "--vibe",
893
920
  "--verbose",
894
921
  "-h",
895
922
  "--help"
@@ -959,6 +986,31 @@ function parseFlags(rest) {
959
986
  else throw new Error("--color must be dark or light");
960
987
  break;
961
988
  }
989
+ case "--tier": {
990
+ const v = need("--tier").toLowerCase();
991
+ if (v !== "solo" && v !== "team" && v !== "enterprise")
992
+ throw new Error("--tier must be solo, team, or enterprise");
993
+ f.tier = v;
994
+ break;
995
+ }
996
+ case "--feature": {
997
+ const raw = need("--feature");
998
+ const off = raw.startsWith("no-");
999
+ const key = off ? raw.slice(3) : raw;
1000
+ if (!FEATURE_KEYS.includes(key))
1001
+ throw new Error(`unknown --feature "${raw}" (one of: ${FEATURE_KEYS.join(", ")}, optionally no-<feature>)`);
1002
+ (f.features ??= {})[key] = !off;
1003
+ break;
1004
+ }
1005
+ case "--mobile":
1006
+ f.mobile = true;
1007
+ break;
1008
+ case "--archetype":
1009
+ f.archetype = need("--archetype");
1010
+ break;
1011
+ case "--vibe":
1012
+ f.styleVibe = need("--vibe");
1013
+ break;
962
1014
  default:
963
1015
  if (a.startsWith("-") && !KNOWN.has(a)) throw new Error(`unknown flag: ${a}`);
964
1016
  f.ideaParts.push(a);
@@ -1002,6 +1054,7 @@ async function buildOne(engine, idea, flags, outRoot, onPhase) {
1002
1054
  }
1003
1055
  return { idea, slug: slug2, ok: false, error: booted.error ?? "boot failed" };
1004
1056
  }
1057
+ const appScope = flags.tier || flags.features ? { ...flags.tier ? { tier: flags.tier } : {}, ...flags.features ? { features: flags.features } : {} } : void 0;
1005
1058
  const result = await httpBuild(
1006
1059
  engine,
1007
1060
  {
@@ -1012,6 +1065,10 @@ async function buildOne(engine, idea, flags, outRoot, onPhase) {
1012
1065
  ...flags.themeId ? { themeId: flags.themeId } : {},
1013
1066
  ...flags.styleId ? { styleId: flags.styleId } : {},
1014
1067
  ...flags.colorScheme ? { colorScheme: flags.colorScheme } : {},
1068
+ ...appScope ? { appScope } : {},
1069
+ ...flags.mobile ? { platform: "mobile" } : {},
1070
+ ...flags.archetype ? { archetype: flags.archetype } : {},
1071
+ ...flags.styleVibe ? { styleVibe: flags.styleVibe } : {},
1015
1072
  lean: true
1016
1073
  },
1017
1074
  onPhase
@@ -1713,7 +1770,7 @@ function showPaywall(loggedIn, webUrl) {
1713
1770
  }
1714
1771
  row("");
1715
1772
  row(c.dim("Free: make \xB7 edit \xB7 preview (watermarked)"));
1716
- row(c.dim("Pro $29/mo: ship unlimited \u2014 own the code"));
1773
+ row(c.dim("Starter $49/mo \xB7 Pro $99/mo \u2014 ship & own apps"));
1717
1774
  row(c.cyan(`${webUrl.replace(/\/$/, "")}/pricing`));
1718
1775
  line(" " + c.cyan("\u2570" + "\u2500".repeat(w) + "\u256F"));
1719
1776
  line();
@@ -1824,6 +1881,13 @@ ${c.bold("Launch")} ${c.dim("(the studio's Launch HQ \u2014 go-to-market, in the
1824
1881
  wholestack business [buildId] one workspace + its readiness scorecard
1825
1882
  ${c.dim("add --json for machine-readable output")}
1826
1883
 
1884
+ ${c.bold("Operation Volition")} ${c.dim("(the autonomous operate-plane \u2014 a proof-gated crew RUNS the business)")}
1885
+ wholestack volition <name|projectId> [--live] hand a business to the crew (sandbox default)
1886
+ wholestack volition status [projectId] operator state + recent shifts
1887
+ wholestack volition actions [projectId] the action ledger (every move has a proof hash)
1888
+ wholestack volition run [projectId] run one crew cycle right now
1889
+ ${c.dim("sandbox simulates external actions; --live goes real ($99/mo add-on, gated server-side)")}
1890
+
1827
1891
  ${c.bold("Prove gate (web2)")} ${c.dim("(deterministic \xB7 fail-closed \xB7 blocking exit code)")}
1828
1892
  wholestack prove <dir> [--json] gate a checked-out repo (local lockstep mirror)
1829
1893
  wholestack prove --remote --github o/r [--ref b] hosted, HMAC-signed verdict via /api/v1/prove
@@ -2554,6 +2618,8 @@ async function main() {
2554
2618
  if (eyes !== null) exit(eyes);
2555
2619
  const ops = await runOpsSubcommand(rawArgs);
2556
2620
  if (ops !== null) exit(ops);
2621
+ const volition = await runVolitionSubcommand(rawArgs);
2622
+ if (volition !== null) exit(volition);
2557
2623
  const skillsSub = await runSkillsSubcommand(rawArgs);
2558
2624
  if (skillsSub !== null) exit(skillsSub);
2559
2625
  const args = parse(rawArgs);
package/dist/index.d.ts CHANGED
@@ -179,6 +179,12 @@ interface BuildResult {
179
179
  * polls {@link pollProofStatus} to flip to the real verdict.
180
180
  */
181
181
  proofPending?: boolean;
182
+ /**
183
+ * True when this was an UNHINGED build — ALL ShipGate proofs/gates were skipped. The verdict
184
+ * is emit+compile only (never proven); render it as "shipped UNVERIFIED", never a trust claim,
185
+ * and do NOT poll for a background re-prove (none is coming).
186
+ */
187
+ unverified?: boolean;
182
188
  themeId?: unknown;
183
189
  fileCount?: number;
184
190
  spec?: string | null;
@@ -362,11 +368,11 @@ declare function buildTools(ctx: ToolContext): {
362
368
  githubRepo?: string | undefined;
363
369
  gitUrl?: string | undefined;
364
370
  installationId?: number | undefined;
365
- source?: string | undefined;
366
371
  sources?: {
367
372
  name: string;
368
373
  source: string;
369
374
  }[] | undefined;
375
+ source?: string | undefined;
370
376
  maxContracts?: number | undefined;
371
377
  }, {
372
378
  ok: false;
@@ -386,12 +392,12 @@ declare function buildTools(ctx: ToolContext): {
386
392
  subject?: string | undefined;
387
393
  findings?: {
388
394
  title: string;
389
- severity: "critical" | "high" | "medium" | "low" | "info";
395
+ severity: "high" | "low" | "info" | "critical" | "medium";
390
396
  description?: string | undefined;
397
+ tool?: string | undefined;
391
398
  category?: string | undefined;
392
399
  location?: string | undefined;
393
400
  recommendation?: string | undefined;
394
- tool?: string | undefined;
395
401
  }[] | undefined;
396
402
  auditBundle?: any;
397
403
  walletGuard?: any;
@@ -476,10 +482,30 @@ declare function buildTools(ctx: ToolContext): {
476
482
  scope: "full" | "static" | "component" | "page";
477
483
  buildModel: "zeta-g1" | "zeta-g1-max";
478
484
  keep: boolean;
485
+ unhinged: boolean;
479
486
  themeId?: "slate-minimal" | "clean-inter" | "friendly-nunito" | "geometric-jakarta" | "techno-mono" | undefined;
480
487
  styleId?: string | undefined;
481
488
  colorScheme?: "dark" | "light" | undefined;
482
- }, BuildResult | {
489
+ platform?: "web" | "mobile" | undefined;
490
+ archetype?: "analytics" | "document-editor" | "collaboration" | "kanban" | "calendar" | "marketplace" | "studio" | undefined;
491
+ styleVibe?: "cinematic-dark" | "editorial-luxe" | "warm-minimal" | "bold-brutalist" | "glass-futuristic" | "vibrant-playful" | "corporate-clean" | undefined;
492
+ }, BuildResult | ({
493
+ verdict: string;
494
+ proofPending: boolean;
495
+ ok: boolean;
496
+ error?: string;
497
+ buildId?: unknown;
498
+ unverified?: boolean;
499
+ themeId?: unknown;
500
+ fileCount?: number;
501
+ spec?: string | null;
502
+ verifyErrors?: string[];
503
+ fileList?: (string | null | undefined)[];
504
+ paywalled?: boolean;
505
+ upgradeUrl?: string;
506
+ } & {
507
+ passportUrl: string;
508
+ }) | {
483
509
  ok: boolean;
484
510
  liveUrl: string | undefined;
485
511
  buildId: string | undefined;
@@ -498,6 +524,30 @@ declare function buildTools(ctx: ToolContext): {
498
524
  buildId?: unknown;
499
525
  verdict?: "SHIP" | "NO_SHIP";
500
526
  proofPending?: boolean;
527
+ unverified?: boolean;
528
+ themeId?: unknown;
529
+ fileCount?: number;
530
+ spec?: string | null;
531
+ verifyErrors?: string[];
532
+ fileList?: (string | null | undefined)[];
533
+ paywalled?: boolean;
534
+ upgradeUrl?: string;
535
+ liveUrl?: undefined;
536
+ files?: undefined;
537
+ loc?: undefined;
538
+ trust?: undefined;
539
+ note?: undefined;
540
+ } | {
541
+ delivered: DeliverResult;
542
+ dir: string;
543
+ installed: boolean;
544
+ nextStep: string;
545
+ verdict: string;
546
+ proofPending: boolean;
547
+ ok: boolean;
548
+ error?: string;
549
+ buildId?: unknown;
550
+ unverified?: boolean;
501
551
  themeId?: unknown;
502
552
  fileCount?: number;
503
553
  spec?: string | null;
@@ -520,6 +570,7 @@ declare function buildTools(ctx: ToolContext): {
520
570
  ok: boolean;
521
571
  error?: string;
522
572
  buildId?: unknown;
573
+ unverified?: boolean;
523
574
  themeId?: unknown;
524
575
  fileCount?: number;
525
576
  spec?: string | null;
@@ -527,6 +578,7 @@ declare function buildTools(ctx: ToolContext): {
527
578
  fileList?: (string | null | undefined)[];
528
579
  paywalled?: boolean;
529
580
  upgradeUrl?: string;
581
+ passportUrl: string;
530
582
  liveUrl?: undefined;
531
583
  files?: undefined;
532
584
  loc?: undefined;
@@ -540,6 +592,7 @@ declare function buildTools(ctx: ToolContext): {
540
592
  buildId?: unknown;
541
593
  verdict?: "SHIP" | "NO_SHIP";
542
594
  proofPending?: boolean;
595
+ unverified?: boolean;
543
596
  themeId?: unknown;
544
597
  fileCount?: number;
545
598
  spec?: string | null;
@@ -560,6 +613,7 @@ declare function buildTools(ctx: ToolContext): {
560
613
  ok: boolean;
561
614
  error?: string;
562
615
  buildId?: unknown;
616
+ unverified?: boolean;
563
617
  themeId?: unknown;
564
618
  fileCount?: number;
565
619
  spec?: string | null;
@@ -567,17 +621,40 @@ declare function buildTools(ctx: ToolContext): {
567
621
  fileList?: (string | null | undefined)[];
568
622
  paywalled?: boolean;
569
623
  upgradeUrl?: string;
624
+ passportUrl: string;
570
625
  liveUrl?: undefined;
571
626
  files?: undefined;
572
627
  loc?: undefined;
573
628
  trust?: undefined;
574
629
  note?: undefined;
575
630
  } | {
631
+ delivered: DeliverResult;
632
+ dir: string;
576
633
  verdict: string;
577
634
  proofPending: boolean;
578
635
  ok: boolean;
579
636
  error?: string;
580
637
  buildId?: unknown;
638
+ unverified?: boolean;
639
+ themeId?: unknown;
640
+ fileCount?: number;
641
+ spec?: string | null;
642
+ verifyErrors?: string[];
643
+ fileList?: (string | null | undefined)[];
644
+ paywalled?: boolean;
645
+ upgradeUrl?: string;
646
+ liveUrl?: undefined;
647
+ files?: undefined;
648
+ loc?: undefined;
649
+ trust?: undefined;
650
+ note?: undefined;
651
+ } | {
652
+ verdict: string;
653
+ proofPending: boolean;
654
+ ok: boolean;
655
+ error?: string;
656
+ buildId?: unknown;
657
+ unverified?: boolean;
581
658
  themeId?: unknown;
582
659
  fileCount?: number;
583
660
  spec?: string | null;
@@ -617,6 +694,97 @@ declare function buildTools(ctx: ToolContext): {
617
694
  note: string;
618
695
  error?: undefined;
619
696
  }>;
697
+ launch_volition: ai.Tool<{
698
+ description?: string | undefined;
699
+ live?: boolean | undefined;
700
+ target?: string | undefined;
701
+ }, {
702
+ ok: boolean;
703
+ error: string;
704
+ } | {
705
+ activated?: boolean;
706
+ enabled?: boolean;
707
+ live?: boolean;
708
+ sandbox?: boolean;
709
+ firstRun?: {
710
+ runId: string;
711
+ summary?: string | null;
712
+ } | null;
713
+ error: string;
714
+ reason?: string;
715
+ checkoutPath?: string;
716
+ priceUsdCents?: number;
717
+ readiness?: {
718
+ inferenceReady?: boolean;
719
+ inferenceSource?: string | null;
720
+ };
721
+ signInUrl?: string;
722
+ ok: boolean;
723
+ status: number | undefined;
724
+ } | {
725
+ activated?: boolean;
726
+ enabled?: boolean;
727
+ live?: boolean;
728
+ sandbox?: boolean;
729
+ firstRun?: {
730
+ runId: string;
731
+ summary?: string | null;
732
+ } | null;
733
+ error?: string;
734
+ reason?: string;
735
+ checkoutPath?: string;
736
+ priceUsdCents?: number;
737
+ readiness?: {
738
+ inferenceReady?: boolean;
739
+ inferenceSource?: string | null;
740
+ };
741
+ signInUrl?: string;
742
+ ok: boolean;
743
+ projectId: string | undefined;
744
+ consoleUrl: string | undefined;
745
+ }>;
746
+ volition_status: ai.Tool<{
747
+ target?: string | undefined;
748
+ }, {
749
+ ok: boolean;
750
+ error: string;
751
+ status?: undefined;
752
+ } | {
753
+ ok: boolean;
754
+ error: string;
755
+ status: number | undefined;
756
+ } | {
757
+ operator?: {
758
+ enabled?: boolean;
759
+ sandbox?: boolean;
760
+ [k: string]: unknown;
761
+ };
762
+ agents?: Array<{
763
+ id: string;
764
+ name?: string;
765
+ }>;
766
+ billing?: {
767
+ entitled?: boolean;
768
+ inferenceReady?: boolean;
769
+ priceUsdCents?: number;
770
+ };
771
+ recentRuns?: Array<{
772
+ runId?: string;
773
+ status?: string;
774
+ trigger?: string;
775
+ summary?: string | null;
776
+ createdAt?: string;
777
+ }>;
778
+ actionCounts?: Record<string, number>;
779
+ metabolism?: {
780
+ factCount?: number;
781
+ topTopics?: string[];
782
+ };
783
+ error?: string;
784
+ ok: boolean;
785
+ projectId: string;
786
+ status?: undefined;
787
+ }>;
620
788
  promote_app: ai.Tool<{
621
789
  domain?: string | undefined;
622
790
  buildId?: string | undefined;
@@ -649,13 +817,13 @@ declare function buildTools(ctx: ToolContext): {
649
817
  sections: {
650
818
  id: string;
651
819
  title: string;
652
- lane: string;
653
- render: string;
654
- summary: string;
655
820
  items: {
656
821
  label: string;
657
822
  detail?: string | undefined;
658
823
  }[];
824
+ summary: string;
825
+ lane: string;
826
+ render: string;
659
827
  }[];
660
828
  };
661
829
  answers: {
@@ -782,8 +950,8 @@ declare function buildTools(ctx: ToolContext): {
782
950
  error?: undefined;
783
951
  }>;
784
952
  send_launch_email: ai.Tool<{
785
- subject: string;
786
953
  body: string;
954
+ subject: string;
787
955
  brandName?: string | undefined;
788
956
  to?: string | undefined;
789
957
  when?: string | undefined;
@@ -799,7 +967,6 @@ declare function buildTools(ctx: ToolContext): {
799
967
  network: "meta" | "google" | "linkedin" | "tiktok" | "reddit";
800
968
  objective: string;
801
969
  adSet: {
802
- budgetDaily: number;
803
970
  audience: {
804
971
  locations?: string[] | undefined;
805
972
  ageMin?: number | undefined;
@@ -810,6 +977,7 @@ declare function buildTools(ctx: ToolContext): {
810
977
  } & {
811
978
  [k: string]: unknown;
812
979
  };
980
+ budgetDaily: number;
813
981
  optimizationGoal?: string | undefined;
814
982
  };
815
983
  name?: string | undefined;
@@ -851,13 +1019,13 @@ declare function buildTools(ctx: ToolContext): {
851
1019
  section: {
852
1020
  id: string;
853
1021
  title: string;
854
- lane: string;
855
- render: string;
856
- summary: string;
857
1022
  items: {
858
1023
  label: string;
859
1024
  detail?: string | undefined;
860
1025
  }[];
1026
+ summary: string;
1027
+ lane: string;
1028
+ render: string;
861
1029
  };
862
1030
  instruction: string;
863
1031
  brief?: string | undefined;
@@ -956,8 +1124,8 @@ declare function buildTools(ctx: ToolContext): {
956
1124
  }>;
957
1125
  read_file: ai.Tool<{
958
1126
  path: string;
959
- offset?: number | undefined;
960
1127
  limit?: number | undefined;
1128
+ offset?: number | undefined;
961
1129
  }, {
962
1130
  ok: boolean;
963
1131
  path: string;
package/dist/index.js CHANGED
@@ -49,7 +49,7 @@ import {
49
49
  resolveModelKey,
50
50
  severityRank,
51
51
  supportsThinking
52
- } from "./chunk-UBDW5N5G.js";
52
+ } from "./chunk-NHABZZTE.js";
53
53
 
54
54
  // src/prompts/template.ts
55
55
  var PLACEHOLDER = /\{\{([A-Za-z0-9_.]+)\}\}/g;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wholestack",
3
- "version": "0.6.2",
3
+ "version": "0.7.0",
4
4
  "description": "Wholestack — a pro-grade conversational terminal agent for the Wholestack codegen engine. Talk to it in plain language: it writes ISL, generates full-stack or Solidity apps, and proves them with ShipGate. Browser login, membership-gated builds, slash commands, sessions, plan mode, diffs, MCP, plugins.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -13,8 +13,8 @@
13
13
  }
14
14
  },
15
15
  "bin": {
16
- "wholestack": "./dist/cli.js",
17
- "zeta": "./dist/cli.js"
16
+ "wholestack": "dist/cli.js",
17
+ "zeta": "dist/cli.js"
18
18
  },
19
19
  "keywords": [
20
20
  "ai",