loki-mode 9.78.0 → 9.81.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/README.md +19 -0
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/autonomy/lib/engine10-legacy-notice.txt +3 -0
- package/autonomy/lib/engine10-push-gitlab.sh +96 -0
- package/autonomy/lib/engine10-push.sh +67 -2
- package/dashboard/__init__.py +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/dev/tmp-cleanup.md +3 -3
- package/docs/v10/BOARD.md +101 -47
- package/docs/v10/DECISIONS.md +18 -0
- package/docs/v10/ENGINE.md +267 -735
- package/docs/v10/GUARDS.md +81 -0
- package/docs/v10/GUIDE.md +154 -0
- package/docs/v10/METRICS.md +26 -0
- package/docs/v10/PROGRESS.md +41 -0
- package/loki-ts/dist/loki.js +711 -623
- package/loki-ts/package.json +1 -1
- 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-CSy7GfXm.js → AdminPage-BsKDNH7g.js} +1 -1
- package/web-app/dist/assets/{Avatar-FuCbZv5L.js → Avatar-eQ64Y3hv.js} +1 -1
- package/web-app/dist/assets/{Badge-Do6fV7hN.js → Badge-b82yzJcN.js} +1 -1
- package/web-app/dist/assets/{Button-B9NZXMf8.js → Button-Bd9FSMso.js} +1 -1
- package/web-app/dist/assets/{CockpitPage-VXxvKnKW.js → CockpitPage-DjnDt5xn.js} +1 -1
- package/web-app/dist/assets/{ComparePage-OmqxCaK7.js → ComparePage-D2gfvgOy.js} +1 -1
- package/web-app/dist/assets/{ErrorBoundary-BYCkDeu8.js → ErrorBoundary-BUHNHWWu.js} +1 -1
- package/web-app/dist/assets/{EvidenceReceiptPanel-KesRGf-7.js → EvidenceReceiptPanel-D1I4Ttbh.js} +1 -1
- package/web-app/dist/assets/{GitHubIssuesPanel-fEnpFg8B.js → GitHubIssuesPanel-DwVEFUMV.js} +1 -1
- package/web-app/dist/assets/{GitHubPRsPanel-DGGod_Y0.js → GitHubPRsPanel-ConSaimn.js} +1 -1
- package/web-app/dist/assets/{HomePage-EeWPhwob.js → HomePage-CKE8CosL.js} +2 -2
- package/web-app/dist/assets/{LoginPage-BPHKgT1f.js → LoginPage-D8axj5IL.js} +1 -1
- package/web-app/dist/assets/{MagicPage-CO0MTvpr.js → MagicPage-aD3MFjIp.js} +1 -1
- package/web-app/dist/assets/{MetricsPage-eYpHWxnI.js → MetricsPage-BdZxBPG9.js} +1 -1
- package/web-app/dist/assets/{NotFoundPage-Cd409HEe.js → NotFoundPage-TDGVwyxo.js} +1 -1
- package/web-app/dist/assets/{ProjectPage-hcAZ_hrX.js → ProjectPage-CUx32MoW.js} +3 -3
- package/web-app/dist/assets/{ProjectsPage-DH04B2fr.js → ProjectsPage-CHFOim84.js} +1 -1
- package/web-app/dist/assets/{SettingsPage-Csur-yom.js → SettingsPage-BM4FDVIk.js} +1 -1
- package/web-app/dist/assets/{ShowcasePage-B5AIrDXd.js → ShowcasePage-nki5E019.js} +1 -1
- package/web-app/dist/assets/{SystemSettingsPage-DA6Bn7er.js → SystemSettingsPage-B40QOcn3.js} +1 -1
- package/web-app/dist/assets/{TeamsPage-KcBbM7_z.js → TeamsPage-CKsaamvM.js} +1 -1
- package/web-app/dist/assets/{TemplatesPage-BgLOizbo.js → TemplatesPage-D3dEJ11t.js} +1 -1
- package/web-app/dist/assets/{TerminalOutput-CX-gh76o.js → TerminalOutput-DCL5jtSd.js} +1 -1
- package/web-app/dist/assets/{activity-6UlD-ytF.js → activity-D-IlrNbY.js} +1 -1
- package/web-app/dist/assets/{bell-CFARmHF4.js → bell-m1luNYs4.js} +1 -1
- package/web-app/dist/assets/{bot-M-HZlOa2.js → bot-Cl1HRT_0.js} +1 -1
- package/web-app/dist/assets/{check-9GtMUwM3.js → check-3lLURBsJ.js} +1 -1
- package/web-app/dist/assets/{chevron-left-CPV_nwtP.js → chevron-left-D02P_bEW.js} +1 -1
- package/web-app/dist/assets/{circle-alert-UahP_eMY.js → circle-alert-ZCI8JfmJ.js} +1 -1
- package/web-app/dist/assets/{clock-CcCc97td.js → clock-D3VuRQUy.js} +1 -1
- package/web-app/dist/assets/{cloud-CviPksVP.js → cloud-D0bikLQP.js} +1 -1
- package/web-app/dist/assets/{code-xml-gGDp7nvj.js → code-xml-tqtfp834.js} +1 -1
- package/web-app/dist/assets/{database-BlHnMksz.js → database-C2bSuVEi.js} +1 -1
- package/web-app/dist/assets/{dollar-sign-CqZfNw7q.js → dollar-sign-Dp8f9cxy.js} +1 -1
- package/web-app/dist/assets/{file-code-corner-ChtMYoeA.js → file-code-corner-CNsBLnGJ.js} +1 -1
- package/web-app/dist/assets/{file-plus-C3l1fGp_.js → file-plus-D5gsIm0p.js} +1 -1
- package/web-app/dist/assets/{globe-BM4RYvi9.js → globe-C5wH6C2_.js} +1 -1
- package/web-app/dist/assets/{hammer-C8xvsZCy.js → hammer-BbgvMFD3.js} +1 -1
- package/web-app/dist/assets/{index-BsB5DTpP.js → index-C-AhysBW.js} +2 -2
- package/web-app/dist/assets/{layers-WUsuQnfe.js → layers-Cy9T0QFp.js} +1 -1
- package/web-app/dist/assets/{loader-circle-CWZhBNSa.js → loader-circle-Bxmwkkrf.js} +1 -1
- package/web-app/dist/assets/{lock-bbfx9k11.js → lock-C8DRY3rX.js} +1 -1
- package/web-app/dist/assets/{package-CDfsTKO6.js → package-0ny9RvN9.js} +1 -1
- package/web-app/dist/assets/{plus-DEm39Klm.js → plus-B7Dhrqtb.js} +1 -1
- package/web-app/dist/assets/{refresh-cw-DJZcHBKa.js → refresh-cw-CkQrR-L1.js} +1 -1
- package/web-app/dist/assets/{rotate-ccw-BcngFsiU.js → rotate-ccw-du8wLFBD.js} +1 -1
- package/web-app/dist/assets/{scroll-text-CYSjVzWv.js → scroll-text-lC55WYYu.js} +1 -1
- package/web-app/dist/assets/{server-CkMcbRF7.js → server-DWbmrgQz.js} +1 -1
- package/web-app/dist/assets/{shield-alert-D6ZsDRLA.js → shield-alert-D7HIrslo.js} +1 -1
- package/web-app/dist/assets/{thumbs-up-Ce0QhF9c.js → thumbs-up-CXHDiQ_F.js} +1 -1
- package/web-app/dist/assets/{trash-2-OojrLB2z.js → trash-2-WYDISyed.js} +1 -1
- package/web-app/dist/assets/{trending-down-3Bu2DcUr.js → trending-down-iUK45Jk7.js} +1 -1
- package/web-app/dist/assets/{trending-up-BUkmDOK8.js → trending-up-Ca_zIVLF.js} +1 -1
- package/web-app/dist/assets/{upload-BgR13l74.js → upload-DWDtE29t.js} +1 -1
- package/web-app/dist/assets/{usePolling-DwQTkEQG.js → usePolling-DqMVwR9D.js} +1 -1
- package/web-app/dist/assets/{user-DZcP5JBh.js → user-Bgt0jZl5.js} +1 -1
- package/web-app/dist/index.html +1 -1
package/README.md
CHANGED
|
@@ -909,6 +909,25 @@ See [benchmarks/](benchmarks/) for methodology.
|
|
|
909
909
|
|
|
910
910
|
---
|
|
911
911
|
|
|
912
|
+
## Loki 10 engine (preview)
|
|
913
|
+
|
|
914
|
+
Opt-in: set LOKI_ENGINE=v10 <!-- loki10-default -->
|
|
915
|
+
|
|
916
|
+
A rewritten engine is under active development. Full guide, provider
|
|
917
|
+
table and the 5-line summary format: [docs/v10/GUIDE.md](docs/v10/GUIDE.md).
|
|
918
|
+
|
|
919
|
+
```
|
|
920
|
+
LOKI_ENGINE=v10 loki "fix the login redirect loop" --no-pr
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
The router (bin/loki), the CLI surface (`--help`), and the run itself
|
|
924
|
+
(intake, plan, wall, implement, verify, seal, PR) are on main, so the
|
|
925
|
+
command above executes a real build end to end. `status`, `verify` and
|
|
926
|
+
`dashboard` are also built. The guide says exactly what is still wired up
|
|
927
|
+
(`--resume`, Slack) and what already runs.
|
|
928
|
+
|
|
929
|
+
---
|
|
930
|
+
|
|
912
931
|
## Limitations
|
|
913
932
|
|
|
914
933
|
| Area | What Works | What Doesn't (Yet) |
|
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.81.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.81.0 | [Autonomi](https://www.autonomi.dev/) flagship product | ~410 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
9.
|
|
1
|
+
9.81.0
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Loki 10 engine P4 push child for GitLab (ENGINE.md sections 6, 7 and 13).
|
|
3
|
+
#
|
|
4
|
+
# engine10-push-gitlab.sh push-mr <repo-dir> <branch> <title> <body-file> [--draft]
|
|
5
|
+
#
|
|
6
|
+
# Prints the merge request URL. Holds GitLab credentials, runs no LLM, reads
|
|
7
|
+
# no untrusted text beyond argv. The target project comes only from the origin
|
|
8
|
+
# P0 pinned before any provider ran (_LOKI_ORIGIN_PINNED=1
|
|
9
|
+
# _LOKI_PINNED_ORIGIN=<url>), and that origin must be a literal gitlab.com
|
|
10
|
+
# https or ssh URL. _loki_trusted_push refuses non-github.com origins, so this
|
|
11
|
+
# mirrors its shape: the branch is fetched into a fresh --template= repo and
|
|
12
|
+
# pushed from there, so no agent-repo hook or config runs in the credentialed
|
|
13
|
+
# process; glab runs from / with the host fixed to gitlab.com.
|
|
14
|
+
set -o pipefail
|
|
15
|
+
|
|
16
|
+
die() { printf 'engine10-push-gitlab: %s\n' "$*" >&2; exit "${2:-2}"; }
|
|
17
|
+
|
|
18
|
+
# <url> -> GROUP[/SUBGROUP...]/PROJECT on stdout, or rc 1. Literal gitlab.com
|
|
19
|
+
# only: no host alias, no port, no embedded credentials, no odd characters.
|
|
20
|
+
_e10_gitlab_project_from_url() {
|
|
21
|
+
local u="${1:-}" lc pre p
|
|
22
|
+
lc="$(printf '%s' "$u" | tr '[:upper:]' '[:lower:]')"
|
|
23
|
+
case "$lc" in
|
|
24
|
+
https://gitlab.com/*) pre="https://gitlab.com/" ;;
|
|
25
|
+
git@gitlab.com:*) pre="git@gitlab.com:" ;;
|
|
26
|
+
ssh://git@gitlab.com/*) pre="ssh://git@gitlab.com/" ;;
|
|
27
|
+
*) return 1 ;;
|
|
28
|
+
esac
|
|
29
|
+
p="${u:${#pre}}"
|
|
30
|
+
p="${p%/}"
|
|
31
|
+
p="${p%.git}"
|
|
32
|
+
case "$p" in
|
|
33
|
+
/* | */ | *//* | */.* | .* | *..* | */-/* | *[!A-Za-z0-9._/-]*) return 1 ;;
|
|
34
|
+
?*/?*) printf '%s\n' "$p" ;;
|
|
35
|
+
*) return 1 ;;
|
|
36
|
+
esac
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
# Neutral glab: cwd /, no git dir, host pinned so an ambient GITLAB_HOST
|
|
40
|
+
# cannot send the token elsewhere.
|
|
41
|
+
_e10_glab() {
|
|
42
|
+
(
|
|
43
|
+
cd / || exit 1
|
|
44
|
+
unset GIT_DIR GIT_WORK_TREE GL_HOST GITLAB_API_HOST
|
|
45
|
+
export GITLAB_HOST=gitlab.com
|
|
46
|
+
command glab "$@"
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
[ "${_LOKI_ORIGIN_PINNED:-}" = "1" ] || die "origin not pinned (_LOKI_ORIGIN_PINNED=1 required)"
|
|
51
|
+
url="${_LOKI_PINNED_ORIGIN:-}"
|
|
52
|
+
proj="$(_e10_gitlab_project_from_url "$url")" \
|
|
53
|
+
|| die "pinned origin refused: not a literal gitlab.com https or ssh GROUP/PROJECT URL"
|
|
54
|
+
|
|
55
|
+
mode="${1:-}"
|
|
56
|
+
shift || true
|
|
57
|
+
[ "$mode" = "push-mr" ] || die "usage: engine10-push-gitlab.sh push-mr <repo-dir> <branch> <title> <body-file> [--draft]"
|
|
58
|
+
[ "$#" -ge 4 ] && [ "$#" -le 5 ] || die "usage: push-mr <repo-dir> <branch> <title> <body-file> [--draft]"
|
|
59
|
+
dir="$1" branch="$2" title="$3" body="$4" draft=()
|
|
60
|
+
if [ "$#" -eq 5 ]; then
|
|
61
|
+
[ "$5" = "--draft" ] || die "unknown flag: $5"
|
|
62
|
+
draft=(--draft)
|
|
63
|
+
fi
|
|
64
|
+
[ -f "$body" ] || die "body file not found: $body"
|
|
65
|
+
dir="$(cd "$dir" 2>/dev/null && pwd -P)" || die "repo dir not found"
|
|
66
|
+
git check-ref-format --branch "$branch" >/dev/null 2>&1 || die "bad branch name"
|
|
67
|
+
case "$branch" in
|
|
68
|
+
main | master | HEAD) die "Not pushing branch '$branch': Loki never pushes directly to a default branch." ;;
|
|
69
|
+
esac
|
|
70
|
+
cur="$(git -C "$dir" config --get remote.origin.url 2>/dev/null)" || cur=""
|
|
71
|
+
[ "$cur" = "$url" ] || die "Not pushing branch '$branch': origin changed during the run; Loki does not push to a destination the agent could have chosen."
|
|
72
|
+
|
|
73
|
+
enc="${proj//\//%2F}"
|
|
74
|
+
def="$(_e10_glab api "projects/$enc" 2>/dev/null \
|
|
75
|
+
| python3 -c 'import json,sys; print(json.load(sys.stdin).get("default_branch") or "")' 2>/dev/null)" || def=""
|
|
76
|
+
[ -n "$def" ] || die "Not pushing branch '$branch': could not resolve the default branch of $proj."
|
|
77
|
+
[ "$branch" != "$def" ] || die "Not pushing branch '$branch': it is the default branch of $proj."
|
|
78
|
+
|
|
79
|
+
tmp="$(mktemp -d "${TMPDIR:-/tmp}/loki-push-gl.XXXXXX")" || die "mktemp failed" 1
|
|
80
|
+
trap 'rm -rf "$tmp"' EXIT
|
|
81
|
+
git init -q --template= "$tmp" >/dev/null 2>&1 \
|
|
82
|
+
&& git -C "$tmp" fetch -q --no-tags --update-shallow "$dir" "+refs/heads/$branch:refs/heads/$branch" >/dev/null 2>&1 \
|
|
83
|
+
&& git -C "$tmp" rev-parse -q --verify "refs/heads/$branch" >/dev/null 2>&1 \
|
|
84
|
+
|| die "could not stage branch '$branch' in a fresh repo"
|
|
85
|
+
git -C "$tmp" push -q "$url" "refs/heads/$branch:refs/heads/$branch" || die "push failed (rc=$?)"
|
|
86
|
+
|
|
87
|
+
mr="$(_e10_glab mr list --repo "$proj" --source-branch "$branch" --output json 2>/dev/null \
|
|
88
|
+
| python3 -c 'import json,sys; d=json.load(sys.stdin); print(d[0].get("web_url","") if d else "")' 2>/dev/null)" \
|
|
89
|
+
|| die "glab mr list failed"
|
|
90
|
+
if [ -z "$mr" ]; then
|
|
91
|
+
mr="$(_e10_glab mr create --repo "$proj" --source-branch "$branch" --title "$title" \
|
|
92
|
+
--description "$(cat "$body")" --yes "${draft[@]}" | grep -Eo 'https://gitlab\.com/[^[:space:]]+' | tail -n 1)" \
|
|
93
|
+
|| die "glab mr create failed"
|
|
94
|
+
[ -n "$mr" ] || die "glab mr create printed no URL"
|
|
95
|
+
fi
|
|
96
|
+
printf '%s\n' "$mr"
|
|
@@ -41,8 +41,66 @@ _LOKI_ORIGIN_PINNED="$_e10_pinned"
|
|
|
41
41
|
_LOKI_PINNED_ORIGIN="$_e10_origin"
|
|
42
42
|
|
|
43
43
|
[ "$_LOKI_ORIGIN_PINNED" = "1" ] || die "origin not pinned (_LOKI_ORIGIN_PINNED=1 required)"
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
|
|
45
|
+
# E-41: the eval harness (eval/loki10/harness.py) pins origin to a local bare
|
|
46
|
+
# repo and scores "PR opened" as a branch landing there. Only an absolute,
|
|
47
|
+
# colon-free path whose own git dir is itself a bare repo qualifies; anything
|
|
48
|
+
# else (URL, scp host:path, relative, non-bare, a subdirectory) takes the
|
|
49
|
+
# GitHub path below and its refusal.
|
|
50
|
+
_e10_local_bare() {
|
|
51
|
+
local p="$1" abs
|
|
52
|
+
case "$p" in /*) ;; *) return 1 ;; esac
|
|
53
|
+
case "$p" in *:*) return 1 ;; esac
|
|
54
|
+
abs="$(cd "$p" 2>/dev/null && pwd -P)" || return 1
|
|
55
|
+
[ "$(git -C "$abs" rev-parse --is-bare-repository 2>/dev/null)" = "true" ] || return 1
|
|
56
|
+
[ "$(git -C "$abs" rev-parse --absolute-git-dir 2>/dev/null)" = "$abs" ]
|
|
57
|
+
}
|
|
58
|
+
_e10_local=""
|
|
59
|
+
_e10_git_env="GIT_DIR GIT_WORK_TREE GIT_COMMON_DIR GIT_CONFIG_PARAMETERS GIT_CONFIG_COUNT"
|
|
60
|
+
# shellcheck disable=SC2086 # word-split list of variable names
|
|
61
|
+
if (unset $_e10_git_env; _e10_local_bare "$_LOKI_PINNED_ORIGIN"); then
|
|
62
|
+
_e10_local=1
|
|
63
|
+
else
|
|
64
|
+
_e10_repo="$(_loki_github_repo_from_url "$_LOKI_PINNED_ORIGIN")" \
|
|
65
|
+
|| die "pinned origin refused: $(_loki_origin_refusal "$_LOKI_PINNED_ORIGIN")"
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Local push: like _loki_trusted_push, the branch is fetched into a fresh
|
|
69
|
+
# template-less repo and pushed from there, so the agent repo's config
|
|
70
|
+
# (pushInsteadOf, remote.<url>.receivepack) and hooks never apply. The bare
|
|
71
|
+
# repo's own receive-side hooks (and its core.hooksPath) DO run: git does not
|
|
72
|
+
# pass -c core.hooksPath to the local receive-pack. What protects them is the
|
|
73
|
+
# allowlisted env below: they inherit it, so no token, SSH agent or askpass
|
|
74
|
+
# reaches them.
|
|
75
|
+
_e10_git() {
|
|
76
|
+
env -i PATH="$PATH" HOME=/dev/null TMPDIR="${TMPDIR:-/tmp}" GIT_CONFIG_NOSYSTEM=1 \
|
|
77
|
+
GIT_CONFIG_GLOBAL=/dev/null GIT_TERMINAL_PROMPT=0 git -c core.hooksPath=/dev/null "$@"
|
|
78
|
+
}
|
|
79
|
+
_e10_local_push() {
|
|
80
|
+
local dir="$1" branch="$2" origin="$_LOKI_PINNED_ORIGIN" def tmp rc=1
|
|
81
|
+
dir="$(cd "$dir" 2>/dev/null && pwd -P)" || return 1
|
|
82
|
+
git check-ref-format --branch "$branch" >/dev/null 2>&1 || return 1
|
|
83
|
+
case "$branch" in
|
|
84
|
+
main | master | HEAD)
|
|
85
|
+
log_warn "Not pushing branch '$branch': Loki never pushes directly to a default branch."
|
|
86
|
+
return 2 ;;
|
|
87
|
+
esac
|
|
88
|
+
def="$(_e10_git -C "$origin" symbolic-ref --short HEAD 2>/dev/null)" || def=""
|
|
89
|
+
if [ -z "$def" ] || [ "$branch" = "$def" ]; then
|
|
90
|
+
log_warn "Not pushing branch '$branch': it is (or may be) the default branch of $origin."
|
|
91
|
+
return 2
|
|
92
|
+
fi
|
|
93
|
+
tmp="$(mktemp -d "${TMPDIR:-/tmp}/loki-push.XXXXXX")" || return 1
|
|
94
|
+
if _e10_git init -q --template= "$tmp" >/dev/null 2>&1 \
|
|
95
|
+
&& _e10_git -C "$tmp" fetch -q --no-tags --update-shallow "$dir" \
|
|
96
|
+
"+refs/heads/$branch:refs/heads/$branch" >/dev/null 2>&1 \
|
|
97
|
+
&& _e10_git -C "$tmp" rev-parse -q --verify "refs/heads/$branch" >/dev/null 2>&1; then
|
|
98
|
+
rc=0
|
|
99
|
+
_e10_git -C "$tmp" push -q "$origin" "refs/heads/$branch:refs/heads/$branch" || rc=$?
|
|
100
|
+
fi
|
|
101
|
+
rm -rf "$tmp"
|
|
102
|
+
return "$rc"
|
|
103
|
+
}
|
|
46
104
|
|
|
47
105
|
_e10_gh() { _loki_with_github_tokens _loki_run_neutral "$_e10_repo" command gh "$@"; }
|
|
48
106
|
|
|
@@ -57,6 +115,11 @@ case "$mode" in
|
|
|
57
115
|
draft=(--draft)
|
|
58
116
|
fi
|
|
59
117
|
[ -f "$body" ] || die "body file not found: $body"
|
|
118
|
+
if [ -n "$_e10_local" ]; then
|
|
119
|
+
_e10_local_push "$dir" "$branch" || die "push refused or failed (rc=$?)"
|
|
120
|
+
printf 'local://%s#%s\n' "$_LOKI_PINNED_ORIGIN" "$branch"
|
|
121
|
+
exit 0
|
|
122
|
+
fi
|
|
60
123
|
_loki_trusted_push _loki_with_github_tokens "$dir" "$branch" || die "push refused or failed (rc=$?)"
|
|
61
124
|
url="$(_e10_gh pr list --repo "$_e10_repo" --head "$branch" --state open --json url --jq '.[0].url')" \
|
|
62
125
|
|| die "gh pr list failed"
|
|
@@ -71,12 +134,14 @@ case "$mode" in
|
|
|
71
134
|
[ "$#" -eq 2 ] || die "usage: comment <pr-number> <body-file>"
|
|
72
135
|
case "$1" in '' | *[!0-9]*) die "pr number must be digits" ;; esac
|
|
73
136
|
[ -f "$2" ] || die "body file not found: $2"
|
|
137
|
+
[ -z "$_e10_local" ] || { log_info "local origin: no PR to comment on (no-op)"; exit 0; }
|
|
74
138
|
_e10_gh pr comment "$1" --repo "$_e10_repo" --body-file "$2" || die "gh pr comment failed"
|
|
75
139
|
;;
|
|
76
140
|
status)
|
|
77
141
|
[ "$#" -eq 3 ] || die "usage: status <sha> <state> <description>"
|
|
78
142
|
[[ "$1" =~ ^[0-9a-f]{40}$ ]] || die "sha must be 40 lowercase hex characters"
|
|
79
143
|
case "$2" in pending | success | failure | error) ;; *) die "bad state: $2" ;; esac
|
|
144
|
+
[ -z "$_e10_local" ] || { log_info "local origin: no commit status to set (no-op)"; exit 0; }
|
|
80
145
|
_e10_gh api "repos/$_e10_repo/statuses/$1" -f "state=$2" -f context=loki/deep-verify \
|
|
81
146
|
-f "description=$3" >/dev/null || die "gh api status failed"
|
|
82
147
|
;;
|
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:** v9.
|
|
5
|
+
**Version:** v9.81.0
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
package/docs/dev/tmp-cleanup.md
CHANGED
|
@@ -62,11 +62,11 @@ loki_run_tmp_create() {
|
|
|
62
62
|
# usage string, a filesystem block, an empty result, or a concatenation of any
|
|
63
63
|
# of those is rejected on every platform.
|
|
64
64
|
loki_run_tmp_stat_field() {
|
|
65
|
-
local gnu_fmt="$1" bsd_fmt="$2"
|
|
65
|
+
local gnu_fmt="$1" bsd_fmt="$2" target_path="$3" value
|
|
66
66
|
|
|
67
|
-
value="$(stat -c "$gnu_fmt" -- "$
|
|
67
|
+
value="$(stat -c "$gnu_fmt" -- "$target_path" 2>/dev/null)" || value=''
|
|
68
68
|
case "$value" in
|
|
69
|
-
'' | *[!0-9]*) value="$(stat -f "$bsd_fmt" -- "$
|
|
69
|
+
'' | *[!0-9]*) value="$(stat -f "$bsd_fmt" -- "$target_path" 2>/dev/null)" || value='' ;;
|
|
70
70
|
esac
|
|
71
71
|
case "$value" in
|
|
72
72
|
'' | *[!0-9]*) return 1 ;;
|