loki-mode 7.16.0 → 7.16.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/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/dashboard/static/index.html +12 -17
- package/docs/INSTALLATION.md +1 -1
- package/loki-ts/dist/loki.js +2 -2
- package/mcp/__init__.py +1 -1
- package/package.json +1 -1
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Autonomous spec-to-product system. Triggers on "Loki Mode". Takes a spec (PRD, GitHub issue, OpenAPI doc, etc.) to deployed product via the RARV-C closure loop, with minimal human intervention. Provider-agnostic. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v7.16.
|
|
6
|
+
# Loki Mode v7.16.1
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -383,4 +383,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
383
383
|
|
|
384
384
|
---
|
|
385
385
|
|
|
386
|
-
**v7.16.
|
|
386
|
+
**v7.16.1 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
7.16.
|
|
1
|
+
7.16.1
|
package/dashboard/__init__.py
CHANGED
|
@@ -854,10 +854,7 @@
|
|
|
854
854
|
}
|
|
855
855
|
function renderViewer(file){
|
|
856
856
|
if (!file){ viewEl.textContent = 'Select a file to view its contents.'; return; }
|
|
857
|
-
var header = file.name + ' (' + fmtSize(file.size) + (file.truncated ? ', truncated' : '') + ')
|
|
858
|
-
' + file.path + '
|
|
859
|
-
|
|
860
|
-
';
|
|
857
|
+
var header = file.name + ' (' + fmtSize(file.size) + (file.truncated ? ', truncated' : '') + ')\n' + file.path + '\n\n';
|
|
861
858
|
var body = file.content || '';
|
|
862
859
|
if (file.kind === 'json'){
|
|
863
860
|
try { body = JSON.stringify(JSON.parse(body), null, 2); } catch(e){ /* leave raw */ }
|
|
@@ -908,8 +905,7 @@
|
|
|
908
905
|
// and paragraphs. Script tags are stripped from non-code text.
|
|
909
906
|
function renderUsageMarkdown(md) {
|
|
910
907
|
if (!md) return '';
|
|
911
|
-
var lines = md.split('
|
|
912
|
-
');
|
|
908
|
+
var lines = md.split('\n');
|
|
913
909
|
var html = '';
|
|
914
910
|
var i = 0;
|
|
915
911
|
var inList = null; // 'ul' or 'ol'
|
|
@@ -940,15 +936,15 @@
|
|
|
940
936
|
var esc = escapeHtml(ch);
|
|
941
937
|
// strip any residual <script tags that survived escaping (defensive)
|
|
942
938
|
esc = esc.replace(/<script/gi, '<script');
|
|
943
|
-
esc = esc.replace(
|
|
939
|
+
esc = esc.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
|
944
940
|
esc = esc.replace(/__([^_]+)__/g, '<strong>$1</strong>');
|
|
945
|
-
esc = esc.replace(
|
|
941
|
+
esc = esc.replace(/\*([^*]+)\*/g, '<em>$1</em>');
|
|
946
942
|
esc = esc.replace(/_([^_]+)_/g, '<em>$1</em>');
|
|
947
943
|
// v7.7.11 XSS guard (Opus 1 council): only allow http/https/mailto/anchor/relative href.
|
|
948
944
|
// javascript: / data: / vbscript: are stripped to a plain code span so the URL stays visible
|
|
949
945
|
// but is not clickable. USAGE.md absorbs agent output + PRD text; treat as untrusted.
|
|
950
|
-
esc = esc.replace(
|
|
951
|
-
var safe = /^(https
|
|
946
|
+
esc = esc.replace(/\[([^\]]+)\]\(([^)]+)\)/g, function(_m, label, url){
|
|
947
|
+
var safe = /^(https?:\/\/|mailto:|#|\/(?!\/))/.test(url);
|
|
952
948
|
if (safe) return '<a href="' + url + '" rel="noopener noreferrer">' + label + '</a>';
|
|
953
949
|
return '<code>' + label + ' (' + url + ')</code>';
|
|
954
950
|
});
|
|
@@ -972,15 +968,14 @@
|
|
|
972
968
|
codeLines.push(lines[i]);
|
|
973
969
|
i++;
|
|
974
970
|
}
|
|
975
|
-
var codeContent = escapeHtml(codeLines.join('
|
|
976
|
-
'));
|
|
971
|
+
var codeContent = escapeHtml(codeLines.join('\n'));
|
|
977
972
|
html += '<pre><code' + (lang ? ' class="language-' + escapeHtml(lang) + '"' : '') + '>' + codeContent + '</code></pre>';
|
|
978
973
|
i++;
|
|
979
974
|
continue;
|
|
980
975
|
}
|
|
981
976
|
|
|
982
977
|
// Headings
|
|
983
|
-
var hMatch = line.match(/^(#{1,6})s+(.*)/);
|
|
978
|
+
var hMatch = line.match(/^(#{1,6})\s+(.*)/);
|
|
984
979
|
if (hMatch) {
|
|
985
980
|
closeList();
|
|
986
981
|
var level = hMatch[1].length;
|
|
@@ -990,7 +985,7 @@
|
|
|
990
985
|
}
|
|
991
986
|
|
|
992
987
|
// Horizontal rule
|
|
993
|
-
if (/^(-{3,}
|
|
988
|
+
if (/^(-{3,}|\*{3,}|_{3,})$/.test(line.trim())) {
|
|
994
989
|
closeList();
|
|
995
990
|
html += '<hr>';
|
|
996
991
|
i++;
|
|
@@ -1000,13 +995,13 @@
|
|
|
1000
995
|
// Blockquote
|
|
1001
996
|
if (/^>/.test(line)) {
|
|
1002
997
|
closeList();
|
|
1003
|
-
html += '<blockquote>' + inlineFormat(line.replace(
|
|
998
|
+
html += '<blockquote>' + inlineFormat(line.replace(/^>\s?/, '')) + '</blockquote>';
|
|
1004
999
|
i++;
|
|
1005
1000
|
continue;
|
|
1006
1001
|
}
|
|
1007
1002
|
|
|
1008
1003
|
// Unordered list
|
|
1009
|
-
var ulMatch = line.match(/^(s*[-*+])s+(.*)/);
|
|
1004
|
+
var ulMatch = line.match(/^(\s*[-*+])\s+(.*)/);
|
|
1010
1005
|
if (ulMatch) {
|
|
1011
1006
|
if (inList !== 'ul') { closeList(); html += '<ul>'; inList = 'ul'; }
|
|
1012
1007
|
html += '<li>' + inlineFormat(ulMatch[2]) + '</li>';
|
|
@@ -1015,7 +1010,7 @@
|
|
|
1015
1010
|
}
|
|
1016
1011
|
|
|
1017
1012
|
// Ordered list
|
|
1018
|
-
var olMatch = line.match(
|
|
1013
|
+
var olMatch = line.match(/^\s*\d+\.\s+(.*)/);
|
|
1019
1014
|
if (olMatch) {
|
|
1020
1015
|
if (inList !== 'ol') { closeList(); html += '<ol>'; inList = 'ol'; }
|
|
1021
1016
|
html += '<li>' + inlineFormat(olMatch[1]) + '</li>';
|
package/docs/INSTALLATION.md
CHANGED
package/loki-ts/dist/loki.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var I7=Object.defineProperty;var P7=($)=>$;function L7($,Q){this[$]=P7.bind(null,Q)}var g=($,Q)=>{for(var K in Q)I7($,K,{get:Q[K],enumerable:!0,configurable:!0,set:L7.bind(Q,K)})};var k=($,Q)=>()=>($&&(Q=$($=0)),Q);var z1=import.meta.require;var w$={};g(w$,{lokiDir:()=>L,homeLokiDir:()=>c1,findRepoRootForVersion:()=>u1,REPO_ROOT:()=>p});import{resolve as o,dirname as f1}from"path";import{fileURLToPath as k7}from"url";import{existsSync as P1}from"fs";import{homedir as j7}from"os";function F7(){let $=A$;for(let Q=0;Q<6;Q++){if(P1(o($,"VERSION"))&&P1(o($,"autonomy/run.sh")))return $;let K=f1($);if(K===$)break;$=K}return o(A$,"..","..","..")}function u1($){let Q=$;for(let K=0;K<6;K++){if(P1(o(Q,"VERSION"))&&P1(o(Q,"autonomy/run.sh")))return Q;let Z=f1(Q);if(Z===Q)break;Q=Z}return o($,"..","..","..")}function L(){return process.env.LOKI_DIR??o(process.cwd(),".loki")}function c1(){return o(j7(),".loki")}var A$,p;var m=k(()=>{A$=f1(k7(import.meta.url));p=F7()});import{readFileSync as R7}from"fs";import{resolve as E7,dirname as S7}from"path";import{fileURLToPath as x7}from"url";function L1(){if($1!==null)return $1;let $="7.16.
|
|
2
|
+
var I7=Object.defineProperty;var P7=($)=>$;function L7($,Q){this[$]=P7.bind(null,Q)}var g=($,Q)=>{for(var K in Q)I7($,K,{get:Q[K],enumerable:!0,configurable:!0,set:L7.bind(Q,K)})};var k=($,Q)=>()=>($&&(Q=$($=0)),Q);var z1=import.meta.require;var w$={};g(w$,{lokiDir:()=>L,homeLokiDir:()=>c1,findRepoRootForVersion:()=>u1,REPO_ROOT:()=>p});import{resolve as o,dirname as f1}from"path";import{fileURLToPath as k7}from"url";import{existsSync as P1}from"fs";import{homedir as j7}from"os";function F7(){let $=A$;for(let Q=0;Q<6;Q++){if(P1(o($,"VERSION"))&&P1(o($,"autonomy/run.sh")))return $;let K=f1($);if(K===$)break;$=K}return o(A$,"..","..","..")}function u1($){let Q=$;for(let K=0;K<6;K++){if(P1(o(Q,"VERSION"))&&P1(o(Q,"autonomy/run.sh")))return Q;let Z=f1(Q);if(Z===Q)break;Q=Z}return o($,"..","..","..")}function L(){return process.env.LOKI_DIR??o(process.cwd(),".loki")}function c1(){return o(j7(),".loki")}var A$,p;var m=k(()=>{A$=f1(k7(import.meta.url));p=F7()});import{readFileSync as R7}from"fs";import{resolve as E7,dirname as S7}from"path";import{fileURLToPath as x7}from"url";function L1(){if($1!==null)return $1;let $="7.16.1";if(typeof $==="string"&&$.length>0)return $1=$,$1;try{let Q=S7(x7(import.meta.url)),K=u1(Q);$1=R7(E7(K,"VERSION"),"utf-8").trim()}catch{$1="unknown"}return $1}var $1=null;var p1=k(()=>{m()});var P$={};g(P$,{runOrThrow:()=>N7,run:()=>F,commandVersion:()=>D7,commandExists:()=>v,ShellError:()=>l1});async function F($,Q={}){let K=Bun.spawn({cmd:[...$],stdout:"pipe",stderr:"pipe",env:Q.env?{...process.env,...Q.env}:process.env,cwd:Q.cwd}),Z,z;if(Q.timeoutMs&&Q.timeoutMs>0)Z=setTimeout(()=>{try{K.kill("SIGTERM")}catch{}z=setTimeout(()=>{try{K.kill("SIGKILL")}catch{}},2000)},Q.timeoutMs);try{let[U,X,W]=await Promise.all([new Response(K.stdout).text(),new Response(K.stderr).text(),K.exited]);return{stdout:U,stderr:X,exitCode:W}}finally{if(Z)clearTimeout(Z);if(z)clearTimeout(z)}}async function N7($,Q={}){let K=await F($,Q);if(K.exitCode!==0)throw new l1(`command failed (${K.exitCode}): ${$.join(" ")}`,K.exitCode,K.stdout,K.stderr);return K}async function v($){let Q=C7($),K=await F(["sh","-c",`command -v ${Q}`],{timeoutMs:5000});if(K.exitCode===0)return K.stdout.trim()||null;return null}function C7($){if(!/^[A-Za-z0-9._/-]+$/.test($))throw Error(`refused to shell-escape suspect token: ${$}`);return $}async function D7($,Q="--version"){if(!await v($))return null;let Z=await F([$,Q],{timeoutMs:5000});if(Z.exitCode!==0)return null;return((Z.stdout||Z.stderr).split(/\r?\n/)[0]?.trim()??"")||null}var l1;var n=k(()=>{l1=class l1 extends Error{message;exitCode;stdout;stderr;constructor($,Q,K,Z){super($);this.message=$;this.exitCode=Q;this.stdout=K;this.stderr=Z;this.name="ShellError"}}});function a($){return h7?"":$}var h7,O,C,I,I3,A,x,h,H;var l=k(()=>{h7=(process.env.NO_COLOR??"").length>0;O=a("\x1B[0;31m"),C=a("\x1B[0;32m"),I=a("\x1B[1;33m"),I3=a("\x1B[0;34m"),A=a("\x1B[0;36m"),x=a("\x1B[1m"),h=a("\x1B[2m"),H=a("\x1B[0m")});import{existsSync as l7}from"fs";async function X1(){if(G1!==void 0)return G1;let $="/opt/homebrew/bin/python3.12";if(l7($))return G1=$,$;let Q=await v("python3.12");if(Q)return G1=Q,Q;let K=await v("python3");return G1=K,K}async function Q1($,Q={}){let K=await X1();if(!K)return{stdout:"",stderr:"python3 not found",exitCode:127};return F([K,"-c",$],Q)}var G1;var B1=k(()=>{n()});var D$={};g(D$,{runStatus:()=>z8});import{existsSync as b,readFileSync as H1,readdirSync as R$,statSync as E$}from"fs";import{resolve as N,basename as s7}from"path";import{homedir as r7}from"os";async function i7(){if(await v("jq"))return!0;return process.stdout.write(`${O}Error: jq is required but not installed.${H}
|
|
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)
|
|
@@ -748,4 +748,4 @@ Set LOKI_LEGACY_BASH=1 to force the bash CLI for every command.
|
|
|
748
748
|
`),2}default:return process.stderr.write(`Unknown command: ${Q}
|
|
749
749
|
`),process.stderr.write(w7),2}}process.on("SIGINT",()=>process.exit(130));process.on("SIGTERM",()=>process.exit(143));var H3=await U3(Bun.argv.slice(2));process.exit(H3);
|
|
750
750
|
|
|
751
|
-
//# debugId=
|
|
751
|
+
//# debugId=5AF2A03AC937F25664756E2164756E21
|
package/mcp/__init__.py
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
|
-
"version": "7.16.
|
|
3
|
+
"version": "7.16.1",
|
|
4
4
|
"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 11 quality gates. Provider-agnostic (Claude Code, OpenAI Codex, Cline, Aider).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent",
|