zora-agent 0.9.4 → 0.9.6
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/CHANGELOG.md +1 -1
- package/README.md +103 -92
- package/dist/cli/audit-commands.d.ts.map +1 -1
- package/dist/cli/audit-commands.js +3 -1
- package/dist/cli/audit-commands.js.map +1 -1
- package/dist/cli/daemon.js +86 -28
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/edit-commands.d.ts.map +1 -1
- package/dist/cli/edit-commands.js +3 -1
- package/dist/cli/edit-commands.js.map +1 -1
- package/dist/cli/hook-commands.d.ts +9 -0
- package/dist/cli/hook-commands.d.ts.map +1 -0
- package/dist/cli/hook-commands.js +106 -0
- package/dist/cli/hook-commands.js.map +1 -0
- package/dist/cli/index.js +87 -35
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init-command.d.ts.map +1 -1
- package/dist/cli/init-command.js +108 -9
- package/dist/cli/init-command.js.map +1 -1
- package/dist/cli/memory-commands.d.ts +1 -1
- package/dist/cli/memory-commands.d.ts.map +1 -1
- package/dist/cli/memory-commands.js +213 -1
- package/dist/cli/memory-commands.js.map +1 -1
- package/dist/cli/presets.d.ts.map +1 -1
- package/dist/cli/presets.js +2 -1
- package/dist/cli/presets.js.map +1 -1
- package/dist/cli/skill-commands.d.ts.map +1 -1
- package/dist/cli/skill-commands.js +4 -2
- package/dist/cli/skill-commands.js.map +1 -1
- package/dist/cli/steer-commands.d.ts.map +1 -1
- package/dist/cli/steer-commands.js +6 -4
- package/dist/cli/steer-commands.js.map +1 -1
- package/dist/cli/team-commands.d.ts.map +1 -1
- package/dist/cli/team-commands.js +3 -1
- package/dist/cli/team-commands.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +12 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/loader.d.ts +23 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +64 -3
- package/dist/config/loader.js.map +1 -1
- package/dist/config/policy-loader.d.ts +14 -0
- package/dist/config/policy-loader.d.ts.map +1 -1
- package/dist/config/policy-loader.js +33 -0
- package/dist/config/policy-loader.js.map +1 -1
- package/dist/dashboard/frontend/dist/assets/index-BcOGj1EF.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-BtiFO9YN.js +261 -0
- package/dist/dashboard/frontend/dist/assets/index-Cfjy5acU.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-D41hcjgc.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-D83BawFd.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DAODjoxu.css +1 -0
- package/dist/dashboard/frontend/dist/assets/index-DB-Eu5oV.js +253 -0
- package/dist/dashboard/frontend/dist/assets/index-W0VVEDu6.js +253 -0
- package/dist/dashboard/frontend/dist/index.html +17 -0
- package/dist/dashboard/server.d.ts +19 -2
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +121 -20
- package/dist/dashboard/server.js.map +1 -1
- package/dist/hooks/hook-runner.d.ts +55 -0
- package/dist/hooks/hook-runner.d.ts.map +1 -0
- package/dist/hooks/hook-runner.js +120 -0
- package/dist/hooks/hook-runner.js.map +1 -0
- package/dist/hooks/hook-types.d.ts +82 -0
- package/dist/hooks/hook-types.d.ts.map +1 -0
- package/dist/hooks/hook-types.js +20 -0
- package/dist/hooks/hook-types.js.map +1 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/memory/context-compressor.d.ts +108 -0
- package/dist/memory/context-compressor.d.ts.map +1 -0
- package/dist/memory/context-compressor.js +307 -0
- package/dist/memory/context-compressor.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/memory-manager.d.ts +88 -4
- package/dist/memory/memory-manager.d.ts.map +1 -1
- package/dist/memory/memory-manager.js +299 -7
- package/dist/memory/memory-manager.js.map +1 -1
- package/dist/memory/observation-store.d.ts +75 -0
- package/dist/memory/observation-store.d.ts.map +1 -0
- package/dist/memory/observation-store.js +162 -0
- package/dist/memory/observation-store.js.map +1 -0
- package/dist/memory/observer-worker.d.ts +34 -0
- package/dist/memory/observer-worker.d.ts.map +1 -0
- package/dist/memory/observer-worker.js +161 -0
- package/dist/memory/observer-worker.js.map +1 -0
- package/dist/memory/reflector-worker.d.ts +40 -0
- package/dist/memory/reflector-worker.d.ts.map +1 -0
- package/dist/memory/reflector-worker.js +185 -0
- package/dist/memory/reflector-worker.js.map +1 -0
- package/dist/memory/salience-scorer.d.ts +16 -6
- package/dist/memory/salience-scorer.d.ts.map +1 -1
- package/dist/memory/salience-scorer.js +42 -22
- package/dist/memory/salience-scorer.js.map +1 -1
- package/dist/memory/structured-memory.d.ts +36 -1
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +207 -8
- package/dist/memory/structured-memory.js.map +1 -1
- package/dist/memory/token-estimator.d.ts +31 -0
- package/dist/memory/token-estimator.d.ts.map +1 -0
- package/dist/memory/token-estimator.js +77 -0
- package/dist/memory/token-estimator.js.map +1 -0
- package/dist/memory/validation-pipeline.d.ts +37 -0
- package/dist/memory/validation-pipeline.d.ts.map +1 -0
- package/dist/memory/validation-pipeline.js +106 -0
- package/dist/memory/validation-pipeline.js.map +1 -0
- package/dist/orchestrator/auth-monitor.d.ts.map +1 -1
- package/dist/orchestrator/auth-monitor.js +3 -1
- package/dist/orchestrator/auth-monitor.js.map +1 -1
- package/dist/orchestrator/execution-loop.d.ts +23 -0
- package/dist/orchestrator/execution-loop.d.ts.map +1 -1
- package/dist/orchestrator/execution-loop.js +60 -19
- package/dist/orchestrator/execution-loop.js.map +1 -1
- package/dist/orchestrator/failover-controller.d.ts +26 -2
- package/dist/orchestrator/failover-controller.d.ts.map +1 -1
- package/dist/orchestrator/failover-controller.js +143 -23
- package/dist/orchestrator/failover-controller.js.map +1 -1
- package/dist/orchestrator/orchestrator.d.ts +70 -7
- package/dist/orchestrator/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator.js +416 -92
- package/dist/orchestrator/orchestrator.js.map +1 -1
- package/dist/orchestrator/retry-queue.d.ts.map +1 -1
- package/dist/orchestrator/retry-queue.js +24 -9
- package/dist/orchestrator/retry-queue.js.map +1 -1
- package/dist/orchestrator/router.d.ts +16 -1
- package/dist/orchestrator/router.d.ts.map +1 -1
- package/dist/orchestrator/router.js +79 -20
- package/dist/orchestrator/router.js.map +1 -1
- package/dist/orchestrator/session-manager.d.ts +26 -1
- package/dist/orchestrator/session-manager.d.ts.map +1 -1
- package/dist/orchestrator/session-manager.js +88 -4
- package/dist/orchestrator/session-manager.js.map +1 -1
- package/dist/providers/circuit-breaker.d.ts +78 -0
- package/dist/providers/circuit-breaker.d.ts.map +1 -0
- package/dist/providers/circuit-breaker.js +129 -0
- package/dist/providers/circuit-breaker.js.map +1 -0
- package/dist/providers/claude-provider.d.ts +27 -11
- package/dist/providers/claude-provider.d.ts.map +1 -1
- package/dist/providers/claude-provider.js +161 -46
- package/dist/providers/claude-provider.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +9 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +97 -48
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +1 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts +7 -0
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +89 -18
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/routines/heartbeat.d.ts +10 -2
- package/dist/routines/heartbeat.d.ts.map +1 -1
- package/dist/routines/heartbeat.js +42 -5
- package/dist/routines/heartbeat.js.map +1 -1
- package/dist/routines/routine-manager.d.ts.map +1 -1
- package/dist/routines/routine-manager.js +22 -15
- package/dist/routines/routine-manager.js.map +1 -1
- package/dist/security/audit-logger.d.ts.map +1 -1
- package/dist/security/audit-logger.js +5 -7
- package/dist/security/audit-logger.js.map +1 -1
- package/dist/security/policy-engine.d.ts +28 -17
- package/dist/security/policy-engine.d.ts.map +1 -1
- package/dist/security/policy-engine.js +42 -185
- package/dist/security/policy-engine.js.map +1 -1
- package/dist/security/policy-serializer.d.ts +19 -0
- package/dist/security/policy-serializer.d.ts.map +1 -0
- package/dist/security/policy-serializer.js +100 -0
- package/dist/security/policy-serializer.js.map +1 -0
- package/dist/security/shell-validator.d.ts +42 -0
- package/dist/security/shell-validator.d.ts.map +1 -0
- package/dist/security/shell-validator.js +231 -0
- package/dist/security/shell-validator.js.map +1 -0
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-loader.d.ts +38 -2
- package/dist/skills/skill-loader.d.ts.map +1 -1
- package/dist/skills/skill-loader.js +83 -2
- package/dist/skills/skill-loader.js.map +1 -1
- package/dist/skills/subagent-loader.d.ts +66 -0
- package/dist/skills/subagent-loader.d.ts.map +1 -0
- package/dist/skills/subagent-loader.js +143 -0
- package/dist/skills/subagent-loader.js.map +1 -0
- package/dist/steering/flag-manager.d.ts +20 -0
- package/dist/steering/flag-manager.d.ts.map +1 -1
- package/dist/steering/flag-manager.js +94 -11
- package/dist/steering/flag-manager.js.map +1 -1
- package/dist/steering/steering-manager.d.ts +11 -0
- package/dist/steering/steering-manager.d.ts.map +1 -1
- package/dist/steering/steering-manager.js +23 -0
- package/dist/steering/steering-manager.js.map +1 -1
- package/dist/steering/telegram-gateway.d.ts +4 -1
- package/dist/steering/telegram-gateway.d.ts.map +1 -1
- package/dist/steering/telegram-gateway.js +49 -10
- package/dist/steering/telegram-gateway.js.map +1 -1
- package/dist/teams/bridge-watchdog.d.ts.map +1 -1
- package/dist/teams/bridge-watchdog.js +5 -3
- package/dist/teams/bridge-watchdog.js.map +1 -1
- package/dist/teams/gemini-bridge.d.ts.map +1 -1
- package/dist/teams/gemini-bridge.js +9 -4
- package/dist/teams/gemini-bridge.js.map +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +16 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +207 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +3 -1
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/tool-factory.d.ts +36 -0
- package/dist/tools/tool-factory.d.ts.map +1 -0
- package/dist/tools/tool-factory.js +55 -0
- package/dist/tools/tool-factory.js.map +1 -0
- package/dist/types.d.ts +205 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +47 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +29 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/event-filter.d.ts +25 -0
- package/dist/utils/event-filter.d.ts.map +1 -0
- package/dist/utils/event-filter.js +61 -0
- package/dist/utils/event-filter.js.map +1 -0
- package/dist/utils/logger.d.ts +33 -36
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +60 -130
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/validate-job-id.d.ts +6 -0
- package/dist/utils/validate-job-id.d.ts.map +1 -0
- package/dist/utils/validate-job-id.js +10 -0
- package/dist/utils/validate-job-id.js.map +1 -0
- package/package.json +12 -3
package/CHANGELOG.md
CHANGED
|
@@ -118,7 +118,7 @@ This release addresses critical security gaps identified in a comprehensive audi
|
|
|
118
118
|
- Routine manager with TOML-defined tasks and node-cron scheduling
|
|
119
119
|
- Heartbeat system with markdown task parsing and completion marking
|
|
120
120
|
- Event trigger manager with fs.stat polling and glob pattern matching
|
|
121
|
-
- Dashboard server on localhost:
|
|
121
|
+
- Dashboard server on localhost:8070 with Express, steering API, and health endpoint
|
|
122
122
|
- Auth middleware with timing-safe Bearer token comparison
|
|
123
123
|
- Skill loader for dynamic ~/.claude/skills/ discovery
|
|
124
124
|
- CLI with `ask`, `status`, `start`, `stop` commands plus memory, audit, edit, team, steer, and skill subcommands
|
package/README.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-

