loki-mode 11.55.3 → 11.56.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.
Files changed (69) hide show
  1. package/SKILL.md +2 -2
  2. package/VERSION +1 -1
  3. package/autonomy/lib/mcp-config.sh +131 -0
  4. package/dashboard/__init__.py +1 -1
  5. package/docs/CLI-REFERENCE.md +1 -1
  6. package/docs/INSTALLATION.md +1 -1
  7. package/docs/v10/DECISIONS.md +33 -0
  8. package/loki-ts/dist/loki.js +420 -420
  9. package/mcp/__init__.py +1 -1
  10. package/package.json +2 -2
  11. package/packages/control-plane/dist/server.js +4 -1
  12. package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
  13. package/web-app/dist/assets/{AdminPage-787mLcOm.js → AdminPage-CS1TLa1p.js} +1 -1
  14. package/web-app/dist/assets/{Avatar-B19Ex8_y.js → Avatar-DFHQa1zD.js} +1 -1
  15. package/web-app/dist/assets/{Badge-7BMBLlqn.js → Badge-Bu0GSP_e.js} +1 -1
  16. package/web-app/dist/assets/{Button-DpwXoEkR.js → Button-BtIqH5ch.js} +1 -1
  17. package/web-app/dist/assets/{CockpitPage-qQ6G5sJ1.js → CockpitPage-CfaBwry6.js} +1 -1
  18. package/web-app/dist/assets/{ComparePage-wRDvE_58.js → ComparePage-LFPFAnAg.js} +1 -1
  19. package/web-app/dist/assets/{ErrorBoundary-RZstCnU5.js → ErrorBoundary-C-vKPes3.js} +1 -1
  20. package/web-app/dist/assets/{EvidenceReceiptPanel-Bf3lmBtM.js → EvidenceReceiptPanel-DqD7XcAO.js} +1 -1
  21. package/web-app/dist/assets/{GitHubIssuesPanel-CJXWuRuz.js → GitHubIssuesPanel-CAgeFtTO.js} +1 -1
  22. package/web-app/dist/assets/{GitHubPRsPanel-B2EeSEh3.js → GitHubPRsPanel-Ba-55DXn.js} +1 -1
  23. package/web-app/dist/assets/{HomePage-UjX-E4N6.js → HomePage-DoWjCSrv.js} +2 -2
  24. package/web-app/dist/assets/{LoginPage-CAmEYfop.js → LoginPage-DV71edmi.js} +1 -1
  25. package/web-app/dist/assets/{MagicPage-DxywKf3P.js → MagicPage-C9D55T2u.js} +1 -1
  26. package/web-app/dist/assets/{MetricsPage-BV046Dt5.js → MetricsPage-Bc024F0k.js} +1 -1
  27. package/web-app/dist/assets/{NotFoundPage-EcTx3K44.js → NotFoundPage-CCLWdYOl.js} +1 -1
  28. package/web-app/dist/assets/{ProjectPage-Dh_t68M9.js → ProjectPage-GUXsX3QZ.js} +3 -3
  29. package/web-app/dist/assets/{ProjectsPage-Kyynj1PE.js → ProjectsPage-Bxod8hn7.js} +1 -1
  30. package/web-app/dist/assets/{SettingsPage-C0hiL43c.js → SettingsPage-Bx5FzopU.js} +1 -1
  31. package/web-app/dist/assets/{ShowcasePage-CQ5jdfMs.js → ShowcasePage-DZ_g4fF_.js} +1 -1
  32. package/web-app/dist/assets/{SystemSettingsPage-FlDa32r5.js → SystemSettingsPage-_flGg0Qi.js} +1 -1
  33. package/web-app/dist/assets/{TeamsPage-DA0TDVwJ.js → TeamsPage-BUiqpzZm.js} +1 -1
  34. package/web-app/dist/assets/{TemplatesPage-BJEMy1Kg.js → TemplatesPage-B92HXpwI.js} +1 -1
  35. package/web-app/dist/assets/{TerminalOutput-cbDWpcZU.js → TerminalOutput-EzZE4Jxm.js} +1 -1
  36. package/web-app/dist/assets/{activity-D96xd-Z8.js → activity-D2CfB_EW.js} +1 -1
  37. package/web-app/dist/assets/{bell-DZZy2Txb.js → bell-CWFPLDWC.js} +1 -1
  38. package/web-app/dist/assets/{bot-ClztK49H.js → bot-CNHeBTIg.js} +1 -1
  39. package/web-app/dist/assets/{check-CafY6Bpp.js → check-6Vwas1_n.js} +1 -1
  40. package/web-app/dist/assets/{chevron-left-qN6MgO6f.js → chevron-left-D6vqVGV2.js} +1 -1
  41. package/web-app/dist/assets/{circle-alert-B3rDlPyi.js → circle-alert-vZSAM05X.js} +1 -1
  42. package/web-app/dist/assets/{clock-yhdmvJQe.js → clock-CnswZnn8.js} +1 -1
  43. package/web-app/dist/assets/{cloud-BfK0zjqu.js → cloud-RH3mXitS.js} +1 -1
  44. package/web-app/dist/assets/{code-xml-ON09v1Zw.js → code-xml-CXESzF1z.js} +1 -1
  45. package/web-app/dist/assets/{database-D14hV_18.js → database-CRVhK-SE.js} +1 -1
  46. package/web-app/dist/assets/{dollar-sign-CwtB4Sj3.js → dollar-sign-DgBukQ9i.js} +1 -1
  47. package/web-app/dist/assets/{file-code-corner-CmKtu-eZ.js → file-code-corner-Y3A4V_K4.js} +1 -1
  48. package/web-app/dist/assets/{file-plus-D0DdAyg0.js → file-plus-BelYcaec.js} +1 -1
  49. package/web-app/dist/assets/{globe-D_8bYAqh.js → globe-CyJSU7jd.js} +1 -1
  50. package/web-app/dist/assets/{hammer-Aj1LkY6C.js → hammer-BOidf3Tp.js} +1 -1
  51. package/web-app/dist/assets/{index-BIEiQjmB.js → index-D6OKfe0b.js} +3 -3
  52. package/web-app/dist/assets/{layers-C7J_v7BJ.js → layers-D2NHIEPk.js} +1 -1
  53. package/web-app/dist/assets/{loader-circle-DoJQhc2w.js → loader-circle-CulP99O3.js} +1 -1
  54. package/web-app/dist/assets/{lock-Bcu2-_9Y.js → lock-3xJg68no.js} +1 -1
  55. package/web-app/dist/assets/{package-CVWCKvFF.js → package-B4KUzPCh.js} +1 -1
  56. package/web-app/dist/assets/{plus-D0RCWsFx.js → plus-k3Afhk_s.js} +1 -1
  57. package/web-app/dist/assets/{refresh-cw-EZbqQk7s.js → refresh-cw-20eHs2b0.js} +1 -1
  58. package/web-app/dist/assets/{rotate-ccw-CsfEWs-s.js → rotate-ccw-ASo2xpKG.js} +1 -1
  59. package/web-app/dist/assets/{scroll-text-DaoryILM.js → scroll-text-Dyf85Xdk.js} +1 -1
  60. package/web-app/dist/assets/{server-C2VU3Les.js → server-B4yn1rg_.js} +1 -1
  61. package/web-app/dist/assets/{shield-alert-Sl4B6ucP.js → shield-alert-DkYeKtwH.js} +1 -1
  62. package/web-app/dist/assets/{thumbs-up-D1lqvxKN.js → thumbs-up-DUok_4OO.js} +1 -1
  63. package/web-app/dist/assets/{trash-2-CLvBqgL2.js → trash-2-CnYRCYin.js} +1 -1
  64. package/web-app/dist/assets/{trending-down-6bDOAs1q.js → trending-down-DVGjDitN.js} +1 -1
  65. package/web-app/dist/assets/{trending-up-Zon-0fnL.js → trending-up-BV5FkIaf.js} +1 -1
  66. package/web-app/dist/assets/{upload-n9ya3v2J.js → upload-DZoTnPCh.js} +1 -1
  67. package/web-app/dist/assets/{usePolling-USiPc69B.js → usePolling-b5Ikv8_H.js} +1 -1
  68. package/web-app/dist/assets/{user-DDC8tQNj.js → user-Doxxr8Rr.js} +1 -1
  69. package/web-app/dist/index.html +1 -1
