@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.
@@ -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. The header carries the no-timeout
28
- * rule INLINE (not only as a skill-doc link) so a new Lead's first read
29
- * already has it; the wording is association-first on purpose (a diagnosis
30
- * to reach for after a dispatch dies, not a prohibition stated in advance).
31
- * Session ids are never generated here — that is `lmctl seed`'s job.
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. A dispatch that dies mid-turn is usually a timeout you set -- use --idle-timeout, not a shell timeout. Reply exactly: ACK: waiting for explicit lmctl task.\"";
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;
@@ -22,4 +22,4 @@ _MEMBER_ alias=Lead provider=claude
22
22
  _MEMBER_ alias=Outliner provider=claude
23
23
  _MEMBER_ alias=Drafter provider=codex
24
24
  _MEMBER_ alias=Editor provider=codex
25
- _MEMBER_ alias=FactChecker provider=qwen
25
+ _MEMBER_ alias=FactChecker provider=agy
@@ -21,5 +21,5 @@
21
21
  _MEMBER_ alias=Lead provider=claude
22
22
  _MEMBER_ alias=Researcher1 provider=codex
23
23
  _MEMBER_ alias=Researcher2 provider=claude
24
- _MEMBER_ alias=Critic provider=qwen
24
+ _MEMBER_ alias=Critic provider=opencode
25
25
  _MEMBER_ alias=Synthesizer provider=codex
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lmctl-ai/lmctl",
3
- "version": "0.2.6",
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",