|
|
2
2
|
|
|
3
3
|
# Zora
|
|
4
4
|
|
|
5
|
-
**
|
|
5
|
+
**Your personal AI assistant that actually does things.** Tell it what you need in plain English — organize files, summarize documents, automate repetitive tasks — and it handles it while you do something else.
|
|
6
|
+
|
|
7
|
+
Unlike chatbots that just talk, Zora runs on your computer and takes action. It reads files, runs commands, remembers your preferences, and works within safety boundaries you control.
|
|
6
8
|
|
|
7
9
|
---
|
|
8
10
|
|
|
9
|
-

|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## Get Started in 5 Minutes
|
|
12
14
|
|
|
13
15
|
```bash
|
|
14
16
|
npm i -g zora-agent
|
|
@@ -16,135 +18,144 @@ zora-agent init
|
|
|
16
18
|
zora-agent ask "summarize files in ~/Projects"
|
|
17
19
|
```
|
|
18
20
|
|
|
19
|
-
That's it. Three commands
|
|
21
|
+
That's it. Three commands and Zora is working for you.
|
|
22
|
+
|
|
23
|
+
> **Note:** The npm package may lag behind the latest release. To install from source: `git clone https://github.com/ryaker/zora && cd zora && npm install && npm link`
|
|
24
|
+
|
|
25
|
+
**New to the terminal?** See our [step-by-step Setup Guide](SETUP_GUIDE.md) — it assumes zero technical experience.
|
|
20
26
|
|
|
21
27
|
---
|
|
22
28
|
|
|
23
|
-

