loki-mode 9.67.0 → 9.68.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/dashboard/__init__.py +1 -1
- package/dashboard/migration_engine.py +38 -13
- package/dashboard/prompt_optimizer.py +19 -6
- package/dashboard/server.py +1 -1
- package/dashboard/static/index.html +66 -66
- package/docs/INSTALLATION.md +1 -1
- package/docs/v10/BOARD.md +1 -0
- package/docs/v10/PROGRESS.md +5 -0
- 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/web-app/dist/assets/{AdminPage-ChUvLzkF.js → AdminPage-DVx_wD7J.js} +1 -1
- package/web-app/dist/assets/{Avatar-Dpy96tAc.js → Avatar-B96e5b-p.js} +1 -1
- package/web-app/dist/assets/{Badge-BOHHYZTu.js → Badge-CYIMEysJ.js} +1 -1
- package/web-app/dist/assets/{Button-B_XqEF7a.js → Button-CFkLj4fj.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-C0z5QwNJ.js → CockpitPage-CD3N0t4G.js} +1 -1
- package/web-app/dist/assets/{ComparePage-KWL6acQk.js → ComparePage-Dfb-kBKl.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BbyBJ4ZP.js → ErrorBoundary-DxBJ42I1.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-Btblkwfr.js → EvidenceReceiptPanel-30CPS1Mt.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-7Bi1t04Q.js → GitHubIssuesPanel-CW-er50w.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BxZtNprq.js → GitHubPRsPanel-DYHxxH3B.js} +1 -1
- package/web-app/dist/assets/{HomePage-BxDh3-CD.js → HomePage-KSJPrzJw.js} +2 -2
- package/web-app/dist/assets/{LoginPage-DpXq4rQe.js → LoginPage-Bz9xYiFY.js} +1 -1
- package/web-app/dist/assets/{MagicPage-DP2k0ioE.js → MagicPage-kn-ESajN.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-Dus04BUR.js → MetricsPage-ne6rjAjb.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage--54yr9Cy.js → NotFoundPage-BY9GRHUS.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-Cs6LOI7R.js → ProjectPage-C6wd7nwM.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-5cpa0X1d.js → ProjectsPage-DCZFtBYI.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Duc5ApRj.js → SettingsPage-BxBtwIEH.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-C1wrPZgl.js → ShowcasePage-rj7G7hEn.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-CoD3LARj.js → SystemSettingsPage-C6ulpcUC.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-GuQ4YDV5.js → TeamsPage-CtnFtvT9.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-CvWecmzl.js → TemplatesPage-Btrc0vGx.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-DFZw34kD.js → TerminalOutput-DNOHB6r6.js} +1 -1
- package/web-app/dist/assets/{activity-BvHkXBYj.js → activity-nzowoOR9.js} +1 -1
- package/web-app/dist/assets/{bell-Bw2j-HI7.js → bell-D_z8w7hF.js} +1 -1
- package/web-app/dist/assets/{bot-BRuEmshQ.js → bot-BIUaGOa_.js} +1 -1
- package/web-app/dist/assets/{check-B5uToWdF.js → check-BDJjUhRA.js} +1 -1
- package/web-app/dist/assets/{chevron-left-D-tXeEPI.js → chevron-left-D012PxLS.js} +1 -1
- package/web-app/dist/assets/{circle-alert-p3-Bg3sx.js → circle-alert-CSwiL_Ci.js} +1 -1
- package/web-app/dist/assets/{clock-CJc_91vp.js → clock-D998ijVs.js} +1 -1
- package/web-app/dist/assets/{cloud-lhmojUN8.js → cloud-DRi3zhWw.js} +1 -1
- package/web-app/dist/assets/{code-xml-DMvQ2jw1.js → code-xml-5-tMr26k.js} +1 -1
- package/web-app/dist/assets/{database-EdwkplCN.js → database-BJyZFH_L.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-BQiPo9Co.js → dollar-sign-DV3VUIZD.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-CXUzs2z1.js → file-code-corner-Dt1RB6AK.js} +1 -1
- package/web-app/dist/assets/{file-plus-hS0xkTL5.js → file-plus-BK6e_Aa4.js} +1 -1
- package/web-app/dist/assets/{globe-B6Xk69Fj.js → globe-BLD9gQs7.js} +1 -1
- package/web-app/dist/assets/{hammer-B_evoVEr.js → hammer-BpgnUNfT.js} +1 -1
- package/web-app/dist/assets/{index-XZrgDphJ.js → index-B9_MlKR6.js} +2 -2
- package/web-app/dist/assets/{layers-Bb295b4u.js → layers-KtTIakvg.js} +1 -1
- package/web-app/dist/assets/{loader-circle-C8cKZhjP.js → loader-circle-B1xKf0Rv.js} +1 -1
- package/web-app/dist/assets/{lock-DcC9B8sE.js → lock-CjDPMVtQ.js} +1 -1
- package/web-app/dist/assets/{package-BFz4FYcR.js → package-BJeOvQMj.js} +1 -1
- package/web-app/dist/assets/{plus-aS4YpFPG.js → plus-Hz9gp1EB.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-B9_ksndc.js → refresh-cw-DQ_mu77L.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-CBogZEoT.js → rotate-ccw-BfLD_AC3.js} +1 -1
- package/web-app/dist/assets/{scroll-text-DMGgO6uq.js → scroll-text-fPCd2SRe.js} +1 -1
- package/web-app/dist/assets/{server-CsEqUM8R.js → server-B5Vp_LNG.js} +1 -1
- package/web-app/dist/assets/{shield-alert-Btnj6tmQ.js → shield-alert-CyIXZM2p.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-C_NLSPqa.js → thumbs-up-CfvcaIBe.js} +1 -1
- package/web-app/dist/assets/{trash-2-zqZc9cSK.js → trash-2-DpV8R-rX.js} +1 -1
- package/web-app/dist/assets/{trending-down-BGQh2rVE.js → trending-down-BUPL60c2.js} +1 -1
- package/web-app/dist/assets/{trending-up-C31TrzUt.js → trending-up-C10V0yZr.js} +1 -1
- package/web-app/dist/assets/{upload-CLwWKjCG.js → upload-D0psWSbr.js} +1 -1
- package/web-app/dist/assets/{usePolling-8wwOP53Y.js → usePolling-zDjbIVGY.js} +1 -1
- package/web-app/dist/assets/{user-DUkbxibF.js → user-R0DRj17j.js} +1 -1
- package/web-app/dist/index.html +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 v9.
|
|
6
|
+
# Loki Mode v9.68.0
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -470,4 +470,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
470
470
|
|
|
471
471
|
---
|
|
472
472
|
|
|
473
|
-
**v9.
|
|
473
|
+
**v9.68.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
9.
|
|
1
|
+
9.68.0
|
package/dashboard/__init__.py
CHANGED
|
@@ -766,19 +766,29 @@ class MigrationPipeline:
|
|
|
766
766
|
current_phase = phase
|
|
767
767
|
overall_status = "failed"
|
|
768
768
|
|
|
769
|
-
# Feature stats
|
|
770
|
-
|
|
771
|
-
|
|
769
|
+
# Feature stats. Missing/corrupt is NOT the same as a real empty
|
|
770
|
+
# plan (0 features): counts go to None with a reason so a consumer
|
|
771
|
+
# can tell "no features yet" apart from "could not read the file".
|
|
772
|
+
features_total: Optional[int] = 0
|
|
773
|
+
features_passing: Optional[int] = 0
|
|
774
|
+
features_error: Optional[str] = None
|
|
772
775
|
try:
|
|
773
776
|
features = self.load_features()
|
|
774
777
|
features_total = len(features)
|
|
775
778
|
features_passing = sum(1 for f in features if f.passes)
|
|
776
|
-
except
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
779
|
+
except FileNotFoundError:
|
|
780
|
+
features_total = None
|
|
781
|
+
features_passing = None
|
|
782
|
+
features_error = "features.json not found"
|
|
783
|
+
except (json.JSONDecodeError, TypeError) as exc:
|
|
784
|
+
features_total = None
|
|
785
|
+
features_passing = None
|
|
786
|
+
features_error = f"features.json is corrupt: {exc}"
|
|
787
|
+
|
|
788
|
+
# Step stats. Same missing/corrupt-vs-empty distinction as features.
|
|
789
|
+
steps_total: Optional[int] = 0
|
|
790
|
+
steps_completed: Optional[int] = 0
|
|
791
|
+
steps_error: Optional[str] = None
|
|
782
792
|
current_step = None
|
|
783
793
|
current_step_index = 0
|
|
784
794
|
try:
|
|
@@ -790,8 +800,14 @@ class MigrationPipeline:
|
|
|
790
800
|
current_step = in_progress[0].id
|
|
791
801
|
# Current step index: completed + 1 (1-based) or completed if all done
|
|
792
802
|
current_step_index = min(steps_completed + 1, steps_total) if steps_total else 0
|
|
793
|
-
except
|
|
794
|
-
|
|
803
|
+
except FileNotFoundError:
|
|
804
|
+
steps_total = None
|
|
805
|
+
steps_completed = None
|
|
806
|
+
steps_error = "migration-plan.json not found"
|
|
807
|
+
except (json.JSONDecodeError, TypeError) as exc:
|
|
808
|
+
steps_total = None
|
|
809
|
+
steps_completed = None
|
|
810
|
+
steps_error = f"migration-plan.json is corrupt: {exc}"
|
|
795
811
|
|
|
796
812
|
# Last checkpoint metadata
|
|
797
813
|
last_checkpoint_data: Optional[dict[str, Any]] = None
|
|
@@ -849,8 +865,17 @@ class MigrationPipeline:
|
|
|
849
865
|
"source": source_path,
|
|
850
866
|
"target": target_name,
|
|
851
867
|
"current_step": current_step,
|
|
852
|
-
"features": {
|
|
853
|
-
|
|
868
|
+
"features": {
|
|
869
|
+
"passing": features_passing,
|
|
870
|
+
"total": features_total,
|
|
871
|
+
**({"reason": features_error} if features_error else {}),
|
|
872
|
+
},
|
|
873
|
+
"steps": {
|
|
874
|
+
"current": current_step_index,
|
|
875
|
+
"completed": steps_completed,
|
|
876
|
+
"total": steps_total,
|
|
877
|
+
**({"reason": steps_error} if steps_error else {}),
|
|
878
|
+
},
|
|
854
879
|
"last_checkpoint": last_checkpoint_data,
|
|
855
880
|
"checkpoints_count": len(manifest.checkpoints),
|
|
856
881
|
"seams": seams_data,
|
|
@@ -66,7 +66,11 @@ class PromptOptimizer:
|
|
|
66
66
|
"""Get the current (latest) prompt optimization version.
|
|
67
67
|
|
|
68
68
|
Returns:
|
|
69
|
-
The latest version data
|
|
69
|
+
The latest version data on a clean read. If no version file
|
|
70
|
+
exists yet, a "never_ran" marker with null fields (distinct
|
|
71
|
+
from a real version 0). If the file exists but cannot be
|
|
72
|
+
parsed, an "error" marker (also null fields) so a corrupt file
|
|
73
|
+
is never mistaken for "never ran".
|
|
70
74
|
"""
|
|
71
75
|
latest = self._latest_file()
|
|
72
76
|
if latest.is_file():
|
|
@@ -74,13 +78,20 @@ class PromptOptimizer:
|
|
|
74
78
|
return json.loads(latest.read_text(encoding="utf-8"))
|
|
75
79
|
except (json.JSONDecodeError, OSError) as exc:
|
|
76
80
|
logger.warning("Failed to read latest prompt version: %s", exc)
|
|
81
|
+
return self._sentinel("error")
|
|
77
82
|
|
|
83
|
+
return self._sentinel("never_ran")
|
|
84
|
+
|
|
85
|
+
@staticmethod
|
|
86
|
+
def _sentinel(status: str) -> dict[str, Any]:
|
|
87
|
+
"""Build a never-ran/error marker. Never a fake version 0 or a fake count."""
|
|
78
88
|
return {
|
|
79
|
-
"version":
|
|
89
|
+
"version": None,
|
|
80
90
|
"generated_at": None,
|
|
81
|
-
"based_on_sessions":
|
|
82
|
-
"failures_analyzed":
|
|
91
|
+
"based_on_sessions": None,
|
|
92
|
+
"failures_analyzed": None,
|
|
83
93
|
"changes": [],
|
|
94
|
+
"status": status,
|
|
84
95
|
}
|
|
85
96
|
|
|
86
97
|
def get_prompt_for_agent(self, agent_type: str) -> dict[str, Any] | None:
|
|
@@ -95,7 +106,7 @@ class PromptOptimizer:
|
|
|
95
106
|
Dict with agent-specific prompt changes, or None if no optimizations exist.
|
|
96
107
|
"""
|
|
97
108
|
current = self.get_current_version()
|
|
98
|
-
if current["version"]
|
|
109
|
+
if not current["version"]:
|
|
99
110
|
return None
|
|
100
111
|
|
|
101
112
|
agent_changes = [c for c in current.get("changes", []) if c.get("agent_type") == agent_type]
|
|
@@ -225,7 +236,9 @@ class PromptOptimizer:
|
|
|
225
236
|
changes = self._generate_changes(failure_data)
|
|
226
237
|
|
|
227
238
|
with self._file_lock:
|
|
228
|
-
|
|
239
|
+
# Never-ran and error sentinels both carry version None; either
|
|
240
|
+
# way there is no real prior version, so the next one is 1.
|
|
241
|
+
current_version = self.get_current_version()["version"] or 0
|
|
229
242
|
new_version = current_version + 1
|
|
230
243
|
|
|
231
244
|
result = {
|
package/dashboard/server.py
CHANGED
|
@@ -10350,7 +10350,7 @@ async def get_checklist_waivers():
|
|
|
10350
10350
|
try:
|
|
10351
10351
|
return json.loads(waivers_file.read_text())
|
|
10352
10352
|
except (json.JSONDecodeError, IOError):
|
|
10353
|
-
return
|
|
10353
|
+
return JSONResponse(status_code=500, content={"error": "Failed to read waivers file"})
|
|
10354
10354
|
|
|
10355
10355
|
|
|
10356
10356
|
@app.post("/api/checklist/waivers", dependencies=[Depends(auth.require_scope("control"))])
|