package/SKILL.md CHANGED
@@ -3,7 +3,7 @@ name: loki-mode
3
3
  description: Runs an autonomous software factory that knows what it is supposed to deliver and proves it did, with a signed receipt. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
4
4
  ---
5
5
 
6
- # Loki Mode v11.55.3
6
+ # Loki Mode v11.56.1
7
7
 
8
8
  **Current entry points (Loki 10 engine):** `loki "<task>"`, `loki owner/repo#N` and `loki quick "<task>"` run the Loki 10 engine and end with a signed receipt (`loki verify`). `loki backlog owner/repo --all` runs many issues in parallel. Guide: `docs/v10/GUIDE.md`. The skill instructions below, and `loki start`, describe the previous bash loop. PRD-file starts (`loki start ./prd.md`) and the opencode provider still run on it until FC38-SWEEP ports them; the legacy-engine command and the LOKI_ENGINE switch remain removed. Prefer `loki owner/repo#N` for issues.
9
9
 
@@ -476,4 +476,4 @@ Implemented, planned and deprecated items, with the version each landed in: `ski
476
476
 
477
477
  ---
478
478
 
479
- **v11.55.3 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
479
+ **v11.56.1 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 11.55.3
1
+ 11.56.1
@@ -27,6 +27,11 @@
27
27
  # element to satisfy Claude's variadic flag.
28
28
  # Returns 0 on success, 1 if the bundle
29
29
  # emission fails.
30
+ # loki_mcp_launch_for -- emit the per-provider MCP launch as one compact JSON
31
+ # object {"argv":[..],"env":{..}[,"reason":".."]}
32
+ # for claude|codex|opencode|cline|aider. Mirror of
33
+ # mcpLaunchFor in loki-ts/src/providers/mcp_config.ts;
34
+ # tests/providers parity test reads both.
30
35
  #
31
36
  # No side effects beyond writing .loki/mcp-config.json (idempotent;
32
37
  # regenerated each call).
@@ -183,3 +188,129 @@ loki_mcp_config_argv() {
183
188
  fi
184
189
  return 0
185
190
  }
191
+
192
+ # ---------- Per-provider MCP launch (CW-10) ----------
193
+ # Usage: loki_mcp_launch_for <provider> [target_dir]
194
+ # claude: the pre-CW-10 --mcp-config paths, unchanged. codex: `-c mcp_servers.*`
195
+ # overrides. opencode: env OPENCODE_CONFIG_CONTENT. cline/aider/unknown: empty
196
+ # launch plus a reason. Servers for codex/opencode: Loki bundle, project
197
+ # <target_dir>/.mcp.json only when LOKI_MCP_PROJECT=1, ~/.claude/mcp.json overlay;
198
+ # bundle wins a name collision, then project over overlay. `${...}` stays literal.
199
+ loki_mcp_launch_for() {
200
+ local provider="${1:-}" target="${2:-${TARGET_DIR:-.}}"
201
+ local claude_argv="" user_path="" project_path="" lsp_detected=0 lsp_bin cline_ver="unknown" line
202
+ case "$provider" in
203
+ claude)
204
+ claude_argv=$(TARGET_DIR="$target" loki_mcp_config_argv) || return 1
205
+ ;;
206
+ codex | opencode)
207
+ TARGET_DIR="$target" loki_mcp_config_path >/dev/null || return 1
208
+ user_path=$(loki_user_mcp_config_path)
209
+ if [ "${LOKI_MCP_PROJECT:-}" = "1" ]; then
210
+ project_path="${target}/.mcp.json"
211
+ fi
212
+ for lsp_bin in typescript-language-server pyright-langserver pylsp gopls rust-analyzer jdtls; do
213
+ if command -v "$lsp_bin" >/dev/null 2>&1; then
214
+ lsp_detected=1
215
+ break
216
+ fi
217
+ done
218
+ ;;
219
+ cline)
220
+ if command -v cline >/dev/null 2>&1; then
221
+ line=$(cline --version 2>/dev/null | head -n 1) || line=""
222
+ line="${line#"${line%%[![:space:]]*}"}"
223
+ line="${line%"${line##*[![:space:]]}"}"
224
+ [ -n "$line" ] && cline_ver="$line"
225
+ fi
226
+ ;;
227
+ esac
228
+ _MCP_PROVIDER="$provider" _MCP_CLAUDE_ARGV="$claude_argv" _MCP_USER="$user_path" _MCP_PROJECT="$project_path" _MCP_LSP="$lsp_detected" _MCP_CLINE_VER="$cline_ver" python3 -c '
229
+ import json, os, re
230
+ prov = os.environ["_MCP_PROVIDER"]
231
+ NAME = re.compile(r"^[A-Za-z0-9_-]+$")
232
+ MAXB = 1024 * 1024
233
+
234
+ def norm(raw):
235
+ out = {}
236
+ if not isinstance(raw, dict):
237
+ return out
238
+ for name, e in raw.items():
239
+ if not NAME.match(name) or not isinstance(e, dict):
240
+ continue
241
+ cmd = e.get("command")
242
+ if not isinstance(cmd, str) or not cmd:
243
+ continue
244
+ args = e.get("args", [])
245
+ if not isinstance(args, list) or not all(isinstance(a, str) for a in args):
246
+ continue
247
+ env = e.get("env", {})
248
+ if not isinstance(env, dict) or not all(isinstance(v, str) for v in env.values()):
249
+ continue
250
+ out[name] = {"command": cmd, "args": args, "env": env}
251
+ return out
252
+
253
+ def load(p):
254
+ if not p:
255
+ return {}
256
+ try:
257
+ if not os.path.isfile(p) or os.path.getsize(p) > MAXB:
258
+ return {}
259
+ with open(p, encoding="utf-8") as h:
260
+ v = json.load(h)
261
+ return norm(v.get("mcpServers")) if isinstance(v, dict) else {}
262
+ except (OSError, ValueError):
263
+ return {}
264
+
265
+ def dumps(v):
266
+ return json.dumps(v, ensure_ascii=False, separators=(",", ":"))
267
+
268
+ def servers():
269
+ merged = {}
270
+ merged.update(load(os.environ["_MCP_USER"]))
271
+ merged.update(load(os.environ["_MCP_PROJECT"]))
272
+ bundle = {"loki-mode": {"command": "python3", "args": ["-m", "mcp.server"]}}
273
+ if os.environ["_MCP_LSP"] == "1":
274
+ bundle["lsp-proxy"] = {"command": "python3", "args": ["-m", "mcp.lsp_proxy"]}
275
+ merged.update(norm(bundle))
276
+ ordered = {k: merged[k] for k in bundle}
277
+ for k, v in merged.items():
278
+ if k not in ordered:
279
+ ordered[k] = v
280
+ return ordered
281
+
282
+ res = {"argv": [], "env": {}}
283
+ if prov == "claude":
284
+ res["argv"] = ["--mcp-config"] + os.environ["_MCP_CLAUDE_ARGV"].split()
285
+ elif prov == "codex":
286
+ skipped = []
287
+ for n, s in servers().items():
288
+ names = [k for k in s["env"] if NAME.match(k)]
289
+ if any(k in res["env"] and res["env"][k] != s["env"][k] for k in names):
290
+ skipped.append(n)
291
+ continue
292
+ res["argv"] += ["-c", "mcp_servers.%s.command=%s" % (n, dumps(s["command"]))]
293
+ res["argv"] += ["-c", "mcp_servers.%s.args=%s" % (n, dumps(s["args"]))]
294
+ if names:
295
+ for k in names:
296
+ res["env"][k] = s["env"][k]
297
+ res["argv"] += ["-c", "mcp_servers.%s.env_vars=%s" % (n, dumps(names))]
298
+ if skipped:
299
+ res["reason"] = "mcp: skipped %s (env name conflict)" % ",".join(skipped)
300
+ elif prov == "opencode":
301
+ mcp = {}
302
+ for n, s in servers().items():
303
+ e = {"type": "local", "command": [s["command"]] + s["args"], "enabled": True}
304
+ if s["env"]:
305
+ e["environment"] = s["env"]
306
+ mcp[n] = e
307
+ res["env"] = {"OPENCODE_CONFIG_CONTENT": dumps({"mcp": mcp})}
308
+ elif prov == "cline":
309
+ res["reason"] = "mcp: unsupported (cline %s)" % os.environ["_MCP_CLINE_VER"]
310
+ elif prov == "aider":
311
+ res["reason"] = "mcp: unsupported (aider has no MCP support)"
312
+ else:
313
+ res["reason"] = "mcp: unsupported (provider %s)" % prov
314
+ print(dumps(res))
315
+ '
316
+ }
@@ -7,6 +7,6 @@ Modules:
7
7
  control: Session control helpers (status, atomic writes, origin check)
8
8
  """
9
9
 
10
- __version__ = "11.55.3"
10
+ __version__ = "11.56.1"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1,6 +1,6 @@
1
1
  # CLI reference
2
2
 
3
- Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.55.3. Do not edit by hand.
3
+ Generated from `loki-ts/src/cli/registry.ts` by `scripts/generate-stale-zero.sh` for v11.56.1. Do not edit by hand.
4
4
  Hidden and legacy-only commands are omitted; see `docs/v10/CLI-MODERN.md` for the full inventory.
5
5
 
6
6
  | Command | Description |
@@ -2,7 +2,7 @@
2
2
 
3
3
  Loki Mode, by [Autonomi](https://www.autonomi.dev/), turns a spec or an issue into a verified pull request with a receipt you can check. This page covers installing it, a first run, and the options around it.
4
4
 
5
- **Version:** v11.55.3
5
+ **Version:** v11.56.1
6
6
 
7
7
  **Engine note:** `loki start` is the primary command. `loki start`, `loki "<task>"`, `loki owner/repo#N` and `loki quick` all run the Loki 10 engine, whatever the flag order or input form (PRD file, issue ref, task or one-word brief). The previous loop runs only on `--engine legacy`, `LOKI_ENGINE=legacy`, or for one call when a flag Loki 10 cannot honor is present. See the [user guide](v10/GUIDE.md) and the [5-minute quickstart](QUICKSTART.md).
