ace-assistant-cli 0.1.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/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # Ace CLI
2
+
3
+ Command-line interface for the Ace productivity assistant. Designed for integration with AI tools like Claude Code.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ # From npm (when published)
9
+ pnpm add -g ace-assistant-cli
10
+
11
+ # Or use pnpm dlx
12
+ pnpm dlx ace-assistant-cli
13
+
14
+ # For development
15
+ cd packages/cli
16
+ bun install
17
+ bun run dev
18
+ ```
19
+
20
+ ## Authentication
21
+
22
+ First, authenticate with your Ace account:
23
+
24
+ ```bash
25
+ ace auth login
26
+ ```
27
+
28
+ This opens a browser window where you can authorize the CLI. Your credentials are stored in `~/.ace/credentials.json`.
29
+
30
+ ### Auth Commands
31
+
32
+ ```bash
33
+ ace auth login # Authenticate with Ace
34
+ ace auth logout # Remove stored credentials
35
+ ace auth status # Show authentication status
36
+ ace auth whoami # Show current user
37
+ ```
38
+
39
+ ## Usage
40
+
41
+ ### Quick Capture
42
+
43
+ ```bash
44
+ ace capture "Call dentist tomorrow"
45
+ ace capture "Review PR #123" --notes "Check the test coverage"
46
+ ```
47
+
48
+ ### Daily Orientation
49
+
50
+ ```bash
51
+ ace orient # Human-readable dashboard
52
+ ace orient --json # JSON for AI consumption
53
+ ```
54
+
55
+ ### Actions
56
+
57
+ ```bash
58
+ ace actions list # List all actions
59
+ ace actions inbox # List inbox items
60
+ ace actions list --status active # Filter by status
61
+ ace actions add "New task" # Create action
62
+ ace actions complete <id> # Mark complete
63
+ ace actions update <id> --status waiting --waiting "Bob"
64
+ ```
65
+
66
+ ### Projects
67
+
68
+ ```bash
69
+ ace projects list # List all projects
70
+ ace projects active # List active projects
71
+ ace projects list --domain Work # Filter by domain
72
+ ace projects add "New Project" # Create project
73
+ ace projects activate <id> # Set to active
74
+ ace projects complete <id> # Mark complete
75
+ ace projects review # Projects due for review
76
+ ```
77
+
78
+ ## JSON Output
79
+
80
+ Add `--json` to any command for machine-readable output (ideal for AI tools):
81
+
82
+ ```bash
83
+ ace orient --json
84
+ ace actions list --json
85
+ ace projects active --json
86
+ ```
87
+
88
+ ## Environment Variables
89
+
90
+ - `ACE_API_URL` - Override the API URL (default: https://ace-assistant.vercel.app)
91
+
92
+ ## Development
93
+
94
+ ```bash
95
+ # Install dependencies
96
+ bun install
97
+
98
+ # Run in development
99
+ bun run dev --help
100
+
101
+ # Build
102
+ bun run build
103
+
104
+ # Type check
105
+ bun run typecheck
106
+ ```
107
+
108
+ ## Publishing
109
+
110
+ The CLI is published to npm as `ace-assistant-cli`:
111
+
112
+ ```bash
113
+ cd packages/cli
114
+ bun run build
115
+ npm publish
116
+ ```
package/bin/ace ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import('../dist/index.js')
package/dist/index.js ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import{createRequire as _$}from"node:module";var Q$=Object.create;var{getPrototypeOf:U$,defineProperty:Mj,getOwnPropertyNames:Z$}=Object;var G$=Object.prototype.hasOwnProperty;var X$=(j,$,S)=>{S=j!=null?Q$(U$(j)):{};let q=$||!j||!j.__esModule?Mj(S,"default",{value:j,enumerable:!0}):S;for(let y of Z$(j))if(!G$.call(q,y))Mj(q,y,{get:()=>j[y],enumerable:!0});return q};var D=(j,$)=>()=>($||j(($={exports:{}}).exports,$),$.exports);var C=_$(import.meta.url);var k=D((z$)=>{class r extends Error{constructor(j,$,S){super(S);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=$,this.exitCode=j,this.nestedError=void 0}}class Wj extends r{constructor(j){super(1,"commander.invalidArgument",j);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}z$.CommanderError=r;z$.InvalidArgumentError=Wj});var O=D((L$)=>{var{InvalidArgumentError:W$}=k();class Hj{constructor(j,$){switch(this.description=$||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,j[0]){case"<":this.required=!0,this._name=j.slice(1,-1);break;case"[":this.required=!1,this._name=j.slice(1,-1);break;default:this.required=!0,this._name=j;break}if(this._name.length>3&&this._name.slice(-3)==="...")this.variadic=!0,this._name=this._name.slice(0,-3)}name(){return this._name}_concatValue(j,$){if($===this.defaultValue||!Array.isArray($))return[j];return $.concat(j)}default(j,$){return this.defaultValue=j,this.defaultValueDescription=$,this}argParser(j){return this.parseArg=j,this}choices(j){return this.argChoices=j.slice(),this.parseArg=($,S)=>{if(!this.argChoices.includes($))throw new W$(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue($,S);return $},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}}function H$(j){let $=j.name()+(j.variadic===!0?"...":"");return j.required?"<"+$+">":"["+$+"]"}L$.Argument=Hj;L$.humanReadableArgName=H$});var l=D((B$)=>{var{humanReadableArgName:D$}=O();class Lj{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(j){let $=j.commands.filter((q)=>!q._hidden),S=j._getHelpCommand();if(S&&!S._hidden)$.push(S);if(this.sortSubcommands)$.sort((q,y)=>{return q.name().localeCompare(y.name())});return $}compareOptions(j,$){let S=(q)=>{return q.short?q.short.replace(/^-/,""):q.long.replace(/^--/,"")};return S(j).localeCompare(S($))}visibleOptions(j){let $=j.options.filter((q)=>!q.hidden),S=j._getHelpOption();if(S&&!S.hidden){let q=S.short&&j._findOption(S.short),y=S.long&&j._findOption(S.long);if(!q&&!y)$.push(S);else if(S.long&&!y)$.push(j.createOption(S.long,S.description));else if(S.short&&!q)$.push(j.createOption(S.short,S.description))}if(this.sortOptions)$.sort(this.compareOptions);return $}visibleGlobalOptions(j){if(!this.showGlobalOptions)return[];let $=[];for(let S=j.parent;S;S=S.parent){let q=S.options.filter((y)=>!y.hidden);$.push(...q)}if(this.sortOptions)$.sort(this.compareOptions);return $}visibleArguments(j){if(j._argsDescription)j.registeredArguments.forEach(($)=>{$.description=$.description||j._argsDescription[$.name()]||""});if(j.registeredArguments.find(($)=>$.description))return j.registeredArguments;return[]}subcommandTerm(j){let $=j.registeredArguments.map((S)=>D$(S)).join(" ");return j._name+(j._aliases[0]?"|"+j._aliases[0]:"")+(j.options.length?" [options]":"")+($?" "+$:"")}optionTerm(j){return j.flags}argumentTerm(j){return j.name()}longestSubcommandTermLength(j,$){return $.visibleCommands(j).reduce((S,q)=>{return Math.max(S,$.subcommandTerm(q).length)},0)}longestOptionTermLength(j,$){return $.visibleOptions(j).reduce((S,q)=>{return Math.max(S,$.optionTerm(q).length)},0)}longestGlobalOptionTermLength(j,$){return $.visibleGlobalOptions(j).reduce((S,q)=>{return Math.max(S,$.optionTerm(q).length)},0)}longestArgumentTermLength(j,$){return $.visibleArguments(j).reduce((S,q)=>{return Math.max(S,$.argumentTerm(q).length)},0)}commandUsage(j){let $=j._name;if(j._aliases[0])$=$+"|"+j._aliases[0];let S="";for(let q=j.parent;q;q=q.parent)S=q.name()+" "+S;return S+$+" "+j.usage()}commandDescription(j){return j.description()}subcommandDescription(j){return j.summary()||j.description()}optionDescription(j){let $=[];if(j.argChoices)$.push(`choices: ${j.argChoices.map((S)=>JSON.stringify(S)).join(", ")}`);if(j.defaultValue!==void 0){if(j.required||j.optional||j.isBoolean()&&typeof j.defaultValue==="boolean")$.push(`default: ${j.defaultValueDescription||JSON.stringify(j.defaultValue)}`)}if(j.presetArg!==void 0&&j.optional)$.push(`preset: ${JSON.stringify(j.presetArg)}`);if(j.envVar!==void 0)$.push(`env: ${j.envVar}`);if($.length>0)return`${j.description} (${$.join(", ")})`;return j.description}argumentDescription(j){let $=[];if(j.argChoices)$.push(`choices: ${j.argChoices.map((S)=>JSON.stringify(S)).join(", ")}`);if(j.defaultValue!==void 0)$.push(`default: ${j.defaultValueDescription||JSON.stringify(j.defaultValue)}`);if($.length>0){let S=`(${$.join(", ")})`;if(j.description)return`${j.description} ${S}`;return S}return j.description}formatHelp(j,$){let S=$.padWidth(j,$),q=$.helpWidth||80,y=2,I=2;function J(X,H){if(H){let s=`${X.padEnd(S+2)}${H}`;return $.wrap(s,q-2,S+2)}return X}function P(X){return X.join(`
4
+ `).replace(/^/gm," ".repeat(2))}let Y=[`Usage: ${$.commandUsage(j)}`,""],T=$.commandDescription(j);if(T.length>0)Y=Y.concat([$.wrap(T,q,0),""]);let R=$.visibleArguments(j).map((X)=>{return J($.argumentTerm(X),$.argumentDescription(X))});if(R.length>0)Y=Y.concat(["Arguments:",P(R),""]);let G=$.visibleOptions(j).map((X)=>{return J($.optionTerm(X),$.optionDescription(X))});if(G.length>0)Y=Y.concat(["Options:",P(G),""]);if(this.showGlobalOptions){let X=$.visibleGlobalOptions(j).map((H)=>{return J($.optionTerm(H),$.optionDescription(H))});if(X.length>0)Y=Y.concat(["Global Options:",P(X),""])}let z=$.visibleCommands(j).map((X)=>{return J($.subcommandTerm(X),$.subcommandDescription(X))});if(z.length>0)Y=Y.concat(["Commands:",P(z),""]);return Y.join(`
5
+ `)}padWidth(j,$){return Math.max($.longestOptionTermLength(j,$),$.longestGlobalOptionTermLength(j,$),$.longestSubcommandTermLength(j,$),$.longestArgumentTermLength(j,$))}wrap(j,$,S,q=40){let I=new RegExp(`[\\n][${" \\f\\t\\v   -    \uFEFF"}]+`);if(j.match(I))return j;let J=$-S;if(J<q)return j;let P=j.slice(0,S),Y=j.slice(S).replace(`\r
6
+ `,`
7
+ `),T=" ".repeat(S),G=`\\s${"​"}`,z=new RegExp(`
8
+ |.{1,${J-1}}([${G}]|$)|[^${G}]+?([${G}]|$)`,"g"),X=Y.match(z)||[];return P+X.map((H,s)=>{if(H===`
9
+ `)return"";return(s>0?T:"")+H.trimEnd()}).join(`
10
+ `)}}B$.Help=Lj});var d=D((A$)=>{var{InvalidArgumentError:V$}=k();class Kj{constructor(j,$){this.flags=j,this.description=$||"",this.required=j.includes("<"),this.optional=j.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(j),this.mandatory=!1;let S=f$(j);if(this.short=S.shortFlag,this.long=S.longFlag,this.negate=!1,this.long)this.negate=this.long.startsWith("--no-");this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(j,$){return this.defaultValue=j,this.defaultValueDescription=$,this}preset(j){return this.presetArg=j,this}conflicts(j){return this.conflictsWith=this.conflictsWith.concat(j),this}implies(j){let $=j;if(typeof j==="string")$={[j]:!0};return this.implied=Object.assign(this.implied||{},$),this}env(j){return this.envVar=j,this}argParser(j){return this.parseArg=j,this}makeOptionMandatory(j=!0){return this.mandatory=!!j,this}hideHelp(j=!0){return this.hidden=!!j,this}_concatValue(j,$){if($===this.defaultValue||!Array.isArray($))return[j];return $.concat(j)}choices(j){return this.argChoices=j.slice(),this.parseArg=($,S)=>{if(!this.argChoices.includes($))throw new V$(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue($,S);return $},this}name(){if(this.long)return this.long.replace(/^--/,"");return this.short.replace(/^-/,"")}attributeName(){return w$(this.name().replace(/^no-/,""))}is(j){return this.short===j||this.long===j}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class Fj{constructor(j){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,j.forEach(($)=>{if($.negate)this.negativeOptions.set($.attributeName(),$);else this.positiveOptions.set($.attributeName(),$)}),this.negativeOptions.forEach(($,S)=>{if(this.positiveOptions.has(S))this.dualOptions.add(S)})}valueFromOption(j,$){let S=$.attributeName();if(!this.dualOptions.has(S))return!0;let q=this.negativeOptions.get(S).presetArg,y=q!==void 0?q:!1;return $.negate===(y===j)}}function w$(j){return j.split("-").reduce(($,S)=>{return $+S[0].toUpperCase()+S.slice(1)})}function f$(j){let $,S,q=j.split(/[ |,]+/);if(q.length>1&&!/^[[<]/.test(q[1]))$=q.shift();if(S=q.shift(),!$&&/^-[^-]$/.test(S))$=S,S=void 0;return{shortFlag:$,longFlag:S}}A$.Option=Kj;A$.DualOptions=Fj});var Dj=D((u$)=>{function k$(j,$){if(Math.abs(j.length-$.length)>3)return Math.max(j.length,$.length);let S=[];for(let q=0;q<=j.length;q++)S[q]=[q];for(let q=0;q<=$.length;q++)S[0][q]=q;for(let q=1;q<=$.length;q++)for(let y=1;y<=j.length;y++){let I=1;if(j[y-1]===$[q-1])I=0;else I=1;if(S[y][q]=Math.min(S[y-1][q]+1,S[y][q-1]+1,S[y-1][q-1]+I),y>1&&q>1&&j[y-1]===$[q-2]&&j[y-2]===$[q-1])S[y][q]=Math.min(S[y][q],S[y-2][q-2]+1)}return S[j.length][$.length]}function b$(j,$){if(!$||$.length===0)return"";$=Array.from(new Set($));let S=j.startsWith("--");if(S)j=j.slice(2),$=$.map((J)=>J.slice(2));let q=[],y=3,I=0.4;if($.forEach((J)=>{if(J.length<=1)return;let P=k$(j,J),Y=Math.max(j.length,J.length);if((Y-P)/Y>I){if(P<y)y=P,q=[J];else if(P===y)q.push(J)}}),q.sort((J,P)=>J.localeCompare(P)),S)q=q.map((J)=>`--${J}`);if(q.length>1)return`
11
+ (Did you mean one of ${q.join(", ")}?)`;if(q.length===1)return`
12
+ (Did you mean ${q[0]}?)`;return""}u$.suggestSimilar=b$});var wj=D((m$)=>{var c$=C("node:events").EventEmitter,i=C("node:child_process"),M=C("node:path"),p=C("node:fs"),_=C("node:process"),{Argument:h$,humanReadableArgName:v$}=O(),{CommanderError:o}=k(),{Help:t$}=l(),{Option:Bj,DualOptions:g$}=d(),{suggestSimilar:Nj}=Dj();class n extends c${constructor(j){super();this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=j||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:($)=>_.stdout.write($),writeErr:($)=>_.stderr.write($),getOutHelpWidth:()=>_.stdout.isTTY?_.stdout.columns:void 0,getErrHelpWidth:()=>_.stderr.isTTY?_.stderr.columns:void 0,outputError:($,S)=>S($)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(j){return this._outputConfiguration=j._outputConfiguration,this._helpOption=j._helpOption,this._helpCommand=j._helpCommand,this._helpConfiguration=j._helpConfiguration,this._exitCallback=j._exitCallback,this._storeOptionsAsProperties=j._storeOptionsAsProperties,this._combineFlagAndOptionalValue=j._combineFlagAndOptionalValue,this._allowExcessArguments=j._allowExcessArguments,this._enablePositionalOptions=j._enablePositionalOptions,this._showHelpAfterError=j._showHelpAfterError,this._showSuggestionAfterError=j._showSuggestionAfterError,this}_getCommandAndAncestors(){let j=[];for(let $=this;$;$=$.parent)j.push($);return j}command(j,$,S){let q=$,y=S;if(typeof q==="object"&&q!==null)y=q,q=null;y=y||{};let[,I,J]=j.match(/([^ ]+) *(.*)/),P=this.createCommand(I);if(q)P.description(q),P._executableHandler=!0;if(y.isDefault)this._defaultCommandName=P._name;if(P._hidden=!!(y.noHelp||y.hidden),P._executableFile=y.executableFile||null,J)P.arguments(J);if(this._registerCommand(P),P.parent=this,P.copyInheritedSettings(this),q)return this;return P}createCommand(j){return new n(j)}createHelp(){return Object.assign(new t$,this.configureHelp())}configureHelp(j){if(j===void 0)return this._helpConfiguration;return this._helpConfiguration=j,this}configureOutput(j){if(j===void 0)return this._outputConfiguration;return Object.assign(this._outputConfiguration,j),this}showHelpAfterError(j=!0){if(typeof j!=="string")j=!!j;return this._showHelpAfterError=j,this}showSuggestionAfterError(j=!0){return this._showSuggestionAfterError=!!j,this}addCommand(j,$){if(!j._name)throw Error(`Command passed to .addCommand() must have a name
13
+ - specify the name in Command constructor or using .name()`);if($=$||{},$.isDefault)this._defaultCommandName=j._name;if($.noHelp||$.hidden)j._hidden=!0;return this._registerCommand(j),j.parent=this,j._checkForBrokenPassThrough(),this}createArgument(j,$){return new h$(j,$)}argument(j,$,S,q){let y=this.createArgument(j,$);if(typeof S==="function")y.default(q).argParser(S);else y.default(S);return this.addArgument(y),this}arguments(j){return j.trim().split(/ +/).forEach(($)=>{this.argument($)}),this}addArgument(j){let $=this.registeredArguments.slice(-1)[0];if($&&$.variadic)throw Error(`only the last argument can be variadic '${$.name()}'`);if(j.required&&j.defaultValue!==void 0&&j.parseArg===void 0)throw Error(`a default value for a required argument is never used: '${j.name()}'`);return this.registeredArguments.push(j),this}helpCommand(j,$){if(typeof j==="boolean")return this._addImplicitHelpCommand=j,this;j=j??"help [command]";let[,S,q]=j.match(/([^ ]+) *(.*)/),y=$??"display help for command",I=this.createCommand(S);if(I.helpOption(!1),q)I.arguments(q);if(y)I.description(y);return this._addImplicitHelpCommand=!0,this._helpCommand=I,this}addHelpCommand(j,$){if(typeof j!=="object")return this.helpCommand(j,$),this;return this._addImplicitHelpCommand=!0,this._helpCommand=j,this}_getHelpCommand(){if(this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))){if(this._helpCommand===void 0)this.helpCommand(void 0,void 0);return this._helpCommand}return null}hook(j,$){let S=["preSubcommand","preAction","postAction"];if(!S.includes(j))throw Error(`Unexpected value for event passed to hook : '${j}'.
14
+ Expecting one of '${S.join("', '")}'`);if(this._lifeCycleHooks[j])this._lifeCycleHooks[j].push($);else this._lifeCycleHooks[j]=[$];return this}exitOverride(j){if(j)this._exitCallback=j;else this._exitCallback=($)=>{if($.code!=="commander.executeSubCommandAsync")throw $};return this}_exit(j,$,S){if(this._exitCallback)this._exitCallback(new o(j,$,S));_.exit(j)}action(j){let $=(S)=>{let q=this.registeredArguments.length,y=S.slice(0,q);if(this._storeOptionsAsProperties)y[q]=this;else y[q]=this.opts();return y.push(this),j.apply(this,y)};return this._actionHandler=$,this}createOption(j,$){return new Bj(j,$)}_callParseArg(j,$,S,q){try{return j.parseArg($,S)}catch(y){if(y.code==="commander.invalidArgument"){let I=`${q} ${y.message}`;this.error(I,{exitCode:y.exitCode,code:y.code})}throw y}}_registerOption(j){let $=j.short&&this._findOption(j.short)||j.long&&this._findOption(j.long);if($){let S=j.long&&this._findOption(j.long)?j.long:j.short;throw Error(`Cannot add option '${j.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${S}'
15
+ - already used by option '${$.flags}'`)}this.options.push(j)}_registerCommand(j){let $=(q)=>{return[q.name()].concat(q.aliases())},S=$(j).find((q)=>this._findCommand(q));if(S){let q=$(this._findCommand(S)).join("|"),y=$(j).join("|");throw Error(`cannot add command '${y}' as already have command '${q}'`)}this.commands.push(j)}addOption(j){this._registerOption(j);let $=j.name(),S=j.attributeName();if(j.negate){let y=j.long.replace(/^--no-/,"--");if(!this._findOption(y))this.setOptionValueWithSource(S,j.defaultValue===void 0?!0:j.defaultValue,"default")}else if(j.defaultValue!==void 0)this.setOptionValueWithSource(S,j.defaultValue,"default");let q=(y,I,J)=>{if(y==null&&j.presetArg!==void 0)y=j.presetArg;let P=this.getOptionValue(S);if(y!==null&&j.parseArg)y=this._callParseArg(j,y,P,I);else if(y!==null&&j.variadic)y=j._concatValue(y,P);if(y==null)if(j.negate)y=!1;else if(j.isBoolean()||j.optional)y=!0;else y="";this.setOptionValueWithSource(S,y,J)};if(this.on("option:"+$,(y)=>{let I=`error: option '${j.flags}' argument '${y}' is invalid.`;q(y,I,"cli")}),j.envVar)this.on("optionEnv:"+$,(y)=>{let I=`error: option '${j.flags}' value '${y}' from env '${j.envVar}' is invalid.`;q(y,I,"env")});return this}_optionEx(j,$,S,q,y){if(typeof $==="object"&&$ instanceof Bj)throw Error("To add an Option object use addOption() instead of option() or requiredOption()");let I=this.createOption($,S);if(I.makeOptionMandatory(!!j.mandatory),typeof q==="function")I.default(y).argParser(q);else if(q instanceof RegExp){let J=q;q=(P,Y)=>{let T=J.exec(P);return T?T[0]:Y},I.default(y).argParser(q)}else I.default(q);return this.addOption(I)}option(j,$,S,q){return this._optionEx({},j,$,S,q)}requiredOption(j,$,S,q){return this._optionEx({mandatory:!0},j,$,S,q)}combineFlagAndOptionalValue(j=!0){return this._combineFlagAndOptionalValue=!!j,this}allowUnknownOption(j=!0){return this._allowUnknownOption=!!j,this}allowExcessArguments(j=!0){return this._allowExcessArguments=!!j,this}enablePositionalOptions(j=!0){return this._enablePositionalOptions=!!j,this}passThroughOptions(j=!0){return this._passThroughOptions=!!j,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(j=!0){if(this.options.length)throw Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!j,this}getOptionValue(j){if(this._storeOptionsAsProperties)return this[j];return this._optionValues[j]}setOptionValue(j,$){return this.setOptionValueWithSource(j,$,void 0)}setOptionValueWithSource(j,$,S){if(this._storeOptionsAsProperties)this[j]=$;else this._optionValues[j]=$;return this._optionValueSources[j]=S,this}getOptionValueSource(j){return this._optionValueSources[j]}getOptionValueSourceWithGlobals(j){let $;return this._getCommandAndAncestors().forEach((S)=>{if(S.getOptionValueSource(j)!==void 0)$=S.getOptionValueSource(j)}),$}_prepareUserArgs(j,$){if(j!==void 0&&!Array.isArray(j))throw Error("first parameter to parse must be array or undefined");if($=$||{},j===void 0&&$.from===void 0){if(_.versions?.electron)$.from="electron";let q=_.execArgv??[];if(q.includes("-e")||q.includes("--eval")||q.includes("-p")||q.includes("--print"))$.from="eval"}if(j===void 0)j=_.argv;this.rawArgs=j.slice();let S;switch($.from){case void 0:case"node":this._scriptPath=j[1],S=j.slice(2);break;case"electron":if(_.defaultApp)this._scriptPath=j[1],S=j.slice(2);else S=j.slice(1);break;case"user":S=j.slice(0);break;case"eval":S=j.slice(1);break;default:throw Error(`unexpected parse option { from: '${$.from}' }`)}if(!this._name&&this._scriptPath)this.nameFromFilename(this._scriptPath);return this._name=this._name||"program",S}parse(j,$){let S=this._prepareUserArgs(j,$);return this._parseCommand([],S),this}async parseAsync(j,$){let S=this._prepareUserArgs(j,$);return await this._parseCommand([],S),this}_executeSubCommand(j,$){$=$.slice();let S=!1,q=[".js",".ts",".tsx",".mjs",".cjs"];function y(T,R){let G=M.resolve(T,R);if(p.existsSync(G))return G;if(q.includes(M.extname(R)))return;let z=q.find((X)=>p.existsSync(`${G}${X}`));if(z)return`${G}${z}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let I=j._executableFile||`${this._name}-${j._name}`,J=this._executableDir||"";if(this._scriptPath){let T;try{T=p.realpathSync(this._scriptPath)}catch(R){T=this._scriptPath}J=M.resolve(M.dirname(T),J)}if(J){let T=y(J,I);if(!T&&!j._executableFile&&this._scriptPath){let R=M.basename(this._scriptPath,M.extname(this._scriptPath));if(R!==this._name)T=y(J,`${R}-${j._name}`)}I=T||I}S=q.includes(M.extname(I));let P;if(_.platform!=="win32")if(S)$.unshift(I),$=Vj(_.execArgv).concat($),P=i.spawn(_.argv[0],$,{stdio:"inherit"});else P=i.spawn(I,$,{stdio:"inherit"});else $.unshift(I),$=Vj(_.execArgv).concat($),P=i.spawn(_.execPath,$,{stdio:"inherit"});if(!P.killed)["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach((R)=>{_.on(R,()=>{if(P.killed===!1&&P.exitCode===null)P.kill(R)})});let Y=this._exitCallback;P.on("close",(T)=>{if(T=T??1,!Y)_.exit(T);else Y(new o(T,"commander.executeSubCommandAsync","(close)"))}),P.on("error",(T)=>{if(T.code==="ENOENT"){let R=J?`searched for local subcommand relative to directory '${J}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",G=`'${I}' does not exist
16
+ - if '${j._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
17
+ - if the default executable name is not suitable, use the executableFile option to supply a custom name or path
18
+ - ${R}`;throw Error(G)}else if(T.code==="EACCES")throw Error(`'${I}' not executable`);if(!Y)_.exit(1);else{let R=new o(1,"commander.executeSubCommandAsync","(error)");R.nestedError=T,Y(R)}}),this.runningCommand=P}_dispatchSubcommand(j,$,S){let q=this._findCommand(j);if(!q)this.help({error:!0});let y;return y=this._chainOrCallSubCommandHook(y,q,"preSubcommand"),y=this._chainOrCall(y,()=>{if(q._executableHandler)this._executeSubCommand(q,$.concat(S));else return q._parseCommand($,S)}),y}_dispatchHelpCommand(j){if(!j)this.help();let $=this._findCommand(j);if($&&!$._executableHandler)$.help();return this._dispatchSubcommand(j,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){if(this.registeredArguments.forEach((j,$)=>{if(j.required&&this.args[$]==null)this.missingArgument(j.name())}),this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)return;if(this.args.length>this.registeredArguments.length)this._excessArguments(this.args)}_processArguments(){let j=(S,q,y)=>{let I=q;if(q!==null&&S.parseArg){let J=`error: command-argument value '${q}' is invalid for argument '${S.name()}'.`;I=this._callParseArg(S,q,y,J)}return I};this._checkNumberOfArguments();let $=[];this.registeredArguments.forEach((S,q)=>{let y=S.defaultValue;if(S.variadic){if(q<this.args.length){if(y=this.args.slice(q),S.parseArg)y=y.reduce((I,J)=>{return j(S,J,I)},S.defaultValue)}else if(y===void 0)y=[]}else if(q<this.args.length){if(y=this.args[q],S.parseArg)y=j(S,y,S.defaultValue)}$[q]=y}),this.processedArgs=$}_chainOrCall(j,$){if(j&&j.then&&typeof j.then==="function")return j.then(()=>$());return $()}_chainOrCallHooks(j,$){let S=j,q=[];if(this._getCommandAndAncestors().reverse().filter((y)=>y._lifeCycleHooks[$]!==void 0).forEach((y)=>{y._lifeCycleHooks[$].forEach((I)=>{q.push({hookedCommand:y,callback:I})})}),$==="postAction")q.reverse();return q.forEach((y)=>{S=this._chainOrCall(S,()=>{return y.callback(y.hookedCommand,this)})}),S}_chainOrCallSubCommandHook(j,$,S){let q=j;if(this._lifeCycleHooks[S]!==void 0)this._lifeCycleHooks[S].forEach((y)=>{q=this._chainOrCall(q,()=>{return y(this,$)})});return q}_parseCommand(j,$){let S=this.parseOptions($);if(this._parseOptionsEnv(),this._parseOptionsImplied(),j=j.concat(S.operands),$=S.unknown,this.args=j.concat($),j&&this._findCommand(j[0]))return this._dispatchSubcommand(j[0],j.slice(1),$);if(this._getHelpCommand()&&j[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(j[1]);if(this._defaultCommandName)return this._outputHelpIfRequested($),this._dispatchSubcommand(this._defaultCommandName,j,$);if(this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName)this.help({error:!0});this._outputHelpIfRequested(S.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let q=()=>{if(S.unknown.length>0)this.unknownOption(S.unknown[0])},y=`command:${this.name()}`;if(this._actionHandler){q(),this._processArguments();let I;if(I=this._chainOrCallHooks(I,"preAction"),I=this._chainOrCall(I,()=>this._actionHandler(this.processedArgs)),this.parent)I=this._chainOrCall(I,()=>{this.parent.emit(y,j,$)});return I=this._chainOrCallHooks(I,"postAction"),I}if(this.parent&&this.parent.listenerCount(y))q(),this._processArguments(),this.parent.emit(y,j,$);else if(j.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",j,$);if(this.listenerCount("command:*"))this.emit("command:*",j,$);else if(this.commands.length)this.unknownCommand();else q(),this._processArguments()}else if(this.commands.length)q(),this.help({error:!0});else q(),this._processArguments()}_findCommand(j){if(!j)return;return this.commands.find(($)=>$._name===j||$._aliases.includes(j))}_findOption(j){return this.options.find(($)=>$.is(j))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach((j)=>{j.options.forEach(($)=>{if($.mandatory&&j.getOptionValue($.attributeName())===void 0)j.missingMandatoryOptionValue($)})})}_checkForConflictingLocalOptions(){let j=this.options.filter((S)=>{let q=S.attributeName();if(this.getOptionValue(q)===void 0)return!1;return this.getOptionValueSource(q)!=="default"});j.filter((S)=>S.conflictsWith.length>0).forEach((S)=>{let q=j.find((y)=>S.conflictsWith.includes(y.attributeName()));if(q)this._conflictingOption(S,q)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach((j)=>{j._checkForConflictingLocalOptions()})}parseOptions(j){let $=[],S=[],q=$,y=j.slice();function I(P){return P.length>1&&P[0]==="-"}let J=null;while(y.length){let P=y.shift();if(P==="--"){if(q===S)q.push(P);q.push(...y);break}if(J&&!I(P)){this.emit(`option:${J.name()}`,P);continue}if(J=null,I(P)){let Y=this._findOption(P);if(Y){if(Y.required){let T=y.shift();if(T===void 0)this.optionMissingArgument(Y);this.emit(`option:${Y.name()}`,T)}else if(Y.optional){let T=null;if(y.length>0&&!I(y[0]))T=y.shift();this.emit(`option:${Y.name()}`,T)}else this.emit(`option:${Y.name()}`);J=Y.variadic?Y:null;continue}}if(P.length>2&&P[0]==="-"&&P[1]!=="-"){let Y=this._findOption(`-${P[1]}`);if(Y){if(Y.required||Y.optional&&this._combineFlagAndOptionalValue)this.emit(`option:${Y.name()}`,P.slice(2));else this.emit(`option:${Y.name()}`),y.unshift(`-${P.slice(2)}`);continue}}if(/^--[^=]+=/.test(P)){let Y=P.indexOf("="),T=this._findOption(P.slice(0,Y));if(T&&(T.required||T.optional)){this.emit(`option:${T.name()}`,P.slice(Y+1));continue}}if(I(P))q=S;if((this._enablePositionalOptions||this._passThroughOptions)&&$.length===0&&S.length===0){if(this._findCommand(P)){if($.push(P),y.length>0)S.push(...y);break}else if(this._getHelpCommand()&&P===this._getHelpCommand().name()){if($.push(P),y.length>0)$.push(...y);break}else if(this._defaultCommandName){if(S.push(P),y.length>0)S.push(...y);break}}if(this._passThroughOptions){if(q.push(P),y.length>0)q.push(...y);break}q.push(P)}return{operands:$,unknown:S}}opts(){if(this._storeOptionsAsProperties){let j={},$=this.options.length;for(let S=0;S<$;S++){let q=this.options[S].attributeName();j[q]=q===this._versionOptionName?this._version:this[q]}return j}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((j,$)=>Object.assign(j,$.opts()),{})}error(j,$){if(this._outputConfiguration.outputError(`${j}
19
+ `,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==="string")this._outputConfiguration.writeErr(`${this._showHelpAfterError}
20
+ `);else if(this._showHelpAfterError)this._outputConfiguration.writeErr(`
21
+ `),this.outputHelp({error:!0});let S=$||{},q=S.exitCode||1,y=S.code||"commander.error";this._exit(q,y,j)}_parseOptionsEnv(){this.options.forEach((j)=>{if(j.envVar&&j.envVar in _.env){let $=j.attributeName();if(this.getOptionValue($)===void 0||["default","config","env"].includes(this.getOptionValueSource($)))if(j.required||j.optional)this.emit(`optionEnv:${j.name()}`,_.env[j.envVar]);else this.emit(`optionEnv:${j.name()}`)}})}_parseOptionsImplied(){let j=new g$(this.options),$=(S)=>{return this.getOptionValue(S)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(S))};this.options.filter((S)=>S.implied!==void 0&&$(S.attributeName())&&j.valueFromOption(this.getOptionValue(S.attributeName()),S)).forEach((S)=>{Object.keys(S.implied).filter((q)=>!$(q)).forEach((q)=>{this.setOptionValueWithSource(q,S.implied[q],"implied")})})}missingArgument(j){let $=`error: missing required argument '${j}'`;this.error($,{code:"commander.missingArgument"})}optionMissingArgument(j){let $=`error: option '${j.flags}' argument missing`;this.error($,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(j){let $=`error: required option '${j.flags}' not specified`;this.error($,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(j,$){let S=(I)=>{let J=I.attributeName(),P=this.getOptionValue(J),Y=this.options.find((R)=>R.negate&&J===R.attributeName()),T=this.options.find((R)=>!R.negate&&J===R.attributeName());if(Y&&(Y.presetArg===void 0&&P===!1||Y.presetArg!==void 0&&P===Y.presetArg))return Y;return T||I},q=(I)=>{let J=S(I),P=J.attributeName();if(this.getOptionValueSource(P)==="env")return`environment variable '${J.envVar}'`;return`option '${J.flags}'`},y=`error: ${q(j)} cannot be used with ${q($)}`;this.error(y,{code:"commander.conflictingOption"})}unknownOption(j){if(this._allowUnknownOption)return;let $="";if(j.startsWith("--")&&this._showSuggestionAfterError){let q=[],y=this;do{let I=y.createHelp().visibleOptions(y).filter((J)=>J.long).map((J)=>J.long);q=q.concat(I),y=y.parent}while(y&&!y._enablePositionalOptions);$=Nj(j,q)}let S=`error: unknown option '${j}'${$}`;this.error(S,{code:"commander.unknownOption"})}_excessArguments(j){if(this._allowExcessArguments)return;let $=this.registeredArguments.length,S=$===1?"":"s",y=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${$} argument${S} but got ${j.length}.`;this.error(y,{code:"commander.excessArguments"})}unknownCommand(){let j=this.args[0],$="";if(this._showSuggestionAfterError){let q=[];this.createHelp().visibleCommands(this).forEach((y)=>{if(q.push(y.name()),y.alias())q.push(y.alias())}),$=Nj(j,q)}let S=`error: unknown command '${j}'${$}`;this.error(S,{code:"commander.unknownCommand"})}version(j,$,S){if(j===void 0)return this._version;this._version=j,$=$||"-V, --version",S=S||"output the version number";let q=this.createOption($,S);return this._versionOptionName=q.attributeName(),this._registerOption(q),this.on("option:"+q.name(),()=>{this._outputConfiguration.writeOut(`${j}
22
+ `),this._exit(0,"commander.version",j)}),this}description(j,$){if(j===void 0&&$===void 0)return this._description;if(this._description=j,$)this._argsDescription=$;return this}summary(j){if(j===void 0)return this._summary;return this._summary=j,this}alias(j){if(j===void 0)return this._aliases[0];let $=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)$=this.commands[this.commands.length-1];if(j===$._name)throw Error("Command alias can't be the same as its name");let S=this.parent?._findCommand(j);if(S){let q=[S.name()].concat(S.aliases()).join("|");throw Error(`cannot add alias '${j}' to command '${this.name()}' as already have command '${q}'`)}return $._aliases.push(j),this}aliases(j){if(j===void 0)return this._aliases;return j.forEach(($)=>this.alias($)),this}usage(j){if(j===void 0){if(this._usage)return this._usage;let $=this.registeredArguments.map((S)=>{return v$(S)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?$:[]).join(" ")}return this._usage=j,this}name(j){if(j===void 0)return this._name;return this._name=j,this}nameFromFilename(j){return this._name=M.basename(j,M.extname(j)),this}executableDir(j){if(j===void 0)return this._executableDir;return this._executableDir=j,this}helpInformation(j){let $=this.createHelp();if($.helpWidth===void 0)$.helpWidth=j&&j.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth();return $.formatHelp(this,$)}_getHelpContext(j){j=j||{};let $={error:!!j.error},S;if($.error)S=(q)=>this._outputConfiguration.writeErr(q);else S=(q)=>this._outputConfiguration.writeOut(q);return $.write=j.write||S,$.command=this,$}outputHelp(j){let $;if(typeof j==="function")$=j,j=void 0;let S=this._getHelpContext(j);this._getCommandAndAncestors().reverse().forEach((y)=>y.emit("beforeAllHelp",S)),this.emit("beforeHelp",S);let q=this.helpInformation(S);if($){if(q=$(q),typeof q!=="string"&&!Buffer.isBuffer(q))throw Error("outputHelp callback must return a string or a Buffer")}if(S.write(q),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",S),this._getCommandAndAncestors().forEach((y)=>y.emit("afterAllHelp",S))}helpOption(j,$){if(typeof j==="boolean"){if(j)this._helpOption=this._helpOption??void 0;else this._helpOption=null;return this}return j=j??"-h, --help",$=$??"display help for command",this._helpOption=this.createOption(j,$),this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption(j){return this._helpOption=j,this}help(j){this.outputHelp(j);let $=_.exitCode||0;if($===0&&j&&typeof j!=="function"&&j.error)$=1;this._exit($,"commander.help","(outputHelp)")}addHelpText(j,$){let S=["beforeAll","before","after","afterAll"];if(!S.includes(j))throw Error(`Unexpected value for position to addHelpText.
23
+ Expecting one of '${S.join("', '")}'`);let q=`${j}Help`;return this.on(q,(y)=>{let I;if(typeof $==="function")I=$({error:y.error,command:y.command});else I=$;if(I)y.write(`${I}
24
+ `)}),this}_outputHelpIfRequested(j){let $=this._getHelpOption();if($&&j.find((q)=>$.is(q)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function Vj(j){return j.map(($)=>{if(!$.startsWith("--inspect"))return $;let S,q="127.0.0.1",y="9229",I;if((I=$.match(/^(--inspect(-brk)?)$/))!==null)S=I[1];else if((I=$.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(S=I[1],/^\d+$/.test(I[3]))y=I[3];else q=I[3];else if((I=$.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)S=I[1],q=I[3],y=I[4];if(S&&y!=="0")return`${S}=${q}:${parseInt(y)+1}`;return $})}m$.Command=n});var Cj=D((d$)=>{var{Argument:fj}=O(),{Command:a}=wj(),{CommanderError:r$,InvalidArgumentError:Aj}=k(),{Help:l$}=l(),{Option:xj}=d();d$.program=new a;d$.createCommand=(j)=>new a(j);d$.createOption=(j,$)=>new xj(j,$);d$.createArgument=(j,$)=>new fj(j,$);d$.Command=a;d$.Option=xj;d$.Argument=fj;d$.Help=l$;d$.CommanderError=r$;d$.InvalidArgumentError=Aj;d$.InvalidOptionArgumentError=Aj});var kj=X$(Cj(),1),{program:W,createCommand:SS,createArgument:qS,createOption:yS,CommanderError:IS,InvalidArgumentError:PS,InvalidOptionArgumentError:JS,Command:YS,Argument:TS,Option:RS,Help:QS}=kj.default;var bj="0.1.0";import{homedir as P1}from"os";import{join as uj}from"path";import{existsSync as e,mkdirSync as J1,readFileSync as Y1,writeFileSync as T1,unlinkSync as R1}from"fs";function Oj(){let j=process.env.ACE_TEST_HOME??P1();return uj(j,".ace")}function jj(){return uj(Oj(),"credentials.json")}var Q1=process.env.DEBUG==="true"||process.env.ACE_DEBUG==="true";function w(j,...$){if(Q1)console.error(`[ace-cli debug] ${j}`,...$)}function U1(){let j=Oj();if(!e(j))J1(j,{recursive:!0,mode:448})}function B(){try{let j=jj();if(!e(j))return w("Credentials file does not exist:",j),null;let $=Y1(j,"utf-8"),S=JSON.parse($);if(S.expiresAt&&new Date(S.expiresAt)<new Date)return w("Token expired at:",S.expiresAt),null;return S}catch(j){return w("Error reading credentials:",j),null}}function $j(j){U1();let $=jj();T1($,JSON.stringify(j,null,2),{mode:384}),w("Credentials saved to:",$)}function Sj(){try{let j=jj();if(e(j))return R1(j),w("Credentials cleared"),!0;return!1}catch(j){return w("Error clearing credentials:",j),!1}}function b(){return B()?.apiUrl??process.env.ACE_API_URL??"https://ace-assistant.vercel.app"}import Zj from"node:process";import{Buffer as pj}from"node:buffer";import oj from"node:path";import{fileURLToPath as O1}from"node:url";import{promisify as c1}from"node:util";import nj from"node:child_process";import h1,{constants as v1}from"node:fs/promises";import tj from"node:process";import gj,{constants as M1}from"node:fs/promises";import vj from"node:process";import z1 from"node:os";import E1 from"node:fs";import X1 from"node:fs";import cj from"node:fs";var qj;function Z1(){try{return cj.statSync("/.dockerenv"),!0}catch{return!1}}function G1(){try{return cj.readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return!1}}function yj(){if(qj===void 0)qj=Z1()||G1();return qj}var Ij,_1=()=>{try{return X1.statSync("/run/.containerenv"),!0}catch{return!1}};function f(){if(Ij===void 0)Ij=_1()||yj();return Ij}var hj=()=>{if(vj.platform!=="linux")return!1;if(z1.release().toLowerCase().includes("microsoft")){if(f())return!1;return!0}try{return E1.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!f():!1}catch{return!1}},L=vj.env.__IS_WSL_TEST__?hj:hj();var W1=(()=>{let $;return async function(){if($)return $;let S="/etc/wsl.conf",q=!1;try{await gj.access(S,M1.F_OK),q=!0}catch{}if(!q)return"/mnt/";let y=await gj.readFile(S,{encoding:"utf8"}),I=/(?<!#.*)root\s*=\s*(?<mountPoint>.*)/g.exec(y);if(!I)return"/mnt/";return $=I.groups.mountPoint.trim(),$=$.endsWith("/")?$:`${$}/`,$}})(),H1=async()=>{return`${await W1()}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`},Pj=async()=>{if(L)return H1();return`${tj.env.SYSTEMROOT||tj.env.windir||String.raw`C:\Windows`}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`};function K(j,$,S){let q=(y)=>Object.defineProperty(j,$,{value:y,enumerable:!0,writable:!0});return Object.defineProperty(j,$,{configurable:!0,enumerable:!0,get(){let y=S();return q(y),y},set(y){q(y)}}),j}import{promisify as C1}from"node:util";import Qj from"node:process";import{execFile as k1}from"node:child_process";import{promisify as L1}from"node:util";import K1 from"node:process";import{execFile as F1}from"node:child_process";var D1=L1(F1);async function Jj(){if(K1.platform!=="darwin")throw Error("macOS only");let{stdout:j}=await D1("defaults",["read","com.apple.LaunchServices/com.apple.launchservices.secure","LSHandlers"]),S=/LSHandlerRoleAll = "(?!-)(?<id>[^"]+?)";\s+?LSHandlerURLScheme = (?:http|https);/.exec(j)?.groups.id??"com.apple.Safari";if(S==="com.apple.safari")return"com.apple.Safari";return S}import B1 from"node:process";import{promisify as N1}from"node:util";import{execFile as V1,execFileSync as tS}from"node:child_process";var w1=N1(V1);async function mj(j,{humanReadableOutput:$=!0,signal:S}={}){if(B1.platform!=="darwin")throw Error("macOS only");let q=$?[]:["-ss"],y={};if(S)y.signal=S;let{stdout:I}=await w1("osascript",["-e",j,q],y);return I.trim()}async function Yj(j){return mj(`tell application "Finder" to set app_path to application file id "${j}" as string
25
+ tell application "System Events" to get value of property list item "CFBundleName" of property list file (app_path & ":Contents:Info.plist")`)}import{promisify as f1}from"node:util";import{execFile as A1}from"node:child_process";var x1=f1(A1),sj={MSEdgeHTM:{name:"Edge",id:"com.microsoft.edge"},MSEdgeBHTML:{name:"Edge Beta",id:"com.microsoft.edge.beta"},MSEdgeDHTML:{name:"Edge Dev",id:"com.microsoft.edge.dev"},AppXq0fevzme2pys62n3e0fbqa7peapykr8v:{name:"Edge",id:"com.microsoft.edge.old"},ChromeHTML:{name:"Chrome",id:"com.google.chrome"},ChromeBHTML:{name:"Chrome Beta",id:"com.google.chrome.beta"},ChromeDHTML:{name:"Chrome Dev",id:"com.google.chrome.dev"},ChromiumHTM:{name:"Chromium",id:"org.chromium.Chromium"},BraveHTML:{name:"Brave",id:"com.brave.Browser"},BraveBHTML:{name:"Brave Beta",id:"com.brave.Browser.beta"},BraveDHTML:{name:"Brave Dev",id:"com.brave.Browser.dev"},BraveSSHTM:{name:"Brave Nightly",id:"com.brave.Browser.nightly"},FirefoxURL:{name:"Firefox",id:"org.mozilla.firefox"},OperaStable:{name:"Opera",id:"com.operasoftware.Opera"},VivaldiHTM:{name:"Vivaldi",id:"com.vivaldi.Vivaldi"},"IE.HTTP":{name:"Internet Explorer",id:"com.microsoft.ie"}},dS=new Map(Object.entries(sj));class Tj extends Error{}async function Rj(j=x1){let{stdout:$}=await j("reg",["QUERY"," HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice","/v","ProgId"]),S=/ProgId\s*REG_SZ\s*(?<id>\S+)/.exec($);if(!S)throw new Tj(`Cannot find Windows browser in stdout: ${JSON.stringify($)}`);let{id:q}=S.groups,y=sj[q];if(!y)throw new Tj(`Unknown browser ID: ${q}`);return y}var b1=C1(k1),u1=(j)=>j.toLowerCase().replaceAll(/(?:^|\s|-)\S/g,($)=>$.toUpperCase());async function Uj(){if(Qj.platform==="darwin"){let j=await Jj();return{name:await Yj(j),id:j}}if(Qj.platform==="linux"){let{stdout:j}=await b1("xdg-mime",["query","default","x-scheme-handler/http"]),$=j.trim();return{name:u1($.replace(/.desktop$/,"").replace("-"," ")),id:$}}if(Qj.platform==="win32")return Rj();throw Error("Only macOS, Linux, and Windows are supported")}var t1=c1(nj.execFile),Gj=oj.dirname(O1(import.meta.url)),rj=oj.join(Gj,"xdg-open"),{platform:A,arch:lj}=Zj;async function g1(){let j=await Pj(),$=String.raw`(Get-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice").ProgId`,S=pj.from($,"utf16le").toString("base64"),{stdout:q}=await t1(j,["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",S],{encoding:"utf8"}),y=q.trim(),I={ChromeHTML:"com.google.chrome",BraveHTML:"com.brave.Browser",MSEdgeHTM:"com.microsoft.edge",FirefoxURL:"org.mozilla.firefox"};return I[y]?{id:I[y]}:{}}var dj=async(j,$)=>{let S;for(let q of j)try{return await $(q)}catch(y){S=y}throw S},c=async(j)=>{if(j={wait:!1,background:!1,newInstance:!1,allowNonzeroExitCode:!1,...j},Array.isArray(j.app))return dj(j.app,(P)=>c({...j,app:P}));let{name:$,arguments:S=[]}=j.app??{};if(S=[...S],Array.isArray($))return dj($,(P)=>c({...j,app:{name:P,arguments:S}}));if($==="browser"||$==="browserPrivate"){let P={"com.google.chrome":"chrome","google-chrome.desktop":"chrome","com.brave.Browser":"brave","org.mozilla.firefox":"firefox","firefox.desktop":"firefox","com.microsoft.msedge":"edge","com.microsoft.edge":"edge","com.microsoft.edgemac":"edge","microsoft-edge.desktop":"edge"},Y={chrome:"--incognito",brave:"--incognito",firefox:"--private-window",edge:"--inPrivate"},T=L?await g1():await Uj();if(T.id in P){let R=P[T.id];if($==="browserPrivate")S.push(Y[R]);return c({...j,app:{name:N[R],arguments:S}})}throw Error(`${T.name} is not supported as a default browser`)}let q,y=[],I={};if(A==="darwin"){if(q="open",j.wait)y.push("--wait-apps");if(j.background)y.push("--background");if(j.newInstance)y.push("--new");if($)y.push("-a",$)}else if(A==="win32"||L&&!f()&&!$){if(q=await Pj(),y.push("-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand"),!L)I.windowsVerbatimArguments=!0;let P=["Start"];if(j.wait)P.push("-Wait");if($){if(P.push(`"\`"${$}\`""`),j.target)S.push(j.target)}else if(j.target)P.push(`"${j.target}"`);if(S.length>0)S=S.map((Y)=>`"\`"${Y}\`""`),P.push("-ArgumentList",S.join(","));j.target=pj.from(P.join(" "),"utf16le").toString("base64")}else{if($)q=$;else{let P=!Gj||Gj==="/",Y=!1;try{await h1.access(rj,v1.X_OK),Y=!0}catch{}q=Zj.versions.electron??(A==="android"||P||!Y)?"xdg-open":rj}if(S.length>0)y.push(...S);if(!j.wait)I.stdio="ignore",I.detached=!0}if(A==="darwin"&&S.length>0)y.push("--args",...S);if(j.target)y.push(j.target);let J=nj.spawn(q,y,I);if(j.wait)return new Promise((P,Y)=>{J.once("error",Y),J.once("close",(T)=>{if(!j.allowNonzeroExitCode&&T>0){Y(Error(`Exited with code ${T}`));return}P(J)})});return J.unref(),J},m1=(j,$)=>{if(typeof j!=="string")throw TypeError("Expected a `target`");return c({...$,target:j})};function ij(j){if(typeof j==="string"||Array.isArray(j))return j;let{[lj]:$}=j;if(!$)throw Error(`${lj} is not supported`);return $}function h({[A]:j},{wsl:$}){if($&&L)return ij($);if(!j)throw Error(`${A} is not supported`);return ij(j)}var N={};K(N,"chrome",()=>h({darwin:"google chrome",win32:"chrome",linux:["google-chrome","google-chrome-stable","chromium"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe",x64:["/mnt/c/Program Files/Google/Chrome/Application/chrome.exe","/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe"]}}));K(N,"brave",()=>h({darwin:"brave browser",win32:"brave",linux:["brave-browser","brave"]},{wsl:{ia32:"/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe",x64:["/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe","/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe"]}}));K(N,"firefox",()=>h({darwin:"firefox",win32:String.raw`C:\Program Files\Mozilla Firefox\firefox.exe`,linux:"firefox"},{wsl:"/mnt/c/Program Files/Mozilla Firefox/firefox.exe"}));K(N,"edge",()=>h({darwin:"microsoft edge",win32:"msedge",linux:["microsoft-edge","microsoft-edge-dev"]},{wsl:"/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"}));K(N,"browser",()=>"browser");K(N,"browserPrivate",()=>"browserPrivate");var aj=m1;var s1=2000,r1=600;async function Xj(j){let $=j??b();console.log(`Initiating authentication...
26
+ `);let S=await fetch(`${$}/api/cli-auth/initiate`,{method:"POST",headers:{"Content-Type":"application/json"}});if(!S.ok){let G=await S.text();throw Error(`Failed to initiate auth: ${G}`)}let{deviceCode:q,userCode:y,verificationUrl:I,interval:J,expiresIn:P}=await S.json(),Y=(J||s1/1000)*1000,T=Math.ceil((P||r1)/(Y/1000));console.log("Opening browser to authenticate..."),console.log(""),console.log(` Your code: ${y}`),console.log(""),console.log(` Or visit: ${I}`),console.log(""),await aj(I),console.log("Waiting for authorization...");let R=0;while(R<T){await l1(Y),R++;try{let G=await fetch(`${$}/api/cli-auth/poll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceCode:q})});if(!G.ok){if(G.status===400)continue;throw Error(`Poll failed: ${await G.text()}`)}let z=await G.json();if(z.status==="authorized"&&z.token){let X={apiUrl:$,token:z.token.token,expiresAt:z.token.expiresAt,userId:z.token.userId,userEmail:z.token.userEmail};$j(X),console.log(""),console.log(`Authenticated as ${z.token.userEmail}`),console.log(""),console.log("You can now use ace commands. Try:"),console.log(" ace orient"),console.log(' ace capture "My new task"');return}if(z.status==="expired")throw Error("Authentication code expired. Please try again.")}catch(G){if(G instanceof TypeError)continue;throw G}}throw Error("Authentication timed out. Please try again.")}function l1(j){return new Promise(($)=>setTimeout($,j))}function Q(){return process.argv.includes("--json")}function U(j,$){if($?.json||Q())console.log(JSON.stringify(j,null,2));else if(typeof j==="string")console.log(j);else console.log(JSON.stringify(j,null,2))}function Z(j){if(Q())console.log(JSON.stringify({error:j}));else console.error(`Error: ${j}`)}function F(j){let $=[`[${j.id.slice(0,8)}] ${j.name}`];if(j.project_name)$.push(`(${j.project_name})`);if(j.dueDate)$.push(`due: ${j.dueDate}`);if(j.status==="waiting"&&j.waitingFor)$.push(`waiting: ${j.waitingFor}`);return $.join(" ")}function V(j){let $=[`[${j.id.slice(0,8)}] ${j.name}`];if(j.category_name)$.push(`(${j.category_name})`);if(j.status!=="active")$.push(`[${j.status}]`);return $.join(" ")}function x(j,$){if(j.length===0)return $?`${$}: (none)`:"(no actions)";let S=j.map((q)=>` ${F(q)}`);if($)return`${$} (${j.length}):
27
+ ${S.join(`
28
+ `)}`;return S.join(`
29
+ `)}function u(j,$){if(j.length===0)return $?`${$}: (none)`:"(no projects)";let S=j.map((q)=>` ${V(q)}`);if($)return`${$} (${j.length}):
30
+ ${S.join(`
31
+ `)}`;return S.join(`
32
+ `)}function ej(j){let $=[];$.push(`Inbox: ${j.inboxCount} items`);let S=j.domains.map((q)=>` ${q.name}: ${q.active_count}/${q.activeProjectLimit} active`);if($.push(`Capacity:
33
+ ${S.join(`
34
+ `)}`),j.activeProjects.length>0)$.push(u(j.activeProjects,"Active Projects"));if(j.overdue.length>0)$.push(x(j.overdue,"Overdue"));if(j.dueToday.length>0)$.push(x(j.dueToday,"Due Today"));if(j.waiting.length>0)$.push(x(j.waiting,"Waiting"));return $.join(`
35
+
36
+ `)}function j$(j){let $=j.command("auth").description("Manage authentication");$.command("login").description("Authenticate with Ace").option("--api-url <url>","Ace API URL (default: https://ace-assistant.vercel.app)").action(async(S)=>{try{await Xj(S.apiUrl)}catch(q){Z(q instanceof Error?q.message:"Login failed"),process.exit(1)}}),$.command("logout").description("Remove stored credentials").action(()=>{let S=Sj();if(Q())U({success:S});else if(S)console.log("Logged out successfully");else console.log("No credentials to remove")}),$.command("status").description("Show current authentication status").action(()=>{let S=B();if(Q())U({authenticated:!!S,email:S?.userEmail??null,apiUrl:S?.apiUrl??null});else if(S)console.log(`Authenticated as ${S.userEmail}`),console.log(`API URL: ${S.apiUrl}`);else console.log("Not authenticated. Run: ace auth login")}),$.command("whoami").description("Show current user").action(()=>{let S=B();if(Q())U({authenticated:!!S,email:S?.userEmail??null,userId:S?.userId??null});else if(S)console.log(S.userEmail);else console.log("Not authenticated"),process.exit(1)})}class zj extends Error{status;body;constructor(j,$,S){super(j);this.status=$;this.body=S;this.name="ApiError"}}class _j extends zj{constructor(j="Not authenticated. Run: ace auth login"){super(j,401);this.name="AuthError"}}async function E(j,$={},S){let q=B();if(!q)throw new _j;let I=`${S??q.apiUrl??b()}/api${j}`,J=await fetch(I,{...$,headers:{Authorization:`Bearer ${q.token}`,"Content-Type":"application/json",...$.headers}});if(J.status===401)throw new _j("Session expired. Run: ace auth login");if(!J.ok){let P=await J.json().catch(()=>({}));throw new zj(P.error??`Request failed with status ${J.status}`,J.status,P)}return J.json()}async function $$(){return E("/dashboard")}async function v(j={}){let $=new URLSearchParams;if(j.status)$.set("status",j.status);if(j.projectId)$.set("project_id",j.projectId);if(j.contextId)$.set("context_id",j.contextId);if(j.search)$.set("search",j.search);if(j.limit)$.set("limit",String(j.limit));if(j.offset)$.set("offset",String(j.offset));let S=$.toString(),q=S?`/actions?${S}`:"/actions";return(await E(q)).actions}async function S$(j){return E(`/actions/${j}`)}async function t(j){return E("/actions",{method:"POST",body:JSON.stringify(j)})}async function Ej(j,$){return E(`/actions/${j}`,{method:"PUT",body:JSON.stringify($)})}async function q$(j){return Ej(j,{status:"completed"})}async function y$(j){await E(`/actions/${j}`,{method:"DELETE"})}async function g(j={}){let $=new URLSearchParams;if(j.status)$.set("status",j.status);if(j.domain)$.set("domain",j.domain);if(j.categoryId)$.set("category_id",j.categoryId);if(j.search)$.set("search",j.search);if(j.dueForReview)$.set("due_for_review","true");let S=$.toString(),q=S?`/projects?${S}`:"/projects";return(await E(q)).projects}async function I$(j){return E(`/projects/${j}`)}async function P$(j){return E("/projects",{method:"POST",body:JSON.stringify(j)})}async function m(j,$){return E(`/projects/${j}`,{method:"PUT",body:JSON.stringify($)})}function J$(j){j.command("capture").description("Quick capture an item to inbox").argument("<text>","The item to capture").option("-n, --notes <notes>","Additional notes").action(async($,S)=>{try{let q=await t({name:$,status:"inbox",notes:S.notes});if(Q())U(q);else console.log(`Captured: ${F(q)}`)}catch(q){Z(q instanceof Error?q.message:"Capture failed"),process.exit(1)}})}function Y$(j){j.command("orient").description("Daily orientation - see your current state").alias("dashboard").action(async()=>{try{let $=await $$();if(Q())U($);else console.log(ej($))}catch($){Z($ instanceof Error?$.message:"Failed to load dashboard"),process.exit(1)}})}function T$(j){let $=j.command("actions").description("Manage actions");$.command("list").description("List actions").option("-s, --status <status>","Filter by status (inbox, active, waiting, someday)").option("-p, --project <id>","Filter by project ID").option("-c, --context <id>","Filter by context ID").option("-q, --search <query>","Search by name").option("-l, --limit <n>","Limit results","50").action(async(S)=>{try{let q=await v({status:S.status,projectId:S.project,contextId:S.context,search:S.search,limit:parseInt(S.limit)});if(Q())U({actions:q});else{let y=S.status?`${S.status} actions`:"Actions";console.log(x(q,y))}}catch(q){Z(q instanceof Error?q.message:"Failed to list actions"),process.exit(1)}}),$.command("inbox").description("List inbox items").action(async()=>{try{let S=await v({status:"inbox"});if(Q())U({actions:S,count:S.length});else console.log(x(S,"Inbox"))}catch(S){Z(S instanceof Error?S.message:"Failed to list inbox"),process.exit(1)}}),$.command("get <id>").description("Get action details").action(async(S)=>{try{let q=await S$(S);if(Q())U(q);else{if(console.log(F(q)),q.notes)console.log(`
37
+ Notes: ${q.notes}`);if(q.contexts.length>0)console.log(`
38
+ Contexts: ${q.contexts.map((y)=>y.name).join(", ")}`)}}catch(q){Z(q instanceof Error?q.message:"Failed to get action"),process.exit(1)}}),$.command("add <name>").description("Create a new action").option("-s, --status <status>","Initial status (default: inbox)").option("-p, --project <id>","Assign to project").option("-d, --due <date>","Due date (YYYY-MM-DD)").option("-n, --notes <notes>","Additional notes").action(async(S,q)=>{try{let y=await t({name:S,status:q.status??"inbox",projectId:q.project,dueDate:q.due,notes:q.notes});if(Q())U(y);else console.log(`Created: ${F(y)}`)}catch(y){Z(y instanceof Error?y.message:"Failed to create action"),process.exit(1)}}),$.command("update <id>").description("Update an action").option("-n, --name <name>","New name").option("-s, --status <status>","New status").option("-p, --project <id>",'Assign to project (use "none" to unassign)').option("-d, --due <date>",'Due date (YYYY-MM-DD, or "none" to clear)').option("--notes <notes>","Update notes").option("-w, --waiting <reason>","Set waiting reason").action(async(S,q)=>{try{let y={};if(q.name)y.name=q.name;if(q.status)y.status=q.status;if(q.project==="none")y.projectId=null;else if(q.project)y.projectId=q.project;if(q.due==="none")y.dueDate=null;else if(q.due)y.dueDate=q.due;if(q.notes)y.notes=q.notes;if(q.waiting)y.waitingFor=q.waiting,y.status="waiting";let I=await Ej(S,y);if(Q())U(I);else console.log(`Updated: ${F(I)}`)}catch(y){Z(y instanceof Error?y.message:"Failed to update action"),process.exit(1)}}),$.command("complete <id>").description("Mark an action as completed").action(async(S)=>{try{let q=await q$(S);if(Q())U(q);else console.log(`Completed: ${F(q)}`)}catch(q){Z(q instanceof Error?q.message:"Failed to complete action"),process.exit(1)}}),$.command("delete <id>").description("Delete an action").action(async(S)=>{try{if(await y$(S),Q())U({success:!0,id:S});else console.log(`Deleted action ${S}`)}catch(q){Z(q instanceof Error?q.message:"Failed to delete action"),process.exit(1)}}),$.command("count").description("Count actions by status").option("-s, --status <status>","Status to count (default: inbox)").action(async(S)=>{try{let q=S.status??"inbox",y=await v({status:q});if(Q())U({status:q,count:y.length});else console.log(`${q}: ${y.length}`)}catch(q){Z(q instanceof Error?q.message:"Failed to count actions"),process.exit(1)}})}function R$(j){let $=j.command("projects").description("Manage projects");$.command("list").description("List projects").option("-s, --status <status>","Filter by status").option("-d, --domain <domain>","Filter by domain (Work, Personal)").option("-c, --category <id>","Filter by category ID").option("-q, --search <query>","Search by name").option("-r, --review","Show only projects due for review").action(async(S)=>{try{let q=await g({status:S.status,domain:S.domain,categoryId:S.category,search:S.search,dueForReview:S.review});if(Q())U({projects:q});else{let y=S.status?`${S.status} projects`:"Projects";console.log(u(q,y))}}catch(q){Z(q instanceof Error?q.message:"Failed to list projects"),process.exit(1)}}),$.command("active").description("List active projects").option("-d, --domain <domain>","Filter by domain (Work, Personal)").action(async(S)=>{try{let q=await g({status:"active",domain:S.domain});if(Q())U({projects:q,count:q.length});else console.log(u(q,"Active Projects"))}catch(q){Z(q instanceof Error?q.message:"Failed to list active projects"),process.exit(1)}}),$.command("get <id>").description("Get project details").action(async(S)=>{try{let q=await I$(S);if(Q())U(q);else{if(console.log(V(q)),q.theOneThing)console.log(`
39
+ The One Thing: ${q.theOneThing}`);if(q.notes)console.log(`
40
+ Notes: ${q.notes}`);if(console.log(`
41
+ Status: ${q.status}`),q.reviewAfter)console.log(`Review after: ${q.reviewAfter}`)}}catch(q){Z(q instanceof Error?q.message:"Failed to get project"),process.exit(1)}}),$.command("add <name>").description("Create a new project").option("-s, --status <status>","Initial status (default: incubating)").option("-c, --category <id>","Assign to category").option("-t, --the-one-thing <text>","Set the one thing").option("-n, --notes <notes>","Additional notes").action(async(S,q)=>{try{let y=await P$({name:S,status:q.status??"incubating",categoryId:q.category,theOneThing:q.theOneThing,notes:q.notes});if(Q())U(y);else console.log(`Created: ${V(y)}`)}catch(y){Z(y instanceof Error?y.message:"Failed to create project"),process.exit(1)}}),$.command("update <id>").description("Update a project").option("-n, --name <name>","New name").option("-s, --status <status>","New status").option("-c, --category <id>",'Assign to category (use "none" to unassign)').option("-t, --the-one-thing <text>","Set the one thing").option("--notes <notes>","Update notes").action(async(S,q)=>{try{let y={};if(q.name)y.name=q.name;if(q.status)y.status=q.status;if(q.category==="none")y.categoryId=null;else if(q.category)y.categoryId=q.category;if(q.theOneThing)y.theOneThing=q.theOneThing;if(q.notes)y.notes=q.notes;let I=await m(S,y);if(Q())U(I);else console.log(`Updated: ${V(I)}`)}catch(y){Z(y instanceof Error?y.message:"Failed to update project"),process.exit(1)}}),$.command("activate <id>").description("Set project status to active").action(async(S)=>{try{let q=await m(S,{status:"active"});if(Q())U(q);else console.log(`Activated: ${V(q)}`)}catch(q){Z(q instanceof Error?q.message:"Failed to activate project"),process.exit(1)}}),$.command("complete <id>").description("Mark a project as completed").action(async(S)=>{try{let q=await m(S,{status:"completed"});if(Q())U(q);else console.log(`Completed: ${V(q)}`)}catch(q){Z(q instanceof Error?q.message:"Failed to complete project"),process.exit(1)}}),$.command("review").description("List projects due for review").action(async()=>{try{let S=await g({dueForReview:!0});if(Q())U({projects:S,count:S.length});else console.log(u(S,"Projects Due for Review"))}catch(S){Z(S instanceof Error?S.message:"Failed to list projects for review"),process.exit(1)}})}W.name("ace").description("CLI for Ace productivity assistant").version(bj);j$(W);J$(W);Y$(W);T$(W);R$(W);W.option("--json","Output in JSON format for AI consumption").option("--api-url <url>","Override API URL");W.parse();
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "ace-assistant-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for Ace productivity assistant - bring your own AI",
5
+ "type": "module",
6
+ "bin": {
7
+ "ace": "./bin/ace"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist",
12
+ "bin"
13
+ ],
14
+ "scripts": {
15
+ "dev": "bun run src/index.ts",
16
+ "build": "bun build src/index.ts --outdir dist --target node --minify",
17
+ "test": "bun test",
18
+ "test:watch": "bun test --watch",
19
+ "prepublishOnly": "bun run build",
20
+ "typecheck": "tsc --noEmit"
21
+ },
22
+ "dependencies": {
23
+ "commander": "^12.1.0",
24
+ "open": "^10.1.0"
25
+ },
26
+ "devDependencies": {
27
+ "@types/bun": "latest",
28
+ "@types/node": "^20",
29
+ "typescript": "^5"
30
+ },
31
+ "engines": {
32
+ "node": ">=18"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/craigsturgis/ace.git",
37
+ "directory": "packages/cli"
38
+ },
39
+ "keywords": [
40
+ "productivity",
41
+ "gtd",
42
+ "cli",
43
+ "ai"
44
+ ],
45
+ "author": "Craig Sturgis",
46
+ "license": "MIT"
47
+ }