dorkos 0.29.0 → 0.30.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 CHANGED
@@ -32,14 +32,14 @@ It's 7am. CI has been red since 2:47am. A dependency update cascaded across thre
32
32
 
33
33
  DorkOS gives your agents what they're missing: scheduling, communication, and coordination. The intelligence comes from the agents. Everything else comes from DorkOS.
34
34
 
35
- ### Pulse - Scheduling
35
+ ### Tasks - Scheduling
36
36
 
37
- Cron-based agent execution, independent of your IDE or terminal. Your agents ship code, triage issues, and run audits on schedule. You wake up to completed pull requests.
37
+ Cron-based and on-demand agent execution, independent of your IDE or terminal. Your agents ship code, triage issues, and run audits on schedule. You wake up to completed pull requests.
38
38
 
39
+ - File-based task definitions alongside your code
39
40
  - Overrun protection prevents duplicate runs
40
41
  - Isolated sessions per run with full history
41
42
  - Configurable concurrency limits
42
- - Approval gates for agent-created schedules
43
43
 
44
44
  ### Relay - Communication
45
45
 
@@ -70,6 +70,18 @@ Start a session from the browser. Check on it from your phone. Resume it from in
70
70
  - Real-time sync across multiple clients
71
71
  - Available in any browser or embedded in Obsidian
72
72
 
73
+ ### Extensions
74
+
75
+ Agents can build and install extensions that add new capabilities. Extensions define their own settings, secrets, and entry points — all managed through the UI.
76
+
77
+ ### MCP Server
78
+
79
+ DorkOS exposes an MCP server at `/mcp` (Streamable HTTP transport) so external AI agents — Claude Code, Cursor, Windsurf — can use DorkOS tools directly. Optional API key auth via `MCP_API_KEY`.
80
+
81
+ ```bash
82
+ claude mcp add dorkos --transport http http://localhost:4242/mcp
83
+ ```
84
+
73
85
  ## CLI Reference
74
86
 
75
87
  ```bash
@@ -77,6 +89,8 @@ dorkos # Start the server
77
89
  dorkos --port 8080 # Custom port
78
90
  dorkos --dir ~/projects # Custom working directory
79
91
  dorkos --tunnel # Enable remote access via ngrok
92
+ dorkos --tasks # Enable Tasks scheduler
93
+ dorkos --no-open # Don't open browser on startup
80
94
  dorkos config # Show all settings
81
95
  dorkos config set <key> <val> # Update a setting
82
96
  dorkos init # Interactive setup wizard
@@ -92,7 +106,12 @@ dorkos cleanup # Remove all DorkOS data
92
106
  | `-d, --dir <path>` | Working directory |
93
107
  | `-b, --boundary <path>` | Directory boundary (default: home directory) |
94
108
  | `-t, --tunnel` | Enable ngrok tunnel for remote access |
109
+ | `--tasks` / `--no-tasks` | Enable or disable the Tasks scheduler |
110
+ | `--no-open` | Don't open browser on startup |
95
111
  | `-l, --log-level <level>` | Log level (`fatal`, `error`, `warn`, `info`, `debug`, `trace`) |
112
+ | `--post-install-check` | Verify installation and exit |
113
+ | `-h, --help` | Show help message |
114
+ | `-v, --version` | Show version number |
96
115
 
97
116
  ### Config Subcommands
98
117
 
@@ -117,13 +136,19 @@ dorkos cleanup # Remove all DorkOS data
117
136
 
118
137
  ### Optional
119
138
 
120
- | Variable | Default | Description |
121
- | -------------------- | ----------------- | -------------------------------------- |
122
- | `DORKOS_PORT` | `4242` | Server port |
123
- | `DORKOS_HOST` | `localhost` | Server host (use `0.0.0.0` for Docker) |
124
- | `DORKOS_DEFAULT_CWD` | Current directory | Default working directory for sessions |
125
- | `DORKOS_BOUNDARY` | Home directory | Directory boundary root |
126
- | `LOG_LEVEL` | `info` | Log verbosity |
139
+ | Variable | Default | Description |
140
+ | ---------------------- | ----------------- | -------------------------------------- |
141
+ | `DORKOS_PORT` | `4242` | Server port |
142
+ | `DORKOS_HOST` | `localhost` | Server host (use `0.0.0.0` for Docker) |
143
+ | `DORKOS_DEFAULT_CWD` | Current directory | Default working directory for sessions |
144
+ | `DORKOS_BOUNDARY` | Home directory | Directory boundary root |
145
+ | `DORK_HOME` | `~/.dork` | Override data directory location |
146
+ | `LOG_LEVEL` | `info` | Log verbosity |
147
+ | `DORKOS_TASKS_ENABLED` | `true` | Enable or disable the Tasks scheduler |
148
+ | `DORKOS_OPEN` | `true` | Open browser on startup |
149
+ | `DORKOS_RELAY_ENABLED` | `true` | Enable the Relay message bus |
150
+ | `DORKOS_CORS_ORIGIN` | `localhost` | CORS allowed origin(s) |
151
+ | `MCP_API_KEY` | (none) | API key for MCP server authentication |
127
152
 
128
153
  ### Remote Access
129
154
 
package/dist/bin/cli.js CHANGED
@@ -19117,12 +19117,12 @@ Examples:
19117
19117
  process.exit(0);
19118
19118
  }
19119
19119
  if (values.version) {
19120
- console.log("0.29.0");
19120
+ console.log("0.30.0");
19121
19121
  process.exit(0);
19122
19122
  }
19123
19123
  if (values["post-install-check"]) {
19124
19124
  checkClaude();
19125
- console.log(`dorkos ${"0.29.0"}`);
19125
+ console.log(`dorkos ${"0.30.0"}`);
19126
19126
  console.log("Installation verified.");
19127
19127
  process.exit(0);
19128
19128
  }
@@ -19249,7 +19249,7 @@ try {
19249
19249
  var port = process.env.DORKOS_PORT || String(DEFAULT_PORT);
19250
19250
  var localUrl = `http://localhost:${port}`;
