@locusai/cli 0.7.0 → 0.7.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/bin/agent/worker.js +37 -18
- package/bin/locus.js +95 -68
- package/package.json +2 -2
package/bin/agent/worker.js
CHANGED
|
@@ -17065,7 +17065,15 @@ var colors = {
|
|
|
17065
17065
|
brightBlue: `${ESC}94m`,
|
|
17066
17066
|
brightMagenta: `${ESC}95m`,
|
|
17067
17067
|
brightCyan: `${ESC}96m`,
|
|
17068
|
-
brightWhite: `${ESC}97m
|
|
17068
|
+
brightWhite: `${ESC}97m`,
|
|
17069
|
+
bgBlack: `${ESC}40m`,
|
|
17070
|
+
bgRed: `${ESC}41m`,
|
|
17071
|
+
bgGreen: `${ESC}42m`,
|
|
17072
|
+
bgYellow: `${ESC}43m`,
|
|
17073
|
+
bgBlue: `${ESC}44m`,
|
|
17074
|
+
bgMagenta: `${ESC}45m`,
|
|
17075
|
+
bgCyan: `${ESC}46m`,
|
|
17076
|
+
bgWhite: `${ESC}47m`
|
|
17069
17077
|
};
|
|
17070
17078
|
var c = {
|
|
17071
17079
|
text: (text, ...colorNames) => {
|
|
@@ -17081,11 +17089,17 @@ var c = {
|
|
|
17081
17089
|
magenta: (t) => c.text(t, "magenta"),
|
|
17082
17090
|
cyan: (t) => c.text(t, "cyan"),
|
|
17083
17091
|
gray: (t) => c.text(t, "gray"),
|
|
17092
|
+
white: (t) => c.text(t, "white"),
|
|
17093
|
+
brightBlue: (t) => c.text(t, "brightBlue"),
|
|
17094
|
+
bgBlue: (t) => c.text(t, "bgBlue", "white", "bold"),
|
|
17084
17095
|
success: (t) => c.text(t, "green", "bold"),
|
|
17085
17096
|
error: (t) => c.text(t, "red", "bold"),
|
|
17086
17097
|
warning: (t) => c.text(t, "yellow", "bold"),
|
|
17087
17098
|
info: (t) => c.text(t, "cyan", "bold"),
|
|
17088
17099
|
primary: (t) => c.text(t, "blue", "bold"),
|
|
17100
|
+
secondary: (t) => c.text(t, "magenta", "bold"),
|
|
17101
|
+
header: (t) => c.text(` ${t} `, "bgBlue", "white", "bold"),
|
|
17102
|
+
step: (t) => c.text(` ${t} `, "bgCyan", "black", "bold"),
|
|
17089
17103
|
underline: (t) => c.text(t, "underline")
|
|
17090
17104
|
};
|
|
17091
17105
|
|
|
@@ -20814,6 +20828,13 @@ class AIModule extends BaseModule {
|
|
|
20814
20828
|
async deleteSession(workspaceId, sessionId) {
|
|
20815
20829
|
await this.api.delete(`/ai/${workspaceId}/session/${sessionId}`);
|
|
20816
20830
|
}
|
|
20831
|
+
async shareSession(workspaceId, sessionId, body) {
|
|
20832
|
+
await this.api.post(`/ai/${workspaceId}/session/${sessionId}/share`, body);
|
|
20833
|
+
}
|
|
20834
|
+
async getSharedSession(sessionId) {
|
|
20835
|
+
const { data } = await this.api.get(`/ai/shared/${sessionId}`);
|
|
20836
|
+
return data;
|
|
20837
|
+
}
|
|
20817
20838
|
}
|
|
20818
20839
|
|
|
20819
20840
|
// ../sdk/src/modules/auth.ts
|
|
@@ -34834,6 +34855,9 @@ var ChatResponseSchema = exports_external.object({
|
|
|
34834
34855
|
sessionId: exports_external.string(),
|
|
34835
34856
|
history: exports_external.array(AIMessageSchema).optional()
|
|
34836
34857
|
});
|
|
34858
|
+
var ShareChatRequestSchema = exports_external.object({
|
|
34859
|
+
isShared: exports_external.boolean()
|
|
34860
|
+
});
|
|
34837
34861
|
// ../shared/src/models/user.ts
|
|
34838
34862
|
var UserSchema = BaseEntitySchema.extend({
|
|
34839
34863
|
email: exports_external.string().email(),
|
|
@@ -36110,13 +36134,10 @@ class CodebaseIndexer {
|
|
|
36110
36134
|
`);
|
|
36111
36135
|
const newTreeHash = this.hashTree(treeString);
|
|
36112
36136
|
const existingIndex = this.loadIndex();
|
|
36113
|
-
if (!force && existingIndex?.treeHash === newTreeHash) {
|
|
36114
|
-
onProgress?.("No file changes detected, skipping reindex");
|
|
36115
|
-
return null;
|
|
36116
|
-
}
|
|
36117
36137
|
const currentHashes = this.computeFileHashes(currentFiles);
|
|
36118
36138
|
const existingHashes = existingIndex?.fileHashes;
|
|
36119
|
-
const
|
|
36139
|
+
const hasExistingContent = existingIndex && (Object.keys(existingIndex.symbols).length > 0 || Object.keys(existingIndex.responsibilities).length > 0);
|
|
36140
|
+
const canIncremental = !force && existingIndex && existingHashes && hasExistingContent;
|
|
36120
36141
|
if (canIncremental) {
|
|
36121
36142
|
onProgress?.("Performing incremental update");
|
|
36122
36143
|
const { added, deleted, modified } = this.diffFiles(currentHashes, existingHashes);
|
|
@@ -36149,8 +36170,12 @@ class CodebaseIndexer {
|
|
|
36149
36170
|
}
|
|
36150
36171
|
}
|
|
36151
36172
|
onProgress?.("AI is analyzing codebase structure...");
|
|
36152
|
-
|
|
36153
|
-
|
|
36173
|
+
try {
|
|
36174
|
+
const index = await treeSummarizer(treeString);
|
|
36175
|
+
return this.applyIndexMetadata(index, currentHashes, newTreeHash);
|
|
36176
|
+
} catch (error48) {
|
|
36177
|
+
throw new Error(`AI analysis failed: ${error48 instanceof Error ? error48.message : String(error48)}`);
|
|
36178
|
+
}
|
|
36154
36179
|
}
|
|
36155
36180
|
async getFileTree() {
|
|
36156
36181
|
const gitmodulesPath = join4(this.projectPath, ".gitmodules");
|
|
@@ -36642,16 +36667,12 @@ class TaskExecutor {
|
|
|
36642
36667
|
});
|
|
36643
36668
|
try {
|
|
36644
36669
|
let plan = null;
|
|
36645
|
-
|
|
36646
|
-
|
|
36647
|
-
} else {
|
|
36648
|
-
this.deps.log("Phase 1: Planning (CLI)...", "info");
|
|
36649
|
-
const planningPrompt = `${basePrompt}
|
|
36670
|
+
this.deps.log("Phase 1: Planning (CLI)...", "info");
|
|
36671
|
+
const planningPrompt = `${basePrompt}
|
|
36650
36672
|
|
|
36651
36673
|
## Phase 1: Planning
|
|
36652
36674
|
Analyze and create a detailed plan for THIS SPECIFIC TASK. Do NOT execute changes yet.`;
|
|
36653
|
-
|
|
36654
|
-
}
|
|
36675
|
+
plan = await this.deps.aiRunner.run(planningPrompt, true);
|
|
36655
36676
|
this.deps.log("Starting Execution...", "info");
|
|
36656
36677
|
let executionPrompt = basePrompt;
|
|
36657
36678
|
if (plan != null) {
|
|
@@ -36740,7 +36761,6 @@ class AgentWorker {
|
|
|
36740
36761
|
this.taskExecutor = new TaskExecutor({
|
|
36741
36762
|
aiRunner: this.aiRunner,
|
|
36742
36763
|
projectPath,
|
|
36743
|
-
skipPlanning: config2.skipPlanning,
|
|
36744
36764
|
log
|
|
36745
36765
|
});
|
|
36746
36766
|
const providerLabel = provider === "codex" ? "Codex" : "Claude";
|
|
@@ -36871,8 +36891,7 @@ if (process.argv[1]?.includes("agent-worker") || process.argv[1]?.includes("work
|
|
|
36871
36891
|
if (value && !value.startsWith("--"))
|
|
36872
36892
|
i++;
|
|
36873
36893
|
config2.provider = resolveProvider(value);
|
|
36874
|
-
}
|
|
36875
|
-
config2.skipPlanning = true;
|
|
36894
|
+
}
|
|
36876
36895
|
}
|
|
36877
36896
|
if (!config2.agentId || !config2.workspaceId || !config2.apiBase || !config2.apiKey || !config2.projectPath) {
|
|
36878
36897
|
console.error("Missing required arguments");
|
package/bin/locus.js
CHANGED
|
@@ -30874,6 +30874,9 @@ var ChatResponseSchema = exports_external.object({
|
|
|
30874
30874
|
sessionId: exports_external.string(),
|
|
30875
30875
|
history: exports_external.array(AIMessageSchema).optional()
|
|
30876
30876
|
});
|
|
30877
|
+
var ShareChatRequestSchema = exports_external.object({
|
|
30878
|
+
isShared: exports_external.boolean()
|
|
30879
|
+
});
|
|
30877
30880
|
// ../shared/src/models/user.ts
|
|
30878
30881
|
var UserSchema = BaseEntitySchema.extend({
|
|
30879
30882
|
email: exports_external.string().email(),
|
|
@@ -31961,13 +31964,10 @@ class CodebaseIndexer {
|
|
|
31961
31964
|
`);
|
|
31962
31965
|
const newTreeHash = this.hashTree(treeString);
|
|
31963
31966
|
const existingIndex = this.loadIndex();
|
|
31964
|
-
if (!force && existingIndex?.treeHash === newTreeHash) {
|
|
31965
|
-
onProgress?.("No file changes detected, skipping reindex");
|
|
31966
|
-
return null;
|
|
31967
|
-
}
|
|
31968
31967
|
const currentHashes = this.computeFileHashes(currentFiles);
|
|
31969
31968
|
const existingHashes = existingIndex?.fileHashes;
|
|
31970
|
-
const
|
|
31969
|
+
const hasExistingContent = existingIndex && (Object.keys(existingIndex.symbols).length > 0 || Object.keys(existingIndex.responsibilities).length > 0);
|
|
31970
|
+
const canIncremental = !force && existingIndex && existingHashes && hasExistingContent;
|
|
31971
31971
|
if (canIncremental) {
|
|
31972
31972
|
onProgress?.("Performing incremental update");
|
|
31973
31973
|
const { added, deleted, modified } = this.diffFiles(currentHashes, existingHashes);
|
|
@@ -32000,8 +32000,12 @@ class CodebaseIndexer {
|
|
|
32000
32000
|
}
|
|
32001
32001
|
}
|
|
32002
32002
|
onProgress?.("AI is analyzing codebase structure...");
|
|
32003
|
-
|
|
32004
|
-
|
|
32003
|
+
try {
|
|
32004
|
+
const index = await treeSummarizer(treeString);
|
|
32005
|
+
return this.applyIndexMetadata(index, currentHashes, newTreeHash);
|
|
32006
|
+
} catch (error48) {
|
|
32007
|
+
throw new Error(`AI analysis failed: ${error48 instanceof Error ? error48.message : String(error48)}`);
|
|
32008
|
+
}
|
|
32005
32009
|
}
|
|
32006
32010
|
async getFileTree() {
|
|
32007
32011
|
const gitmodulesPath = join3(this.projectPath, ".gitmodules");
|
|
@@ -32492,16 +32496,12 @@ class TaskExecutor {
|
|
|
32492
32496
|
});
|
|
32493
32497
|
try {
|
|
32494
32498
|
let plan = null;
|
|
32495
|
-
|
|
32496
|
-
|
|
32497
|
-
} else {
|
|
32498
|
-
this.deps.log("Phase 1: Planning (CLI)...", "info");
|
|
32499
|
-
const planningPrompt = `${basePrompt}
|
|
32499
|
+
this.deps.log("Phase 1: Planning (CLI)...", "info");
|
|
32500
|
+
const planningPrompt = `${basePrompt}
|
|
32500
32501
|
|
|
32501
32502
|
## Phase 1: Planning
|
|
32502
32503
|
Analyze and create a detailed plan for THIS SPECIFIC TASK. Do NOT execute changes yet.`;
|
|
32503
|
-
|
|
32504
|
-
}
|
|
32504
|
+
plan = await this.deps.aiRunner.run(planningPrompt, true);
|
|
32505
32505
|
this.deps.log("Starting Execution...", "info");
|
|
32506
32506
|
let executionPrompt = basePrompt;
|
|
32507
32507
|
if (plan != null) {
|
|
@@ -32559,7 +32559,15 @@ var colors = {
|
|
|
32559
32559
|
brightBlue: `${ESC}94m`,
|
|
32560
32560
|
brightMagenta: `${ESC}95m`,
|
|
32561
32561
|
brightCyan: `${ESC}96m`,
|
|
32562
|
-
brightWhite: `${ESC}97m
|
|
32562
|
+
brightWhite: `${ESC}97m`,
|
|
32563
|
+
bgBlack: `${ESC}40m`,
|
|
32564
|
+
bgRed: `${ESC}41m`,
|
|
32565
|
+
bgGreen: `${ESC}42m`,
|
|
32566
|
+
bgYellow: `${ESC}43m`,
|
|
32567
|
+
bgBlue: `${ESC}44m`,
|
|
32568
|
+
bgMagenta: `${ESC}45m`,
|
|
32569
|
+
bgCyan: `${ESC}46m`,
|
|
32570
|
+
bgWhite: `${ESC}47m`
|
|
32563
32571
|
};
|
|
32564
32572
|
var c = {
|
|
32565
32573
|
text: (text, ...colorNames) => {
|
|
@@ -32575,11 +32583,17 @@ var c = {
|
|
|
32575
32583
|
magenta: (t) => c.text(t, "magenta"),
|
|
32576
32584
|
cyan: (t) => c.text(t, "cyan"),
|
|
32577
32585
|
gray: (t) => c.text(t, "gray"),
|
|
32586
|
+
white: (t) => c.text(t, "white"),
|
|
32587
|
+
brightBlue: (t) => c.text(t, "brightBlue"),
|
|
32588
|
+
bgBlue: (t) => c.text(t, "bgBlue", "white", "bold"),
|
|
32578
32589
|
success: (t) => c.text(t, "green", "bold"),
|
|
32579
32590
|
error: (t) => c.text(t, "red", "bold"),
|
|
32580
32591
|
warning: (t) => c.text(t, "yellow", "bold"),
|
|
32581
32592
|
info: (t) => c.text(t, "cyan", "bold"),
|
|
32582
32593
|
primary: (t) => c.text(t, "blue", "bold"),
|
|
32594
|
+
secondary: (t) => c.text(t, "magenta", "bold"),
|
|
32595
|
+
header: (t) => c.text(` ${t} `, "bgBlue", "white", "bold"),
|
|
32596
|
+
step: (t) => c.text(` ${t} `, "bgCyan", "black", "bold"),
|
|
32583
32597
|
underline: (t) => c.text(t, "underline")
|
|
32584
32598
|
};
|
|
32585
32599
|
|
|
@@ -36308,6 +36322,13 @@ class AIModule extends BaseModule {
|
|
|
36308
36322
|
async deleteSession(workspaceId, sessionId) {
|
|
36309
36323
|
await this.api.delete(`/ai/${workspaceId}/session/${sessionId}`);
|
|
36310
36324
|
}
|
|
36325
|
+
async shareSession(workspaceId, sessionId, body) {
|
|
36326
|
+
await this.api.post(`/ai/${workspaceId}/session/${sessionId}/share`, body);
|
|
36327
|
+
}
|
|
36328
|
+
async getSharedSession(sessionId) {
|
|
36329
|
+
const { data } = await this.api.get(`/ai/shared/${sessionId}`);
|
|
36330
|
+
return data;
|
|
36331
|
+
}
|
|
36311
36332
|
}
|
|
36312
36333
|
|
|
36313
36334
|
// ../sdk/src/modules/auth.ts
|
|
@@ -36746,7 +36767,6 @@ class AgentWorker {
|
|
|
36746
36767
|
this.taskExecutor = new TaskExecutor({
|
|
36747
36768
|
aiRunner: this.aiRunner,
|
|
36748
36769
|
projectPath,
|
|
36749
|
-
skipPlanning: config2.skipPlanning,
|
|
36750
36770
|
log
|
|
36751
36771
|
});
|
|
36752
36772
|
const providerLabel = provider === "codex" ? "Codex" : "Claude";
|
|
@@ -36877,8 +36897,7 @@ if (process.argv[1]?.includes("agent-worker") || process.argv[1]?.includes("work
|
|
|
36877
36897
|
if (value && !value.startsWith("--"))
|
|
36878
36898
|
i++;
|
|
36879
36899
|
config2.provider = resolveProvider(value);
|
|
36880
|
-
}
|
|
36881
|
-
config2.skipPlanning = true;
|
|
36900
|
+
}
|
|
36882
36901
|
}
|
|
36883
36902
|
if (!config2.agentId || !config2.workspaceId || !config2.apiBase || !config2.apiKey || !config2.projectPath) {
|
|
36884
36903
|
console.error("Missing required arguments");
|
|
@@ -37012,9 +37031,6 @@ ${c.success("✅ Orchestrator finished")}`);
|
|
|
37012
37031
|
if (this.config.provider) {
|
|
37013
37032
|
workerArgs.push("--provider", this.config.provider);
|
|
37014
37033
|
}
|
|
37015
|
-
if (this.config.skipPlanning) {
|
|
37016
|
-
workerArgs.push("--skip-planning");
|
|
37017
|
-
}
|
|
37018
37034
|
if (this.resolvedSprintId) {
|
|
37019
37035
|
workerArgs.push("--sprint-id", this.resolvedSprintId);
|
|
37020
37036
|
}
|
|
@@ -37613,12 +37629,12 @@ function getVersion() {
|
|
|
37613
37629
|
var VERSION2 = getVersion();
|
|
37614
37630
|
function printBanner() {
|
|
37615
37631
|
console.log(c.primary(`
|
|
37616
|
-
|
|
37617
|
-
|
|
37618
|
-
|
|
37619
|
-
|
|
37620
|
-
|
|
37621
|
-
`));
|
|
37632
|
+
_ ____ ____ _ _ ____
|
|
37633
|
+
| | / __ \\ / ___| | | |/ ___|
|
|
37634
|
+
| | | | | | | | | | |\\___ \\
|
|
37635
|
+
| |___| |__| | |___| |_| |___) |
|
|
37636
|
+
|_____|\\____/ \\____|\\___/|____/ ${c.dim(`v${VERSION2}`)}
|
|
37637
|
+
`));
|
|
37622
37638
|
}
|
|
37623
37639
|
function isProjectInitialized(projectPath) {
|
|
37624
37640
|
const locusDir = join8(projectPath, LOCUS_CONFIG.dir);
|
|
@@ -37628,14 +37644,14 @@ function isProjectInitialized(projectPath) {
|
|
|
37628
37644
|
function requireInitialization(projectPath, command) {
|
|
37629
37645
|
if (!isProjectInitialized(projectPath)) {
|
|
37630
37646
|
console.error(`
|
|
37631
|
-
${c.error("
|
|
37647
|
+
${c.error("✖ Error")} ${c.red(`Locus is not initialized in this directory.`)}
|
|
37632
37648
|
|
|
37633
|
-
The '${c.bold(command)}' command requires a Locus project to be initialized.
|
|
37649
|
+
The '${c.bold(command)}' command requires a Locus project to be initialized.
|
|
37634
37650
|
|
|
37635
|
-
To initialize Locus in this directory, run:
|
|
37636
|
-
|
|
37651
|
+
To initialize Locus in this directory, run:
|
|
37652
|
+
${c.primary("locus init")}
|
|
37637
37653
|
|
|
37638
|
-
This will create a .locus directory with the necessary configuration.
|
|
37654
|
+
This will create a ${c.dim(".locus")} directory with the necessary configuration.
|
|
37639
37655
|
`);
|
|
37640
37656
|
process.exit(1);
|
|
37641
37657
|
}
|
|
@@ -37696,12 +37712,11 @@ async function runCommand(args) {
|
|
|
37696
37712
|
apiBase,
|
|
37697
37713
|
maxIterations: 100,
|
|
37698
37714
|
projectPath,
|
|
37699
|
-
apiKey
|
|
37700
|
-
skipPlanning: Boolean(values["skip-planning"])
|
|
37715
|
+
apiKey
|
|
37701
37716
|
});
|
|
37702
|
-
orchestrator.on("task:assigned", (data) => console.log(
|
|
37703
|
-
orchestrator.on("task:completed", (data) => console.log(
|
|
37704
|
-
orchestrator.on("task:failed", (data) => console.log(
|
|
37717
|
+
orchestrator.on("task:assigned", (data) => console.log(` ${c.info("●")} ${c.bold("Claimed:")} ${data.title}`));
|
|
37718
|
+
orchestrator.on("task:completed", (data) => console.log(` ${c.success("✔")} ${c.success("Completed:")} ${c.dim(data.taskId)}`));
|
|
37719
|
+
orchestrator.on("task:failed", (data) => console.log(` ${c.error("✖")} ${c.error("Failed:")} ${c.bold(data.taskId)}: ${data.error}`));
|
|
37705
37720
|
const handleSignal = async (signal) => {
|
|
37706
37721
|
console.log(`
|
|
37707
37722
|
${c.info(`Received ${signal}. Stopping agents...`)}`);
|
|
@@ -37710,7 +37725,8 @@ ${c.info(`Received ${signal}. Stopping agents...`)}`);
|
|
|
37710
37725
|
};
|
|
37711
37726
|
process.on("SIGINT", () => handleSignal("SIGINT"));
|
|
37712
37727
|
process.on("SIGTERM", () => handleSignal("SIGTERM"));
|
|
37713
|
-
console.log(
|
|
37728
|
+
console.log(`
|
|
37729
|
+
${c.primary("\uD83D\uDE80")} ${c.bold("Starting Locus agent in")} ${c.primary(projectPath)}...`);
|
|
37714
37730
|
await orchestrator.start();
|
|
37715
37731
|
}
|
|
37716
37732
|
async function indexCommand(args) {
|
|
@@ -37734,12 +37750,22 @@ async function indexCommand(args) {
|
|
|
37734
37750
|
});
|
|
37735
37751
|
const summarizer = new TreeSummarizer(aiRunner);
|
|
37736
37752
|
const indexer = new CodebaseIndexer(projectPath);
|
|
37737
|
-
console.log(
|
|
37738
|
-
|
|
37739
|
-
|
|
37740
|
-
indexer.
|
|
37753
|
+
console.log(`
|
|
37754
|
+
${c.step(" INDEX ")} ${c.primary("Analyzing codebase in")} ${c.bold(projectPath)}...`);
|
|
37755
|
+
try {
|
|
37756
|
+
const index = await indexer.index((msg) => console.log(` ${c.dim(msg)}`), (tree) => summarizer.summarize(tree));
|
|
37757
|
+
if (index) {
|
|
37758
|
+
indexer.saveIndex(index);
|
|
37759
|
+
}
|
|
37760
|
+
} catch (error48) {
|
|
37761
|
+
console.error(`
|
|
37762
|
+
${c.error("✖")} ${c.error("Indexing failed:")} ${c.red(error48 instanceof Error ? error48.message : String(error48))}`);
|
|
37763
|
+
console.error(c.dim(` The agent might have limited context until indexing succeeds.
|
|
37764
|
+
`));
|
|
37741
37765
|
}
|
|
37742
|
-
console.log(
|
|
37766
|
+
console.log(`
|
|
37767
|
+
${c.success("✔")} ${c.success("Indexing complete!")}
|
|
37768
|
+
`);
|
|
37743
37769
|
}
|
|
37744
37770
|
async function initCommand() {
|
|
37745
37771
|
const projectPath = process.cwd();
|
|
@@ -37755,19 +37781,19 @@ If you want to reinitialize, please remove the .locus directory first.
|
|
|
37755
37781
|
}
|
|
37756
37782
|
await new ConfigManager(projectPath).init(VERSION2);
|
|
37757
37783
|
console.log(`
|
|
37758
|
-
${c.success("✨ Locus initialized successfully!")}
|
|
37784
|
+
${c.success("✨ Locus initialized successfully!")}
|
|
37759
37785
|
|
|
37760
|
-
Created:
|
|
37761
|
-
|
|
37762
|
-
|
|
37763
|
-
|
|
37764
|
-
|
|
37786
|
+
${c.bold("Created:")}
|
|
37787
|
+
${c.primary("\uD83D\uDCC1")} ${c.bold(".locus/")} ${c.dim("Configuration directory")}
|
|
37788
|
+
${c.primary("\uD83D\uDCC4")} ${c.bold(".locus/config.json")} ${c.dim("Project settings")}
|
|
37789
|
+
${c.primary("\uD83D\uDCDD")} ${c.bold("CLAUDE.md")} ${c.dim("AI instructions & context")}
|
|
37790
|
+
${c.primary("\uD83D\uDCC1")} ${c.bold(".agent/skills/")} ${c.dim("Domain-specific agent skills")}
|
|
37765
37791
|
|
|
37766
|
-
Next steps:
|
|
37767
|
-
|
|
37768
|
-
|
|
37792
|
+
${c.bold("Next steps:")}
|
|
37793
|
+
1. Run '${c.primary("locus index")}' to index your codebase
|
|
37794
|
+
2. Run '${c.primary("locus run")}' to start an agent (requires --api-key)
|
|
37769
37795
|
|
|
37770
|
-
For more information, visit: ${c.underline("https://locusai.dev/docs")}
|
|
37796
|
+
For more information, visit: ${c.underline("https://locusai.dev/docs")}
|
|
37771
37797
|
`);
|
|
37772
37798
|
}
|
|
37773
37799
|
async function main() {
|
|
@@ -37786,28 +37812,29 @@ async function main() {
|
|
|
37786
37812
|
break;
|
|
37787
37813
|
default:
|
|
37788
37814
|
console.log(`
|
|
37789
|
-
|
|
37815
|
+
${c.header(" USAGE ")}
|
|
37816
|
+
${c.primary("locus")} ${c.dim("<command> [options]")}
|
|
37790
37817
|
|
|
37791
|
-
|
|
37792
|
-
|
|
37793
|
-
|
|
37794
|
-
|
|
37818
|
+
${c.header(" COMMANDS ")}
|
|
37819
|
+
${c.success("init")} Initialize Locus in the current directory
|
|
37820
|
+
${c.success("index")} Index the codebase for AI context
|
|
37821
|
+
${c.success("run")} Start an agent to work on tasks
|
|
37795
37822
|
|
|
37796
|
-
|
|
37797
|
-
|
|
37798
|
-
|
|
37799
|
-
--skip-planning Skip the planning phase (CLI planning)
|
|
37823
|
+
${c.header(" OPTIONS ")}
|
|
37824
|
+
${c.secondary("--help")} Show this help message
|
|
37825
|
+
${c.secondary("--provider")} <name> AI provider: ${c.dim("claude")} or ${c.dim("codex")} (default: ${c.dim("claude")})
|
|
37800
37826
|
|
|
37801
|
-
|
|
37802
|
-
|
|
37803
|
-
|
|
37804
|
-
|
|
37827
|
+
${c.header(" EXAMPLES ")}
|
|
37828
|
+
${c.dim("$")} ${c.primary("locus init")}
|
|
37829
|
+
${c.dim("$")} ${c.primary("locus index")}
|
|
37830
|
+
${c.dim("$")} ${c.primary("locus run --api-key YOUR_KEY")}
|
|
37805
37831
|
|
|
37806
|
-
For more information, visit: https://locusai.dev/docs
|
|
37832
|
+
For more information, visit: ${c.underline("https://locusai.dev/docs")}
|
|
37807
37833
|
`);
|
|
37808
37834
|
}
|
|
37809
37835
|
}
|
|
37810
37836
|
main().catch((err) => {
|
|
37811
|
-
console.error(`
|
|
37837
|
+
console.error(`
|
|
37838
|
+
${c.error("✖ Fatal Error")} ${c.red(err.message)}`);
|
|
37812
37839
|
process.exit(1);
|
|
37813
37840
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@locusai/cli",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "CLI for Locus - AI-native project management platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"author": "",
|
|
33
33
|
"license": "MIT",
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@locusai/sdk": "^0.7.
|
|
35
|
+
"@locusai/sdk": "^0.7.1"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {}
|
|
38
38
|
}
|