|
|
30
|
+
|
|
31
|
+
## How Does It Work?
|
|
24
32
|
|
|
25
|
-
|
|
33
|
+
You type a request. Zora figures out what needs to happen, does it, and shows you the result.
|
|
26
34
|
|
|
27
|
-
|
|
35
|
+
Behind the scenes, Zora uses AI (Claude or Gemini) to understand your request, then uses tools on your computer — reading files, running safe commands, searching the web — to complete the task. Everything stays within safety rules you set up during installation.
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
**No API keys. No surprise bills.** Zora authenticates through your existing Claude Code or Gemini CLI session. No per-token charges — it uses the subscription you already pay for.
|
|
30
38
|
|
|
31
|
-
|
|
39
|
+
---
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+

|
|
34
42
|
|
|
35
|
-
|
|
43
|
+
## What Can Zora Do?
|
|
36
44
|
|
|
37
|
-
|
|
45
|
+
Here are real things you can ask Zora right now:
|
|
38
46
|
|
|
39
|
-
|
|
47
|
+
- **"Sort my Downloads folder by type and archive anything older than 30 days"** — File organization on autopilot
|
|
48
|
+
- **"Find all TODO comments in my project and create a summary"** — Code analysis in seconds
|
|
49
|
+
- **"Draft a changelog from my last 10 commits"** — Content generation with context
|
|
50
|
+
- **"What changed in my repos this week? Give me a summary"** — Stay on top of your work
|
|
51
|
+
- **"Find and summarize the latest React 19 migration guides"** — Research without tab-hopping
|
|
40
52
|
|
|
41
|
-
|
|
42
|
-
- **Code review** — `zora-agent ask "Check all PRs in my repos and comment on style issues"`
|
|
43
|
-
- **Email drafting** — `zora-agent ask "Draft replies to unread emails about the product launch"`
|
|
44
|
-
- **Git management** — `zora-agent ask "Create feature branches from all open issues labeled 'sprint-12'"`
|
|
45
|
-
- **Web research** — `zora-agent ask "Find and summarize the latest React 19 migration guides"`
|
|
46
|
-
- **Multi-step workflows** — `zora-agent ask "Find all TODOs in my project, create a summary, and open a GitHub issue with it."`
|
|
53
|
+
Zora remembers your preferences across sessions. Tell it once that you prefer TypeScript over JavaScript, and it remembers forever.
|
|
47
54
|
|
|
48
55
|
---
|
|
49
56
|
|
|
50
|
-

