loki-mode 7.123.1 → 7.125.0
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/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/loki +31 -0
- package/autonomy/run.sh +31 -4
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +2 -2
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Autonomous spec-driven build system with a built-in trust layer. It does not call work done until it is verified (RARV-C closure loop, 8 quality gates, completion council, verified-completion evidence gate). Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v7.
|
|
6
|
+
# Loki Mode v7.125.0
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -408,4 +408,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
408
408
|
|
|
409
409
|
---
|
|
410
410
|
|
|
411
|
-
**v7.
|
|
411
|
+
**v7.125.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
7.
|
|
1
|
+
7.125.0
|
package/autonomy/loki
CHANGED
|
@@ -903,6 +903,7 @@ show_help() {
|
|
|
903
903
|
echo " --github Enable GitHub issue import"
|
|
904
904
|
echo " --no-dashboard Disable web dashboard"
|
|
905
905
|
echo " --sandbox Run in Docker sandbox for isolation (default: off; requires Docker)"
|
|
906
|
+
echo " --isolation LVL Per-run isolation dial: none (default) | worktree | docker"
|
|
906
907
|
echo " --skip-memory Skip loading memory context at startup"
|
|
907
908
|
echo " --fresh-prd Regenerate the PRD from the codebase (no-PRD runs; ignores the reusable generated PRD)"
|
|
908
909
|
echo " --compliance PRESET Enable compliance mode (default|healthcare|fintech|government)"
|
|
@@ -1221,6 +1222,8 @@ cmd_start() {
|
|
|
1221
1222
|
echo " --no-dashboard Disable web dashboard"
|
|
1222
1223
|
echo " --api Start dashboard API server alongside the build"
|
|
1223
1224
|
echo " --sandbox Run in Docker sandbox (default: off; requires Docker)"
|
|
1225
|
+
echo " --isolation LEVEL Per-run isolation: none (default) | worktree | docker."
|
|
1226
|
+
echo " Unified dial; --parallel = worktree, --sandbox = docker."
|
|
1224
1227
|
echo " --skip-memory Skip loading memory context at startup"
|
|
1225
1228
|
echo " --fresh-prd Regenerate the PRD from the codebase on a no-PRD run"
|
|
1226
1229
|
echo " (ignores the reusable generated PRD; aliases: --regen-prd,"
|
|
@@ -1385,6 +1388,34 @@ cmd_start() {
|
|
|
1385
1388
|
export LOKI_SANDBOX_MODE=true
|
|
1386
1389
|
shift
|
|
1387
1390
|
;;
|
|
1391
|
+
--isolation|--isolation=*)
|
|
1392
|
+
# Unified per-run isolation dial (rec #4). ONE canonical knob that
|
|
1393
|
+
# subsumes the fragmented --parallel (worktree) and --sandbox
|
|
1394
|
+
# (docker) flags, matching the zeroshot none/worktree/docker model
|
|
1395
|
+
# while keeping every existing flag working as an alias:
|
|
1396
|
+
# none -> default (in-place; exactly today's behavior)
|
|
1397
|
+
# worktree -> git-worktree isolation (same mechanism as --parallel)
|
|
1398
|
+
# docker -> Docker sandbox (same mechanism as --sandbox)
|
|
1399
|
+
# Fail-closed on an unknown value: never silently downgrade to a
|
|
1400
|
+
# weaker isolation than the operator asked for.
|
|
1401
|
+
local _iso_val
|
|
1402
|
+
if [[ "$1" == --isolation=* ]]; then
|
|
1403
|
+
_iso_val="${1#--isolation=}"; shift
|
|
1404
|
+
else
|
|
1405
|
+
_iso_val="${2:-}"; shift 2 2>/dev/null || shift
|
|
1406
|
+
fi
|
|
1407
|
+
case "$_iso_val" in
|
|
1408
|
+
none|"")
|
|
1409
|
+
: ;; # default: no isolation, in-place
|
|
1410
|
+
worktree|wt)
|
|
1411
|
+
args+=("--parallel") ;;
|
|
1412
|
+
docker|sandbox)
|
|
1413
|
+
export LOKI_SANDBOX_MODE=true ;;
|
|
1414
|
+
*)
|
|
1415
|
+
echo -e "${RED}Error: --isolation must be one of: none, worktree, docker (got '${_iso_val}')${NC}" >&2
|
|
1416
|
+
return 2 ;;
|
|
1417
|
+
esac
|
|
1418
|
+
;;
|
|
1388
1419
|
--skip-memory)
|
|
1389
1420
|
export LOKI_SKIP_MEMORY=true
|
|
1390
1421
|
shift
|
package/autonomy/run.sh
CHANGED
|
@@ -11263,6 +11263,13 @@ MANAGED_SELECTION
|
|
|
11263
11263
|
export LOKI_REVIEW_DIFF_FILE="$diff_file"
|
|
11264
11264
|
export LOKI_REVIEW_FILES_FILE="$files_file"
|
|
11265
11265
|
export LOKI_AGENTS_TYPES_FILE="${PROJECT_DIR}/agents/types.json"
|
|
11266
|
+
# Complexity-proportional verification (rec #3): scale the number of
|
|
11267
|
+
# keyword-selected specialists to the detected task tier. HARD FLOOR: every
|
|
11268
|
+
# tier keeps the 2 mandatory reviewers + 2 specialists (= today's behavior),
|
|
11269
|
+
# so simple/standard are byte-identical to prior releases and nothing
|
|
11270
|
+
# shippable ever gets LESS scrutiny. Only `complex` ADDS specialists (deeper
|
|
11271
|
+
# battery for hard tasks). Never drops below the floor.
|
|
11272
|
+
export LOKI_REVIEW_COMPLEXITY="${DETECTED_COMPLEXITY:-standard}"
|
|
11266
11273
|
local selected_specialists
|
|
11267
11274
|
selected_specialists=$(python3 << 'SPECIALIST_SELECT'
|
|
11268
11275
|
import os
|
|
@@ -11366,11 +11373,31 @@ for name, spec in SPECIALISTS.items():
|
|
|
11366
11373
|
# Sort by score descending, then by priority ascending (tie-breaker)
|
|
11367
11374
|
ranked = sorted(scores.keys(), key=lambda n: (-scores[n], SPECIALISTS[n]["priority"]))
|
|
11368
11375
|
|
|
11369
|
-
#
|
|
11376
|
+
# Complexity-proportional specialist count (rec #3). HARD FLOOR of 2 keyword
|
|
11377
|
+
# specialists on every tier -- combined with the 2 always-on mandatory reviewers
|
|
11378
|
+
# below, that is the 4-reviewer battery every prior release shipped, so simple
|
|
11379
|
+
# and standard are byte-identical. Only `complex` ADDS specialists (up to 4) for
|
|
11380
|
+
# a deeper battery on hard tasks; it never drops below the floor. Capped at the
|
|
11381
|
+
# available pool so a small pool cannot request more than exist.
|
|
11382
|
+
complexity = os.environ.get("LOKI_REVIEW_COMPLEXITY", "standard").strip().lower()
|
|
11383
|
+
SPECIALIST_COUNT_BY_TIER = {"simple": 2, "standard": 2, "complex": 4}
|
|
11384
|
+
want = SPECIALIST_COUNT_BY_TIER.get(complexity, 2)
|
|
11385
|
+
if want < 2:
|
|
11386
|
+
want = 2 # floor guard: an unknown/forced tier can never shrink the battery
|
|
11387
|
+
|
|
11388
|
+
# If no keywords matched at all, use defaults (still honoring the tier count:
|
|
11389
|
+
# pad the two hardcoded defaults with the next-ranked specialists for `complex`).
|
|
11370
11390
|
if all(s == 0 for s in scores.values()):
|
|
11371
|
-
|
|
11391
|
+
base_defaults = ["security-sentinel", "test-coverage-auditor"]
|
|
11392
|
+
selected = list(base_defaults)
|
|
11393
|
+
if want > len(selected):
|
|
11394
|
+
for n in ranked:
|
|
11395
|
+
if n not in selected:
|
|
11396
|
+
selected.append(n)
|
|
11397
|
+
if len(selected) >= want:
|
|
11398
|
+
break
|
|
11372
11399
|
else:
|
|
11373
|
-
selected = ranked[:
|
|
11400
|
+
selected = ranked[:want]
|
|
11374
11401
|
|
|
11375
11402
|
# Output JSON: architecture-strategist + maintainer-mergeability always first
|
|
11376
11403
|
# (both carry a mandate no keyword-selected specialist does), then the 2 selected.
|
|
@@ -11406,7 +11433,7 @@ result = {
|
|
|
11406
11433
|
print(json.dumps(result))
|
|
11407
11434
|
SPECIALIST_SELECT
|
|
11408
11435
|
)
|
|
11409
|
-
unset LOKI_REVIEW_DIFF_FILE LOKI_REVIEW_FILES_FILE LOKI_AGENTS_TYPES_FILE LOKI_REVIEW_HEALING_ACTIVE
|
|
11436
|
+
unset LOKI_REVIEW_DIFF_FILE LOKI_REVIEW_FILES_FILE LOKI_AGENTS_TYPES_FILE LOKI_REVIEW_HEALING_ACTIVE LOKI_REVIEW_COMPLEXITY
|
|
11410
11437
|
|
|
11411
11438
|
if [ -z "$selected_specialists" ]; then
|
|
11412
11439
|
log_error "Code review: Specialist selection failed"
|
package/dashboard/__init__.py
CHANGED
package/docs/INSTALLATION.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
The flagship product of [Autonomi](https://www.autonomi.dev/). Loki Mode is a spec-driven autonomous builder with a built-in trust layer that takes any spec to a deployed product and verifies completion with evidence (quality gates plus a completion council), not just a "done" claim. Complete installation instructions for all platforms and use cases.
|
|
4
4
|
|
|
5
|
-
**Version:** v7.
|
|
5
|
+
**Version:** v7.125.0
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -396,7 +396,7 @@ provider works inside the container. Provide auth with your Anthropic API key:
|
|
|
396
396
|
# Run Loki Mode in Docker (Claude provider, API-key auth)
|
|
397
397
|
docker run --rm -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" \
|
|
398
398
|
-v $(pwd):/workspace -w /workspace \
|
|
399
|
-
asklokesh/loki-mode:7.
|
|
399
|
+
asklokesh/loki-mode:7.125.0 start ./my-spec.md
|
|
400
400
|
```
|
|
401
401
|
|
|
402
402
|
##### docker compose + .env (no host install)
|
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var q8=Object.defineProperty;var J8=($)=>$;function V8($,Q){this[$]=J8.bind(null,Q)}var b=($,Q)=>{for(var Z in Q)q8($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:V8.bind(Q,Z)})};var P=($,Q)=>()=>($&&(Q=$($=0)),Q);var J$=import.meta.require;var m1={};b(m1,{lokiDir:()=>j,homeLokiDir:()=>T$,findRepoRootForVersion:()=>$1,REPO_ROOT:()=>h});import{resolve as t,dirname as e$}from"path";import{fileURLToPath as W8}from"url";import{existsSync as N$}from"fs";import{homedir as H8}from"os";function G8(){let $=v1;for(let Q=0;Q<6;Q++){if(N$(t($,"VERSION"))&&N$(t($,"autonomy/run.sh")))return $;let Z=e$($);if(Z===$)break;$=Z}return t(v1,"..","..","..")}function $1($){let Q=$;for(let Z=0;Z<6;Z++){if(N$(t(Q,"VERSION"))&&N$(t(Q,"autonomy/run.sh")))return Q;let z=e$(Q);if(z===Q)break;Q=z}return t($,"..","..","..")}function j(){return process.env.LOKI_DIR??t(process.cwd(),".loki")}function T$(){return t(H8(),".loki")}var v1,h;var C=P(()=>{v1=e$(W8(import.meta.url));h=G8()});import{readFileSync as U8}from"fs";import{resolve as Y8,dirname as B8}from"path";import{fileURLToPath as M8}from"url";function S$(){if(Q$!==null)return Q$;let $="7.
|
|
2
|
+
var q8=Object.defineProperty;var J8=($)=>$;function V8($,Q){this[$]=J8.bind(null,Q)}var b=($,Q)=>{for(var Z in Q)q8($,Z,{get:Q[Z],enumerable:!0,configurable:!0,set:V8.bind(Q,Z)})};var P=($,Q)=>()=>($&&(Q=$($=0)),Q);var J$=import.meta.require;var m1={};b(m1,{lokiDir:()=>j,homeLokiDir:()=>T$,findRepoRootForVersion:()=>$1,REPO_ROOT:()=>h});import{resolve as t,dirname as e$}from"path";import{fileURLToPath as W8}from"url";import{existsSync as N$}from"fs";import{homedir as H8}from"os";function G8(){let $=v1;for(let Q=0;Q<6;Q++){if(N$(t($,"VERSION"))&&N$(t($,"autonomy/run.sh")))return $;let Z=e$($);if(Z===$)break;$=Z}return t(v1,"..","..","..")}function $1($){let Q=$;for(let Z=0;Z<6;Z++){if(N$(t(Q,"VERSION"))&&N$(t(Q,"autonomy/run.sh")))return Q;let z=e$(Q);if(z===Q)break;Q=z}return t($,"..","..","..")}function j(){return process.env.LOKI_DIR??t(process.cwd(),".loki")}function T$(){return t(H8(),".loki")}var v1,h;var C=P(()=>{v1=e$(W8(import.meta.url));h=G8()});import{readFileSync as U8}from"fs";import{resolve as Y8,dirname as B8}from"path";import{fileURLToPath as M8}from"url";function S$(){if(Q$!==null)return Q$;let $="7.125.0";if(typeof $==="string"&&$.length>0)return Q$=$,Q$;try{let Q=B8(M8(import.meta.url)),Z=$1(Q);Q$=U8(Y8(Z,"VERSION"),"utf-8").trim()}catch{Q$="unknown"}return Q$}var Q$=null;var Q1=P(()=>{C()});var p1={};b(p1,{runOrThrow:()=>S8,run:()=>R,readStreamCapped:()=>c1,commandVersion:()=>C8,commandExists:()=>u,ShellError:()=>Z1,MAX_STDOUT_BYTES:()=>u1});async function c1($,Q=u1){let Z=$.getReader(),z=new TextDecoder,X="",q=0;try{while(q<Q){let{done:K,value:W}=await Z.read();if(K)break;if(!W)continue;if(q+=W.byteLength,q>Q){let V=W.byteLength-(q-Q);X+=z.decode(W.subarray(0,V),{stream:!0});break}X+=z.decode(W,{stream:!0})}X+=z.decode()}finally{try{await Z.cancel()}catch{}Z.releaseLock()}return X}async function R($,Q={}){let Z=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Q.env?{...process.env,...Q.env}:process.env,cwd:Q.cwd}),z,X;if(Q.timeoutMs&&Q.timeoutMs>0)z=setTimeout(()=>{try{Z.kill("SIGTERM")}catch{}X=setTimeout(()=>{try{Z.kill("SIGKILL")}catch{}},2000)},Q.timeoutMs);try{let[q,K,W]=await Promise.all([c1(Z.stdout),new Response(Z.stderr).text(),Z.exited]);return{stdout:q,stderr:K,exitCode:W}}finally{if(z)clearTimeout(z);if(X)clearTimeout(X)}}async function S8($,Q={}){let Z=await R($,Q);if(Z.exitCode!==0)throw new Z1(`command failed (${Z.exitCode}): ${$.join(" ")}`,Z.exitCode,Z.stdout,Z.stderr);return Z}async function u($){let Q=D8($),Z=await R(["sh","-c",`command -v ${Q}`],{timeoutMs:5000});if(Z.exitCode===0)return Z.stdout.trim()||null;return null}function D8($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function C8($,Q="--version"){if(!await u($))return null;let z=await R([$,Q],{timeoutMs:5000});if(z.exitCode!==0)return null;return((z.stdout||z.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var u1=16777216,Z1;var o=P(()=>{Z1=class Z1 extends Error{message;exitCode;stdout;stderr;constructor($,Q,Z,z){super($);this.message=$;this.exitCode=Q;this.stdout=Z;this.stderr=z;this.name="ShellError"}}});function r($){return b8?"":$}var b8,M,S,_,tZ,L,k,y,J;var p=P(()=>{b8=(process.env.NO_COLOR??"").length>0;M=r("\x1B[0;31m"),S=r("\x1B[0;32m"),_=r("\x1B[1;33m"),tZ=r("\x1B[0;34m"),L=r("\x1B[0;36m"),k=r("\x1B[1m"),y=r("\x1B[2m"),J=r("\x1B[0m")});import{existsSync as l8}from"fs";async function Z$(){if(A$!==void 0)return A$;let $="/opt/homebrew/bin/python3.12";if(l8($))return A$=$,$;let Q=await u("python3.12");if(Q)return A$=Q,Q;let Z=await u("python3");return A$=Z,Z}async function z$($,Q={}){let Z=await Z$();if(!Z)return{stdout:"",stderr:"python3 not found",exitCode:127};return R([Z,"-c",$],Q)}var A$;var V$=P(()=>{o()});var V0={};b(V0,{runStatus:()=>U3});import{existsSync as v,readFileSync as H$,readdirSync as $0,statSync as Q0}from"fs";import{resolve as D,basename as z3}from"path";import{homedir as X3}from"os";function Z0($){let Q=Math.trunc($);if(Q>=1e6)return`${(Math.trunc(Q/1e6*10)/10).toFixed(1)}M`;if(Q>=1000)return`${(Math.trunc(Q/1000*10)/10).toFixed(1)}K`;return String(Q)}function z0($,Q,Z){if(Q===0)return null;let z=Math.trunc($*100/Q),X=Math.trunc($*C$/Q);if(X>C$)X=C$;let q=C$-X,K=S;if(z>=80)K=M;else if(z>=50)K=_;let W="=".repeat(Math.max(0,X))+" ".repeat(Math.max(0,q)),V=Z0($),H=Z0(Q);return` ${k}${Z}${J} ${K}[${W}]${J} ${z}% (${V} / ${H})`}async function q3(){if(await u("jq"))return!0;return process.stdout.write(`${M}Error: jq is required but not installed.${J}
|
|
3
3
|
`),process.stdout.write(`Install with:
|
|
4
4
|
`),process.stdout.write(` brew install jq (macOS)
|
|
5
5
|
`),process.stdout.write(` apt install jq (Debian/Ubuntu)
|
|
@@ -814,4 +814,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
814
814
|
`),2}default:return process.stderr.write(`Unknown command: ${Q}
|
|
815
815
|
`),process.stderr.write(K8),2}}e1();process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var SZ=await NZ(Bun.argv.slice(2));process.exit(SZ);
|
|
816
816
|
|
|
817
|
-
//# debugId=
|
|
817
|
+
//# debugId=C14C20DF1E561FCA64756E2164756E21
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
3
|
"mcpName": "io.github.asklokesh/loki-mode",
|
|
4
|
-
"version": "7.
|
|
4
|
+
"version": "7.125.0",
|
|
5
5
|
"description": "Loki Mode by Autonomi. Autonomous spec-to-product system: takes a PRD, GitHub issue, OpenAPI/JSON/YAML, or one-line brief to a deployed app via the RARV-C closure loop with 8 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider).",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"agent",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "loki-mode",
|
|
4
4
|
"displayName": "Loki Mode",
|
|
5
|
-
"version": "7.
|
|
5
|
+
"version": "7.125.0",
|
|
6
6
|
"description": "Autonomous spec-to-product build system with a built-in trust layer (RARV-C closure loop, 8 quality gates, completion council). Ships Loki's spec-hardening, drift-detection, and deterministic PR verification commands plus the Loki MCP server.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Autonomi",
|