loki-mode 5.52.1 → 5.52.3
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 +110 -817
- package/SKILL.md +2 -2
- package/VERSION +1 -1
- package/dashboard/__init__.py +1 -1
- package/dashboard/server.py +49 -0
- package/docs/INSTALLATION.md +1 -1
- package/docs/enterprise/migration.md +4 -4
- package/docs/enterprise/sdk-guide.md +11 -11
- package/docs/enterprise/security.md +2 -2
- package/docs/show-hn-post.md +47 -0
- package/mcp/__init__.py +39 -3
- package/package.json +11 -4
- package/src/integrations/linear/index.js +30 -0
package/SKILL.md
CHANGED
|
@@ -3,7 +3,7 @@ name: loki-mode
|
|
|
3
3
|
description: Multi-agent autonomous startup system. Triggers on "Loki Mode". Takes PRD to deployed product with minimal human intervention. Requires --dangerously-skip-permissions flag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Loki Mode v5.52.
|
|
6
|
+
# Loki Mode v5.52.3
|
|
7
7
|
|
|
8
8
|
**You are an autonomous agent. You make decisions. You do not ask questions. You do not stop.**
|
|
9
9
|
|
|
@@ -263,4 +263,4 @@ The following features are documented in skill modules but not yet fully automat
|
|
|
263
263
|
| Quality gates 3-reviewer system | Implemented (v5.35.0) | 5 specialist reviewers in `skills/quality-gates.md`; execution in run.sh |
|
|
264
264
|
| Benchmarks (HumanEval, SWE-bench) | Infrastructure only | Runner scripts and datasets exist in `benchmarks/`; no published results |
|
|
265
265
|
|
|
266
|
-
**v5.52.
|
|
266
|
+
**v5.52.3 | [Autonomi](https://www.autonomi.dev/) flagship product | ~260 lines core**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.52.
|
|
1
|
+
5.52.3
|
package/dashboard/__init__.py
CHANGED
package/dashboard/server.py
CHANGED
|
@@ -366,6 +366,55 @@ async def health_check() -> dict[str, str]:
|
|
|
366
366
|
return {"status": "healthy", "service": "loki-dashboard"}
|
|
367
367
|
|
|
368
368
|
|
|
369
|
+
# A2A Agent Card - advertises agent capabilities per the A2A spec
|
|
370
|
+
@app.get("/.well-known/agent.json", include_in_schema=False)
|
|
371
|
+
async def agent_card() -> dict:
|
|
372
|
+
"""A2A Agent Card served at /.well-known/agent.json."""
|
|
373
|
+
return {
|
|
374
|
+
"name": "Loki Mode",
|
|
375
|
+
"version": _version,
|
|
376
|
+
"description": "Multi-agent autonomous system by Autonomi. Takes PRD to fully deployed product with minimal human intervention.",
|
|
377
|
+
"url": "https://www.autonomi.dev/",
|
|
378
|
+
"capabilities": {
|
|
379
|
+
"agents": 41,
|
|
380
|
+
"swarms": 8,
|
|
381
|
+
"quality_gates": 9,
|
|
382
|
+
"providers": ["claude", "codex", "gemini"],
|
|
383
|
+
"streaming": True,
|
|
384
|
+
"pushNotifications": False,
|
|
385
|
+
"stateTransitionHistory": True,
|
|
386
|
+
},
|
|
387
|
+
"skills": [
|
|
388
|
+
{"id": "prd-to-product", "name": "PRD to Product", "description": "Takes a PRD and builds a fully deployed product"},
|
|
389
|
+
{"id": "code-review", "name": "Code Review", "description": "Multi-reviewer parallel code review with anti-sycophancy"},
|
|
390
|
+
{"id": "testing", "name": "Testing", "description": "Comprehensive test generation and execution"},
|
|
391
|
+
{"id": "deployment", "name": "Deployment", "description": "Production deployment with verification"},
|
|
392
|
+
],
|
|
393
|
+
"protocols": {
|
|
394
|
+
"a2a": "0.1",
|
|
395
|
+
"mcp": "1.0",
|
|
396
|
+
},
|
|
397
|
+
"endpoints": {
|
|
398
|
+
"health": "/health",
|
|
399
|
+
"status": "/api/status",
|
|
400
|
+
"openapi": "/openapi.json",
|
|
401
|
+
"metrics": "/metrics",
|
|
402
|
+
"websocket": "/ws",
|
|
403
|
+
},
|
|
404
|
+
"enterprise": {
|
|
405
|
+
"multi_tenant": True,
|
|
406
|
+
"rbac": True,
|
|
407
|
+
"audit_log": True,
|
|
408
|
+
"sso": False,
|
|
409
|
+
},
|
|
410
|
+
"authentication": {
|
|
411
|
+
"schemes": ["bearer", "api-key"],
|
|
412
|
+
},
|
|
413
|
+
"defaultInputModes": ["text/plain", "application/json"],
|
|
414
|
+
"defaultOutputModes": ["text/plain", "application/json"],
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
|
|
369
418
|
# Status endpoint - reads from .loki/ flat files (primary) + DB (fallback)
|
|
370
419
|
@app.get("/api/status", response_model=StatusResponse)
|
|
371
420
|
async def get_status() -> StatusResponse:
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -52,12 +52,12 @@ The v1 API (`/api/`) continues to work unchanged. The v2 API adds tenant isolati
|
|
|
52
52
|
|
|
53
53
|
Official SDKs for programmatic access to the Control Plane API.
|
|
54
54
|
|
|
55
|
-
**Python SDK (`
|
|
55
|
+
**Python SDK (`loki-mode-sdk`):**
|
|
56
56
|
- Zero external dependencies (stdlib only)
|
|
57
57
|
- Synchronous client using `urllib`
|
|
58
58
|
- Type-safe dataclasses for all API resources
|
|
59
59
|
|
|
60
|
-
**TypeScript SDK (
|
|
60
|
+
**TypeScript SDK (`loki-mode-sdk`):**
|
|
61
61
|
- Zero external dependencies (uses Node.js built-in `fetch`)
|
|
62
62
|
- Async/await API
|
|
63
63
|
- TypeScript interfaces for all resources
|
|
@@ -220,10 +220,10 @@ export LOKI_OIDC_ISSUER="https://..."
|
|
|
220
220
|
|
|
221
221
|
```bash
|
|
222
222
|
# Python SDK
|
|
223
|
-
pip install
|
|
223
|
+
pip install loki-mode-sdk
|
|
224
224
|
|
|
225
225
|
# TypeScript SDK
|
|
226
|
-
npm install
|
|
226
|
+
npm install loki-mode-sdk
|
|
227
227
|
```
|
|
228
228
|
|
|
229
229
|
#### 5. Test Enterprise Features
|
|
@@ -9,7 +9,7 @@ Official Python and TypeScript SDKs for the Autonomi Control Plane API. Both SDK
|
|
|
9
9
|
### Installation
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
pip install
|
|
12
|
+
pip install loki-mode-sdk
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
Or install from source:
|
|
@@ -24,7 +24,7 @@ pip install -e .
|
|
|
24
24
|
### Quick Start
|
|
25
25
|
|
|
26
26
|
```python
|
|
27
|
-
from
|
|
27
|
+
from loki_mode_sdk import AutonomiClient
|
|
28
28
|
|
|
29
29
|
# Create a client
|
|
30
30
|
client = AutonomiClient(
|
|
@@ -115,7 +115,7 @@ client.query_audit(
|
|
|
115
115
|
#### SessionManager
|
|
116
116
|
|
|
117
117
|
```python
|
|
118
|
-
from
|
|
118
|
+
from loki_mode_sdk import AutonomiClient, SessionManager
|
|
119
119
|
|
|
120
120
|
client = AutonomiClient(base_url="http://localhost:57374", token="loki_xxx")
|
|
121
121
|
sessions = SessionManager(client)
|
|
@@ -130,7 +130,7 @@ session = sessions.get_session("session-id")
|
|
|
130
130
|
#### TaskManager
|
|
131
131
|
|
|
132
132
|
```python
|
|
133
|
-
from
|
|
133
|
+
from loki_mode_sdk import AutonomiClient, TaskManager
|
|
134
134
|
|
|
135
135
|
client = AutonomiClient(base_url="http://localhost:57374", token="loki_xxx")
|
|
136
136
|
tasks = TaskManager(client)
|
|
@@ -153,7 +153,7 @@ tasks.update_task(task.id, status="in_progress")
|
|
|
153
153
|
#### EventStream
|
|
154
154
|
|
|
155
155
|
```python
|
|
156
|
-
from
|
|
156
|
+
from loki_mode_sdk import AutonomiClient, EventStream
|
|
157
157
|
import time
|
|
158
158
|
|
|
159
159
|
client = AutonomiClient(base_url="http://localhost:57374", token="loki_xxx")
|
|
@@ -172,7 +172,7 @@ while True:
|
|
|
172
172
|
### Error Handling
|
|
173
173
|
|
|
174
174
|
```python
|
|
175
|
-
from
|
|
175
|
+
from loki_mode_sdk import (
|
|
176
176
|
AutonomiClient,
|
|
177
177
|
AutonomiError,
|
|
178
178
|
AuthenticationError,
|
|
@@ -212,7 +212,7 @@ AutonomiError (base)
|
|
|
212
212
|
### Installation
|
|
213
213
|
|
|
214
214
|
```bash
|
|
215
|
-
npm install
|
|
215
|
+
npm install loki-mode-sdk
|
|
216
216
|
```
|
|
217
217
|
|
|
218
218
|
Or use from source:
|
|
@@ -227,7 +227,7 @@ npm link
|
|
|
227
227
|
### Quick Start
|
|
228
228
|
|
|
229
229
|
```typescript
|
|
230
|
-
import { AutonomiClient } from '
|
|
230
|
+
import { AutonomiClient } from 'loki-mode-sdk';
|
|
231
231
|
|
|
232
232
|
const client = new AutonomiClient({
|
|
233
233
|
baseUrl: 'http://localhost:57374',
|
|
@@ -400,7 +400,7 @@ import {
|
|
|
400
400
|
AuthenticationError,
|
|
401
401
|
ForbiddenError,
|
|
402
402
|
NotFoundError,
|
|
403
|
-
} from '
|
|
403
|
+
} from 'loki-mode-sdk';
|
|
404
404
|
|
|
405
405
|
const client = new AutonomiClient({
|
|
406
406
|
baseUrl: 'http://localhost:57374',
|
|
@@ -471,7 +471,7 @@ Process incoming webhooks and update the Control Plane:
|
|
|
471
471
|
```python
|
|
472
472
|
# Python -- Flask webhook handler example
|
|
473
473
|
from flask import Flask, request
|
|
474
|
-
from
|
|
474
|
+
from loki_mode_sdk import AutonomiClient
|
|
475
475
|
|
|
476
476
|
app = Flask(__name__)
|
|
477
477
|
client = AutonomiClient(base_url="http://localhost:57374", token="loki_xxx")
|
|
@@ -483,7 +483,7 @@ def handle_webhook():
|
|
|
483
483
|
|
|
484
484
|
if event_type == "task_completed":
|
|
485
485
|
# Update task status in the Control Plane
|
|
486
|
-
from
|
|
486
|
+
from loki_mode_sdk import TaskManager
|
|
487
487
|
tasks = TaskManager(client)
|
|
488
488
|
tasks.update_task(payload["task_id"], status="completed")
|
|
489
489
|
|
|
@@ -41,7 +41,7 @@ curl -X DELETE http://localhost:57374/api/keys/ci-pipeline \
|
|
|
41
41
|
|
|
42
42
|
Python:
|
|
43
43
|
```python
|
|
44
|
-
from
|
|
44
|
+
from loki_mode_sdk import AutonomiClient
|
|
45
45
|
|
|
46
46
|
client = AutonomiClient(
|
|
47
47
|
base_url="http://localhost:57374",
|
|
@@ -51,7 +51,7 @@ client = AutonomiClient(
|
|
|
51
51
|
|
|
52
52
|
TypeScript:
|
|
53
53
|
```typescript
|
|
54
|
-
import { AutonomiClient } from '
|
|
54
|
+
import { AutonomiClient } from 'loki-mode-sdk';
|
|
55
55
|
|
|
56
56
|
const client = new AutonomiClient({
|
|
57
57
|
baseUrl: 'http://localhost:57374',
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Show HN Post Draft
|
|
2
|
+
|
|
3
|
+
## Title
|
|
4
|
+
|
|
5
|
+
Show HN: Loki Mode - PRD in, tested code out (41 agents, 9 quality gates, RARV self-verification)
|
|
6
|
+
|
|
7
|
+
## Body
|
|
8
|
+
|
|
9
|
+
I built Loki Mode because I got tired of the copy-paste loop between AI coding assistants and my terminal. I wanted to hand over a PRD and get back a working, tested codebase -- not perfect, but a solid starting point.
|
|
10
|
+
|
|
11
|
+
**What it does:** You give it a Product Requirements Document. It breaks the work into tasks, dispatches them across 41 specialized agent types organized into 8 swarms (engineering, operations, business, data, product, growth, review, orchestration), and runs every iteration through a self-verification loop called RARV: Reason, Act, Reflect, Verify. The idea is that the system catches its own mistakes before you have to.
|
|
12
|
+
|
|
13
|
+
**Quality gates:** 9 automated gates including 3-reviewer blind review (agents review each other's work without seeing prior reviews), anti-sycophancy checks (a devil's advocate pass on unanimous approvals), and mock/mutation detection. These are not foolproof, but they catch a surprising number of issues that single-pass generation misses.
|
|
14
|
+
|
|
15
|
+
**Multi-provider:** Runs on Claude Code (full parallel agent support), OpenAI Codex CLI, or Google Gemini CLI. Codex and Gemini run in degraded sequential mode -- no parallel agents, no Task tool. Claude Code is the primary target.
|
|
16
|
+
|
|
17
|
+
**Memory:** 3-tier system (episodic, semantic, procedural) so the system can learn from previous runs. Optional vector search with sentence-transformers if you want similarity-based retrieval.
|
|
18
|
+
|
|
19
|
+
**Enterprise features:** TLS, OIDC/SSO, RBAC, OTEL tracing, policy engine, audit trails. All behind env vars. Certs are self-signed only. Dashboard runs on a single machine at port 57374.
|
|
20
|
+
|
|
21
|
+
**Research foundation:** The architecture draws from Anthropic's Constitutional AI (principles-based self-critique), DeepMind's Scalable Oversight via Debate, and OpenAI's Agents SDK patterns (guardrails, tripwires, handoffs). References to specific papers are in the repo.
|
|
22
|
+
|
|
23
|
+
**What it does NOT do:** It does not deploy anything. It generates deployment configs (Helm, Docker Compose, Terraform), but a human deploys. Complex domain logic will need human review. The system can and does make mistakes, especially on novel problems. Token costs scale with project complexity. Our SWE-bench numbers (299/300 patches generated) measure output, not resolution -- the official evaluator has not been run, so the actual fix rate is unknown and likely significantly lower than the generation rate. The HumanEval score is self-reported with max 3 retries per problem.
|
|
24
|
+
|
|
25
|
+
**Test suite:** 683 npm tests, 631 pytest tests, 16 shell tests. Self-reported HumanEval score of 162/164 (98.78%).
|
|
26
|
+
|
|
27
|
+
Built solo. MIT licensed.
|
|
28
|
+
|
|
29
|
+
## Try it
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install -g loki-mode
|
|
33
|
+
claude --dangerously-skip-permissions
|
|
34
|
+
# Then say: "Loki Mode with PRD at path/to/your-prd.md"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Python SDK: `pip install loki-mode-sdk`. TypeScript SDK: `npm install loki-mode-sdk` (available in the repo at `sdk/typescript/`).
|
|
38
|
+
|
|
39
|
+
Integrations: Jira, Slack, Teams, GitHub Actions.
|
|
40
|
+
|
|
41
|
+
## Feedback wanted
|
|
42
|
+
|
|
43
|
+
- Is the 9-gate quality system overkill, or does it actually help for your use cases?
|
|
44
|
+
- How do you handle the tension between autonomous agent speed and code review thoroughness?
|
|
45
|
+
- What PRD complexity level breaks this approach? I have hit walls with highly coupled distributed systems.
|
|
46
|
+
|
|
47
|
+
GitHub: https://github.com/asklokesh/loki-mode
|
package/mcp/__init__.py
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
1
|
+
"""
|
|
2
|
+
Loki Mode MCP Server Package
|
|
3
|
+
|
|
4
|
+
NAMESPACE NOTE:
|
|
5
|
+
This local 'mcp/' package provides the Loki Mode MCP server tools
|
|
6
|
+
(loki_memory_retrieve, loki_task_queue, etc.). It intentionally uses
|
|
7
|
+
the 'mcp' namespace, which shadows the pip-installed 'mcp' SDK
|
|
8
|
+
(FastMCP) when imported from the project root.
|
|
9
|
+
|
|
10
|
+
The server module (mcp/server.py) works around this by loading
|
|
11
|
+
FastMCP directly from site-packages via importlib.util, bypassing
|
|
12
|
+
Python's normal package resolution. This means:
|
|
13
|
+
|
|
14
|
+
- The pip 'mcp' SDK MUST be installed for the server to start.
|
|
15
|
+
Install with: pip install mcp
|
|
16
|
+
- Importing 'mcp' from the project root yields THIS package,
|
|
17
|
+
not the pip SDK. This is the intended behavior.
|
|
18
|
+
- The server runs correctly via 'python -m mcp.server' as long
|
|
19
|
+
as the pip SDK is installed in site-packages.
|
|
20
|
+
|
|
21
|
+
This is a known limitation documented in the integrity audit.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import logging as _logging
|
|
25
|
+
|
|
26
|
+
_logger = _logging.getLogger('loki-mcp')
|
|
27
|
+
|
|
28
|
+
# Gracefully handle server import -- requires pip 'mcp' SDK installed
|
|
29
|
+
try:
|
|
30
|
+
from .server import mcp
|
|
31
|
+
_SERVER_AVAILABLE = True
|
|
32
|
+
except SystemExit:
|
|
33
|
+
mcp = None
|
|
34
|
+
_SERVER_AVAILABLE = False
|
|
35
|
+
_logger.warning(
|
|
36
|
+
"MCP server not available: pip 'mcp' SDK not installed. "
|
|
37
|
+
"Install with: pip install mcp"
|
|
38
|
+
)
|
|
3
39
|
|
|
4
40
|
# Import learning collector if available
|
|
5
41
|
try:
|
|
@@ -21,4 +57,4 @@ try:
|
|
|
21
57
|
except ImportError:
|
|
22
58
|
__all__ = ['mcp']
|
|
23
59
|
|
|
24
|
-
__version__ = '5.52.
|
|
60
|
+
__version__ = '5.52.3'
|
package/package.json
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "loki-mode",
|
|
3
|
-
"version": "5.52.
|
|
3
|
+
"version": "5.52.3",
|
|
4
4
|
"description": "Loki Mode by Autonomi - Multi-agent autonomous startup system for Claude Code, Codex CLI, and Gemini CLI",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"autonomi",
|
|
7
7
|
"loki-mode",
|
|
8
8
|
"claude",
|
|
9
9
|
"claude-code",
|
|
10
|
+
"codex",
|
|
11
|
+
"gemini",
|
|
10
12
|
"ai",
|
|
13
|
+
"ai-agent",
|
|
11
14
|
"agent",
|
|
12
15
|
"autonomous",
|
|
13
|
-
"
|
|
14
|
-
"
|
|
16
|
+
"multi-agent",
|
|
17
|
+
"prd",
|
|
18
|
+
"code-generation",
|
|
19
|
+
"testing",
|
|
20
|
+
"mcp",
|
|
21
|
+
"llm"
|
|
15
22
|
],
|
|
16
23
|
"homepage": "https://www.autonomi.dev/",
|
|
17
24
|
"bugs": {
|
|
@@ -59,7 +66,7 @@
|
|
|
59
66
|
"test:dashboard": "npm run test:visual && npm run test:parity"
|
|
60
67
|
},
|
|
61
68
|
"engines": {
|
|
62
|
-
"node": ">=
|
|
69
|
+
"node": ">=18.0.0"
|
|
63
70
|
},
|
|
64
71
|
"os": [
|
|
65
72
|
"darwin",
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var { LinearClient, LinearApiError, RateLimitError, LINEAR_API_URL } = require('./client');
|
|
4
|
+
var { LinearSync, PRIORITY_MAP, VALID_RARV_STATUSES } = require('./sync');
|
|
5
|
+
var { loadConfig, validateConfig, parseSimpleYaml, DEFAULT_STATUS_MAPPING } = require('./config');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Create a configured Linear sync manager.
|
|
9
|
+
* @param {object} config - Linear configuration object (apiKey, teamId, statusMapping, etc.)
|
|
10
|
+
* @param {object} [options] - Optional adapter options
|
|
11
|
+
* @returns {LinearSync}
|
|
12
|
+
*/
|
|
13
|
+
function createSync(config, options) {
|
|
14
|
+
return new LinearSync(config, options);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = {
|
|
18
|
+
LinearClient: LinearClient,
|
|
19
|
+
LinearApiError: LinearApiError,
|
|
20
|
+
RateLimitError: RateLimitError,
|
|
21
|
+
LINEAR_API_URL: LINEAR_API_URL,
|
|
22
|
+
LinearSync: LinearSync,
|
|
23
|
+
PRIORITY_MAP: PRIORITY_MAP,
|
|
24
|
+
VALID_RARV_STATUSES: VALID_RARV_STATUSES,
|
|
25
|
+
DEFAULT_STATUS_MAPPING: DEFAULT_STATUS_MAPPING,
|
|
26
|
+
loadConfig: loadConfig,
|
|
27
|
+
validateConfig: validateConfig,
|
|
28
|
+
parseSimpleYaml: parseSimpleYaml,
|
|
29
|
+
createSync: createSync,
|
|
30
|
+
};
|