orbital-command 1.0.1 → 1.1.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 (62) hide show
  1. package/README.md +1 -1
  2. package/bin/commands/launch.js +0 -1
  3. package/bin/lib/helpers.js +1 -31
  4. package/bin/orbital.js +34 -32
  5. package/dist/assets/Landing-B6q9U0Vd.js +11 -0
  6. package/dist/assets/{PrimitivesConfig-DThSipFy.js → PrimitivesConfig-TlFvypvg.js} +9 -14
  7. package/dist/assets/{QualityGates-B4kxM5UU.js → QualityGates-D8uvclW4.js} +1 -1
  8. package/dist/assets/SessionTimeline-QUaJw6Aa.js +1 -0
  9. package/dist/assets/Settings-CAEnAZAk.js +12 -0
  10. package/dist/assets/{SourceControl-BMNIz7Lt.js → SourceControl-DPeSBaMV.js} +7 -12
  11. package/dist/assets/{WorkflowVisualizer-CxuSBOYu.js → WorkflowVisualizer-DHrIjx6W.js} +1 -1
  12. package/dist/assets/{arrow-down-DVPp6_qp.js → arrow-down-DnfKgF33.js} +1 -1
  13. package/dist/assets/{bot-NFaJBDn_.js → bot-DUPnHZfM.js} +1 -1
  14. package/dist/assets/{circle-x-IsFCkBZu.js → circle-x-B4nA79je.js} +1 -1
  15. package/dist/assets/{file-text-J1cebZXF.js → file-text-PnzRO4pO.js} +1 -1
  16. package/dist/assets/{globe-WzeyHsUc.js → globe-CIX_GBr0.js} +1 -1
  17. package/dist/assets/index-B-B-tTjw.css +1 -0
  18. package/dist/assets/index-DQVAzHMu.js +354 -0
  19. package/dist/assets/{key-CKR8JJSj.js → key-DpAZM-3d.js} +1 -1
  20. package/dist/assets/{minus-CHBsJyjp.js → minus-CJlpKNUB.js} +1 -1
  21. package/dist/assets/{radio-xqZaR-Uk.js → radio-DhynLcSx.js} +1 -1
  22. package/dist/assets/{rocket-D_xvvNG6.js → rocket-DnuQh3sF.js} +1 -1
  23. package/dist/assets/{shield-TdB1yv_a.js → shield-DLMQmvFQ.js} +1 -1
  24. package/dist/assets/{ui-BmsSg9jU.js → ui-QhrRH5wk.js} +6 -6
  25. package/dist/assets/{useSocketListener-0L5yiN5i.js → useSocketListener-DPrExNDV.js} +1 -1
  26. package/dist/assets/{useWorkflowEditor-CqeRWVQX.js → useWorkflowEditor-BxN7phfr.js} +2 -2
  27. package/dist/assets/{workflow-constants-Rw-GmgHZ.js → workflow-constants-ZcCN11vm.js} +1 -1
  28. package/dist/assets/{zap-C9wqYMpl.js → zap-eJ3z8HRI.js} +1 -1
  29. package/dist/index.html +3 -3
  30. package/dist/server/server/index.js +9 -10
  31. package/dist/server/server/launch.js +0 -3
  32. package/dist/server/server/routes/sync-routes.js +175 -0
  33. package/dist/server/server/services/telemetry-service.js +143 -0
  34. package/dist/server/server/wizard/detect.js +0 -79
  35. package/dist/server/server/wizard/index.js +43 -113
  36. package/dist/server/server/wizard/phases/setup-wizard.js +4 -34
  37. package/dist/server/server/wizard/types.js +3 -25
  38. package/dist/server/shared/workflow-presets.js +22 -0
  39. package/package.json +1 -1
  40. package/server/index.ts +7 -14
  41. package/server/launch.ts +0 -3
  42. package/server/routes/sync-routes.ts +205 -0
  43. package/server/wizard/detect.ts +1 -81
  44. package/server/wizard/index.ts +45 -146
  45. package/server/wizard/phases/setup-wizard.ts +7 -38
  46. package/server/wizard/types.ts +4 -45
  47. package/shared/workflow-presets.ts +28 -0
  48. package/templates/hooks/block-push.sh +16 -2
  49. package/templates/hooks/git-commit-guard.sh +3 -2
  50. package/dist/assets/Landing-CfQdHR0N.js +0 -11
  51. package/dist/assets/SessionTimeline-Bz1iZnmg.js +0 -1
  52. package/dist/assets/Settings-DLcZwbCT.js +0 -12
  53. package/dist/assets/index-BdJ57EhC.css +0 -1
  54. package/dist/assets/index-o4ScMAuR.js +0 -349
  55. package/dist/server/server/wizard/phases/confirm.js +0 -39
  56. package/dist/server/server/wizard/phases/project-setup.js +0 -90
  57. package/dist/server/server/wizard/phases/welcome.js +0 -32
  58. package/dist/server/server/wizard/phases/workflow-setup.js +0 -22
  59. package/server/wizard/phases/confirm.ts +0 -45
  60. package/server/wizard/phases/project-setup.ts +0 -106
  61. package/server/wizard/phases/welcome.ts +0 -39
  62. package/server/wizard/phases/workflow-setup.ts +0 -28
package/README.md CHANGED
@@ -32,7 +32,7 @@ Think of it as the control tower that turns a collection of AI-assisted coding s
32
32
  ## Quick Start
33
33
 
34
34
  ```bash
35
- npm install orbital-command
35
+ npm install -g orbital-command
36
36
  cd my-project
37
37
  orbital
38
38
  ```
