loki-mode 11.5.1 → 11.6.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 +12 -201
- package/autonomy/notification-checker.py +1 -1
- package/dashboard/__init__.py +3 -10
- package/dashboard/control.py +5 -435
- package/docs/ARCHITECTURE.md +1 -2
- package/docs/CLI-CORE-VERBS.md +2 -6
- package/docs/CLI-REFERENCE.md +1 -1
- package/docs/COMPONENTS.md +0 -2
- package/docs/INSTALLATION.md +1 -1
- package/docs/authentication.md +19 -1
- package/docs/dev/release-checklist.md +9 -8
- package/docs/enterprise/security.md +3 -234
- package/docs/v10/ARCHITECT-CUTS.md +304 -0
- package/docs/v10/DECISIONS.md +5 -5
- package/docs/v10/ENGINE.md +735 -299
- package/docs/v10/GUARDS.md +16 -14
- package/docs/v10/GUIDE.md +5 -7
- package/docs/v10/PROGRESS.md +12 -1
- package/docs/v11/MARKET-SLICES.md +1 -5
- package/integrations/openclaw/README.md +20 -0
- package/integrations/vibe-kanban.md +12 -50
- package/loki-ts/dist/loki.js +1183 -1182
- package/mcp/__init__.py +1 -1
- package/mcp/_sdk_loader.py +1 -1
- package/package.json +2 -2
- package/packages/control-plane/dist/server.js +630 -613
- package/plugins/loki-mode/.claude-plugin/plugin.json +1 -1
- package/references/quality-control.md +1 -116
- package/skills/00-index.md +2 -2
- package/skills/artifacts.md +0 -22
- package/skills/production.md +2 -38
- package/web-app/dist/assets/{AdminPage-Cbu3pXL8.js → AdminPage-DhXdJNQk.js} +1 -1
- package/web-app/dist/assets/{Avatar-DGqGGcGx.js → Avatar-ixVj76fM.js} +1 -1
- package/web-app/dist/assets/{Badge-Bhlipt6v.js → Badge-BGMSp22s.js} +1 -1
- package/web-app/dist/assets/{Button-CpN2sO61.js → Button-pYJc32tG.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-BqeDJwdL.js → CockpitPage-C1JBBouA.js} +1 -1
- package/web-app/dist/assets/{ComparePage-DUieA2ba.js → ComparePage-qD0NV4RK.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-DTWsYrOm.js → ErrorBoundary-C-yxO58j.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-BU_B9X19.js → EvidenceReceiptPanel-ByPzuE1S.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-DEZoLOsP.js → GitHubIssuesPanel-BNv_2BEJ.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-BEsnrq7Y.js → GitHubPRsPanel-CuLZQ9CS.js} +1 -1
- package/web-app/dist/assets/{HomePage-BoUVuq7h.js → HomePage-CS_FW8Je.js} +2 -2
- package/web-app/dist/assets/{LoginPage-CmOED7vb.js → LoginPage-DwiNf1Wm.js} +1 -1
- package/web-app/dist/assets/{MagicPage-DATZitrZ.js → MagicPage-CmQybLPZ.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-DGL1v0I-.js → MetricsPage-D9ERdpv8.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-C2WgOjZd.js → NotFoundPage-D9ccgdbF.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-BMi1tepj.js → ProjectPage-B9Jslmgv.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-vc3y5YPh.js → ProjectsPage-DnU99Go2.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-kbq0Ftvi.js → SettingsPage-DcTyx6wo.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-Bn6Q8Kbg.js → ShowcasePage-jEY9ghSr.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-Basmhs_b.js → SystemSettingsPage-CSGltW-8.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-BTqOc4TR.js → TeamsPage-gUuJXb9l.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-2P9002VL.js → TemplatesPage-37Zhe--v.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CAoSPBrg.js → TerminalOutput-B09hRwaR.js} +1 -1
- package/web-app/dist/assets/{activity-BcWVWCqU.js → activity-q_4MY9J0.js} +1 -1
- package/web-app/dist/assets/{bell-CYRqqgZ6.js → bell-X8OC_PFP.js} +1 -1
- package/web-app/dist/assets/{bot-CU7gdn3g.js → bot-C-N1PUOD.js} +1 -1
- package/web-app/dist/assets/{check-DLlCpz9V.js → check-B2c76Jmp.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CE9Cb30C.js → chevron-left-BF76YLNw.js} +1 -1
- package/web-app/dist/assets/{circle-alert-uou4bjua.js → circle-alert-AeFKBD8h.js} +1 -1
- package/web-app/dist/assets/{clock-C_dSJcDX.js → clock-CiXRf-FH.js} +1 -1
- package/web-app/dist/assets/{cloud-DZ22ITF6.js → cloud-DKQ8SRJ5.js} +1 -1
- package/web-app/dist/assets/{code-xml-BrJS0hhS.js → code-xml-DEb6jXWP.js} +1 -1
- package/web-app/dist/assets/{database-D2HOmxtl.js → database-6W7e-E9c.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CQ1vK_6q.js → dollar-sign-Ds2GOuyW.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-w2vpGm5d.js → file-code-corner-CZU0jg52.js} +1 -1
- package/web-app/dist/assets/{file-plus-DlF6wjkD.js → file-plus-DTVYnXCN.js} +1 -1
- package/web-app/dist/assets/{globe-Dy3lBJg1.js → globe-0mUzKYDe.js} +1 -1
- package/web-app/dist/assets/{hammer-C3xIiRXN.js → hammer-BMHZg3YX.js} +1 -1
- package/web-app/dist/assets/{index-4t-_IW2y.js → index-BvOTvjax.js} +3 -3
- package/web-app/dist/assets/{layers-Y8Fs8qXI.js → layers-Df7TdcWB.js} +1 -1
- package/web-app/dist/assets/{loader-circle-CxgN1v4m.js → loader-circle-kPsVfrSY.js} +1 -1
- package/web-app/dist/assets/{lock-DFFNbXDs.js → lock-CXYcbEc5.js} +1 -1
- package/web-app/dist/assets/{package-5e6qCTUg.js → package-Cqhua1ID.js} +1 -1
- package/web-app/dist/assets/{plus-C0Go_ytj.js → plus-lseXhsn-.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-D4i-NW3o.js → refresh-cw-OZriI6gD.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-YlKkiUW6.js → rotate-ccw-CKCfjPg8.js} +1 -1
- package/web-app/dist/assets/{scroll-text-4qXOHTap.js → scroll-text-DoVyyfKb.js} +1 -1
- package/web-app/dist/assets/{server-BB6zXNp9.js → server-DGy7TflW.js} +1 -1
- package/web-app/dist/assets/{shield-alert-D4tzjB1H.js → shield-alert-BCzRcMXi.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-DZiRwdFj.js → thumbs-up-C_znJd5g.js} +1 -1
- package/web-app/dist/assets/{trash-2-Dv_LkRIK.js → trash-2-BosCbeeA.js} +1 -1
- package/web-app/dist/assets/{trending-down-BJYp9PQe.js → trending-down-CkR5zDkV.js} +1 -1
- package/web-app/dist/assets/{trending-up-BTcXLklK.js → trending-up-DpUIfOH4.js} +1 -1
- package/web-app/dist/assets/{upload-fcHqwOxr.js → upload-CH9aKc8L.js} +1 -1
- package/web-app/dist/assets/{usePolling-BeJYw_4L.js → usePolling-pzxrHJeg.js} +1 -1
- package/web-app/dist/assets/{user-BcDwUCsO.js → user-B7OHa-VQ.js} +1 -1
- package/web-app/dist/index.html +1 -1
- package/dashboard/run.py +0 -63
- package/docs/openclaw-integration.md +0 -52
- package/docs/v10/HANDOFF-NEXT-WEEK.md +0 -40
- package/docs/v10/MORNING-BRIEF-1003.md +0 -25
- package/docs/v10/MORNING-BRIEF.md +0 -52
- package/docs/v10/TODO.md +0 -35
- package/mcp/resources.py +0 -351
- package/mcp/tools.py +0 -200
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: An autonomous software factory that knows what it is supposed to deliver, and proves it did. Use when the user says Loki Mode or asks to build, fix or verify software autonomously.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v11.
|
|
6
|
+
# Loki Mode v11.6.0
|
|
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
|
|
|
@@ -483,4 +483,4 @@ See `CHANGELOG.md` entries [7.5.7], [7.5.8], [7.5.13] for the per-fix list and r
|
|
|
483
483
|
|
|
484
484
|
---
|
|
485
485
|
|
|
486
|
-
**v11.
|
|
486
|
+
**v11.6.0 | [Autonomi](https://www.autonomi.dev/) flagship product | core skill**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
11.
|
|
1
|
+
11.6.0
|
package/autonomy/loki
CHANGED
|
@@ -8293,7 +8293,7 @@ PURPLE_LAB_STATE_DIR="${HOME}/.loki/purple-lab"
|
|
|
8293
8293
|
PURPLE_LAB_PID_FILE="${PURPLE_LAB_STATE_DIR}/purple-lab.pid"
|
|
8294
8294
|
|
|
8295
8295
|
# Is this pid positively identified as THIS installation's Purple Lab server
|
|
8296
|
-
# (
|
|
8296
|
+
# (a server started before the web deprecation launched exactly `$DASHBOARD_PYTHON $SKILL_DIR/web-app/server.py`
|
|
8297
8297
|
# at :8078), rather than a recycled pid, a decoy that merely mentions the path
|
|
8298
8298
|
# in an argument, or another installation's server.py at a different SKILL_DIR?
|
|
8299
8299
|
#
|
|
@@ -8506,205 +8506,6 @@ cmd_web_help() {
|
|
|
8506
8506
|
echo " loki web stop Stop a standalone web server started the old way"
|
|
8507
8507
|
}
|
|
8508
8508
|
|
|
8509
|
-
cmd_web_start() {
|
|
8510
|
-
local open_browser=true
|
|
8511
|
-
local port="${PURPLE_LAB_DEFAULT_PORT}"
|
|
8512
|
-
local prd_file=""
|
|
8513
|
-
|
|
8514
|
-
# Parse arguments
|
|
8515
|
-
while [[ $# -gt 0 ]]; do
|
|
8516
|
-
case "$1" in
|
|
8517
|
-
--no-open)
|
|
8518
|
-
open_browser=false
|
|
8519
|
-
shift
|
|
8520
|
-
;;
|
|
8521
|
-
--port)
|
|
8522
|
-
if [[ -z "${2:-}" ]]; then
|
|
8523
|
-
echo -e "${RED}--port requires a port number${NC}"
|
|
8524
|
-
exit 1
|
|
8525
|
-
fi
|
|
8526
|
-
port="$2"
|
|
8527
|
-
shift 2
|
|
8528
|
-
;;
|
|
8529
|
-
--prd)
|
|
8530
|
-
if [[ -z "${2:-}" ]]; then
|
|
8531
|
-
echo -e "${RED}--prd requires a file path${NC}"
|
|
8532
|
-
exit 1
|
|
8533
|
-
fi
|
|
8534
|
-
prd_file="$2"
|
|
8535
|
-
shift 2
|
|
8536
|
-
;;
|
|
8537
|
-
--help|-h)
|
|
8538
|
-
cmd_web_help
|
|
8539
|
-
exit 0
|
|
8540
|
-
;;
|
|
8541
|
-
*)
|
|
8542
|
-
echo -e "${RED}Unknown option: $1${NC}"
|
|
8543
|
-
echo "Run 'loki web --help' for usage."
|
|
8544
|
-
exit 1
|
|
8545
|
-
;;
|
|
8546
|
-
esac
|
|
8547
|
-
done
|
|
8548
|
-
|
|
8549
|
-
# Validate port: must be numeric and in valid range
|
|
8550
|
-
if [[ ! "$port" =~ ^[0-9]+$ ]]; then
|
|
8551
|
-
echo -e "${RED}Error: Port must be a number, got '$port'${NC}"
|
|
8552
|
-
exit 1
|
|
8553
|
-
fi
|
|
8554
|
-
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
|
|
8555
|
-
echo -e "${RED}Error: Port must be between 1 and 65535, got $port${NC}"
|
|
8556
|
-
exit 1
|
|
8557
|
-
fi
|
|
8558
|
-
# Port validation moved below (after PID file check) so we can offer to kill orphans
|
|
8559
|
-
|
|
8560
|
-
# Validate --prd file if provided
|
|
8561
|
-
if [ -n "$prd_file" ]; then
|
|
8562
|
-
if [ ! -f "$prd_file" ]; then
|
|
8563
|
-
echo -e "${RED}Error: PRD file not found: $prd_file${NC}"
|
|
8564
|
-
exit 1
|
|
8565
|
-
fi
|
|
8566
|
-
export PURPLE_LAB_PRD
|
|
8567
|
-
PURPLE_LAB_PRD=$(cat "$prd_file")
|
|
8568
|
-
fi
|
|
8569
|
-
|
|
8570
|
-
# Check that web-app dist exists
|
|
8571
|
-
local web_dist="${SKILL_DIR}/web-app/dist"
|
|
8572
|
-
if [ ! -d "$web_dist" ] || [ ! -f "$web_dist/index.html" ]; then
|
|
8573
|
-
echo -e "${RED}Error: Web app not built${NC}"
|
|
8574
|
-
echo "Expected files at: $web_dist"
|
|
8575
|
-
echo ""
|
|
8576
|
-
echo "Build the web app first:"
|
|
8577
|
-
echo " cd web-app && npm install && npm run build"
|
|
8578
|
-
exit 1
|
|
8579
|
-
fi
|
|
8580
|
-
|
|
8581
|
-
# Check that server.py exists
|
|
8582
|
-
local server_py="${SKILL_DIR}/web-app/server.py"
|
|
8583
|
-
if [ ! -f "$server_py" ]; then
|
|
8584
|
-
echo -e "${RED}Error: Purple Lab server not found at $server_py${NC}"
|
|
8585
|
-
exit 1
|
|
8586
|
-
fi
|
|
8587
|
-
|
|
8588
|
-
# Ensure Python venv with FastAPI is available
|
|
8589
|
-
if ! ensure_dashboard_venv; then
|
|
8590
|
-
echo -e "${RED}Error: Failed to set up Python environment${NC}"
|
|
8591
|
-
exit 1
|
|
8592
|
-
fi
|
|
8593
|
-
|
|
8594
|
-
# Check if already running
|
|
8595
|
-
mkdir -p "${LOKI_DIR}/purple-lab"
|
|
8596
|
-
if [ -f "$PURPLE_LAB_PID_FILE" ]; then
|
|
8597
|
-
local existing_pid
|
|
8598
|
-
existing_pid=$(cat "$PURPLE_LAB_PID_FILE" 2>/dev/null)
|
|
8599
|
-
if [ -n "$existing_pid" ] && kill -0 "$existing_pid" 2>/dev/null; then
|
|
8600
|
-
echo -e "${GREEN}Purple Lab already running (PID: $existing_pid)${NC}"
|
|
8601
|
-
local url="http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/"
|
|
8602
|
-
echo -e "Open: ${CYAN}$url${NC}"
|
|
8603
|
-
if [ "$open_browser" = true ]; then
|
|
8604
|
-
loki_open_url "$url" 2>/dev/null || true
|
|
8605
|
-
fi
|
|
8606
|
-
return 0
|
|
8607
|
-
fi
|
|
8608
|
-
fi
|
|
8609
|
-
|
|
8610
|
-
# Check if port is already in use -- try to clean up orphaned processes.
|
|
8611
|
-
# Only kill it if it is positively identified as THIS installation's own
|
|
8612
|
-
# Purple Lab server (never a bare "it's listening on our port" guess): an
|
|
8613
|
-
# unrelated process bound to the same port, or another installation's
|
|
8614
|
-
# server, must never be signaled.
|
|
8615
|
-
if lsof -i:"$port" -sTCP:LISTEN &> /dev/null; then
|
|
8616
|
-
local blocking_pid
|
|
8617
|
-
blocking_pid=$(lsof -ti:"$port" -sTCP:LISTEN 2>/dev/null | head -1)
|
|
8618
|
-
if [ -n "$blocking_pid" ]; then
|
|
8619
|
-
if _loki_pid_looks_like_purplelab "$blocking_pid"; then
|
|
8620
|
-
echo -e "${YELLOW}Port $port in use by PID $blocking_pid -- stopping it...${NC}"
|
|
8621
|
-
kill "$blocking_pid" 2>/dev/null
|
|
8622
|
-
sleep 1
|
|
8623
|
-
if kill -0 "$blocking_pid" 2>/dev/null; then
|
|
8624
|
-
kill -9 "$blocking_pid" 2>/dev/null
|
|
8625
|
-
sleep 1
|
|
8626
|
-
fi
|
|
8627
|
-
# Verify port is now free
|
|
8628
|
-
if lsof -i:"$port" -sTCP:LISTEN &> /dev/null; then
|
|
8629
|
-
echo -e "${RED}Error: Could not free port $port${NC}"
|
|
8630
|
-
echo "Use --port to specify a different port, or manually kill the process."
|
|
8631
|
-
exit 1
|
|
8632
|
-
fi
|
|
8633
|
-
echo -e "${GREEN}Port $port freed.${NC}"
|
|
8634
|
-
else
|
|
8635
|
-
echo -e "${RED}Error: Port $port is in use by PID $blocking_pid, which is not this installation's Purple Lab server.${NC}"
|
|
8636
|
-
echo "Use --port to specify a different port, or manually stop that process."
|
|
8637
|
-
exit 1
|
|
8638
|
-
fi
|
|
8639
|
-
fi
|
|
8640
|
-
fi
|
|
8641
|
-
|
|
8642
|
-
# Start the server
|
|
8643
|
-
local log_dir="${LOKI_DIR}/purple-lab/logs"
|
|
8644
|
-
mkdir -p "$log_dir"
|
|
8645
|
-
local log_file="$log_dir/purple-lab.log"
|
|
8646
|
-
|
|
8647
|
-
echo -e "${CYAN}Starting Purple Lab...${NC}"
|
|
8648
|
-
|
|
8649
|
-
PURPLE_LAB_PORT="$port" PURPLE_LAB_HOST="${PURPLE_LAB_DEFAULT_HOST}" \
|
|
8650
|
-
LOKI_DIR="$LOKI_DIR" LOKI_SKILL_DIR="$SKILL_DIR" PYTHONPATH="$SKILL_DIR" \
|
|
8651
|
-
nohup "$DASHBOARD_PYTHON" "$server_py" > "$log_file" 2>&1 &
|
|
8652
|
-
local pid=$!
|
|
8653
|
-
|
|
8654
|
-
mkdir -p "$PURPLE_LAB_STATE_DIR"
|
|
8655
|
-
echo "$pid" > "$PURPLE_LAB_PID_FILE"
|
|
8656
|
-
echo "$port" > "${PURPLE_LAB_STATE_DIR}/port"
|
|
8657
|
-
# Also write to local .loki for backward compat
|
|
8658
|
-
mkdir -p "${LOKI_DIR}/purple-lab"
|
|
8659
|
-
echo "$pid" > "${LOKI_DIR}/purple-lab/purple-lab.pid"
|
|
8660
|
-
echo "$port" > "${LOKI_DIR}/purple-lab/port"
|
|
8661
|
-
|
|
8662
|
-
# Wait for server to be ready
|
|
8663
|
-
local retries=0
|
|
8664
|
-
local server_ready=false
|
|
8665
|
-
while [ $retries -lt 15 ]; do
|
|
8666
|
-
if curl -s "http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/api/session/status" > /dev/null 2>&1; then
|
|
8667
|
-
server_ready=true
|
|
8668
|
-
break
|
|
8669
|
-
fi
|
|
8670
|
-
sleep 0.5
|
|
8671
|
-
retries=$((retries + 1))
|
|
8672
|
-
done
|
|
8673
|
-
|
|
8674
|
-
if ! kill -0 "$pid" 2>/dev/null; then
|
|
8675
|
-
echo -e "${RED}Error: Purple Lab failed to start${NC}"
|
|
8676
|
-
echo "Check logs at: $log_file"
|
|
8677
|
-
rm -f "$PURPLE_LAB_PID_FILE"
|
|
8678
|
-
exit 1
|
|
8679
|
-
fi
|
|
8680
|
-
|
|
8681
|
-
local url="http://${PURPLE_LAB_DEFAULT_HOST}:${port}/lab/"
|
|
8682
|
-
|
|
8683
|
-
if [ "$server_ready" = true ]; then
|
|
8684
|
-
echo -e "${GREEN}Purple Lab (project web UI) running at: $url${NC} (PID: $pid)"
|
|
8685
|
-
else
|
|
8686
|
-
echo -e "${YELLOW}Purple Lab (project web UI) starting at: $url${NC} (PID: $pid)"
|
|
8687
|
-
echo "Server may still be loading. Refresh the browser if it does not load immediately."
|
|
8688
|
-
fi
|
|
8689
|
-
echo -e "Logs: $log_file"
|
|
8690
|
-
# v7.28.x UX #5: distinguish the two browser UIs so the ops monitor and the
|
|
8691
|
-
# spec-input web UI are never confused for each other.
|
|
8692
|
-
echo -e "${DIM}Looking for the live run monitor? loki dashboard (:${DASHBOARD_DEFAULT_PORT:-57374})${NC}"
|
|
8693
|
-
echo -e "Stop with: ${CYAN}loki web stop${NC}"
|
|
8694
|
-
|
|
8695
|
-
# Open browser only after server is confirmed ready
|
|
8696
|
-
if [ "$open_browser" = true ]; then
|
|
8697
|
-
if [ "$server_ready" = true ]; then
|
|
8698
|
-
echo ""
|
|
8699
|
-
loki_open_url "$url" 2>/dev/null || echo "Please open in browser: $url"
|
|
8700
|
-
else
|
|
8701
|
-
echo ""
|
|
8702
|
-
echo -e "${YELLOW}Browser not opened because server is not ready yet.${NC}"
|
|
8703
|
-
echo "Open manually when ready: $url"
|
|
8704
|
-
fi
|
|
8705
|
-
fi
|
|
8706
|
-
}
|
|
8707
|
-
|
|
8708
8509
|
cmd_web_stop() {
|
|
8709
8510
|
local stopped=false
|
|
8710
8511
|
local port
|
|
@@ -12451,6 +12252,7 @@ cmd_export() {
|
|
|
12451
12252
|
echo " markdown Human-readable session summary"
|
|
12452
12253
|
echo " csv Task queue as CSV"
|
|
12453
12254
|
echo " timeline Iteration timeline as JSON"
|
|
12255
|
+
echo " vibe-kanban Sync .loki/queue tasks into the Vibe Kanban SQLite DB"
|
|
12454
12256
|
echo ""
|
|
12455
12257
|
echo "Flags:"
|
|
12456
12258
|
echo " --sarif [run-id] Write .loki/runs/<id>/findings.sarif (SARIF 2.1.0; needs bun)"
|
|
@@ -12461,6 +12263,7 @@ cmd_export() {
|
|
|
12461
12263
|
echo " loki export markdown # Readable summary"
|
|
12462
12264
|
echo " loki export csv tasks.csv # Task queue CSV"
|
|
12463
12265
|
echo " loki export timeline # Iteration timeline"
|
|
12266
|
+
echo " loki export vibe-kanban # Sync tasks to Vibe Kanban"
|
|
12464
12267
|
exit 0
|
|
12465
12268
|
;;
|
|
12466
12269
|
json)
|
|
@@ -12477,13 +12280,21 @@ cmd_export() {
|
|
|
12477
12280
|
require_jq || return 1
|
|
12478
12281
|
_export_timeline "$output_path"
|
|
12479
12282
|
;;
|
|
12283
|
+
vibe-kanban)
|
|
12284
|
+
local vk_script="${SKILL_DIR:-}/scripts/sync-to-vibe-kanban.sh"
|
|
12285
|
+
if [ ! -f "$vk_script" ]; then
|
|
12286
|
+
echo -e "${RED}Error: sync-to-vibe-kanban.sh not found at $vk_script${NC}" >&2
|
|
12287
|
+
return 1
|
|
12288
|
+
fi
|
|
12289
|
+
bash "$vk_script"
|
|
12290
|
+
;;
|
|
12480
12291
|
--sarif)
|
|
12481
12292
|
echo -e "${RED}loki export --sarif needs bun (https://bun.sh).${NC}" >&2
|
|
12482
12293
|
return 1
|
|
12483
12294
|
;;
|
|
12484
12295
|
*)
|
|
12485
12296
|
echo -e "${RED}Unknown format: $format${NC}"
|
|
12486
|
-
echo "Supported: json, markdown, csv, timeline"
|
|
12297
|
+
echo "Supported: json, markdown, csv, timeline, vibe-kanban"
|
|
12487
12298
|
exit 1
|
|
12488
12299
|
;;
|
|
12489
12300
|
esac
|
|
@@ -265,7 +265,7 @@ def check_quality_gate(trigger, loki_dir, iteration, notifications):
|
|
|
265
265
|
defect as the budget key, in the same file.
|
|
266
266
|
|
|
267
267
|
gate-failures.txt is the canonical failure source used by
|
|
268
|
-
proof-generator.py:413 and loki-ts
|
|
268
|
+
proof-generator.py:413 and loki-ts build_prompt.ts, so this
|
|
269
269
|
reuses a proven contract rather than introducing a second one.
|
|
270
270
|
"""
|
|
271
271
|
failures_file = Path(loki_dir) / "quality" / "gate-failures.txt"
|
package/dashboard/__init__.py
CHANGED
|
@@ -4,16 +4,9 @@ Loki Mode Dashboard Backend
|
|
|
4
4
|
FastAPI-based dashboard for managing Loki Mode projects, tasks, and agents.
|
|
5
5
|
|
|
6
6
|
Modules:
|
|
7
|
-
control: Session control
|
|
7
|
+
control: Session control helpers (status, atomic writes, origin check)
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
__version__ = "11.
|
|
10
|
+
__version__ = "11.6.0"
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
try:
|
|
14
|
-
from .control import app as control_app
|
|
15
|
-
except ImportError:
|
|
16
|
-
# FastAPI not installed, control module not available
|
|
17
|
-
control_app = None
|
|
18
|
-
|
|
19
|
-
__all__ = ["control_app", "__version__"]
|
|
12
|
+
__all__ = ["__version__"]
|