@inerrata-corporation/errata 2.0.0-dev.55 → 2.0.0-dev.57
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.txt +28 -32
- package/errata.mjs +28 -4
- package/install.ps1 +61 -40
- package/package.json +1 -1
- package/uninstall.ps1 +21 -15
package/README.txt
CHANGED
|
@@ -2,36 +2,38 @@ errata - local-first observation engine for coding agents
|
|
|
2
2
|
|
|
3
3
|
Requires Node.js 22 or newer on PATH (https://nodejs.org).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
INSTALL
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
npm i -g @inerrata-corporation/errata
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
That's the whole install: npm drops the bundle + tree-sitter runtime and puts
|
|
10
|
+
the `errata` command on your PATH. Works on Windows, macOS, and Linux. (Alpha
|
|
11
|
+
dogfooders track the dev channel: `npm i -g @inerrata-corporation/errata@dev`.)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
Windows autostart (optional): run install.ps1 (shipped alongside this file) to
|
|
14
|
+
register a hidden logon Scheduled Task that keeps `errata dash` running across
|
|
15
|
+
reboots. It installs via the SAME `npm i -g` and points the task at the
|
|
16
|
+
npm-managed bundle, so a later `errata update` is picked up automatically -
|
|
17
|
+
install and update never diverge. uninstall.ps1 removes the task + the install.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
USE
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
cd /path/to/your/project
|
|
22
|
+
errata init # auto-detects the profile + installs harness hooks
|
|
23
|
+
errata start # observe this repo (or 'errata dash' to watch all projects)
|
|
24
|
+
errata status # verify the whole chain (daemon, cloud, consent, version)
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
ln -s "$PWD/errata.mjs" ~/.local/bin/errata
|
|
26
|
+
Dashboard: http://127.0.0.1:7891
|
|
26
27
|
|
|
27
|
-
|
|
28
|
+
UPDATE
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
errata update # pull the newest build on your channel (npm i -g)
|
|
31
|
+
errata update --channel latest # switch channels; the choice is persisted
|
|
32
|
+
errata update --check # just report whether you're behind
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
errata
|
|
34
|
-
errata status # verify the whole chain (daemon, cloud, consent)
|
|
34
|
+
CLOUD (optional - errata works fully local without it)
|
|
35
|
+
|
|
36
|
+
errata login # browser OAuth (loopback); '--device' for the code flow
|
|
35
37
|
|
|
36
38
|
Model caveat (Claude Code + Claude Fable 5): the harness treats Fable 5's
|
|
37
39
|
mid-turn assistant text (written between tool calls) as ephemeral - it reaches
|
|
@@ -41,16 +43,10 @@ tells the agent to restate mid-turn tags in its final message (which always
|
|
|
41
43
|
survives), so expect reduced mid-turn capture on Fable sessions; Opus/Sonnet
|
|
42
44
|
sessions are fully captured. (Verified with a 3-model matrix, 2026-07-02.)
|
|
43
45
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
Point at a cloud (defaults to the public instance):
|
|
47
|
-
|
|
48
|
-
errata init --cloud https://your-instance --token <api-key>
|
|
49
|
-
errata login # or browser device-code flow
|
|
50
|
-
|
|
51
|
-
Per-workspace state lives at .errata/ inside each project root and is
|
|
52
|
-
preserved on uninstall - delete manually if you want it gone.
|
|
46
|
+
Per-workspace state lives at .errata/ inside each project root and is preserved
|
|
47
|
+
on uninstall - delete manually if you want it gone.
|
|
53
48
|
|
|
54
|
-
|
|
49
|
+
UNINSTALL
|
|
55
50
|
|
|
56
|
-
.\uninstall.ps1
|
|
51
|
+
.\uninstall.ps1 # Windows (removes the autostart task too)
|
|
52
|
+
npm uninstall -g @inerrata-corporation/errata # any platform
|
package/errata.mjs
CHANGED
|
@@ -21216,6 +21216,16 @@ var init_client = __esm({
|
|
|
21216
21216
|
* resolvable member ids. AUTHED. Always HTTP 200 — the `status` field
|
|
21217
21217
|
* discriminates outcomes (incl. the autophagy-floor refusal, which is a
|
|
21218
21218
|
* normal "not enough collective grounding yet" result, not an error). */
|
|
21219
|
+
/** Durable skills pinned to this workspace's cloud project (bodies included).
|
|
21220
|
+
* The daemon claims these on its skill-sync tick and installs them into
|
|
21221
|
+
* `.errata/skills/`, unioned into the collective set (never pruned). Returns
|
|
21222
|
+
* an empty set when nothing is pinned or the project isn't linked. */
|
|
21223
|
+
async getSkillPins(projectId) {
|
|
21224
|
+
return this.json(
|
|
21225
|
+
"GET",
|
|
21226
|
+
`/v2/skill-pins?projectId=${encodeURIComponent(projectId)}`
|
|
21227
|
+
);
|
|
21228
|
+
}
|
|
21219
21229
|
async induceSkill(body2) {
|
|
21220
21230
|
return this.json("POST", "/v2/skills/induce", body2);
|
|
21221
21231
|
}
|
|
@@ -42362,11 +42372,11 @@ function readSkillManifest(manifestPath) {
|
|
|
42362
42372
|
return [];
|
|
42363
42373
|
}
|
|
42364
42374
|
}
|
|
42365
|
-
async function syncSkills(paths, client, seed) {
|
|
42375
|
+
async function syncSkills(paths, client, seed, pins = []) {
|
|
42366
42376
|
const res = await client.getSkills(void 0, seed);
|
|
42367
42377
|
const staleDaemon = res.staleDaemon && res.latestDaemonVersion ? { latest: res.latestDaemonVersion } : void 0;
|
|
42368
42378
|
mkdirSync5(paths.skillsDir, { recursive: true });
|
|
42369
|
-
if (res.skills.length === 0) {
|
|
42379
|
+
if (res.skills.length === 0 && pins.length === 0) {
|
|
42370
42380
|
const existing = readdirSync6(paths.skillsDir).filter((f) => f.endsWith(".md"));
|
|
42371
42381
|
if (existing.length > 0) return { written: 0, pruned: 0, ...staleDaemon ? { staleDaemon } : {} };
|
|
42372
42382
|
}
|
|
@@ -42384,6 +42394,19 @@ async function syncSkills(paths, client, seed) {
|
|
|
42384
42394
|
file: `skills/${fileName}`
|
|
42385
42395
|
});
|
|
42386
42396
|
}
|
|
42397
|
+
for (const p of pins) {
|
|
42398
|
+
const fileName = skillFileName(p.id);
|
|
42399
|
+
if (keep.has(fileName)) continue;
|
|
42400
|
+
keep.add(fileName);
|
|
42401
|
+
writeFileSync10(join18(paths.skillsDir, fileName), p.markdown, "utf8");
|
|
42402
|
+
rows.push({
|
|
42403
|
+
id: p.id,
|
|
42404
|
+
title: p.title,
|
|
42405
|
+
layer: p.layer,
|
|
42406
|
+
confidence: p.confidence,
|
|
42407
|
+
file: `skills/${fileName}`
|
|
42408
|
+
});
|
|
42409
|
+
}
|
|
42387
42410
|
let pruned = 0;
|
|
42388
42411
|
for (const f of readdirSync6(paths.skillsDir)) {
|
|
42389
42412
|
if (!f.endsWith(".md")) continue;
|
|
@@ -42820,7 +42843,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
|
|
|
42820
42843
|
}
|
|
42821
42844
|
|
|
42822
42845
|
// src/engine.ts
|
|
42823
|
-
var DAEMON_VERSION = true ? "2.0.0-dev.
|
|
42846
|
+
var DAEMON_VERSION = true ? "2.0.0-dev.57" : "2.0.0-alpha.0";
|
|
42824
42847
|
var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
|
|
42825
42848
|
var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
|
|
42826
42849
|
var GIT_OP_MUTE_MS = 4e3;
|
|
@@ -43802,7 +43825,8 @@ function createWorkspaceEngine(opts) {
|
|
|
43802
43825
|
const cloudId = p.attrs["cloudNodeId"];
|
|
43803
43826
|
return typeof cloudId === "string" && cloudId !== p.id ? [p.id, cloudId] : [p.id];
|
|
43804
43827
|
});
|
|
43805
|
-
|
|
43828
|
+
const pins = profile?.projectId ? await cloud.getSkillPins(profile.projectId).then((r) => r.pins).catch(() => []) : [];
|
|
43829
|
+
return syncSkills(paths, cloud, skillSeed, pins);
|
|
43806
43830
|
};
|
|
43807
43831
|
return {
|
|
43808
43832
|
profile,
|
package/install.ps1
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
# errata Windows installer
|
|
2
|
-
# Idempotent: re-running upgrades an existing install in place.
|
|
1
|
+
# errata Windows installer + logon autostart (no admin rights required).
|
|
3
2
|
#
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
#
|
|
3
|
+
# The ONE install path is `npm i -g @inerrata-corporation/errata` - the SAME
|
|
4
|
+
# mechanism `errata update` uses, so an update actually takes effect. (The old
|
|
5
|
+
# installer copied a bundle to %LOCALAPPDATA%\errata while `errata update`
|
|
6
|
+
# installed into npm's global prefix - two diverging locations, so the autostart
|
|
7
|
+
# task kept relaunching the STALE copy and updates silently never landed. This
|
|
8
|
+
# unifies them: install + update share one npm-managed location.)
|
|
9
|
+
#
|
|
10
|
+
# Requires Node 22+ on PATH (npm ships with it).
|
|
11
|
+
#
|
|
12
|
+
# Usage: .\install.ps1 # dev channel (the alpha default)
|
|
13
|
+
# .\install.ps1 -Channel latest
|
|
14
|
+
|
|
15
|
+
param([ValidateSet('dev', 'latest')][string]$Channel = 'dev')
|
|
7
16
|
|
|
8
17
|
$ErrorActionPreference = "Stop"
|
|
9
|
-
$ScriptRoot = $PSScriptRoot
|
|
10
|
-
if (-not $ScriptRoot) { $ScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path }
|
|
11
18
|
|
|
12
|
-
# errata runs on the system Node
|
|
19
|
+
# errata runs on the system Node - fail loudly if it's missing rather than after install.
|
|
13
20
|
$node = Get-Command node -ErrorAction SilentlyContinue
|
|
14
21
|
if (-not $node) {
|
|
15
22
|
Write-Host "[X] Node.js not found on PATH. Install Node 22+ from https://nodejs.org and re-run."
|
|
@@ -21,41 +28,55 @@ if ([int]$nodeMajor -lt 22) {
|
|
|
21
28
|
exit 1
|
|
22
29
|
}
|
|
23
30
|
|
|
24
|
-
$
|
|
25
|
-
$
|
|
26
|
-
|
|
27
|
-
if ($
|
|
28
|
-
Write-Host "
|
|
29
|
-
|
|
30
|
-
Write-Host "installing errata to $Target (Node $nodeMajor)"
|
|
31
|
+
$Pkg = "@inerrata-corporation/errata"
|
|
32
|
+
Write-Host "installing $Pkg@$Channel via npm (Node $nodeMajor)..."
|
|
33
|
+
& npm install -g "$Pkg@$Channel"
|
|
34
|
+
if ($LASTEXITCODE -ne 0) {
|
|
35
|
+
Write-Host "[X] npm install failed (exit $LASTEXITCODE). Is npm on PATH?"
|
|
36
|
+
exit 1
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
if
|
|
34
|
-
|
|
39
|
+
# Migrate off the OLD %LOCALAPPDATA%\errata bundle install if present: delete its
|
|
40
|
+
# copied bundle and drop it from PATH, so the npm-generated `errata` shim (which
|
|
41
|
+
# `errata update` keeps current) is the one that wins instead of a stale shadow.
|
|
42
|
+
$LegacyDir = Join-Path $env:LOCALAPPDATA "errata"
|
|
43
|
+
$LegacyMjs = Join-Path $LegacyDir "errata.mjs"
|
|
44
|
+
if (Test-Path $LegacyMjs) {
|
|
45
|
+
Write-Host "migrating off the legacy %LOCALAPPDATA%\errata bundle install..."
|
|
46
|
+
foreach ($f in @("errata.mjs", "errata.cmd", "pass-worker.mjs", "consolidate-worker.mjs", "resources")) {
|
|
47
|
+
$p = Join-Path $LegacyDir $f
|
|
48
|
+
if (Test-Path $p) { Remove-Item -Path $p -Recurse -Force -ErrorAction SilentlyContinue }
|
|
49
|
+
}
|
|
50
|
+
$UserPath = [Environment]::GetEnvironmentVariable("Path", "User")
|
|
51
|
+
if ($UserPath -and ($UserPath.Split(";") -contains $LegacyDir)) {
|
|
52
|
+
$NewPath = (($UserPath.Split(";") | Where-Object { $_ -ne $LegacyDir }) -join ";").Trim(";")
|
|
53
|
+
[Environment]::SetEnvironmentVariable("Path", $NewPath, "User")
|
|
54
|
+
Write-Host "removed the stale $LegacyDir entry from user PATH"
|
|
55
|
+
}
|
|
35
56
|
}
|
|
36
|
-
Copy-Item -Path (Join-Path $ScriptRoot "errata.mjs") -Destination $Target -Force
|
|
37
|
-
Copy-Item -Path (Join-Path $ScriptRoot "errata.cmd") -Destination $Target -Force
|
|
38
|
-
$ResSrc = Join-Path $ScriptRoot "resources"
|
|
39
|
-
$ResDst = Join-Path $Target "resources"
|
|
40
|
-
if (Test-Path $ResDst) { Remove-Item $ResDst -Recurse -Force }
|
|
41
|
-
Copy-Item -Path $ResSrc -Destination $Target -Recurse -Force
|
|
42
57
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
Write-Host "
|
|
49
|
-
Write-Host "
|
|
50
|
-
|
|
51
|
-
Write-Host "PATH already contains $Target"
|
|
58
|
+
# Resolve the npm-installed bundle so autostart points at the SAME file `errata
|
|
59
|
+
# update` (npm i -g) replaces IN PLACE - this is what makes an update take effect.
|
|
60
|
+
$globalRoot = (& npm root -g).Trim()
|
|
61
|
+
$Mjs = Join-Path (Join-Path (Join-Path $globalRoot "@inerrata-corporation") "errata") "errata.mjs"
|
|
62
|
+
if (-not (Test-Path $Mjs)) {
|
|
63
|
+
Write-Host "[X] installed, but could not locate the bundle at $Mjs - autostart not registered."
|
|
64
|
+
Write-Host " You can still run 'errata dash' manually."
|
|
65
|
+
exit 1
|
|
52
66
|
}
|
|
53
67
|
|
|
68
|
+
# Persist the update channel so `errata update` tracks the one you installed.
|
|
69
|
+
# (No-op display-wise; the config default is already 'dev', so this only matters
|
|
70
|
+
# when you install -Channel latest.)
|
|
71
|
+
try { & node "$Mjs" update --channel $Channel --check | Out-Null } catch { }
|
|
72
|
+
|
|
54
73
|
# Auto-start the daemon at logon via a Scheduled Task. We launch through a hidden
|
|
55
|
-
# .vbs shim because node.exe is a console app
|
|
74
|
+
# .vbs shim because node.exe is a console app - running it from the task directly
|
|
56
75
|
# flashes a window every logon; WScript's Run(..., 0, False) starts it windowless.
|
|
57
76
|
# Task name/path mirror uninstall.ps1 (\errata\ai.errata.daemon) so the two stay
|
|
58
|
-
# symmetric.
|
|
77
|
+
# symmetric. The launcher points at the npm bundle above, so a later `errata
|
|
78
|
+
# update` is picked up on next logon with no re-install. Best-effort.
|
|
79
|
+
if (-not (Test-Path $LegacyDir)) { New-Item -ItemType Directory -Path $LegacyDir | Out-Null }
|
|
59
80
|
$VbsTemplate = @'
|
|
60
81
|
' errata daemon autostart launcher (written by install.ps1) - runs `errata dash` fully hidden.
|
|
61
82
|
Set sh = CreateObject("WScript.Shell")
|
|
@@ -63,8 +84,8 @@ sh.CurrentDirectory = "__CWD__"
|
|
|
63
84
|
sh.Run """__NODE__"" ""__MJS__"" dash", 0, False
|
|
64
85
|
'@
|
|
65
86
|
try {
|
|
66
|
-
$Launcher = Join-Path $
|
|
67
|
-
$Vbs = $VbsTemplate.Replace("__CWD__", $env:USERPROFILE).Replace("__NODE__", $node.Source).Replace("__MJS__",
|
|
87
|
+
$Launcher = Join-Path $LegacyDir "errata-autostart.vbs"
|
|
88
|
+
$Vbs = $VbsTemplate.Replace("__CWD__", $env:USERPROFILE).Replace("__NODE__", $node.Source).Replace("__MJS__", $Mjs)
|
|
68
89
|
Set-Content -Path $Launcher -Value $Vbs -Encoding ASCII
|
|
69
90
|
|
|
70
91
|
$action = New-ScheduledTaskAction -Execute "wscript.exe" -Argument ('"{0}"' -f $Launcher)
|
|
@@ -72,19 +93,19 @@ try {
|
|
|
72
93
|
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Seconds 0) -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)
|
|
73
94
|
$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Limited
|
|
74
95
|
Register-ScheduledTask -TaskName "ai.errata.daemon" -TaskPath "\errata\" -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Description "Auto-start the errata dash daemon at logon." -Force | Out-Null
|
|
75
|
-
Write-Host "registered autostart task \errata\ai.errata.daemon (starts at logon)"
|
|
96
|
+
Write-Host "registered autostart task \errata\ai.errata.daemon (starts at logon, runs the npm-installed bundle)"
|
|
76
97
|
} catch {
|
|
77
98
|
Write-Host "[!] could not register autostart task: $($_.Exception.Message)"
|
|
78
99
|
Write-Host " (install still succeeded - start the daemon manually with 'errata dash')"
|
|
79
100
|
}
|
|
80
101
|
|
|
81
102
|
Write-Host ""
|
|
82
|
-
|
|
103
|
+
Write-Host "[OK] errata installed (channel: $Channel)."
|
|
83
104
|
Write-Host ""
|
|
84
105
|
Write-Host "Next steps:"
|
|
85
|
-
Write-Host " 1. Open a new terminal so PATH refreshes."
|
|
106
|
+
Write-Host " 1. Open a new terminal so PATH refreshes (npm's global bin holds the 'errata' command)."
|
|
86
107
|
Write-Host " 2. cd into the workspace you want to observe."
|
|
87
108
|
Write-Host " 3. errata init"
|
|
88
109
|
Write-Host " 4. errata start (or 'errata dash' to watch all projects)"
|
|
89
110
|
Write-Host ""
|
|
90
|
-
Write-Host "
|
|
111
|
+
Write-Host "Update anytime with: errata update (autostart picks it up on next logon)"
|
package/package.json
CHANGED
package/uninstall.ps1
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
# errata uninstaller.
|
|
2
2
|
$ErrorActionPreference = "Stop"
|
|
3
|
-
$Target = Join-Path $env:LOCALAPPDATA "errata"
|
|
4
|
-
|
|
5
|
-
if (-not (Test-Path $Target)) {
|
|
6
|
-
Write-Host "errata is not installed at $Target."
|
|
7
|
-
exit 0
|
|
8
|
-
}
|
|
9
3
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
$PathParts = $UserPath.Split(";") | Where-Object { $_ -ne $Target }
|
|
16
|
-
$NewPath = ($PathParts -join ";").Trim(";")
|
|
17
|
-
[Environment]::SetEnvironmentVariable("Path", $NewPath, "User")
|
|
18
|
-
Write-Host "removed $Target from user PATH"
|
|
4
|
+
# Remove the npm-global install (the binary + bundle + npm's PATH shim).
|
|
5
|
+
$node = Get-Command node -ErrorAction SilentlyContinue
|
|
6
|
+
if ($node) {
|
|
7
|
+
Write-Host "removing @inerrata-corporation/errata (npm global)..."
|
|
8
|
+
& npm uninstall -g "@inerrata-corporation/errata" 2>$null | Out-Null
|
|
19
9
|
}
|
|
20
10
|
|
|
11
|
+
# Remove the logon autostart task.
|
|
21
12
|
$Existing = Get-ScheduledTask -TaskName "ai.errata.daemon" -TaskPath "\errata\" -ErrorAction SilentlyContinue
|
|
22
13
|
if ($Existing) {
|
|
23
14
|
Unregister-ScheduledTask -TaskName "ai.errata.daemon" -TaskPath "\errata\" -Confirm:$false
|
|
24
15
|
Write-Host "removed scheduled task errata\ai.errata.daemon"
|
|
25
16
|
}
|
|
26
17
|
|
|
18
|
+
# Remove %LOCALAPPDATA%\errata - the autostart launcher lives here, and (for
|
|
19
|
+
# machines upgraded from the pre-npm installer) so did the legacy bundle. Also
|
|
20
|
+
# drop the legacy dir from user PATH if a pre-npm install left it there.
|
|
21
|
+
$Target = Join-Path $env:LOCALAPPDATA "errata"
|
|
22
|
+
if (Test-Path $Target) {
|
|
23
|
+
Remove-Item -Path $Target -Recurse -Force
|
|
24
|
+
Write-Host "removed $Target"
|
|
25
|
+
}
|
|
26
|
+
$UserPath = [Environment]::GetEnvironmentVariable("Path", "User")
|
|
27
|
+
if ($UserPath -and ($UserPath.Split(";") -contains $Target)) {
|
|
28
|
+
$NewPath = (($UserPath.Split(";") | Where-Object { $_ -ne $Target }) -join ";").Trim(";")
|
|
29
|
+
[Environment]::SetEnvironmentVariable("Path", $NewPath, "User")
|
|
30
|
+
Write-Host "removed the legacy $Target entry from user PATH"
|
|
31
|
+
}
|
|
32
|
+
|
|
27
33
|
Write-Host ""
|
|
28
34
|
Write-Host "[OK] errata uninstalled."
|
|
29
35
|
Write-Host "Per-workspace .errata/ folders are left in place - delete them manually if desired."
|