19251
19251
  console.log("");
19252
- console.log(` DorkOS v${"0.29.0"}`);
19252
+ console.log(` DorkOS v${"0.30.0"}`);
19253
19253
  console.log(` Local: ${link(localUrl, localUrl)}`);
19254
19254
  var nets = networkInterfaces();
19255
19255
  var networkUrl = null;
@@ -19310,9 +19310,9 @@ if (shouldOpenBrowser && process.stdin.isTTY) {
19310
19310
  }
19311
19311
  });
19312
19312
  }
19313
- checkForUpdate("0.29.0").then((latestVersion) => {
19313
+ checkForUpdate("0.30.0").then((latestVersion) => {
19314
19314
  if (latestVersion) {
19315
- const msg = `Update available: ${"0.29.0"} \u2192 ${latestVersion}`;
19315
+ const msg = `Update available: ${"0.30.0"} \u2192 ${latestVersion}`;
19316
19316
  const cmd = "Run npm install -g dorkos@latest to update";
19317
19317
  const width = Math.max(msg.length, cmd.length) + 6;
19318
19318
  const pad = (s2) => `\u2502 ${s2}${" ".repeat(width - s2.length - 6)} \u2502`;
@@ -1,4 +1,4 @@
1
- import{n as Odn,o as $Jn,p as DJn,r as mn,j as we,q as Ldn,t as _Jn,s as FJn,v as RJn,w as UX,A as $dn,x as Ddn,c as s5,Z as bpe,y as gpe,z as BJn,b as rA,D as JJn,F as GJn,X as HJn,G as qJn,H as T1n,m as zJn,I as UJn,J as KJn,K as XJn,L as WJn,N as VJn,O as QJn,Q as YJn,U as ZJn,V as eGn,W as nGn}from"./index-C6kLRUkB.js";/**
1
+ import{n as Odn,o as $Jn,p as DJn,r as mn,j as we,q as Ldn,t as _Jn,s as FJn,v as RJn,w as UX,A as $dn,x as Ddn,c as s5,Z as bpe,y as gpe,z as BJn,b as rA,D as JJn,F as GJn,X as HJn,G as qJn,H as T1n,m as zJn,I as UJn,J as KJn,K as XJn,L as WJn,N as VJn,O as QJn,Q as YJn,U as ZJn,V as eGn,W as nGn}from"./index-PgrCLMKB.js";/**
2
2
  * @license lucide-react v0.575.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -1 +1 @@
1
- import{r,R as m,M as x,j as d,B as p}from"./index-C6kLRUkB.js";var B=({code:i,language:e,raw:a,className:g,startLine:u,...n})=>{let{shikiTheme:l}=r.useContext(m),t=x(),[h,s]=r.useState(a);return r.useEffect(()=>{if(!t){s(a);return}let o=t.highlight({code:i,language:e,themes:l},c=>{s(c)});o&&s(o)},[i,e,l,t,a]),d.jsx(p,{className:g,language:e,result:h,startLine:u,...n})};export{B as HighlightedCodeBlockBody};
1
+ import{r,R as m,M as x,j as d,B as p}from"./index-PgrCLMKB.js";var B=({code:i,language:e,raw:a,className:g,startLine:u,...n})=>{let{shikiTheme:l}=r.useContext(m),t=x(),[h,s]=r.useState(a);return r.useEffect(()=>{if(!t){s(a);return}let o=t.highlight({code:i,language:e,themes:l},c=>{s(c)});o&&s(o)},[i,e,l,t,a]),d.jsx(p,{className:g,language:e,result:h,startLine:u,...n})};export{B as HighlightedCodeBlockBody};
@@ -1 +1 @@
1
- import{r as b,j as e,T as f,C as v,P as N,a as E,c as g,b as k,S,u as w,d as y,e as C,f as T,g as R,h as z,t as m}from"./index-C6kLRUkB.js";import{E as M,i as _,k as H,l as B}from"./index-C6kLRUkB.js";const P=new Set(["disabled","discovered","incompatible","invalid"]);function I({extension:o,onToggle:u,isToggling:c}){const{manifest:s,status:t,scope:h,error:n}=o,[r,a]=b.useState(!1),x=!P.has(t),d=t==="incompatible",l=t==="invalid",i=t==="compile_error"||t==="activate_error",j=!d&&!l;return e.jsx("div",{"data-slot":"extension-card","data-testid":`extension-card-${o.id}`,className:g("bg-card rounded-xl border p-4",i&&"border-amber-500/50",(d||l)&&"opacity-70"),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1 space-y-1.5",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i&&e.jsx(f,{className:"size-4 shrink-0 text-amber-500","aria-hidden":"true"}),(d||l)&&!i&&e.jsx(v,{className:"text-muted-foreground size-4 shrink-0","aria-hidden":"true"}),!i&&!d&&!l&&e.jsx(N,{className:"text-muted-foreground size-4 shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium",children:s.name}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:["v",s.version]})]}),s.description&&e.jsx("p",{className:"text-muted-foreground text-sm",children:s.description}),d&&s.minHostVersion&&e.jsxs("p",{className:"text-muted-foreground text-sm",children:["Requires DorkOS >= ",s.minHostVersion]}),i&&n&&e.jsxs("div",{className:"space-y-1",children:[e.jsxs("p",{className:"text-sm text-amber-600 dark:text-amber-400",children:[t==="compile_error"?"Compilation error: ":"Activation failed: ",n.message]}),n.details&&e.jsxs("button",{type:"button",onClick:()=>a(p=>!p),className:"text-muted-foreground hover:text-foreground flex items-center gap-1 text-xs transition-colors","aria-expanded":r,children:[e.jsx(E,{className:g("size-3 transition-transform",r&&"rotate-180")}),r?"Hide details":"Show details"]}),r&&n.details&&e.jsx("pre",{className:"bg-muted mt-1 max-h-32 overflow-auto rounded-md p-2 text-xs",children:n.details})]}),e.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-2 text-xs",children:[e.jsx(k,{variant:"outline",className:"text-xs",children:h}),s.author&&e.jsx("span",{children:s.author})]})]}),e.jsx("div",{className:"pt-0.5",children:e.jsx(S,{checked:x,onCheckedChange:p=>u(o.id,p),disabled:!j||c,"aria-label":`${x?"Disable":"Enable"} ${s.name}`})})]})})}function A(){const{data:o=[],isLoading:u}=w(),c=y(),s=C(),t=T(),h=new Set([...c.variables?[c.variables]:[],...s.variables?[s.variables]:[]]);async function n(a,x){(x?c:s).mutate(a,{onSuccess:()=>{m.info("Extension changed — reload the page to apply",{action:{label:"Reload now",onClick:()=>location.reload()}})},onError:l=>{const i=x?"enable":"disable";m.error(`Failed to ${i} extension: ${l.message}`)}})}function r(){t.mutate(void 0,{onSuccess:a=>{m.success(`Reloaded ${a.length} extension(s)`)},onError:()=>{m.error("Failed to reload extensions")}})}return u?e.jsx("div",{className:"text-muted-foreground py-8 text-center text-sm",children:"Loading extensions…"}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-muted-foreground text-sm",children:["Extensions add new UI and capabilities to DorkOS. Place them in"," ",e.jsx("code",{className:"bg-muted rounded px-1",children:"~/.dork/extensions/"})," or"," ",e.jsx("code",{className:"bg-muted rounded px-1",children:".dork/extensions/"})," in your project."]}),o.length===0?e.jsx("div",{className:"text-muted-foreground py-8 text-center text-sm","data-testid":"no-extensions",children:e.jsx("p",{children:"No extensions installed."})}):e.jsx("div",{className:"space-y-3",children:o.map(a=>e.jsx(I,{extension:a,onToggle:n,isToggling:h.has(a.id)},a.id))}),e.jsx("div",{className:"flex justify-end",children:e.jsxs(R,{variant:"outline",size:"sm",onClick:r,disabled:t.isPending,"data-testid":"reload-extensions-button",children:[e.jsx(z,{className:g("mr-2 size-4",t.isPending&&"animate-spin")}),"Reload Extensions"]})})]})}export{M as ExtensionLoader,_ as ExtensionProvider,A as ExtensionsSettingsTab,H as createExtensionAPI,B as useExtensions};
1
+ import{r as b,j as e,T as f,C as v,P as N,a as E,c as g,b as k,S,u as w,d as y,e as C,f as T,g as R,h as z,t as m}from"./index-PgrCLMKB.js";import{E as M,i as _,k as H,l as B}from"./index-PgrCLMKB.js";const P=new Set(["disabled","discovered","incompatible","invalid"]);function I({extension:o,onToggle:u,isToggling:c}){const{manifest:s,status:t,scope:h,error:n}=o,[r,a]=b.useState(!1),x=!P.has(t),d=t==="incompatible",l=t==="invalid",i=t==="compile_error"||t==="activate_error",j=!d&&!l;return e.jsx("div",{"data-slot":"extension-card","data-testid":`extension-card-${o.id}`,className:g("bg-card rounded-xl border p-4",i&&"border-amber-500/50",(d||l)&&"opacity-70"),children:e.jsxs("div",{className:"flex items-start justify-between gap-4",children:[e.jsxs("div",{className:"min-w-0 flex-1 space-y-1.5",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[i&&e.jsx(f,{className:"size-4 shrink-0 text-amber-500","aria-hidden":"true"}),(d||l)&&!i&&e.jsx(v,{className:"text-muted-foreground size-4 shrink-0","aria-hidden":"true"}),!i&&!d&&!l&&e.jsx(N,{className:"text-muted-foreground size-4 shrink-0","aria-hidden":"true"}),e.jsx("span",{className:"font-medium",children:s.name}),e.jsxs("span",{className:"text-muted-foreground text-sm",children:["v",s.version]})]}),s.description&&e.jsx("p",{className:"text-muted-foreground text-sm",children:s.description}),d&&s.minHostVersion&&e.jsxs("p",{className:"text-muted-foreground text-sm",children:["Requires DorkOS >= ",s.minHostVersion]}),i&&n&&e.jsxs("div",{className:"space-y-1",children:[e.jsxs("p",{className:"text-sm text-amber-600 dark:text-amber-400",children:[t==="compile_error"?"Compilation error: ":"Activation failed: ",n.message]}),n.details&&e.jsxs("button",{type:"button",onClick:()=>a(p=>!p),className:"text-muted-foreground hover:text-foreground flex items-center gap-1 text-xs transition-colors","aria-expanded":r,children:[e.jsx(E,{className:g("size-3 transition-transform",r&&"rotate-180")}),r?"Hide details":"Show details"]}),r&&n.details&&e.jsx("pre",{className:"bg-muted mt-1 max-h-32 overflow-auto rounded-md p-2 text-xs",children:n.details})]}),e.jsxs("div",{className:"text-muted-foreground flex flex-wrap items-center gap-2 text-xs",children:[e.jsx(k,{variant:"outline",className:"text-xs",children:h}),s.author&&e.jsx("span",{children:s.author})]})]}),e.jsx("div",{className:"pt-0.5",children:e.jsx(S,{checked:x,onCheckedChange:p=>u(o.id,p),disabled:!j||c,"aria-label":`${x?"Disable":"Enable"} ${s.name}`})})]})})}function A(){const{data:o=[],isLoading:u}=w(),c=y(),s=C(),t=T(),h=new Set([...c.variables?[c.variables]:[],...s.variables?[s.variables]:[]]);async function n(a,x){(x?c:s).mutate(a,{onSuccess:()=>{m.info("Extension changed — reload the page to apply",{action:{label:"Reload now",onClick:()=>location.reload()}})},onError:l=>{const i=x?"enable":"disable";m.error(`Failed to ${i} extension: ${l.message}`)}})}function r(){t.mutate(void 0,{onSuccess:a=>{m.success(`Reloaded ${a.length} extension(s)`)},onError:()=>{m.error("Failed to reload extensions")}})}return u?e.jsx("div",{className:"text-muted-foreground py-8 text-center text-sm",children:"Loading extensions…"}):e.jsxs("div",{className:"space-y-4",children:[e.jsxs("p",{className:"text-muted-foreground text-sm",children:["Extensions add new UI and capabilities to DorkOS. Place them in"," ",e.jsx("code",{className:"bg-muted rounded px-1",children:"~/.dork/extensions/"})," or"," ",e.jsx("code",{className:"bg-muted rounded px-1",children:".dork/extensions/"})," in your project."]}),o.length===0?e.jsx("div",{className:"text-muted-foreground py-8 text-center text-sm","data-testid":"no-extensions",children:e.jsx("p",{children:"No extensions installed."})}):e.jsx("div",{className:"space-y-3",children:o.map(a=>e.jsx(I,{extension:a,onToggle:n,isToggling:h.has(a.id)},a.id))}),e.jsx("div",{className:"flex justify-end",children:e.jsxs(R,{variant:"outline",size:"sm",onClick:r,disabled:t.isPending,"data-testid":"reload-extensions-button",children:[e.jsx(z,{className:g("mr-2 size-4",t.isPending&&"animate-spin")}),"Reload Extensions"]})})]})}export{M as ExtensionLoader,_ as ExtensionProvider,A as ExtensionsSettingsTab,H as createExtensionAPI,B as useExtensions};
@@ -1,4 +1,4 @@
1
- var xt=Object.defineProperty;var wt=(e,n,i)=>n in e?xt(e,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[n]=i;var N=(e,n,i)=>wt(e,typeof n!="symbol"?n+"":n,i);import{m as bt,j as v,r as ee}from"./index-C6kLRUkB.js";var on={exports:{}};/*!
1
+ var xt=Object.defineProperty;var wt=(e,n,i)=>n in e?xt(e,n,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[n]=i;var N=(e,n,i)=>wt(e,typeof n!="symbol"?n+"":n,i);import{m as bt,j as v,r as ee}from"./index-PgrCLMKB.js";var on={exports:{}};/*!
2
2
  Copyright (c) 2018 Jed Watson.
3
3
  Licensed under the MIT License (MIT), see
4
4
  http://jedwatson.github.io/classnames