loreforge 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +87 -0
- package/dist/cli/args.js +287 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/detect.js +94 -0
- package/dist/cli/detect.js.map +1 -0
- package/dist/cli/home.js +36 -0
- package/dist/cli/home.js.map +1 -0
- package/dist/cli/init.js +309 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/input.js +72 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/instructions.js +83 -0
- package/dist/cli/instructions.js.map +1 -0
- package/dist/cli/main.js +250 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.js +108 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/context/render.js +297 -0
- package/dist/context/render.js.map +1 -0
- package/dist/core/contracts.js +49 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/dispatch.js +109 -0
- package/dist/core/dispatch.js.map +1 -0
- package/dist/core/errors.js +36 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/operations/claims.js +91 -0
- package/dist/core/operations/claims.js.map +1 -0
- package/dist/core/operations/common.js +108 -0
- package/dist/core/operations/common.js.map +1 -0
- package/dist/core/operations/context.js +130 -0
- package/dist/core/operations/context.js.map +1 -0
- package/dist/core/operations/decisions.js +44 -0
- package/dist/core/operations/decisions.js.map +1 -0
- package/dist/core/operations/handoffs.js +147 -0
- package/dist/core/operations/handoffs.js.map +1 -0
- package/dist/core/operations/messages.js +117 -0
- package/dist/core/operations/messages.js.map +1 -0
- package/dist/core/operations/register.js +51 -0
- package/dist/core/operations/register.js.map +1 -0
- package/dist/core/operations/tasks.js +54 -0
- package/dist/core/operations/tasks.js.map +1 -0
- package/dist/core/schemas/common.js +81 -0
- package/dist/core/schemas/common.js.map +1 -0
- package/dist/core/schemas/context.js +10 -0
- package/dist/core/schemas/context.js.map +1 -0
- package/dist/core/schemas/decisions.js +11 -0
- package/dist/core/schemas/decisions.js.map +1 -0
- package/dist/core/schemas/handoffs.js +38 -0
- package/dist/core/schemas/handoffs.js.map +1 -0
- package/dist/core/schemas/questions.js +22 -0
- package/dist/core/schemas/questions.js.map +1 -0
- package/dist/core/schemas/registration.js +16 -0
- package/dist/core/schemas/registration.js.map +1 -0
- package/dist/core/schemas/request.js +103 -0
- package/dist/core/schemas/request.js.map +1 -0
- package/dist/core/schemas/tasks.js +35 -0
- package/dist/core/schemas/tasks.js.map +1 -0
- package/dist/evidence/git.js +119 -0
- package/dist/evidence/git.js.map +1 -0
- package/dist/integrations/index.js +32 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/storage/db.js +239 -0
- package/dist/storage/db.js.map +1 -0
- package/dist/storage/faults.js +12 -0
- package/dist/storage/faults.js.map +1 -0
- package/dist/storage/receipts.js +82 -0
- package/dist/storage/receipts.js.map +1 -0
- package/dist/storage/schema.js +119 -0
- package/dist/storage/schema.js.map +1 -0
- package/docs/integrations.md +71 -0
- package/docs/usage.md +405 -0
- package/package.json +54 -0
- package/templates/instructions.template.md +42 -0
- package/templates/session-rule.md +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Loreforge contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Loreforge
|
|
2
|
+
|
|
3
|
+
**Loreforge — shared memory for independent agents.**
|
|
4
|
+
|
|
5
|
+
A local record so Astra, Muse, Flash, Grok, and other CLIs can hand off work by ID instead of by copy-paste. No cloud, no daemon, no prompt interception.
|
|
6
|
+
|
|
7
|
+
Loreforge is a **log**, not a harness. Blackboard (or you) starts models and isolates worktrees. Loreforge stores tasks, claims, questions, decisions, and git evidence so a session that was not started from a board can still see what happened.
|
|
8
|
+
|
|
9
|
+
Agent ids are labels (`codex`, `claude`, `cursor`, `grok`, …), not roles. Any registered agent may claim any open task. Who implements vs reviews is decided at claim time, not by vendor.
|
|
10
|
+
|
|
11
|
+
**Non-goals:** never start or wake a model; never create or merge worktrees; never merge or deploy. Install the protocol into each CLI's always-on rules so sessions check the board without a pasted plan. See [Install into sessions](docs/integrations.md#install-into-sessions).
|
|
12
|
+
|
|
13
|
+
Repo: `loreforge`. CLI: `lore`.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
lore context --input - [--home <dir>] [--json]
|
|
17
|
+
lore handoff --input - [--home <dir>] [--json]
|
|
18
|
+
lore ask --input - [--home <dir>] [--json]
|
|
19
|
+
lore inbox --input - [--home <dir>] [--json]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
State lives in SQLite (`loreforge.sqlite3` under `--home`, `LOREFORGE_HOME`, or `~/.loreforge/context-v1`). Existing `AGENT_COMPANY_HOME` / `~/.agent-company/context-v1` / `company.sqlite3` paths still open.
|
|
23
|
+
|
|
24
|
+
### Alpha status
|
|
25
|
+
|
|
26
|
+
This release supports task-linked handoffs, questions, decisions, and context retrieval. Standalone searchable notes and correction history are planned. Token savings have not been measured.
|
|
27
|
+
|
|
28
|
+
Use a separate state home per project during this alpha. Re-running init with a changed project name or agent roster can fail because initialization reuses request IDs; keep those settings stable.
|
|
29
|
+
|
|
30
|
+
### Install and try
|
|
31
|
+
|
|
32
|
+
Requires Node.js 24.15+. Do not use a `postinstall` prompt; run `lore init` once.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install -g loreforge@alpha
|
|
36
|
+
cd /path/to/your/git/repo
|
|
37
|
+
export LOREFORGE_HOME="$PWD/.loreforge-state"
|
|
38
|
+
lore init --write-rules --demo
|
|
39
|
+
# or pick roles: lore init --agent codex:implement --agent grok:review --write-rules --demo
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`lore init` with no `--agent` **detects local CLIs** (binary on PATH and/or a config directory). `lore detect` lists them. That is not a billing check: an auth file on disk means “looks signed in,” not which plan you pay for. Interactive `lore init` still asks implement / review / both. Roles are preferences, not locks.
|
|
43
|
+
|
|
44
|
+
Keep `.loreforge-state/` out of version control if you use this local state directory.
|
|
45
|
+
|
|
46
|
+
Then open those CLIs in the repo and ask “what’s next.” Each should list the sample tasks and claim according to its role.
|
|
47
|
+
|
|
48
|
+
### Quick Start
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
lore project register --input - <<'EOF'
|
|
52
|
+
{"schemaVersion":1,"requestId":"req-reg-1","payload":{"root":"/path/to/repo","name":"MyProject"}}
|
|
53
|
+
EOF
|
|
54
|
+
|
|
55
|
+
lore agent register --input - <<'EOF'
|
|
56
|
+
{"schemaVersion":1,"requestId":"req-reg-agent-1","payload":{"id":"flash","displayName":"Flash Agent"}}
|
|
57
|
+
EOF
|
|
58
|
+
|
|
59
|
+
lore context --input - <<'EOF'
|
|
60
|
+
{"schemaVersion":1,"projectId":"<PROJECT_UUID>","payload":{"taskId":"<TASK_UUID>","mode":"work"}}
|
|
61
|
+
EOF
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Compiled binary: `node dist/cli/main.js` (same arguments as `lore`).
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
lore instructions show --project <PROJECT_UUID> --agent <AGENT_ID>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
See [Usage Guide](docs/usage.md) and [Integrations](docs/integrations.md).
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Historical Automation (Legacy)
|
|
75
|
+
|
|
76
|
+
The following existing directories and scripts represent an earlier prototype architecture designed around GitHub issue polling, automated PR creation, and auto-merging:
|
|
77
|
+
- `orchestrator/`: shell scripts (`coordinator.sh`, `tick.sh`, `review.sh`, `fix.sh`, `digest.sh`) and policies.
|
|
78
|
+
- `agents/`: historical prompts (`developer.md`, `reviewer.md`).
|
|
79
|
+
- `.env.example`: historical environment configuration.
|
|
80
|
+
- `docs/roadmap.md`: earlier cloud/scale-out roadmap.
|
|
81
|
+
|
|
82
|
+
> [!WARNING]
|
|
83
|
+
> **Historical Artifacts**: The legacy scripts contain automated publishing and merge actions. They are preserved for historical reference only. The v0.1 product code does not execute, invoke, or import any legacy files.
|
|
84
|
+
|
|
85
|
+
## Rename compatibility
|
|
86
|
+
|
|
87
|
+
`company` remains a bin alias for `lore`. Pre-rename homes and `company.sqlite3` files still open. Frozen planning docs and historical reports keep their original names.
|
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
export const READ_OPERATIONS = new Set([
|
|
2
|
+
"task.get",
|
|
3
|
+
"task.list",
|
|
4
|
+
"inbox.list",
|
|
5
|
+
"context.get"
|
|
6
|
+
]);
|
|
7
|
+
// Everyday verbs Astra named: lore context / handoff / ask / inbox.
|
|
8
|
+
// Full namespace+verb forms remain valid.
|
|
9
|
+
export const SHORT_COMMANDS = {
|
|
10
|
+
context: "context.get",
|
|
11
|
+
handoff: "handoff.submit",
|
|
12
|
+
ask: "question.ask",
|
|
13
|
+
inbox: "inbox.list",
|
|
14
|
+
};
|
|
15
|
+
const VALID_OPERATIONS = {
|
|
16
|
+
project: {
|
|
17
|
+
register: "project.register"
|
|
18
|
+
},
|
|
19
|
+
agent: {
|
|
20
|
+
register: "agent.register"
|
|
21
|
+
},
|
|
22
|
+
task: {
|
|
23
|
+
create: "task.create",
|
|
24
|
+
get: "task.get",
|
|
25
|
+
list: "task.list",
|
|
26
|
+
claim: "task.claim",
|
|
27
|
+
renew: "task.renew",
|
|
28
|
+
release: "task.release",
|
|
29
|
+
reopen: "task.reopen",
|
|
30
|
+
cancel: "task.cancel"
|
|
31
|
+
},
|
|
32
|
+
handoff: {
|
|
33
|
+
submit: "handoff.submit"
|
|
34
|
+
},
|
|
35
|
+
question: {
|
|
36
|
+
ask: "question.ask",
|
|
37
|
+
answer: "question.answer"
|
|
38
|
+
},
|
|
39
|
+
inbox: {
|
|
40
|
+
list: "inbox.list"
|
|
41
|
+
},
|
|
42
|
+
decision: {
|
|
43
|
+
record: "decision.record"
|
|
44
|
+
},
|
|
45
|
+
context: {
|
|
46
|
+
get: "context.get"
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export class CliValidationError extends Error {
|
|
50
|
+
code = "VALIDATION";
|
|
51
|
+
exitCode = 2;
|
|
52
|
+
constructor(message) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.name = "CliValidationError";
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const INIT_ROLES = new Set(["implement", "review", "both"]);
|
|
58
|
+
const AGENT_ID_RE = /^[a-z][a-z0-9_-]{0,63}$/;
|
|
59
|
+
/** Parse `id` or `id:implement|review|both`. Default role is both. */
|
|
60
|
+
export function parseAgentSpec(raw) {
|
|
61
|
+
const trimmed = raw.trim();
|
|
62
|
+
const colon = trimmed.indexOf(":");
|
|
63
|
+
const id = (colon === -1 ? trimmed : trimmed.slice(0, colon)).trim();
|
|
64
|
+
const roleRaw = (colon === -1 ? "both" : trimmed.slice(colon + 1)).trim();
|
|
65
|
+
if (!AGENT_ID_RE.test(id)) {
|
|
66
|
+
throw new CliValidationError(`Invalid agent id '${id}'`);
|
|
67
|
+
}
|
|
68
|
+
if (!INIT_ROLES.has(roleRaw)) {
|
|
69
|
+
throw new CliValidationError(`Invalid role '${roleRaw}' for agent '${id}' (use implement, review, or both)`);
|
|
70
|
+
}
|
|
71
|
+
return { id, role: roleRaw };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parses raw command-line argument arrays strictly according to CONTRACT.md.
|
|
75
|
+
* Throws CliValidationError on unknown flags, unknown commands, or missing required options.
|
|
76
|
+
*/
|
|
77
|
+
export function parseCliArgs(args) {
|
|
78
|
+
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
79
|
+
// If command prefix precedes --help, provide context-aware help
|
|
80
|
+
if (args.length > 0 && !args[0].startsWith("-")) {
|
|
81
|
+
const ns = args[0];
|
|
82
|
+
const verb = args[1] && !args[1].startsWith("-") ? args[1] : undefined;
|
|
83
|
+
return { kind: "help", topic: verb ? `${ns} ${verb}` : ns };
|
|
84
|
+
}
|
|
85
|
+
return { kind: "help" };
|
|
86
|
+
}
|
|
87
|
+
const positionals = [];
|
|
88
|
+
let inputPath;
|
|
89
|
+
let home;
|
|
90
|
+
let json = false;
|
|
91
|
+
let projectId;
|
|
92
|
+
let agentId;
|
|
93
|
+
const agentSpecs = [];
|
|
94
|
+
let root;
|
|
95
|
+
let name;
|
|
96
|
+
let writeRules = false;
|
|
97
|
+
let writeUserRules = false;
|
|
98
|
+
let demo = false;
|
|
99
|
+
let detect = true;
|
|
100
|
+
let i = 0;
|
|
101
|
+
while (i < args.length) {
|
|
102
|
+
const arg = args[i];
|
|
103
|
+
if (arg === "--input") {
|
|
104
|
+
i++;
|
|
105
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
106
|
+
throw new CliValidationError("Missing value for --input flag");
|
|
107
|
+
}
|
|
108
|
+
inputPath = args[i];
|
|
109
|
+
}
|
|
110
|
+
else if (arg.startsWith("--input=")) {
|
|
111
|
+
inputPath = arg.slice("--input=".length);
|
|
112
|
+
if (!inputPath)
|
|
113
|
+
throw new CliValidationError("Empty value for --input");
|
|
114
|
+
}
|
|
115
|
+
else if (arg === "--home") {
|
|
116
|
+
i++;
|
|
117
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
118
|
+
throw new CliValidationError("Missing value for --home flag");
|
|
119
|
+
}
|
|
120
|
+
home = args[i];
|
|
121
|
+
}
|
|
122
|
+
else if (arg.startsWith("--home=")) {
|
|
123
|
+
home = arg.slice("--home=".length);
|
|
124
|
+
if (!home)
|
|
125
|
+
throw new CliValidationError("Empty value for --home");
|
|
126
|
+
}
|
|
127
|
+
else if (arg === "--json") {
|
|
128
|
+
json = true;
|
|
129
|
+
}
|
|
130
|
+
else if (arg === "--project") {
|
|
131
|
+
i++;
|
|
132
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
133
|
+
throw new CliValidationError("Missing value for --project flag");
|
|
134
|
+
}
|
|
135
|
+
projectId = args[i];
|
|
136
|
+
}
|
|
137
|
+
else if (arg.startsWith("--project=")) {
|
|
138
|
+
projectId = arg.slice("--project=".length);
|
|
139
|
+
if (!projectId)
|
|
140
|
+
throw new CliValidationError("Empty value for --project");
|
|
141
|
+
}
|
|
142
|
+
else if (arg === "--agent") {
|
|
143
|
+
i++;
|
|
144
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
145
|
+
throw new CliValidationError("Missing value for --agent flag");
|
|
146
|
+
}
|
|
147
|
+
agentId = args[i];
|
|
148
|
+
agentSpecs.push(args[i]);
|
|
149
|
+
}
|
|
150
|
+
else if (arg.startsWith("--agent=")) {
|
|
151
|
+
agentId = arg.slice("--agent=".length);
|
|
152
|
+
if (!agentId)
|
|
153
|
+
throw new CliValidationError("Empty value for --agent");
|
|
154
|
+
agentSpecs.push(agentId);
|
|
155
|
+
}
|
|
156
|
+
else if (arg === "--root") {
|
|
157
|
+
i++;
|
|
158
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
159
|
+
throw new CliValidationError("Missing value for --root flag");
|
|
160
|
+
}
|
|
161
|
+
root = args[i];
|
|
162
|
+
}
|
|
163
|
+
else if (arg.startsWith("--root=")) {
|
|
164
|
+
root = arg.slice("--root=".length);
|
|
165
|
+
if (!root)
|
|
166
|
+
throw new CliValidationError("Empty value for --root");
|
|
167
|
+
}
|
|
168
|
+
else if (arg === "--name") {
|
|
169
|
+
i++;
|
|
170
|
+
if (i >= args.length || args[i].startsWith("--")) {
|
|
171
|
+
throw new CliValidationError("Missing value for --name flag");
|
|
172
|
+
}
|
|
173
|
+
name = args[i];
|
|
174
|
+
}
|
|
175
|
+
else if (arg.startsWith("--name=")) {
|
|
176
|
+
name = arg.slice("--name=".length);
|
|
177
|
+
if (!name)
|
|
178
|
+
throw new CliValidationError("Empty value for --name");
|
|
179
|
+
}
|
|
180
|
+
else if (arg === "--write-rules") {
|
|
181
|
+
writeRules = true;
|
|
182
|
+
}
|
|
183
|
+
else if (arg === "--write-user-rules") {
|
|
184
|
+
writeUserRules = true;
|
|
185
|
+
}
|
|
186
|
+
else if (arg === "--demo") {
|
|
187
|
+
demo = true;
|
|
188
|
+
}
|
|
189
|
+
else if (arg === "--detect") {
|
|
190
|
+
detect = true;
|
|
191
|
+
}
|
|
192
|
+
else if (arg === "--no-detect") {
|
|
193
|
+
detect = false;
|
|
194
|
+
}
|
|
195
|
+
else if (arg.startsWith("-")) {
|
|
196
|
+
throw new CliValidationError(`Unknown flag: ${arg}`);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
positionals.push(arg);
|
|
200
|
+
}
|
|
201
|
+
i++;
|
|
202
|
+
}
|
|
203
|
+
if (positionals.length === 1 && positionals[0] === "detect") {
|
|
204
|
+
return { kind: "detect", json, help: false };
|
|
205
|
+
}
|
|
206
|
+
if (positionals.length === 1 && positionals[0] === "init") {
|
|
207
|
+
const seen = new Set();
|
|
208
|
+
const agents = [];
|
|
209
|
+
for (const spec of agentSpecs) {
|
|
210
|
+
const parsedAgent = parseAgentSpec(spec);
|
|
211
|
+
if (seen.has(parsedAgent.id)) {
|
|
212
|
+
throw new CliValidationError(`Duplicate agent id '${parsedAgent.id}'`);
|
|
213
|
+
}
|
|
214
|
+
seen.add(parsedAgent.id);
|
|
215
|
+
agents.push(parsedAgent);
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
kind: "init",
|
|
219
|
+
home,
|
|
220
|
+
json,
|
|
221
|
+
root,
|
|
222
|
+
name,
|
|
223
|
+
agents,
|
|
224
|
+
writeRules,
|
|
225
|
+
writeUserRules,
|
|
226
|
+
demo,
|
|
227
|
+
detect,
|
|
228
|
+
help: false,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (positionals.length === 1 && SHORT_COMMANDS[positionals[0]]) {
|
|
232
|
+
if (!inputPath) {
|
|
233
|
+
throw new CliValidationError("Missing required --input <file|-> argument");
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
kind: "operation",
|
|
237
|
+
operation: SHORT_COMMANDS[positionals[0]],
|
|
238
|
+
inputPath,
|
|
239
|
+
home,
|
|
240
|
+
json,
|
|
241
|
+
help: false
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (positionals.length < 2) {
|
|
245
|
+
throw new CliValidationError(`Expected <command> or <namespace> <verb>, received: ${positionals.join(" ")}`);
|
|
246
|
+
}
|
|
247
|
+
const [namespace, verb, ...extraPos] = positionals;
|
|
248
|
+
if (extraPos.length > 0) {
|
|
249
|
+
throw new CliValidationError(`Unexpected positional arguments: ${extraPos.join(" ")}`);
|
|
250
|
+
}
|
|
251
|
+
// Handle instructions show
|
|
252
|
+
if (namespace === "instructions" && verb === "show") {
|
|
253
|
+
if (!projectId) {
|
|
254
|
+
throw new CliValidationError("Missing required --project flag for instructions show");
|
|
255
|
+
}
|
|
256
|
+
if (!agentId) {
|
|
257
|
+
throw new CliValidationError("Missing required --agent flag for instructions show");
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
kind: "instructions",
|
|
261
|
+
projectId,
|
|
262
|
+
agentId,
|
|
263
|
+
home,
|
|
264
|
+
help: false
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
const nsOps = VALID_OPERATIONS[namespace];
|
|
268
|
+
if (!nsOps) {
|
|
269
|
+
throw new CliValidationError(`Unknown namespace: ${namespace}`);
|
|
270
|
+
}
|
|
271
|
+
const op = nsOps[verb];
|
|
272
|
+
if (!op) {
|
|
273
|
+
throw new CliValidationError(`Unknown verb '${verb}' for namespace '${namespace}'`);
|
|
274
|
+
}
|
|
275
|
+
if (!inputPath) {
|
|
276
|
+
throw new CliValidationError("Missing required --input <file|-> argument");
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
kind: "operation",
|
|
280
|
+
operation: op,
|
|
281
|
+
inputPath,
|
|
282
|
+
home,
|
|
283
|
+
json,
|
|
284
|
+
help: false
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const CATALOG = [
|
|
4
|
+
{ id: "grok", displayName: "Grok", binaries: ["grok"], configDir: ".grok", authFiles: ["auth.json"] },
|
|
5
|
+
{ id: "claude", displayName: "Claude Code", binaries: ["claude"], configDir: ".claude", authFiles: [".credentials.json", "credentials.json"] },
|
|
6
|
+
{ id: "codex", displayName: "Codex", binaries: ["codex"], configDir: ".codex", authFiles: ["auth.json"] },
|
|
7
|
+
{ id: "cursor", displayName: "Cursor", binaries: ["cursor", "cursor-agent"], configDir: ".cursor", authFiles: [] },
|
|
8
|
+
{ id: "agy", displayName: "Antigravity", binaries: ["agy"], configDir: ".agy", authFiles: [] },
|
|
9
|
+
{ id: "muse", displayName: "Muse", binaries: ["muse"], configDir: ".muse", authFiles: [] },
|
|
10
|
+
{ id: "gemini", displayName: "Gemini CLI", binaries: ["gemini"], configDir: ".gemini", authFiles: [] },
|
|
11
|
+
];
|
|
12
|
+
function isDir(path) {
|
|
13
|
+
try {
|
|
14
|
+
return statSync(path).isDirectory();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function isFile(path) {
|
|
21
|
+
try {
|
|
22
|
+
return statSync(path).isFile();
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Resolve a binary on PATH. Never executes it. */
|
|
29
|
+
export function findBinary(name, pathEnv, pathDelimiter = ":", pathext = "") {
|
|
30
|
+
const extensions = pathext
|
|
31
|
+
? pathext.split(";").map((e) => e.trim()).filter(Boolean)
|
|
32
|
+
: [""];
|
|
33
|
+
if (!extensions.includes(""))
|
|
34
|
+
extensions.unshift("");
|
|
35
|
+
for (const dir of pathEnv.split(pathDelimiter)) {
|
|
36
|
+
if (!dir)
|
|
37
|
+
continue;
|
|
38
|
+
for (const ext of extensions) {
|
|
39
|
+
const candidate = join(dir, `${name}${ext}`);
|
|
40
|
+
if (existsSync(candidate) && !isDir(candidate))
|
|
41
|
+
return candidate;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Detect local coding CLIs from PATH and home config dirs.
|
|
48
|
+
* Does not read credential file contents or call vendor APIs.
|
|
49
|
+
* `signedIn` means an auth file exists, not that a paid plan was verified.
|
|
50
|
+
*/
|
|
51
|
+
export function detectCodingClis(options) {
|
|
52
|
+
const delim = options.pathDelimiter ?? (options.path.includes(";") && !options.path.includes(":") ? ";" : ":");
|
|
53
|
+
const found = [];
|
|
54
|
+
for (const entry of CATALOG) {
|
|
55
|
+
const evidence = [];
|
|
56
|
+
let binary = null;
|
|
57
|
+
for (const name of entry.binaries) {
|
|
58
|
+
binary = findBinary(name, options.path, delim, options.pathext);
|
|
59
|
+
if (binary) {
|
|
60
|
+
evidence.push(`binary:${name}`);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const configDir = join(options.home, entry.configDir);
|
|
65
|
+
const hasConfigDir = isDir(configDir);
|
|
66
|
+
if (hasConfigDir)
|
|
67
|
+
evidence.push(`dir:${entry.configDir}`);
|
|
68
|
+
let signedIn = false;
|
|
69
|
+
for (const rel of entry.authFiles) {
|
|
70
|
+
const authPath = join(configDir, rel);
|
|
71
|
+
if (isFile(authPath)) {
|
|
72
|
+
signedIn = true;
|
|
73
|
+
evidence.push("auth-file:present");
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (evidence.length === 0)
|
|
78
|
+
continue;
|
|
79
|
+
found.push({
|
|
80
|
+
id: entry.id,
|
|
81
|
+
displayName: entry.displayName,
|
|
82
|
+
defaultRole: "both",
|
|
83
|
+
binary,
|
|
84
|
+
configDir: hasConfigDir ? configDir : null,
|
|
85
|
+
signedIn,
|
|
86
|
+
evidence,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return found;
|
|
90
|
+
}
|
|
91
|
+
export function detectedToAgents(detected) {
|
|
92
|
+
return detected.map((d) => ({ id: d.id, role: d.defaultRole }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/cli/detect.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/home.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { resolve, join } from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
import { databaseExists, resolveDbPath } from "../storage/db.js";
|
|
5
|
+
export { DB_FILENAME, LEGACY_DB_FILENAME } from "../storage/db.js";
|
|
6
|
+
/**
|
|
7
|
+
* Resolves the state home directory with precedence:
|
|
8
|
+
* 1. Explicit --home
|
|
9
|
+
* 2. LOREFORGE_HOME, then LORE_HOME
|
|
10
|
+
* 3. AGENT_COMPANY_HOME (pre-rename)
|
|
11
|
+
* 4. ~/.loreforge/context-v1, or ~/.agent-company/context-v1 if that already exists
|
|
12
|
+
*/
|
|
13
|
+
export function resolveHomeDir(explicitHome, env = process.env) {
|
|
14
|
+
if (explicitHome && explicitHome.trim().length > 0) {
|
|
15
|
+
return resolve(explicitHome.trim());
|
|
16
|
+
}
|
|
17
|
+
for (const key of ["LOREFORGE_HOME", "LORE_HOME", "AGENT_COMPANY_HOME"]) {
|
|
18
|
+
const value = env[key];
|
|
19
|
+
if (value && value.trim().length > 0) {
|
|
20
|
+
return resolve(value.trim());
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const nextDefault = resolve(join(homedir(), ".loreforge", "context-v1"));
|
|
24
|
+
const legacyDefault = resolve(join(homedir(), ".agent-company", "context-v1"));
|
|
25
|
+
if (!existsSync(nextDefault) && existsSync(legacyDefault)) {
|
|
26
|
+
return legacyDefault;
|
|
27
|
+
}
|
|
28
|
+
return nextDefault;
|
|
29
|
+
}
|
|
30
|
+
export function getDbPath(homeDir) {
|
|
31
|
+
return resolveDbPath(homeDir);
|
|
32
|
+
}
|
|
33
|
+
export function doesStateExist(homeDir) {
|
|
34
|
+
return databaseExists(homeDir);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../src/cli/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAqB,EACrB,MAA0C,OAAO,CAAC,GAAG;IAErD,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;IACzE,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|