|
|
58
|
+
|
|
59
|
+
## Is It Safe?
|
|
51
60
|
|
|
52
|
-
|
|
61
|
+
Yes. Zora was built with safety as a core feature, not an afterthought.
|
|
53
62
|
|
|
54
|
-
|
|
63
|
+
**You're always in control.** During setup, you choose what Zora can and can't do:
|
|
55
64
|
|
|
56
|
-
**
|
|
65
|
+
- **Which folders** it can access (and which are off-limits, like your SSH keys)
|
|
66
|
+
- **Which commands** it can run (safe ones like `git` and `ls`, never destructive ones like `sudo`)
|
|
67
|
+
- **How much autonomy** it gets — from "ask me before doing anything" to "handle it yourself"
|
|
57
68
|
|
|
58
|
-
|
|
59
|
-
|---------|-------------|
|
|
60
|
-
| **Action Budgets** | Per-session limits on tool invocations and token spend prevent unbounded loops |
|
|
61
|
-
| **Dry-Run Mode** | Preview write operations without executing — test policies safely |
|
|
62
|
-
| **Intent Capsules** | HMAC-SHA256 signed mandates detect goal hijacking from injected instructions |
|
|
63
|
-
| **RAG Injection Defense** | 20+ patterns detect prompt injection in tool outputs and RAG documents |
|
|
64
|
-
| **Hash-Chain Audit** | SHA-256 chained append-only log with tamper detection |
|
|
65
|
-
| **AES-256-GCM Secrets** | Encrypted credential storage with PBKDF2 key derivation |
|
|
69
|
+
Every action Zora takes is recorded in a tamper-proof audit log you can review anytime. If something looks wrong, you'll know exactly what happened and when.
|
|
66
70
|
|
|
67
|
-
See
|
|
71
|
+
For the security-minded: Zora is hardened against the [OWASP LLM Top 10](https://owasp.org/www-project-top-10-for-large-language-model-applications/) and [OWASP Agentic Top 10](https://owasp.org/www-project-agentic-ai-threats/). See [SECURITY.md](SECURITY.md) for the full technical breakdown.
|
|
68
72
|
|
|
69
73
|
---
|
|
70
74
|
|
|
71
|
-

|
|
72
76
|
|
|
73
|
-
##
|
|
77
|
+
## The Dashboard
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
│ Retry Queue │ Session Manager │
|
|
80
|
-
├─────────────────────────────────────────────────┤
|
|
81
|
-
│ LLM PROVIDER REGISTRY │
|
|
82
|
-
│ Claude Opus/Sonnet/Haiku │ Gemini │ Ollama │
|
|
83
|
-
│ Agent SDK (Native) CLI (Sub) REST (Local) │
|
|
84
|
-
├─────────────────────────────────────────────────┤
|
|
85
|
-
│ Tools │ Memory │ Security │
|
|
86
|
-
│ Shell │ MEMORY.md │ Policy Engine │
|
|
87
|
-
│ Filesystem │ Daily Notes │ Audit Log │
|
|
88
|
-
│ Web │ Context Loader │ Restrictive FS │
|
|
89
|
-
└─────────────────────────────────────────────────┘
|
|
79
|
+
Zora includes a local web dashboard where you can watch tasks happen in real time, check on your AI providers, and send course-corrections to running jobs.
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
zora-agent start
|
|
90
83
|
```
|
|
91
84
|
|
|
85
|
+
Your browser opens automatically to `http://localhost:8070`. First-time users see a guided welcome screen with ready-to-go task templates.
|
|
86
|
+
|
|
92
87
|
---
|
|
93
88
|
|
|
94
|
-

|
|
95
90
|
|
|
96
|
-
##
|
|
91
|
+
## Multiple AI Brains, One Interface
|
|
97
92
|
|
|
98
|
-
Zora
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
| Action budgets (per-session + per-type limits) | ✅ Working |
|
|
106
|
-
| Dry-run preview mode (test without executing) | ✅ Working |
|
|
107
|
-
| Intent capsules (HMAC-SHA256 goal drift detection) | ✅ Working |
|
|
108
|
-
| RAG/tool-output injection defense (20+ patterns) | ✅ Working |
|
|
109
|
-
| Policy-aware agent (checks permissions before acting) | ✅ Working |
|
|
110
|
-
| SOUL.md personality loading | ✅ Working |
|
|
111
|
-
| Hierarchical memory (long-term + daily notes) | ✅ Working |
|
|
112
|
-
| Scheduled routines via cron | ✅ Working |
|
|
113
|
-
| Web dashboard with live SSE feed, task submission, and onboarding | ✅ Working |
|
|
114
|
-
| Provider quota/usage tracking in dashboard | ✅ Working |
|
|
115
|
-
| Cost-aware routing via `--max-cost-tier` | ✅ Working |
|
|
116
|
-
| Manual routine execution (`runRoutine()`) | ✅ Working |
|
|
117
|
-
| Persistent retry queue with backoff | ✅ Working |
|
|
118
|
-
| Docker containerization for integration testing | ✅ Working |
|
|
119
|
-
| Interactive approval for flagged actions (`always_flag`) | 🚧 Config parsed, enforcement in progress |
|
|
120
|
-
| Runtime permission expansion (grant access mid-task) | 🚧 Planned |
|
|
121
|
-
| Cross-platform support (macOS, Linux, Windows) | 🚧 macOS tested, others in progress |
|
|
93
|
+
Zora works with multiple AI providers and picks the best one for each task:
|
|
94
|
+
|
|
95
|
+
- **Claude** (primary) — Deep reasoning, coding, creative work
|
|
96
|
+
- **Gemini** (backup) — Search, large documents, structured data
|
|
97
|
+
- **Ollama** (optional, local) — Zero-cost, fully offline, complete privacy
|
|
98
|
+
|
|
99
|
+
If one provider is unavailable, Zora automatically fails over to the next one. You never have to manage this yourself.
|
|
122
100
|
|
|
123
101
|
---
|
|
124
102
|
|
|
125
|
-

|
|
104
|
+
|
|
105
|
+
## Scheduled Tasks
|
|
126
106
|
|
|
127
|
-
|
|
107
|
+
Set up recurring tasks that run automatically:
|
|
128
108
|
|
|
129
|
-
|
|
109
|
+
- "Every morning at 8am, check for new issues assigned to me"
|
|
110
|
+
- "Every Friday, generate a weekly project report"
|
|
111
|
+
- "Every night, check for outdated dependencies"
|
|
130
112
|
|
|
131
|
-
|
|
113
|
+
See the [Routines Cookbook](ROUTINES_COOKBOOK.md) for templates.
|
|
132
114
|
|
|
133
115
|
---
|
|
134
116
|
|
|
135
|
-

|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+

|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+

|
|
136
126
|
|
|
137
127
|
## Documentation
|
|
138
128
|
|
|
139
|
-
|
|
|
140
|
-
|
|
141
|
-
| **[
|
|
142
|
-
| **[
|
|
143
|
-
| **[
|
|
144
|
-
| **[
|
|
145
|
-
| **[
|
|
146
|
-
| **[
|
|
147
|
-
| **[
|
|
129
|
+
| Guide | Who It's For |
|
|
130
|
+
|-------|-------------|
|
|
131
|
+
| **[Quick Start](QUICKSTART.md)** | Get running in 5 minutes (some terminal comfort) |
|
|
132
|
+
| **[Setup Guide](SETUP_GUIDE.md)** | Complete walkthrough for first-time users |
|
|
133
|
+
| **[What Is Zora?](WHAT_IS_ZORA.md)** | Plain-English explainer for non-technical users |
|
|
134
|
+
| **[FAQ](FAQ.md)** | Common questions answered simply |
|
|
135
|
+
| **[Use Cases](USE_CASES.md)** | Real-world examples and workflow ideas |
|
|
136
|
+
| **[Security Guide](SECURITY.md)** | How the safety system works (technical) |
|
|
137
|
+
| **[Routines Cookbook](ROUTINES_COOKBOOK.md)** | Templates for scheduled tasks |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+

|
|
142
|
+
|
|
143
|
+
## Project Status
|
|
144
|
+
|
|
145
|
+
Zora is in active development (v0.9.6). The core features work reliably today.
|
|
146
|
+
|
|
147
|
+
| Feature | Status |
|
|
148
|
+
|---------|--------|
|
|
149
|
+
| Task execution via Claude and Gemini | ✅ Working |
|
|
150
|
+
| Automatic failover between providers | ✅ Working |
|
|
151
|
+
| Safety system (file/command/network boundaries) | ✅ Working |
|
|
152
|
+
| Long-term memory across sessions | ✅ Working |
|
|
153
|
+
| Web dashboard with live monitoring | ✅ Working |
|
|
154
|
+
| Scheduled routines (cron-based) | ✅ Working |
|
|
155
|
+
| Failed task retry with backoff | ✅ Working |
|
|
156
|
+
| Cross-platform (macOS, Linux, Windows) | 🚧 macOS tested, others in progress |
|
|
157
|
+
|
|
158
|
+
---
|
|
148
159
|
|
|
149
160
|
## Contributing
|
|
150
161
|
|
|
@@ -152,8 +163,8 @@ Contributions are welcome. Open an issue to discuss features or bugs before subm
|
|
|
152
163
|
|
|
153
164
|
## License
|
|
154
165
|
|
|
155
|
-
MIT License
|
|
166
|
+
MIT License — see [LICENSE](LICENSE) for details.
|
|
156
167
|
|
|
157
168
|
---
|
|
158
169
|
|
|
159
|
-
*Local first. Works for you.*
|
|
170
|
+
*Local first. No surprise bills. Works for you.*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,MAAM,MAAM,GAC5B,IAAI,CA6CN"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Spec §5.9 "CLI Interface" — audit subcommand.
|
|
5
5
|
*/
|
|
6
6
|
import { AuditLogger } from '../security/audit-logger.js';
|
|
7
|
+
import { createLogger } from '../utils/logger.js';
|
|
8
|
+
const log = createLogger('audit-commands');
|
|
7
9
|
function parseDuration(duration) {
|
|
8
10
|
const match = /^(\d+)(h|d|m)$/.exec(duration);
|
|
9
11
|
if (!match)
|
|
@@ -37,7 +39,7 @@ export function registerAuditCommands(program, getAuditLogPath) {
|
|
|
37
39
|
console.log(`Audit chain verified: ${result.entries} entries, all valid.`);
|
|
38
40
|
}
|
|
39
41
|
else {
|
|
40
|
-
|
|
42
|
+
log.error({ brokenAt: result.brokenAt, reason: result.reason }, 'Audit chain BROKEN');
|
|
41
43
|
process.exitCode = 1;
|
|
42
44
|
}
|
|
43
45
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-commands.js","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"audit-commands.js","sourceRoot":"","sources":["../../src/cli/audit-commands.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/daemon.js
CHANGED
|
@@ -8,12 +8,17 @@
|
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import os from 'node:os';
|
|
10
10
|
import fs from 'node:fs';
|
|
11
|
-
import
|
|
11
|
+
import crypto from 'node:crypto';
|
|
12
|
+
import { resolveConfig } from '../config/loader.js';
|
|
13
|
+
import { resolvePolicy } from '../config/policy-loader.js';
|
|
12
14
|
import { Orchestrator } from '../orchestrator/orchestrator.js';
|
|
13
15
|
import { DashboardServer } from '../dashboard/server.js';
|
|
14
16
|
import { ClaudeProvider } from '../providers/claude-provider.js';
|
|
15
17
|
import { GeminiProvider } from '../providers/gemini-provider.js';
|
|
16
18
|
import { OllamaProvider } from '../providers/ollama-provider.js';
|
|
19
|
+
import { createLogger } from '../utils/logger.js';
|
|
20
|
+
import { TelegramGateway } from '../steering/telegram-gateway.js';
|
|
21
|
+
const log = createLogger('daemon');
|
|
17
22
|
function createProviders(config) {
|
|
18
23
|
const providers = [];
|
|
19
24
|
for (const pConfig of config.providers) {
|
|
@@ -34,26 +39,35 @@ function createProviders(config) {
|
|
|
34
39
|
return providers;
|
|
35
40
|
}
|
|
36
41
|
async function main() {
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
// Resolve project directory from env (set by CLI start command) or cwd
|
|
43
|
+
const projectDir = process.env.ZORA_PROJECT_DIR ?? process.cwd();
|
|
44
|
+
// Three-layer config resolution: defaults → global → project
|
|
45
|
+
let config;
|
|
46
|
+
let sources;
|
|
47
|
+
try {
|
|
48
|
+
const resolved = await resolveConfig({ projectDir });
|
|
49
|
+
config = resolved.config;
|
|
50
|
+
sources = resolved.sources;
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
log.error({ err }, 'Config resolution failed. Run `zora-agent init` first.');
|
|
42
54
|
process.exit(1);
|
|
43
55
|
}
|
|
44
|
-
|
|
45
|
-
//
|
|
46
|
-
const { loadPolicy } = await import('../config/policy-loader.js');
|
|
56
|
+
log.info({ sources }, 'Config resolved');
|
|
57
|
+
// Two-layer policy resolution: global → project
|
|
47
58
|
let policy;
|
|
48
59
|
try {
|
|
49
|
-
policy = await
|
|
60
|
+
policy = await resolvePolicy({ projectDir });
|
|
50
61
|
}
|
|
51
62
|
catch {
|
|
52
|
-
|
|
63
|
+
log.error('Policy not found at ~/.zora/policy.toml. Run `zora-agent init` first.');
|
|
53
64
|
process.exit(1);
|
|
54
65
|
}
|
|
66
|
+
// Determine baseDir: project .zora/ if it exists, else global
|
|
67
|
+
const projectZora = path.join(projectDir, '.zora');
|
|
68
|
+
const configDir = fs.existsSync(projectZora) ? projectZora : path.join(os.homedir(), '.zora');
|
|
55
69
|
const providers = createProviders(config);
|
|
56
|
-
const orchestrator = new Orchestrator({ config, policy, providers });
|
|
70
|
+
const orchestrator = new Orchestrator({ config, policy, providers, baseDir: configDir });
|
|
57
71
|
await orchestrator.boot();
|
|
58
72
|
// Start dashboard server
|
|
59
73
|
const dashboard = new DashboardServer({
|
|
@@ -63,31 +77,48 @@ async function main() {
|
|
|
63
77
|
authMonitor: orchestrator.authMonitor,
|
|
64
78
|
submitTask: async (prompt) => {
|
|
65
79
|
// Generate jobId immediately and kick off task in background (don't await)
|
|
66
|
-
const jobId = `job_${
|
|
80
|
+
const jobId = `job_${crypto.randomUUID()}`;
|
|
67
81
|
orchestrator.submitTask({ prompt, jobId, onEvent: (event) => {
|
|
68
82
|
dashboard.broadcastEvent({ type: event.type, data: event.content });
|
|
69
83
|
} }).catch(err => {
|
|
70
|
-
|
|
84
|
+
log.error({ jobId, err }, 'Task failed');
|
|
71
85
|
dashboard.broadcastEvent({ type: 'job_failed', data: { jobId, error: err instanceof Error ? err.message : String(err) } });
|
|
72
86
|
});
|
|
73
87
|
return jobId;
|
|
74
88
|
},
|
|
75
|
-
port: config.steering.dashboard_port ??
|
|
89
|
+
port: config.steering.dashboard_port ?? 8070,
|
|
76
90
|
host: process.env.ZORA_BIND_HOST,
|
|
77
91
|
});
|
|
78
92
|
await dashboard.start();
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
93
|
+
// Initialize Telegram gateway if enabled and configured
|
|
94
|
+
let telegramGateway;
|
|
95
|
+
const telegramConfig = config.steering.telegram;
|
|
96
|
+
if (telegramConfig?.enabled) {
|
|
97
|
+
const token = telegramConfig.bot_token || process.env.TELEGRAM_BOT_TOKEN;
|
|
98
|
+
if (!token) {
|
|
99
|
+
log.warn('Telegram enabled but no bot_token configured and TELEGRAM_BOT_TOKEN not set. Skipping.');
|
|
86
100
|
}
|
|
87
|
-
|
|
88
|
-
|
|
101
|
+
else {
|
|
102
|
+
log.warn('Telegram: Ensure you are using a dedicated bot token for this Zora instance. ' +
|
|
103
|
+
'Sharing a bot token across multiple processes causes polling conflicts and lost messages.');
|
|
104
|
+
try {
|
|
105
|
+
const fullTelegramConfig = {
|
|
106
|
+
...config.steering,
|
|
107
|
+
...telegramConfig,
|
|
108
|
+
bot_token: token,
|
|
109
|
+
};
|
|
110
|
+
telegramGateway = await TelegramGateway.create(fullTelegramConfig, orchestrator.steeringManager);
|
|
111
|
+
log.info({ mode: telegramConfig.mode ?? 'polling' }, 'Telegram gateway started');
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
log.error({ err }, 'Failed to start Telegram gateway');
|
|
115
|
+
}
|
|
89
116
|
}
|
|
90
|
-
|
|
117
|
+
}
|
|
118
|
+
log.info('Zora daemon is running');
|
|
119
|
+
// Graceful shutdown handler with 30-second timeout
|
|
120
|
+
const SHUTDOWN_TIMEOUT_MS = 30_000;
|
|
121
|
+
const cleanupPidFile = () => {
|
|
91
122
|
const pidFile = path.join(configDir, 'state', 'daemon.pid');
|
|
92
123
|
try {
|
|
93
124
|
fs.unlinkSync(pidFile);
|
|
@@ -95,13 +126,40 @@ async function main() {
|
|
|
95
126
|
catch {
|
|
96
127
|
// Already removed
|
|
97
128
|
}
|
|
129
|
+
};
|
|
130
|
+
const shutdown = async (signal) => {
|
|
131
|
+
log.info({ signal }, 'Received signal, shutting down');
|
|
132
|
+
const graceful = async () => {
|
|
133
|
+
try {
|
|
134
|
+
if (telegramGateway) {
|
|
135
|
+
await telegramGateway.stop();
|
|
136
|
+
}
|
|
137
|
+
await dashboard.stop();
|
|
138
|
+
await orchestrator.shutdown();
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
log.error({ err: err instanceof Error ? err.message : String(err) }, 'Error during shutdown');
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const timeout = new Promise((_, reject) => {
|
|
145
|
+
setTimeout(() => reject(new Error('Shutdown timed out after 30 seconds')), SHUTDOWN_TIMEOUT_MS);
|
|
146
|
+
});
|
|
147
|
+
try {
|
|
148
|
+
await Promise.race([graceful(), timeout]);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
log.error({ err: err instanceof Error ? err.message : String(err) }, 'Shutdown timeout — forcing exit');
|
|
152
|
+
cleanupPidFile();
|
|
153
|
+
process.exit(1);
|
|
154
|
+
}
|
|
155
|
+
cleanupPidFile();
|
|
98
156
|
process.exit(0);
|
|
99
157
|
};
|
|
100
|
-
process.on('SIGTERM', () => { shutdown('SIGTERM').catch(err => {
|
|
101
|
-
process.on('SIGINT', () => { shutdown('SIGINT').catch(err => {
|
|
158
|
+
process.on('SIGTERM', () => { shutdown('SIGTERM').catch(err => { log.error({ err }, 'Shutdown error'); process.exit(1); }); });
|
|
159
|
+
process.on('SIGINT', () => { shutdown('SIGINT').catch(err => { log.error({ err }, 'Shutdown error'); process.exit(1); }); });
|
|
102
160
|
}
|
|
103
161
|
main().catch((err) => {
|
|
104
|
-
|
|
162
|
+
log.fatal({ err }, 'Fatal error');
|
|
105
163
|
process.exit(1);
|
|
106
164
|
});
|
|
107
165
|
//# sourceMappingURL=daemon.js.map
|
package/dist/cli/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"edit-commands.d.ts","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAChB,IAAI,CAmCN"}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import path from 'node:path';
|
|
8
8
|
import fs from 'node:fs';
|
|
9
|
+
import { createLogger } from '../utils/logger.js';
|
|
10
|
+
const log = createLogger('edit-commands');
|
|
9
11
|
const EDITABLE_FILES = {
|
|
10
12
|
config: 'config.toml',
|
|
11
13
|
policy: 'policy.toml',
|
|
@@ -20,7 +22,7 @@ export function registerEditCommands(program, configDir) {
|
|
|
20
22
|
.action(async () => {
|
|
21
23
|
const filePath = path.join(configDir, filename);
|
|
22
24
|
if (!fs.existsSync(filePath)) {
|
|
23
|
-
|
|
25
|
+
log.error({ filePath }, 'File not found');
|
|
24
26
|
process.exitCode = 1;
|
|
25
27
|
return;
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"edit-commands.js","sourceRoot":"","sources":["../../src/cli/edit-commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAC1C,MAAM,cAAc,GAA2B;IAC7C,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,SAAS;CAChB,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,SAAiB;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAEpE,GAAG;aACA,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,QAAQ,QAAQ,aAAa,CAAC;aAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAEhD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAC1C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;YAEtE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACtB,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAE3D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook CLI Commands — ORCH-13
|
|
3
|
+
*
|
|
4
|
+
* Provides `zora hooks list` and `zora hooks test` commands
|
|
5
|
+
* for inspecting and testing registered lifecycle hooks.
|
|
6
|
+
*/
|
|
7
|
+
import type { Command } from 'commander';
|
|
8
|
+
export declare function registerHookCommands(program: Command, configDir: string): void;
|
|
9
|
+
//# sourceMappingURL=hook-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-commands.d.ts","sourceRoot":"","sources":["../../src/cli/hook-commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAuF9E"}
|