8
8
 
@@ -875,3 +875,36 @@ FC-AGENT-PROOF: a run whose only executed passing check is a test file the same
875
875
  6. The project's own install scripts (for example npm postinstall) run exactly as they do for a developer; opt-out is LOKI_E10_INSTALL=0 or loki.yaml `verify.install_deps: false`, documented in docs/environment-variables.md.
876
876
  - Amendment (D99): uv uses `uv sync --locked` (fails on an out-of-sync uv.lock; `--frozen` is replaced) and pipenv uses `pipenv install --deploy` (fails on an out-of-date Pipfile.lock; `pipenv sync` is replaced); pnpm-workspace.yaml is read in inline-list, block and unindented-block forms with `!` exclusions.
877
877
  - Reverse: founder call; the opt-out covers one-off needs.
878
+
879
+ ## D107 (2026-10-23, CoS records): #246 stays OFF by default (KEEP OFF)
880
+ 1. The #246 behavior ships disabled by default; it is enabled only by an explicit opt-in.
881
+ 2. Reversing this needs a new decision entry with field evidence.
882
+
883
+ ## D108 (2026-10-22, founder grant, CoS records on 2026-10-23): paid Claude and loki runs are pre-approved, each use is logged
884
+ 1. The founder pre-approved paid Claude runs and paid loki runs (LOKI_BENCH_SPEND_APPROVED) without a per-run question.
885
+ 2. Every use is logged (what ran, why, when) so the spend stays auditable. This extends D99.
886
+
887
+ ## D109 (2026-10-23, CoS records): weaktest and 246 are retired
888
+ 1. The weaktest and 246 work items are closed as retired; they are not reopened without a new decision entry.
889
+ 2. Related: D107 keeps the #246 behavior OFF by default.
890
+
891
+ ## D110 (2026-10-23, CoS under D99, slice pd/npmskip GO): npm dist-tag moves are fail-closed on any registry read failure
892
+ 1. scripts/npm-dist-tags.sh moves latest and next only to the highest published stable version, never backwards. It re-reads the tags after writing and restores an overtaken tag.
893
+ 2. Any failed or empty read of latest, next or the published versions refuses before ANY write (exit 1, "refusing to move latest (fail closed)"). The same script serves loki-mode and loki-mode-sdk. Class: FC-DIST-TAG-MOVED-BACKWARDS in FAILURE-CLASSES.md.
894
+ 3. Companion guards in the same slice: a verify-npm-registry job proves the registry serves the version, and release.sh --ship refuses notes that release-notes.sh rejects (not bypassable by LOKI_RELEASE_SKIP_GUARDS).
895
+
896
+ ## D111 (2026-10-23, CoS records, CW-04, #337): LOKI_SPEC_STRICT=1 is opt-in, default off
897
+ 1. Strict spec handling runs only when LOKI_SPEC_STRICT=1 is set; the default behavior is unchanged.
898
+ 2. Making it the default needs a new decision entry.
899
+
900
+ ## D112 (2026-10-23, founder mandate, CoS records): full autonomy and the 10/10 mandate
901
+ 1. The founder granted full decision authority and set 10/10 as the standing target; the CoS decides, ships and logs without per-step approval. This restates D99 and the 2026-10-22 grant.
902
+ 2. The never-do list in docs/LOKI-10-BUILD-PROMPT.md and the zero-mis-anything bar still bind.
903
+
904
+ ## D113 (2026-10-23, CoS records): test-only council changes are MEDIUM tier, not HIGH
905
+ 1. A change that touches only tests (no product code, gate, verifier, Seal, auth or release policy) is reviewed at MEDIUM by Tech Leads under D12, not by HIGH opus reviewers.
906
+ 2. Any change that also touches the moat, verifier, Seal, auth, security or release policy stays HIGH.
907
+
908
+ ## D114 (2026-10-23, CoS records, #343): Codex MCP secrets never go on argv
909
+ 1. Secret names are passed to Codex through env_vars; secret values travel only in the process environment.
910
+ 2. No secret value appears in a command line, where ps and shell history can read it.