@@ -38,7 +38,6 @@ export function cmdLaunchOrDev(forceViteFlag) {
38
38
  const env = {
39
39
  ...process.env,
40
40
  ORBITAL_LAUNCH_MODE: 'central',
41
- ORBITAL_AUTO_REGISTER: projectRoot,
42
41
  ORBITAL_SERVER_PORT: String(serverPort),
43
42
  };
44
43
 
@@ -39,15 +39,6 @@ export function resolveBin(name) {
39
39
  return null;
40
40
  }
41
41
 
42
- export function isGitRepo() {
43
- try {
44
- execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8', stdio: 'pipe' });
45
- return true;
46
- } catch {
47
- return false;
48
- }
49
- }
50
-
51
42
  export function detectProjectRoot() {
52
43
  try {
53
44
  return execFileSync('git', ['rev-parse', '--show-toplevel'], { encoding: 'utf8', stdio: 'pipe' }).trim();
@@ -56,13 +47,6 @@ export function detectProjectRoot() {
56
47
  }
57
48
  }
58
49
 
59
- export function requireGitRepo() {
60
- if (!isGitRepo()) {
61
- console.error('Not a git repository. Run `orbital` from inside a project directory.');
62
- process.exit(1);
63
- }
64
- }
65
-
66
50
  export function loadConfig(projectRoot) {
67
51
  const configPath = path.join(projectRoot, '.claude', 'orbital.config.json');
68
52
  if (fs.existsSync(configPath)) {
@@ -84,21 +68,6 @@ export function getPackageVersion() {
84
68
  }
85
69
  }
86
70
 
87
- export function stampTemplateVersion(projectRoot) {
88
- const configPath = path.join(projectRoot, '.claude', 'orbital.config.json');
89
- if (!fs.existsSync(configPath)) return;
90
-
91
- try {
92
- const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
93
- const version = getPackageVersion();
94
- if (config.templateVersion !== version) {
95
- config.templateVersion = version;
96
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
97
- console.log(` Stamped templateVersion: ${version}`);
98
- }
99
- } catch { /* ignore malformed config */ }
100
- }
101
-
102
71
  export function openBrowser(url) {
103
72
  const platform = process.platform;
104
73
  if (platform === 'darwin') {
@@ -188,6 +157,7 @@ Usage:
188
157
  orbital <command> Run a specific command directly
189
158
 
190
159
  Commands:
160
+ launch Launch the dashboard directly
191
161
  config Modify project settings interactively
192
162
  doctor Health check and version diagnostics
193
163
  update Sync templates and apply migrations
package/bin/orbital.js CHANGED
@@ -10,7 +10,6 @@ import {
10
10
  loadSharedModule,
11
11
  loadWizardModule,
12
12
  orbitalSetupDone,
13
- stampTemplateVersion,
14
13
  printHelp,
15
14
  } from './lib/helpers.js';
16
15
 
@@ -34,9 +33,10 @@ async function runHubFlow() {
34
33
  const wiz = await loadWizardModule();
35
34
  const hubVersion = getPackageVersion();
36
35
 
37
- // First-time global setup — no menu, just run the wizard
36
+ // First-time global setup — run wizard then launch dashboard
38
37
  if (!orbitalSetupDone()) {
39
38
  await wiz.runSetupWizard(hubVersion);
39
+ cmdLaunchOrDev(false);
40
40
  return;
41
41
  }
42
42
 
@@ -45,23 +45,22 @@ async function runHubFlow() {
45
45
  path.join(hubRoot, '.claude', 'orbital.config.json')
46
46
  );
47
47
  const hubRegistry = loadRegistry();
48
- const projectNames = (hubRegistry.projects || []).map(p => p.name);
49
48
 
50
- // Not initialized and no registered projects just run setup wizard
51
- if (!isInitialized && projectNames.length === 0) {
52
- await wiz.runProjectSetup(hubRoot, hubVersion, []);
53
- stampTemplateVersion(hubRoot);
49
+ // Not an initialized projectlaunch dashboard directly.
50
+ // The frontend Add Project modal handles project setup.
51
+ if (!isInitialized) {
52
+ cmdLaunchOrDev(false);
54
53
  return;
55
54
  }
56
55
 
57
- // Show hub menu (initialized OR has registered projects)
56
+ // Show hub menu for initialized projects
57
+ const projectNames = (hubRegistry.projects || []).map(p => p.name);
58
58
  const projects = (hubRegistry.projects || [])
59
59
  .filter(p => p.enabled !== false)
60
60
  .map(p => ({ name: p.name, path: p.path }));
61
61
 
62
62
  const hubResult = await wiz.runHub({
63
63
  packageVersion: hubVersion,
64
- isProjectInitialized: isInitialized,
65
64
  projectNames,
66
65
  itermPromptShown: hubRegistry.itermPromptShown === true,
67
66
  isMac: process.platform === 'darwin',
@@ -85,26 +84,29 @@ async function runHubFlow() {
85
84
  writeRegistryAtomic(hubRegistry);
86
85
  }
87
86
 
88
- // Route the chosen action
89
- switch (hubResult.action) {
90
- case 'launch': cmdLaunchOrDev(false); break;
91
- case 'init':
92
- await wiz.runProjectSetup(hubRoot, hubVersion, []);
93
- stampTemplateVersion(hubRoot);
94
- break;
95
- case 'config': await cmdConfig([]); break;
96
- case 'doctor': await cmdDoctor(); break;
97
- case 'update': await cmdUpdate([]); break;
98
- case 'status': await cmdStatus(); break;
99
- case 'reset': {
100
- const { runInit } = await loadSharedModule();
101
- runInit(hubRoot, { force: true });
102
- stampTemplateVersion(hubRoot);
103
- break;
87
+ // Route the chosen action, then loop back to menu
88
+ let action = hubResult.action;
89
+
90
+ while (true) {
91
+ switch (action) {
92
+ case 'launch': cmdLaunchOrDev(false); return;
93
+ case 'config': await cmdConfig([]); break;
94
+ case 'doctor': await cmdDoctor(); break;
95
+ case 'update': await cmdUpdate([]); break;
96
+ case 'status': await cmdStatus(); break;
97
+ case 'reset': {
98
+ const { runInit } = await loadSharedModule();
99
+ runInit(hubRoot, { force: true });
100
+ break;
101
+ }
102
+ default:
103
+ console.error(`Unknown action: ${action}`);
104
+ process.exit(1);
104
105
  }
105
- default:
106
- console.error(`Unknown action: ${hubResult.action}`);
107
- process.exit(1);
106
+
107
+ // Show menu again after completing an action
108
+ console.log('');
109
+ action = await wiz.promptHubAction(projectNames);
108
110
  }
109
111
  }
110
112
 
@@ -116,14 +118,14 @@ const [command, ...args] = process.argv.slice(2);
116
118
 
117
119
  async function main() {
118
120
  switch (command) {
119
- // Deprecated commands — silently redirect to hub
120
- case 'init':
121
- case 'setup':
122
- case 'launch':
123
121
  case undefined:
124
122
  await runHubFlow();
125
123
  break;
126
124
 
125
+ case 'launch':
126
+ cmdLaunchOrDev(false);
127
+ break;
128
+
127
129
  // Active commands
128
130
  case 'config':
129
131
  await cmdConfig(args);
@@ -0,0 +1,11 @@
1
+ import{j as e}from"./ui-QhrRH5wk.js";import{a as c}from"./vendor-Bqt8AJn2.js";import{c as ee,aV as j,aW as W,aX as te,aY as Ne,aZ as we,a_ as ne,a$ as ke,b0 as Se,b1 as se,b2 as Ee,b3 as ze,b4 as O,b5 as V,b6 as Le,b7 as N,b8 as ie,b9 as G,ba as Ce,bb as I,bc as u,G as R,bd as Ie,f as ae,K as re,C as Y,be as le,S as oe,aT as ce,V as Te,L as de,E as Ae}from"./index-DQVAzHMu.js";import{Z as ue}from"./zap-eJ3z8HRI.js";import{B as me}from"./bot-DUPnHZfM.js";import{R as H}from"./rocket-DnuQh3sF.js";import{R as he}from"./radio-DhynLcSx.js";import"./charts-LGLb8hyU.js";/**
2
+ * @license lucide-react v0.577.0 - ISC
3
+ *
4
+ * This source code is licensed under the ISC license.
5
+ * See the LICENSE file in the root directory of this source tree.
6
+ */const Me=[["path",{d:"M15 6v12a3 3 0 1 0 3-3H6a3 3 0 1 0 3 3V6a3 3 0 1 0-3 3h12a3 3 0 1 0-3-3",key:"11bfej"}]],fe=ee("command",Me);/**
7
+ * @license lucide-react v0.577.0 - ISC
8
+ *
9
+ * This source code is licensed under the ISC license.
10
+ * See the LICENSE file in the root directory of this source tree.
11
+ */const Re=[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]],ge=ee("cpu",Re);function xe(t,n){let a;const s=()=>{const{currentTime:i}=n,l=(i===null?0:i.value)/100;a!==l&&t(l),a=l};return j.update(s,!0),()=>W(s)}const z=new WeakMap;let p;function Fe(t,n){if(n){const{inlineSize:a,blockSize:s}=n[0];return{width:a,height:s}}else return t instanceof SVGElement&&"getBBox"in t?t.getBBox():{width:t.offsetWidth,height:t.offsetHeight}}function We({target:t,contentRect:n,borderBoxSize:a}){var s;(s=z.get(t))===null||s===void 0||s.forEach(i=>{i({target:t,contentSize:n,get size(){return Fe(t,a)}})})}function Oe(t){t.forEach(We)}function Ve(){typeof ResizeObserver>"u"||(p=new ResizeObserver(Oe))}function He(t,n){p||Ve();const a=te(t);return a.forEach(s=>{let i=z.get(s);i||(i=new Set,z.set(s,i)),i.add(n),p==null||p.observe(s)}),()=>{a.forEach(s=>{const i=z.get(s);i==null||i.delete(n),i!=null&&i.size||p==null||p.unobserve(s)})}}const L=new Set;let w;function Be(){w=()=>{const t={width:window.innerWidth,height:window.innerHeight},n={target:window,size:t,contentSize:t};L.forEach(a=>a(n))},window.addEventListener("resize",w)}function Pe(t){return L.add(t),w||Be(),()=>{L.delete(t),!L.size&&w&&(w=void 0)}}function De(t,n){return typeof t=="function"?Pe(t):He(t,n)}const _e=50,$=()=>({current:0,offset:[],progress:0,scrollLength:0,targetOffset:0,targetLength:0,containerLength:0,velocity:0}),Ge=()=>({time:0,x:$(),y:$()}),Ye={x:{length:"Width",position:"Left"},y:{length:"Height",position:"Top"}};function q(t,n,a,s){const i=a[n],{length:r,position:l}=Ye[n],o=i.current,m=a.time;i.current=t[`scroll${l}`],i.scrollLength=t[`scroll${r}`]-t[`client${r}`],i.offset.length=0,i.offset[0]=0,i.offset[1]=i.scrollLength,i.progress=Ne(0,i.scrollLength,i.current);const d=s-m;i.velocity=d>_e?0:we(i.current-o,d)}function $e(t,n,a){q(t,"x",n,a),q(t,"y",n,a),n.time=a}function qe(t,n){const a={x:0,y:0};let s=t;for(;s&&s!==n;)if(s instanceof HTMLElement)a.x+=s.offsetLeft,a.y+=s.offsetTop,s=s.offsetParent;else if(s.tagName==="svg"){const i=s.getBoundingClientRect();s=s.parentElement;const r=s.getBoundingClientRect();a.x+=i.left-r.left,a.y+=i.top-r.top}else if(s instanceof SVGGraphicsElement){const{x:i,y:r}=s.getBBox();a.x+=i,a.y+=r;let l=null,o=s.parentNode;for(;!l;)o.tagName==="svg"&&(l=o),o=s.parentNode;s=l}else break;return a}const F={start:0,center:.5,end:1};function X(t,n,a=0){let s=0;if(t in F&&(t=F[t]),typeof t=="string"){const i=parseFloat(t);t.endsWith("px")?s=i:t.endsWith("%")?t=i/100:t.endsWith("vw")?s=i/100*document.documentElement.clientWidth:t.endsWith("vh")?s=i/100*document.documentElement.clientHeight:t=i}return typeof t=="number"&&(s=n*t),a+s}const Xe=[0,0];function Ze(t,n,a,s){let i=Array.isArray(t)?t:Xe,r=0,l=0;return typeof t=="number"?i=[t,t]:typeof t=="string"&&(t=t.trim(),t.includes(" ")?i=t.split(" "):i=[t,F[t]?t:"0"]),r=X(i[0],a,s),l=X(i[1],n),r-l}const Ke={All:[[0,0],[1,1]]},Ue={x:0,y:0};function Je(t){return"getBBox"in t&&t.tagName!=="svg"?t.getBBox():{width:t.clientWidth,height:t.clientHeight}}function Qe(t,n,a){const{offset:s=Ke.All}=a,{target:i=t,axis:r="y"}=a,l=r==="y"?"height":"width",o=i!==t?qe(i,t):Ue,m=i===t?{width:t.scrollWidth,height:t.scrollHeight}:Je(i),d={width:t.clientWidth,height:t.clientHeight};n[r].offset.length=0;let h=!n[r].interpolate;const x=s.length;for(let f=0;f<x;f++){const _=Ze(s[f],d[l],m[l],o[r]);!h&&_!==n[r].interpolatorOffsets[f]&&(h=!0),n[r].offset[f]=_}h&&(n[r].interpolate=ne(n[r].offset,ke(s),{clamp:!1}),n[r].interpolatorOffsets=[...n[r].offset]),n[r].progress=Se(0,1,n[r].interpolate(n[r].current))}function et(t,n=t,a){if(a.x.targetOffset=0,a.y.targetOffset=0,n!==t){let s=n;for(;s&&s!==t;)a.x.targetOffset+=s.offsetLeft,a.y.targetOffset+=s.offsetTop,s=s.offsetParent}a.x.targetLength=n===t?n.scrollWidth:n.clientWidth,a.y.targetLength=n===t?n.scrollHeight:n.clientHeight,a.x.containerLength=t.clientWidth,a.y.containerLength=t.clientHeight}function tt(t,n,a,s={}){return{measure:()=>et(t,s.target,a),update:i=>{$e(t,a,i),(s.offset||s.target)&&Qe(t,a,s)},notify:()=>n(a)}}const v=new WeakMap,Z=new WeakMap,T=new WeakMap,K=t=>t===document.documentElement?window:t;function B(t,{container:n=document.documentElement,...a}={}){let s=T.get(n);s||(s=new Set,T.set(n,s));const i=Ge(),r=tt(n,t,i,a);if(s.add(r),!v.has(n)){const o=()=>{for(const f of s)f.measure()},m=()=>{for(const f of s)f.update(se.timestamp)},d=()=>{for(const f of s)f.notify()},h=()=>{j.read(o,!1,!0),j.read(m,!1,!0),j.update(d,!1,!0)};v.set(n,h);const x=K(n);window.addEventListener("resize",h,{passive:!0}),n!==document.documentElement&&Z.set(n,De(n,h)),x.addEventListener("scroll",h,{passive:!0})}const l=v.get(n);return j.read(l,!1,!0),()=>{var o;W(l);const m=T.get(n);if(!m||(m.delete(r),m.size))return;const d=v.get(n);v.delete(n),d&&(K(n).removeEventListener("scroll",d),(o=Z.get(n))===null||o===void 0||o(),window.removeEventListener("resize",d))}}function nt({source:t,container:n,axis:a="y"}){t&&(n=t);const s={value:0},i=B(r=>{s.value=r[a].progress*100},{container:n,axis:a});return{currentTime:s,cancel:i}}const A=new Map;function pe({source:t,container:n=document.documentElement,axis:a="y"}={}){t&&(n=t),A.has(n)||A.set(n,{});const s=A.get(n);return s[a]||(s[a]=ze()?new ScrollTimeline({source:n,axis:a}):nt({source:n,axis:a})),s[a]}function st(t){return t.length===2}function je(t){return t&&(t.target||t.offset)}function it(t,n){return st(t)||je(n)?B(a=>{t(a[n.axis].progress,a)},n):xe(t,pe(n))}function at(t,n){if(t.flatten(),je(n))return t.pause(),B(a=>{t.time=t.duration*a[n.axis].progress},n);{const a=pe(n);return t.attachTimeline?t.attachTimeline(a,s=>(s.pause(),xe(i=>{s.time=s.duration*i},a))):Ee}}function rt(t,{axis:n="y",...a}={}){const s={axis:n,...a};return typeof t=="function"?it(t,s):at(t,s)}function U(t,n){Le(!!(!n||n.current))}const lt=()=>({scrollX:N(0),scrollY:N(0),scrollXProgress:N(0),scrollYProgress:N(0)});function P({container:t,target:n,layoutEffect:a=!0,...s}={}){const i=O(lt);return(a?V:c.useEffect)(()=>(U("target",n),U("container",t),rt((l,{x:o,y:m})=>{i.scrollX.set(o.current),i.scrollXProgress.set(o.progress),i.scrollY.set(m.current),i.scrollYProgress.set(m.progress)},{...s,container:(t==null?void 0:t.current)||void 0,target:(n==null?void 0:n.current)||void 0})),[t,n,JSON.stringify(s.offset)]),i}function ye(t){const n=O(()=>N(t)),{isStatic:a}=c.useContext(ie);if(a){const[,s]=c.useState(t);c.useEffect(()=>n.on("change",s),[])}return n}function be(t,n){const a=ye(n()),s=()=>a.set(n());return s(),V(()=>{const i=()=>j.preRender(s,!1,!0),r=t.map(l=>l.on("change",i));return()=>{r.forEach(l=>l()),W(s)}}),a}function J(t){return typeof t=="number"?t:parseFloat(t)}function ot(t,n={}){const{isStatic:a}=c.useContext(ie),s=c.useRef(null),i=ye(G(t)?J(t.get()):t),r=c.useRef(i.get()),l=c.useRef(()=>{}),o=()=>{const d=s.current;d&&d.time===0&&d.sample(se.delta),m(),s.current=Ce({keyframes:[i.get(),r.current],velocity:i.getVelocity(),type:"spring",restDelta:.001,restSpeed:.01,...n,onUpdate:l.current})},m=()=>{s.current&&s.current.stop()};return c.useInsertionEffect(()=>i.attach((d,h)=>a?h(d):(r.current=d,l.current=h,j.update(o),i.get()),m),[JSON.stringify(n)]),V(()=>{if(G(t))return t.on("change",d=>i.set(J(d)))},[i]),i}const ct=t=>t&&typeof t=="object"&&t.mix,dt=t=>ct(t)?t.mix:void 0;function ut(...t){const n=!Array.isArray(t[0]),a=n?0:-1,s=t[0+a],i=t[1+a],r=t[2+a],l=t[3+a],o=ne(i,r,{mixer:dt(r[0]),...l});return n?o(s):o}function mt(t){I.current=[],t();const n=be(I.current,t);return I.current=void 0,n}function C(t,n,a,s){if(typeof t=="function")return mt(t);const i=typeof n=="function"?n:ut(n,a,s);return Array.isArray(t)?Q(t,i):Q([t],([r])=>i(r))}function Q(t,n){const a=O(()=>[]);return be(t,()=>{a.length=0;const s=t.length;for(let i=0;i<s;i++)a[i]=t[i].get();return n(a)})}const ht={some:0,all:1};function ft(t,n,{root:a,margin:s,amount:i="some"}={}){const r=te(t),l=new WeakMap,o=d=>{d.forEach(h=>{const x=l.get(h.target);if(h.isIntersecting!==!!x)if(h.isIntersecting){const f=n(h);typeof f=="function"?l.set(h.target,f):m.unobserve(h.target)}else typeof x=="function"&&(x(h),l.delete(h.target))})},m=new IntersectionObserver(o,{root:a,rootMargin:s,threshold:typeof i=="number"?i:ht[i]});return r.forEach(d=>m.observe(d)),()=>m.disconnect()}function ve(t,{root:n,margin:a,amount:s,once:i=!1}={}){const[r,l]=c.useState(!1);return c.useEffect(()=>{if(!t.current||i&&r)return;const o=()=>(l(!0),i?void 0:()=>l(!1)),m={root:n&&n.current||void 0,margin:a,amount:s};return ft(t.current,o,m)},[n,t,a,i,s]),r}const y=[.25,.46,.45,.94];function D(t,n=1500){const a=ve(t,{once:!0,amount:"some"}),[s,i]=c.useState(!1);return c.useEffect(()=>{const r=setTimeout(()=>i(!0),n);return()=>clearTimeout(r)},[n]),a||s}function g({children:t,delay:n=0,className:a=""}){const s=c.useRef(null),i=D(s);return e.jsx(u.div,{ref:s,initial:{opacity:0,y:48},animate:i?{opacity:1,y:0}:{},transition:{duration:.8,delay:n,ease:y},className:a,children:t})}function gt({children:t,delay:n=0,className:a=""}){const s=c.useRef(null),i=D(s);return e.jsx(u.div,{ref:s,initial:{opacity:0,scale:.85},animate:i?{opacity:1,scale:1}:{},transition:{duration:.7,delay:n,ease:y},className:a,children:t})}function k({children:t,delay:n=0,direction:a="left",className:s=""}){const i=c.useRef(null),r=D(i),l=a==="left"?-80:80;return e.jsx(u.div,{ref:i,initial:{opacity:0,x:l},animate:r?{opacity:1,x:0}:{},transition:{duration:.8,delay:n,ease:y},className:s,children:t})}function xt({text:t,className:n=""}){const a=t.split(" ");return e.jsx("span",{className:n,children:a.map((s,i)=>e.jsxs(c.Fragment,{children:[e.jsx(u.span,{initial:{opacity:0,y:40,filter:"blur(8px)"},animate:{opacity:1,y:0,filter:"blur(0px)"},transition:{duration:.6,delay:.15+i*.12,ease:y},className:"inline-block",children:s})," "]},i))})}function pt(){return e.jsxs("div",{className:"landing-orbital-rings",children:[e.jsxs(u.div,{className:"landing-ring landing-ring-1",animate:{rotate:360},transition:{duration:30,repeat:1/0,ease:"linear"},children:[e.jsx("div",{className:"landing-ring-dot",style:{top:"0%",left:"50%"}}),e.jsx("div",{className:"landing-ring-dot",style:{bottom:"0%",left:"50%"}})]}),e.jsx(u.div,{className:"landing-ring landing-ring-2",animate:{rotate:-360},transition:{duration:45,repeat:1/0,ease:"linear"},children:e.jsx("div",{className:"landing-ring-dot landing-ring-dot-pink",style:{top:"50%",right:"0%"}})}),e.jsxs(u.div,{className:"landing-ring landing-ring-3",animate:{rotate:360},transition:{duration:60,repeat:1/0,ease:"linear"},children:[e.jsx("div",{className:"landing-ring-dot landing-ring-dot-green",style:{top:"10%",left:"15%"}}),e.jsx("div",{className:"landing-ring-dot",style:{bottom:"15%",right:"10%"}})]}),e.jsx("div",{className:"landing-center-glow"})]})}const jt=Array.from({length:30},(t,n)=>({id:n,x:Math.random()*100,y:Math.random()*100,size:1+Math.random()*2,duration:15+Math.random()*25,delay:Math.random()*10}));function yt(){return e.jsx("div",{className:"absolute inset-0 overflow-hidden pointer-events-none",children:jt.map(t=>e.jsx(u.div,{className:"absolute rounded-full",style:{left:`${t.x}%`,top:`${t.y}%`,width:t.size,height:t.size,background:t.id%3===0?"rgba(0, 188, 212, 0.5)":t.id%3===1?"rgba(233, 30, 99, 0.4)":"rgba(255, 255, 255, 0.2)"},animate:{y:[-20,20,-20],x:[-10,10,-10],opacity:[.2,.7,.2]},transition:{duration:t.duration,delay:t.delay,repeat:1/0,ease:"easeInOut"}},t.id))})}function bt({value:t,suffix:n=""}){const[a,s]=c.useState(0);return c.useEffect(()=>{if(t===0)return;const i=setTimeout(()=>{const l=performance.now();function o(m){const d=m-l,h=Math.min(d/1500,1),x=1-Math.pow(1-h,3);s(Math.round(x*t)),h<1&&requestAnimationFrame(o)}requestAnimationFrame(o)},800);return()=>clearTimeout(i)},[t]),e.jsxs("span",{children:[a,n]})}function vt(){const{scrollYProgress:t}=P(),n=ot(t,{stiffness:100,damping:30});return e.jsx(u.div,{className:"fixed top-0 left-0 right-0 h-[2px] z-50 origin-left",style:{scaleX:n,background:"linear-gradient(90deg, #00bcd4, #e91e63, #00bcd4)"}})}function Nt(){const[t,n]=c.useState(!1);return c.useEffect(()=>{const a=()=>n(window.scrollY>50);return window.addEventListener("scroll",a,{passive:!0}),()=>window.removeEventListener("scroll",a)},[]),e.jsx(u.nav,{className:`fixed top-0 left-0 right-0 z-40 transition-all duration-500 ${t?"landing-nav-scrolled":"landing-nav-transparent"}`,initial:{y:-80},animate:{y:0},transition:{duration:.6,ease:y},children:e.jsxs("div",{className:"max-w-7xl mx-auto px-6 h-16 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:"landing-nav-logo",children:e.jsx(fe,{size:20,className:"text-[#00bcd4]"})}),e.jsx("span",{className:"text-base font-semibold tracking-tight text-white",children:"Orbital Command"})]}),e.jsxs("div",{className:"hidden md:flex items-center gap-8",children:[e.jsx("a",{href:"#features",className:"text-sm text-white/60 hover:text-white transition-colors",children:"Features"}),e.jsx("a",{href:"#how-it-works",className:"text-sm text-white/60 hover:text-white transition-colors",children:"How It Works"}),e.jsx("a",{href:"#architecture",className:"text-sm text-white/60 hover:text-white transition-colors",children:"Architecture"}),e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-nav-cta",children:[e.jsx(R,{size:14}),"GitHub"]})]})]})})}function wt(){const t=c.useRef(null),{scrollYProgress:n}=P({target:t,offset:["start start","end start"]}),a=C(n,[0,1],[0,200]),s=C(n,[0,.6],[1,0]),i=C(n,[0,1],[0,100]);return e.jsxs(e.Fragment,{children:[e.jsxs("section",{ref:t,className:"landing-hero",children:[e.jsx("div",{className:"landing-hero-orb landing-hero-orb-1"}),e.jsx("div",{className:"landing-hero-orb landing-hero-orb-2"}),e.jsx("div",{className:"landing-hero-orb landing-hero-orb-3"}),e.jsxs(u.div,{className:"landing-hero-content",style:{y:a,opacity:s},children:[e.jsxs(u.div,{className:"landing-badge",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:.5,delay:.1},children:[e.jsx(Ie,{size:14,className:"text-[#00bcd4]"}),e.jsx("span",{children:"Mission control for Claude Code"})]}),e.jsxs("h1",{className:"landing-headline",children:[e.jsx(xt,{text:"Command your"}),e.jsx("br",{}),e.jsx(u.span,{className:"landing-headline-gradient",initial:{opacity:0,y:40},animate:{opacity:1,y:0},transition:{duration:.7,delay:.5,ease:y},children:"AI fleet."})]}),e.jsxs(u.p,{className:"landing-subtitle",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.7,delay:.8},children:["Real-time project management dashboard for Claude Code.",e.jsx("br",{className:"hidden sm:block"}),"Kanban boards, sprint orchestration, quality gates, and deploy pipelines",e.jsx("br",{className:"hidden sm:block"}),"— all driven by a file-based event bus."]}),e.jsxs(u.div,{className:"landing-cta-row",initial:{opacity:0,y:20},animate:{opacity:1,y:0},transition:{duration:.7,delay:1},children:[e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-cta-primary group",children:[e.jsx(ae,{size:18}),"Get Started",e.jsx(re,{size:16,className:"ml-1 transition-transform group-hover:translate-x-1"})]}),e.jsxs("a",{href:"#features",className:"landing-cta-secondary",children:["See Features",e.jsx(Y,{size:16})]})]}),e.jsx(u.div,{className:"landing-install",initial:{opacity:0},animate:{opacity:1},transition:{duration:.6,delay:1.3},children:e.jsx("code",{children:"npm install -g orbital-command"})})]}),e.jsx(u.div,{className:"landing-hero-visual",initial:{opacity:0,scale:.8},animate:{opacity:1,scale:1},transition:{duration:1.2,delay:.5,ease:y},style:{y:i},children:e.jsx(pt,{})}),e.jsx(u.div,{className:"landing-scroll-indicator",animate:{y:[0,8,0]},transition:{duration:2,repeat:1/0,ease:"easeInOut"},children:e.jsx(Y,{size:20,className:"text-white/30"})})]}),e.jsx("section",{className:"landing-stats",children:e.jsx("div",{className:"landing-stats-inner",children:[{value:7,suffix:"",label:"Dashboard Views"},{value:100,suffix:"%",label:"File-Based"},{value:0,suffix:"",label:"Lock-in",staticText:"0"},{label:"Real-time Sync",staticText:"RT"}].map((r,l)=>e.jsxs("div",{className:"contents",children:[l>0&&e.jsx("div",{className:"landing-stat-divider"}),e.jsxs("div",{className:"landing-stat",children:[e.jsx("span",{className:"landing-stat-value",children:r.staticText??e.jsx(bt,{value:r.value,suffix:r.suffix})}),e.jsx("span",{className:"landing-stat-label",children:r.label})]})]},r.label))})})]})}const kt={cyan:{glow:"rgba(0,188,212,0.15)",border:"rgba(0,188,212,0.3)",text:"#00bcd4"},pink:{glow:"rgba(233,30,99,0.15)",border:"rgba(233,30,99,0.3)",text:"#e91e63"},green:{glow:"rgba(0,230,118,0.15)",border:"rgba(0,230,118,0.3)",text:"#00e676"},amber:{glow:"rgba(255,171,0,0.15)",border:"rgba(255,171,0,0.3)",text:"#ffab00"},purple:{glow:"rgba(117,109,158,0.2)",border:"rgba(117,109,158,0.4)",text:"#9c8fd4"}};function b({icon:t,title:n,description:a,color:s,delay:i=0}){const r=kt[s];return e.jsx(g,{delay:i,children:e.jsxs(u.div,{className:"landing-feature-card group",whileHover:{y:-8,transition:{duration:.3}},children:[e.jsx("div",{className:"landing-feature-icon-wrap",style:{background:r.glow,borderColor:r.border},children:e.jsx(t,{size:24,style:{color:r.text}})}),e.jsx("h3",{className:"landing-feature-title",children:n}),e.jsx("p",{className:"landing-feature-desc",children:a}),e.jsx("div",{className:"landing-feature-glow",style:{background:`radial-gradient(ellipse at center, ${r.glow}, transparent 70%)`}})]})})}function St(){return e.jsx("section",{id:"features",className:"landing-section",children:e.jsxs("div",{className:"landing-section-inner",children:[e.jsx(g,{children:e.jsx("p",{className:"landing-section-tag",children:"Features"})}),e.jsx(g,{delay:.1,children:e.jsxs("h2",{className:"landing-section-title",children:["Everything you need to",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"orchestrate AI agents."})]})}),e.jsx(g,{delay:.2,children:e.jsx("p",{className:"landing-section-desc",children:"A complete mission control system that turns Claude Code sessions into observable, manageable workflows with real-time feedback."})}),e.jsxs("div",{className:"landing-features-grid",children:[e.jsx(b,{icon:le,title:"Visual Kanban",description:"Drag-and-drop scope cards across workflow columns. Real-time status updates as Claude agents work through tasks.",color:"cyan",delay:0}),e.jsx(b,{icon:ue,title:"Sprint Orchestration",description:"Batch scopes into sprints with automatic sequencing, dependency resolution, and parallel execution across agents.",color:"pink",delay:.08}),e.jsx(b,{icon:oe,title:"Quality Gates",description:"Enforce standards with configurable gates — typecheck, lint, test, build. Auto-block deployments that fail checks.",color:"green",delay:.16}),e.jsx(b,{icon:ce,title:"Workflow DAG Editor",description:"Visual directed acyclic graph editor for custom workflows. Define columns, transitions, hooks, and inference rules.",color:"purple",delay:.08}),e.jsx(b,{icon:me,title:"Agent Feed",description:"Live stream of all Claude Code events across every session. Filter by agent, scope, or event type. Full audit trail.",color:"amber",delay:.16}),e.jsx(b,{icon:H,title:"Deploy Pipeline",description:"Multi-stage deployment visualization from dev to staging to production. Rollback controls and promotion gates.",color:"cyan",delay:.24})]})]})})}const S=({color:t,children:n})=>e.jsx("span",{style:{color:t},children:n}),E=[{elements:e.jsx(e.Fragment,{children:"$ orbital"}),delay:400},{elements:e.jsx(e.Fragment,{children:" Scaffolding hooks, skills, and agents..."}),delay:800},{elements:e.jsx(e.Fragment,{children:" Writing .claude/hooks/on-scope-change.sh"}),delay:200},{elements:e.jsx(e.Fragment,{children:" Writing .claude/hooks/on-quality-gate.sh"}),delay:200},{elements:e.jsx(e.Fragment,{children:" Creating orbital.config.json"}),delay:300},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00e676",children:"✓"})," Orbital Command initialized"]}),delay:600},{elements:e.jsx(e.Fragment,{children:" "}),delay:300},{elements:e.jsx(e.Fragment,{children:" Launching dashboard..."}),delay:500},{elements:e.jsx(e.Fragment,{children:" Server running on http://localhost:4444"}),delay:400},{elements:e.jsx(e.Fragment,{children:" Client running on http://localhost:4445"}),delay:200},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00bcd4",children:"◉"})," Watching scopes/ for changes..."]}),delay:300},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00bcd4",children:"◉"})," Watching .claude/orbital-events/ for events..."]}),delay:200},{elements:e.jsxs(e.Fragment,{children:[" ",e.jsx(S,{color:"#00e676",children:"✓"})," Dashboard ready — mission control is live"]}),delay:0}];function Et(){const t=c.useRef(null),n=ve(t,{once:!0,amount:.1}),[a,s]=c.useState(0);return c.useEffect(()=>{if(!n)return;let i,r=0;function l(){r>=E.length||(s(r+1),r++,r<E.length&&(i=setTimeout(l,E[r].delay)))}return i=setTimeout(l,600),()=>clearTimeout(i)},[n]),e.jsxs("div",{ref:t,className:"landing-terminal",children:[e.jsxs("div",{className:"landing-terminal-header",children:[e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-red"}),e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-yellow"}),e.jsx("div",{className:"landing-terminal-dot landing-terminal-dot-green"}),e.jsx("span",{className:"landing-terminal-title",children:"orbital-command"})]}),e.jsxs("div",{className:"landing-terminal-body",children:[E.slice(0,a).map((i,r)=>e.jsx(u.div,{initial:{opacity:0,x:-8},animate:{opacity:1,x:0},transition:{duration:.3},className:"landing-terminal-line",children:i.elements},r)),e.jsx(u.span,{className:"landing-terminal-cursor",animate:{opacity:[1,0,1]},transition:{duration:1,repeat:1/0},children:"▌"})]})]})}const zt=[{label:"Kanban Board",gradient:"from-cyan-500/20 to-blue-500/20",icon:le},{label:"Quality Gates",gradient:"from-green-500/20 to-emerald-500/20",icon:oe},{label:"Workflow DAG",gradient:"from-purple-500/20 to-pink-500/20",icon:ce},{label:"Agent Feed",gradient:"from-pink-500/20 to-red-500/20",icon:me},{label:"Sprint View",gradient:"from-amber-500/20 to-orange-500/20",icon:ue},{label:"Deploy Pipeline",gradient:"from-cyan-500/20 to-teal-500/20",icon:H}];function Lt(){const t=c.useRef(null),{scrollYProgress:n}=P({target:t,offset:["start end","end start"]}),a=C(n,[0,1],["5%","-15%"]);return e.jsxs("section",{className:"landing-section-full",children:[e.jsxs(g,{className:"text-center mb-12",children:[e.jsx("p",{className:"landing-section-tag",children:"Dashboard"}),e.jsxs("h2",{className:"landing-section-title",children:["Six views. ",e.jsx("span",{className:"landing-gradient-text",children:"One command center."})]})]}),e.jsx("div",{ref:t,className:"overflow-hidden py-8",children:e.jsx(u.div,{className:"flex gap-6 px-8",style:{x:a},children:zt.map(s=>e.jsxs(u.div,{className:`landing-showcase-card bg-gradient-to-br ${s.gradient}`,whileHover:{scale:1.03},transition:{duration:.3},children:[e.jsx(s.icon,{size:48,className:"text-white/30 mb-4"}),e.jsx("span",{className:"text-lg font-medium text-white/80",children:s.label})]},s.label))})})]})}function M({number:t,title:n,description:a,icon:s,delay:i}){return e.jsxs(g,{delay:i,className:"landing-step",children:[e.jsx("div",{className:"landing-step-number",children:t}),e.jsx("div",{className:"landing-step-icon",children:e.jsx(s,{size:28})}),e.jsx("h3",{className:"text-lg font-semibold text-white mt-4 mb-2",children:n}),e.jsx("p",{className:"text-sm text-white/50 leading-relaxed",children:a})]})}const Ct=[{label:"Frontend",sub:"React + Vite + Tailwind",color:"#00bcd4",icon:Ae},{label:"Real-time",sub:"Socket.io Push",color:"#e91e63",icon:he},{label:"API",sub:"Express REST",color:"#ffab00",icon:de},{label:"Engine",sub:"Workflow + Events",color:"#00e676",icon:ge}];function It(){return e.jsx("div",{className:"landing-arch-stack",children:Ct.map(t=>e.jsxs(u.div,{className:"landing-arch-layer",whileHover:{x:8,transition:{duration:.2}},style:{borderLeftColor:t.color},children:[e.jsx("div",{className:"landing-arch-icon",style:{color:t.color},children:e.jsx(t.icon,{size:20})}),e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-semibold text-white",children:t.label}),e.jsx("div",{className:"text-xs text-white/40",children:t.sub})]})]},t.label))})}function Ht(){return e.jsxs("div",{className:"landing-root",children:[e.jsx(vt,{}),e.jsx(Nt,{}),e.jsx(yt,{}),e.jsx(wt,{}),e.jsx(St,{}),e.jsx(Lt,{}),e.jsx("section",{id:"how-it-works",className:"landing-section",children:e.jsxs("div",{className:"landing-section-inner",children:[e.jsx(g,{children:e.jsx("p",{className:"landing-section-tag",children:"How It Works"})}),e.jsx(g,{delay:.1,children:e.jsxs("h2",{className:"landing-section-title",children:["Three steps to",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"mission control."})]})}),e.jsxs("div",{className:"landing-steps-grid",children:[e.jsx(M,{number:"01",title:"Initialize",description:"Run orbital in your project. The setup wizard scaffolds hooks, skills, agents, and config into your .claude/ directory. Zero lock-in — everything is plain files.",icon:ae,delay:0}),e.jsx(M,{number:"02",title:"Define Scopes",description:"Write markdown files with YAML frontmatter in scopes/. Each scope is a task card — title, status, category, priority, assignee. Claude reads and updates them.",icon:R,delay:.15}),e.jsx(M,{number:"03",title:"Launch",description:"Select Launch from the hub menu and open the dashboard. Watch your AI fleet in real-time as Claude agents pick up scopes, emit events, and progress through your workflow.",icon:H,delay:.3})]})]})}),e.jsx("section",{className:"landing-section",children:e.jsx("div",{className:"landing-section-inner",children:e.jsxs("div",{className:"landing-split",children:[e.jsxs(k,{direction:"left",className:"flex-1 min-w-0",children:[e.jsx("p",{className:"landing-section-tag",children:"Developer Experience"}),e.jsxs("h2",{className:"landing-section-title text-left",children:["Get running in",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"under a minute."})]}),e.jsx("p",{className:"landing-section-desc text-left mt-4",children:"One command to scaffold. One command to launch. File-based architecture means everything is inspectable, versionable, and customizable."}),e.jsxs("div",{className:"landing-dx-features",children:[e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(Te,{size:16,className:"text-[#00bcd4]"}),e.jsx("span",{children:"Zero-config setup"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(de,{size:16,className:"text-[#e91e63]"}),e.jsx("span",{children:"File-based event bus"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(he,{size:16,className:"text-[#00e676]"}),e.jsx("span",{children:"Real-time Socket.io sync"})]}),e.jsxs("div",{className:"landing-dx-item",children:[e.jsx(ge,{size:16,className:"text-[#ffab00]"}),e.jsx("span",{children:"SQLite persistence"})]})]})]}),e.jsx(k,{direction:"right",className:"flex-1 min-w-0",children:e.jsx(Et,{})})]})})}),e.jsx("section",{id:"architecture",className:"landing-section",children:e.jsx("div",{className:"landing-section-inner",children:e.jsxs("div",{className:"landing-split",children:[e.jsxs(k,{direction:"left",className:"flex-1 min-w-0",children:[e.jsx("p",{className:"landing-section-tag",children:"Architecture"}),e.jsxs("h2",{className:"landing-section-title text-left",children:["Built on",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"open primitives."})]}),e.jsx("p",{className:"landing-section-desc text-left mt-4",children:"Markdown files are tasks. JSON files are events. The workflow engine is pure TypeScript with zero I/O. Everything is observable and hackable."})]}),e.jsx(k,{direction:"right",className:"flex-1 min-w-0",children:e.jsx(It,{})})]})})}),e.jsxs("section",{className:"landing-final-cta",children:[e.jsx("div",{className:"landing-final-cta-bg"}),e.jsxs("div",{className:"relative z-10 max-w-3xl mx-auto text-center px-6",children:[e.jsx(gt,{children:e.jsxs("h2",{className:"landing-final-headline",children:["Ready for",e.jsx("br",{})," ",e.jsx("span",{className:"landing-gradient-text",children:"liftoff?"})]})}),e.jsx(g,{delay:.2,children:e.jsx("p",{className:"text-lg text-white/50 mb-10 leading-relaxed",children:"Install Orbital Command and take control of your AI-powered development workflow. Open source. Zero lock-in. Fully extensible."})}),e.jsx(g,{delay:.4,children:e.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4",children:[e.jsxs("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"landing-cta-primary group text-base px-8 py-4",children:[e.jsx(R,{size:18}),"View on GitHub",e.jsx(re,{size:16,className:"ml-1 transition-transform group-hover:translate-x-1"})]}),e.jsx("div",{className:"landing-install",children:e.jsx("code",{children:"npm install -g orbital-command"})})]})})]})]}),e.jsx("footer",{className:"landing-footer",children:e.jsxs("div",{className:"max-w-7xl mx-auto px-6 flex flex-col sm:flex-row items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(fe,{size:16,className:"text-[#00bcd4]"}),e.jsx("span",{className:"text-sm text-white/40",children:"Orbital Command"})]}),e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsx("a",{href:"https://github.com/SakaraLabs/orbital-command",target:"_blank",rel:"noopener noreferrer",className:"text-xs text-white/30 hover:text-white/60 transition-colors",children:"GitHub"}),e.jsx("span",{className:"text-xs text-white/20",children:"MIT License"})]})]})})]})}export{Ht as Landing,Ht as default};