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 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.0
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.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
386
+ **v7.16.1 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
package/VERSION CHANGED
@@ -1 +1 @@
1
- 7.16.0
1
+ 7.16.1
@@ -7,7 +7,7 @@ Modules:
7
7
  control: Session control API (start/stop/pause/resume)
8
8
  """
9
9
 
10
- __version__ = "7.16.0"
10
+ __version__ = "7.16.1"
11
11
 
12
12
  # Expose the control app for easy import
13
13
  try:
@@ -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(/&lt;script/gi, '&lt;sc​ript');
943
- esc = esc.replace(/**([^*]+)**/g, '<strong>$1</strong>');
939
+ esc = esc.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
944
940
  esc = esc.replace(/__([^_]+)__/g, '<strong>$1</strong>');
945
- esc = esc.replace(/*([^*]+)*/g, '<em>$1</em>');
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(/[([^]]+)](([^)]+))/g, function(_m, label, url){
951
- var safe = /^(https?://|mailto:|#|/(?!/))/.test(url);
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,}|*{3,}|_{3,})$/.test(line.trim())) {
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(/^>s?/, '')) + '</blockquote>';
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(/^s*d+.s+(.*)/);
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>';
@@ -2,7 +2,7 @@
2
2
 
3
3
  The flagship product of [Autonomi](https://www.autonomi.dev/). Complete installation instructions for all platforms and use cases.
4
4
 
5
- **Version:** v7.16.0
5
+ **Version:** v7.16.1
6
6
 
7
7
  ---
8
8
 
@@ -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.0";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}
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=36813D9891E226F164756E2164756E21
751
+ //# debugId=5AF2A03AC937F25664756E2164756E21
package/mcp/__init__.py CHANGED
@@ -57,4 +57,4 @@ try:
57
57
  except ImportError:
58
58
  __all__ = ['mcp']
59
59
 
60
- __version__ = '7.16.0'
60
+ __version__ = '7.16.1'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loki-mode",
3
- "version": "7.16.0",
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",