@lmctl-ai/lmctl 0.2.6 → 0.2.8
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 +1 -1
- package/dist/cli/hello.d.ts +9 -0
- package/dist/cli/index.js +455 -365
- package/dist/cli/init.d.ts +21 -0
- package/dist/cli/plan.d.ts +9 -0
- package/dist/cli/quickrun.d.ts +11 -0
- package/dist/cli/script.js +149 -148
- package/dist/cli/teamfile-template.d.ts +12 -5
- package/dist/providers/config/init-config.d.ts +43 -0
- package/dist/providers/seed-instruction.d.ts +1 -1
- package/dist/script/lmscript.d.ts +14 -0
- package/examples/book-team.lmctl +1 -1
- package/examples/research-team.lmctl +1 -1
- package/package.json +1 -1
|
@@ -24,11 +24,18 @@ export declare function parseMemberSpec(raw: string): {
|
|
|
24
24
|
};
|
|
25
25
|
export declare function renderMemberLine(member: MemberSpec): string;
|
|
26
26
|
/**
|
|
27
|
-
* Render the canonical starter teamfile.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
27
|
+
* Render the canonical starter teamfile. Session ids are never generated
|
|
28
|
+
* here — that is `lmctl seed`'s job.
|
|
29
|
+
*
|
|
30
|
+
* Operator, 2026-09-29 (onboarding revamp, queued#21811): the header
|
|
31
|
+
* teaches the loop -- generate, edit, lint, seed -- and points at ONE page
|
|
32
|
+
* covering the teamfile format plus what lint and seed each do, rather
|
|
33
|
+
* than explaining any of that inline. Deliberately ONE link, not two:
|
|
34
|
+
* lmctl-lead.md is dropped (the seed prompt is cut to bare minimum for the
|
|
35
|
+
* same reason -- an arriving Lead isn't front-loaded with an operating
|
|
36
|
+
* guide) and the previously-inline no-`timeout` paragraph is cut entirely
|
|
37
|
+
* (queued#21813/#21814/#21820, operator: a warning that never stopped
|
|
38
|
+
* anyone who hit it is noise for everyone who has not).
|
|
32
39
|
*/
|
|
33
40
|
export declare function renderTeamfile(opts: {
|
|
34
41
|
teamName: string;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface InitProviderSlot {
|
|
2
|
+
provider: string;
|
|
3
|
+
model1: string;
|
|
4
|
+
model2: string;
|
|
5
|
+
model3: string;
|
|
6
|
+
}
|
|
7
|
+
export interface InitConfig {
|
|
8
|
+
provider1: InitProviderSlot;
|
|
9
|
+
provider2: InitProviderSlot;
|
|
10
|
+
provider3: InitProviderSlot;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The four providers lmctl actively ships defaults for, each with three
|
|
14
|
+
* model tiers (top / mid / lighter). These are real, currently-declared
|
|
15
|
+
* models observed on a live fleet (2026-09-29) -- a useful starting point,
|
|
16
|
+
* not a claim of permanent correctness; lint warns (never errors) if one
|
|
17
|
+
* goes stale, and the whole point of `lmctl init`'s output is that it is
|
|
18
|
+
* meant to be edited.
|
|
19
|
+
*/
|
|
20
|
+
export declare const PROVIDER_MODEL_DEFAULTS: Record<string, readonly [string, string, string]>;
|
|
21
|
+
/** Providers lmctl init knows how to fill in, in fixed preference order
|
|
22
|
+
* (used only to pick 3 of 4 when every provider is present; presence
|
|
23
|
+
* detection itself never ranks). */
|
|
24
|
+
export declare const SUPPORTED_INIT_PROVIDERS: readonly ["claude", "codex", "agy", "kimi"];
|
|
25
|
+
export declare function getDefaultInitConfigPath(): string;
|
|
26
|
+
/** Fill rule (operator, 2026-09-29): 3 detected -> use all 3; 2 -> Provider3 = Provider1;
|
|
27
|
+
* 1 (or 0, using a placeholder) -> Provider2 and Provider3 = Provider1. */
|
|
28
|
+
export declare function buildInitConfig(detectedProviders: string[]): InitConfig;
|
|
29
|
+
/** Returns the subset of SUPPORTED_INIT_PROVIDERS present on this machine,
|
|
30
|
+
* in SUPPORTED_INIT_PROVIDERS order (not a usage ranking -- presence is a
|
|
31
|
+
* yes/no question, order here is just deterministic output, not a claim
|
|
32
|
+
* about which is "best"). */
|
|
33
|
+
export declare function detectPresentProviders(): string[];
|
|
34
|
+
export declare function renderInitConfig(config: InitConfig): string;
|
|
35
|
+
export declare function parseInitConfigText(raw: string): InitConfig | null;
|
|
36
|
+
/** Reads the init config, or null if it doesn't exist / doesn't parse into
|
|
37
|
+
* all three complete slots. Never throws. */
|
|
38
|
+
export declare function readInitConfig(filePath?: string): InitConfig | null;
|
|
39
|
+
export declare function writeInitConfig(config: InitConfig, filePath?: string): void;
|
|
40
|
+
/** Substitutes ${Provider1..3} and ${Model1..3} in template text from a
|
|
41
|
+
* resolved InitConfig. Unknown placeholders are left untouched (quickrun
|
|
42
|
+
* surfaces them separately so a lint failure names the real cause). */
|
|
43
|
+
export declare function substituteInitPlaceholders(text: string, config: InitConfig): string;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare const SEED_ACK = "ACK: waiting for explicit lmctl task.";
|
|
2
2
|
export declare const SEED_INITIAL_PROMPT: string;
|
|
3
|
-
export declare const MANUAL_SEED_POST_LAUNCH_NOTE = "send this exact lmctl seed instruction: \"lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, or edit.
|
|
3
|
+
export declare const MANUAL_SEED_POST_LAUNCH_NOTE = "send this exact lmctl seed instruction: \"lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, or edit. Reply exactly: ACK: waiting for explicit lmctl task.\"";
|
|
@@ -512,6 +512,20 @@ export interface ExecutionResult {
|
|
|
512
512
|
export declare const LANGUAGE_DOCS: FunctionDoc[];
|
|
513
513
|
export declare const BUILTIN_FUNCTION_DOCS: FunctionDoc[];
|
|
514
514
|
export declare const STDLIB_FUNCTION_DOCS: FunctionDoc[];
|
|
515
|
+
/**
|
|
516
|
+
* Real C/Perl/Python printf-style substitution for sprintf()/printf()
|
|
517
|
+
* (math.lmctl, 2026-09-29, defect B: sprintf/printf were aliased onto
|
|
518
|
+
* format(), which is Python str.format brace syntax -- `sprintf("%s=%s",
|
|
519
|
+
* a, b)` silently returned the literal template unsubstituted, because "%s"
|
|
520
|
+
* is not a brace placeholder. "%s is the ONLY reason anyone reaches for the
|
|
521
|
+
* name sprintf" -- so these two entry points get their OWN real % syntax,
|
|
522
|
+
* format() keeps braces. Deliberately minimal: %s/%d/%f/%%, no width/
|
|
523
|
+
* precision/padding modifiers -- add more only against a concrete need.
|
|
524
|
+
* Extra args with no corresponding %-directive are silently unused,
|
|
525
|
+
* matching real printf (not folded into a "no directives -> space-join"
|
|
526
|
+
* fallback, which would just be a second silently-wrong behavior).
|
|
527
|
+
*/
|
|
528
|
+
export declare function printfFormat(template: any, args: any[]): string;
|
|
515
529
|
export declare class LMScript {
|
|
516
530
|
private readonly hostFunctions;
|
|
517
531
|
private readonly functionDocs;
|
package/examples/book-team.lmctl
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://lmctl.com",
|