@mneme-ai/core 2.93.0 → 2.95.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/dist/agent_manifest.d.ts +0 -2
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +45 -0
- package/dist/agent_manifest.js.map +1 -1
- package/dist/lexicon/aup_audit.d.ts +74 -0
- package/dist/lexicon/aup_audit.d.ts.map +1 -0
- package/dist/lexicon/aup_audit.js +118 -0
- package/dist/lexicon/aup_audit.js.map +1 -0
- package/dist/lexicon/dual_surface.d.ts.map +1 -1
- package/dist/lexicon/dual_surface.js +27 -0
- package/dist/lexicon/dual_surface.js.map +1 -1
- package/dist/lexicon/index.d.ts +1 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +1 -0
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicon.test.js +45 -0
- package/dist/lexicon/lexicon.test.js.map +1 -1
- package/dist/lexicon/mappings.d.ts +4 -2
- package/dist/lexicon/mappings.d.ts.map +1 -1
- package/dist/lexicon/mappings.js +31 -0
- package/dist/lexicon/mappings.js.map +1 -1
- package/dist/notifier/agent_files.js +2 -2
- package/dist/notifier/agent_files.js.map +1 -1
- package/dist/pulse.d.ts.map +1 -1
- package/dist/pulse.js +23 -5
- package/dist/pulse.js.map +1 -1
- package/dist/truth_gate/claims.d.ts.map +1 -1
- package/dist/truth_gate/claims.js +7 -0
- package/dist/truth_gate/claims.js.map +1 -1
- package/dist/truth_gate/probes.d.ts.map +1 -1
- package/dist/truth_gate/probes.js +78 -0
- package/dist/truth_gate/probes.js.map +1 -1
- package/dist/upgrade_visibility/index.d.ts +1 -0
- package/dist/upgrade_visibility/index.d.ts.map +1 -1
- package/dist/upgrade_visibility/index.js +1 -0
- package/dist/upgrade_visibility/index.js.map +1 -1
- package/dist/upgrade_visibility/notify_state.d.ts +51 -0
- package/dist/upgrade_visibility/notify_state.d.ts.map +1 -0
- package/dist/upgrade_visibility/notify_state.js +88 -0
- package/dist/upgrade_visibility/notify_state.js.map +1 -0
- package/dist/upgrade_visibility/notify_state.test.d.ts +11 -0
- package/dist/upgrade_visibility/notify_state.test.d.ts.map +1 -0
- package/dist/upgrade_visibility/notify_state.test.js +60 -0
- package/dist/upgrade_visibility/notify_state.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
export { acquireLock, releaseLock, readLock, isLocked, formatLock, type LockState, type AcquireResult, type AcquireOptions, } from "./mutex.js";
|
|
31
31
|
export { recordUpgrade, listUpgrades, lastFailure, lastSuccess, verifyChain, formatUpgradeLog, type UpgradeEntry, type RecordUpgradeOptions, } from "./exit_log.js";
|
|
32
32
|
export { isInsideNpmInstall, isUpgradeSafeRightNow, formatDetection, type DetectionResult, } from "./npm_detector.js";
|
|
33
|
+
export { classifyUpgradeSeverity, shouldSurfaceUpgrade, upgradeAlreadyNotified, markUpgradeNotified, readNotifyState, type UpgradeSeverity, type NotifyState, } from "./notify_state.js";
|
|
33
34
|
import { lastFailure, lastSuccess } from "./exit_log.js";
|
|
34
35
|
/** One-shot doctor: is it safe to attempt an upgrade right now? Pure
|
|
35
36
|
* read-only — never mutates state. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upgrade_visibility/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EACL,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACxD,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,GACxD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EACpF,KAAK,YAAY,EAAE,KAAK,oBAAoB,GAC7C,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAC1D,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAC;AAEvE;uCACuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC9C,aAAa,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAiBnE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAsB3D"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/upgrade_visibility/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EACL,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACxD,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,GACxD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EACpF,KAAK,YAAY,EAAE,KAAK,oBAAoB,GAC7C,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,EAC1D,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,eAAe,EAC3G,KAAK,eAAe,EAAE,KAAK,WAAW,GACvC,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAC;AAEvE;uCACuC;AACvC,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC9C,aAAa,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAiBnE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,CAsB3D"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
export { acquireLock, releaseLock, readLock, isLocked, formatLock, } from "./mutex.js";
|
|
31
31
|
export { recordUpgrade, listUpgrades, lastFailure, lastSuccess, verifyChain, formatUpgradeLog, } from "./exit_log.js";
|
|
32
32
|
export { isInsideNpmInstall, isUpgradeSafeRightNow, formatDetection, } from "./npm_detector.js";
|
|
33
|
+
export { classifyUpgradeSeverity, shouldSurfaceUpgrade, upgradeAlreadyNotified, markUpgradeNotified, readNotifyState, } from "./notify_state.js";
|
|
33
34
|
import { isUpgradeSafeRightNow } from "./npm_detector.js";
|
|
34
35
|
import { isLocked, readLock } from "./mutex.js";
|
|
35
36
|
import { lastFailure, lastSuccess, listUpgrades } from "./exit_log.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/upgrade_visibility/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/upgrade_visibility/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EACL,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAEzD,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,GAErF,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,eAAe,GAE3D,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,eAAe,GAE5G,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAYvE,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,MAAM,MAAM,GAAG,qBAAqB,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAAC,KAAK,GAAG,KAAK,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,KAAK,GAAG,KAAK,CAAC;QACd,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO;QACL,KAAK;QACL,OAAO;QACP,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC;QACpC,aAAa,EAAE,WAAW,CAAC,QAAQ,CAAC;QACpC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAsB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,aAAa,CAAC,aAAa,OAAO,CAAC,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;IAChI,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.94.0 — WHISPER NOT NAG, precisely (the first ETHOS action · docs/ALETHEIA.md §XI).
|
|
3
|
+
*
|
|
4
|
+
* Removing a notice entirely would be hiding something important — ETHOS broken
|
|
5
|
+
* another way. The discipline is "speak proportional to importance, once per new
|
|
6
|
+
* fact": dedupe the upgrade notice BY VERSION (whisper once per new `latest`, then
|
|
7
|
+
* stay quiet until `latest` changes again), under SEVERITY TIERS:
|
|
8
|
+
* • security → surface ALWAYS (a duty, not a nag)
|
|
9
|
+
* • feature → whisper ONCE per new latest, then silent
|
|
10
|
+
* • cosmetic → inbox/glyph only (never the loud pulse block)
|
|
11
|
+
*
|
|
12
|
+
* It preserves the de-worm vow (v2.78): INFORM, never COMMAND; no auto-upgrade;
|
|
13
|
+
* manual-only; never hide a security upgrade. This only REDUCES repetition.
|
|
14
|
+
*
|
|
15
|
+
* Honest scope: severity is derived from the semver delta (the only thing knowable
|
|
16
|
+
* from installed-vs-npm-latest). "security" is an EXPLICIT-flag tier — Mneme does
|
|
17
|
+
* not pretend to auto-detect a security release from a version number; if a caller
|
|
18
|
+
* (or a future advisory feed) sets `security: true`, the always-surface duty fires.
|
|
19
|
+
*/
|
|
20
|
+
export type UpgradeSeverity = "security" | "feature" | "cosmetic";
|
|
21
|
+
export interface NotifyState {
|
|
22
|
+
/** The `latest` version we last surfaced the loud upgrade notice for. */
|
|
23
|
+
lastNotifiedVersion: string | null;
|
|
24
|
+
lastNotifiedAt: number;
|
|
25
|
+
lastSeverity: UpgradeSeverity | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Classify the importance of an upgrade from the semver delta. A major OR minor
|
|
29
|
+
* bump is a "feature" (whisper once); a patch-only bump is "cosmetic" (inbox/glyph
|
|
30
|
+
* only). An explicit `security` flag overrides to the always-surface tier. If either
|
|
31
|
+
* version is unparseable, default to "feature" (safer to whisper once than to hide).
|
|
32
|
+
*/
|
|
33
|
+
export declare function classifyUpgradeSeverity(current: string, latest: string, opts?: {
|
|
34
|
+
security?: boolean;
|
|
35
|
+
}): UpgradeSeverity;
|
|
36
|
+
/** Read the persisted notify-state. Never throws. */
|
|
37
|
+
export declare function readNotifyState(repoRoot: string): NotifyState;
|
|
38
|
+
/** True if we already surfaced the loud upgrade notice for this exact `latest`. Pure read. */
|
|
39
|
+
export declare function upgradeAlreadyNotified(repoRoot: string, latest: string): boolean;
|
|
40
|
+
/** Record that we surfaced the loud notice for `latest`. Best-effort; never throws. */
|
|
41
|
+
export declare function markUpgradeNotified(repoRoot: string, latest: string, severity: UpgradeSeverity, now?: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* THE GATE — should the pulse surface the LOUD upgrade notice this turn?
|
|
44
|
+
* security → always (duty)
|
|
45
|
+
* cosmetic → never (inbox/glyph only)
|
|
46
|
+
* feature → only if this `latest` hasn't been surfaced yet (whisper once per new version)
|
|
47
|
+
* Pure read (does NOT mark — the caller marks once after deciding, to keep the
|
|
48
|
+
* [INFO] block and the inbox surfacing consistent within one pulse). Never throws.
|
|
49
|
+
*/
|
|
50
|
+
export declare function shouldSurfaceUpgrade(repoRoot: string, latest: string, severity: UpgradeSeverity): boolean;
|
|
51
|
+
//# sourceMappingURL=notify_state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify_state.d.ts","sourceRoot":"","sources":["../../src/upgrade_visibility/notify_state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;CACtC;AAQD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,eAAe,CAQ3H;AAID,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAS7D;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhF;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAM/H;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAIzG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.94.0 — WHISPER NOT NAG, precisely (the first ETHOS action · docs/ALETHEIA.md §XI).
|
|
3
|
+
*
|
|
4
|
+
* Removing a notice entirely would be hiding something important — ETHOS broken
|
|
5
|
+
* another way. The discipline is "speak proportional to importance, once per new
|
|
6
|
+
* fact": dedupe the upgrade notice BY VERSION (whisper once per new `latest`, then
|
|
7
|
+
* stay quiet until `latest` changes again), under SEVERITY TIERS:
|
|
8
|
+
* • security → surface ALWAYS (a duty, not a nag)
|
|
9
|
+
* • feature → whisper ONCE per new latest, then silent
|
|
10
|
+
* • cosmetic → inbox/glyph only (never the loud pulse block)
|
|
11
|
+
*
|
|
12
|
+
* It preserves the de-worm vow (v2.78): INFORM, never COMMAND; no auto-upgrade;
|
|
13
|
+
* manual-only; never hide a security upgrade. This only REDUCES repetition.
|
|
14
|
+
*
|
|
15
|
+
* Honest scope: severity is derived from the semver delta (the only thing knowable
|
|
16
|
+
* from installed-vs-npm-latest). "security" is an EXPLICIT-flag tier — Mneme does
|
|
17
|
+
* not pretend to auto-detect a security release from a version number; if a caller
|
|
18
|
+
* (or a future advisory feed) sets `security: true`, the always-surface duty fires.
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
function parseSemver(v) {
|
|
23
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)/.exec(String(v ?? "").trim());
|
|
24
|
+
if (!m)
|
|
25
|
+
return null;
|
|
26
|
+
return [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Classify the importance of an upgrade from the semver delta. A major OR minor
|
|
30
|
+
* bump is a "feature" (whisper once); a patch-only bump is "cosmetic" (inbox/glyph
|
|
31
|
+
* only). An explicit `security` flag overrides to the always-surface tier. If either
|
|
32
|
+
* version is unparseable, default to "feature" (safer to whisper once than to hide).
|
|
33
|
+
*/
|
|
34
|
+
export function classifyUpgradeSeverity(current, latest, opts = {}) {
|
|
35
|
+
if (opts.security === true)
|
|
36
|
+
return "security";
|
|
37
|
+
const c = parseSemver(current);
|
|
38
|
+
const l = parseSemver(latest);
|
|
39
|
+
if (!c || !l)
|
|
40
|
+
return "feature";
|
|
41
|
+
if (l[0] !== c[0] || l[1] !== c[1])
|
|
42
|
+
return "feature"; // major or minor delta
|
|
43
|
+
if (l[2] !== c[2])
|
|
44
|
+
return "cosmetic"; // patch-only delta
|
|
45
|
+
return "cosmetic"; // equal (shouldn't reach when updateAvailable)
|
|
46
|
+
}
|
|
47
|
+
function statePath(repoRoot) { return join(repoRoot, ".mneme", "upgrade_visibility", "notify-state.json"); }
|
|
48
|
+
/** Read the persisted notify-state. Never throws. */
|
|
49
|
+
export function readNotifyState(repoRoot) {
|
|
50
|
+
try {
|
|
51
|
+
const p = statePath(repoRoot);
|
|
52
|
+
if (existsSync(p)) {
|
|
53
|
+
const s = JSON.parse(readFileSync(p, "utf8"));
|
|
54
|
+
return { lastNotifiedVersion: s.lastNotifiedVersion ?? null, lastNotifiedAt: s.lastNotifiedAt ?? 0, lastSeverity: s.lastSeverity ?? null };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch { /* */ }
|
|
58
|
+
return { lastNotifiedVersion: null, lastNotifiedAt: 0, lastSeverity: null };
|
|
59
|
+
}
|
|
60
|
+
/** True if we already surfaced the loud upgrade notice for this exact `latest`. Pure read. */
|
|
61
|
+
export function upgradeAlreadyNotified(repoRoot, latest) {
|
|
62
|
+
return readNotifyState(repoRoot).lastNotifiedVersion === String(latest ?? "");
|
|
63
|
+
}
|
|
64
|
+
/** Record that we surfaced the loud notice for `latest`. Best-effort; never throws. */
|
|
65
|
+
export function markUpgradeNotified(repoRoot, latest, severity, now = Date.now()) {
|
|
66
|
+
try {
|
|
67
|
+
const dir = join(repoRoot, ".mneme", "upgrade_visibility");
|
|
68
|
+
mkdirSync(dir, { recursive: true });
|
|
69
|
+
writeFileSync(statePath(repoRoot), JSON.stringify({ lastNotifiedVersion: String(latest ?? ""), lastNotifiedAt: now, lastSeverity: severity }), "utf8");
|
|
70
|
+
}
|
|
71
|
+
catch { /* */ }
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* THE GATE — should the pulse surface the LOUD upgrade notice this turn?
|
|
75
|
+
* security → always (duty)
|
|
76
|
+
* cosmetic → never (inbox/glyph only)
|
|
77
|
+
* feature → only if this `latest` hasn't been surfaced yet (whisper once per new version)
|
|
78
|
+
* Pure read (does NOT mark — the caller marks once after deciding, to keep the
|
|
79
|
+
* [INFO] block and the inbox surfacing consistent within one pulse). Never throws.
|
|
80
|
+
*/
|
|
81
|
+
export function shouldSurfaceUpgrade(repoRoot, latest, severity) {
|
|
82
|
+
if (severity === "security")
|
|
83
|
+
return true;
|
|
84
|
+
if (severity === "cosmetic")
|
|
85
|
+
return false;
|
|
86
|
+
return !upgradeAlreadyNotified(repoRoot, latest);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=notify_state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify_state.js","sourceRoot":"","sources":["../../src/upgrade_visibility/notify_state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.94.0 — WHISPER, DON'T NAG (the first ETHOS action). notify-state tests.
|
|
3
|
+
*
|
|
4
|
+
* W1 classifyUpgradeSeverity — security flag · feature (major/minor) · cosmetic (patch)
|
|
5
|
+
* W2 feature bump → whisper ONCE per new latest; silent after; a NEW latest re-whispers
|
|
6
|
+
* W3 security → surface ALWAYS (a duty, never deduped)
|
|
7
|
+
* W4 cosmetic → never the loud block (inbox/glyph only)
|
|
8
|
+
* W5 de-worm vow preserved — the notice is never an auto-action; reducing repetition only
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=notify_state.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify_state.test.d.ts","sourceRoot":"","sources":["../../src/upgrade_visibility/notify_state.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.94.0 — WHISPER, DON'T NAG (the first ETHOS action). notify-state tests.
|
|
3
|
+
*
|
|
4
|
+
* W1 classifyUpgradeSeverity — security flag · feature (major/minor) · cosmetic (patch)
|
|
5
|
+
* W2 feature bump → whisper ONCE per new latest; silent after; a NEW latest re-whispers
|
|
6
|
+
* W3 security → surface ALWAYS (a duty, never deduped)
|
|
7
|
+
* W4 cosmetic → never the loud block (inbox/glyph only)
|
|
8
|
+
* W5 de-worm vow preserved — the notice is never an auto-action; reducing repetition only
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from "vitest";
|
|
11
|
+
import { mkdtempSync } from "node:fs";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { classifyUpgradeSeverity, shouldSurfaceUpgrade, markUpgradeNotified, upgradeAlreadyNotified } from "./notify_state.js";
|
|
15
|
+
function repo() { return mkdtempSync(join(tmpdir(), "notify-")); }
|
|
16
|
+
describe("v2.94.0 WHISPER — upgrade notify-state (version-dedupe + severity)", () => {
|
|
17
|
+
it("W1 classifyUpgradeSeverity — security / feature(major,minor) / cosmetic(patch)", () => {
|
|
18
|
+
expect(classifyUpgradeSeverity("2.93.0", "2.94.0", { security: true })).toBe("security");
|
|
19
|
+
expect(classifyUpgradeSeverity("2.93.0", "3.0.0")).toBe("feature"); // major
|
|
20
|
+
expect(classifyUpgradeSeverity("2.93.0", "2.94.0")).toBe("feature"); // minor
|
|
21
|
+
expect(classifyUpgradeSeverity("2.93.0", "2.93.1")).toBe("cosmetic"); // patch only
|
|
22
|
+
expect(classifyUpgradeSeverity("2.93.0", "garbage")).toBe("feature"); // unparseable → safer to whisper
|
|
23
|
+
});
|
|
24
|
+
it("W2 feature bump → whisper ONCE per new latest; silent after; new latest re-whispers", () => {
|
|
25
|
+
const r = repo();
|
|
26
|
+
// first sight of 2.94.0 → surface
|
|
27
|
+
expect(shouldSurfaceUpgrade(r, "2.94.0", "feature")).toBe(true);
|
|
28
|
+
markUpgradeNotified(r, "2.94.0", "feature");
|
|
29
|
+
// same latest again → silent (the nag is gone)
|
|
30
|
+
expect(shouldSurfaceUpgrade(r, "2.94.0", "feature")).toBe(false);
|
|
31
|
+
expect(shouldSurfaceUpgrade(r, "2.94.0", "feature")).toBe(false);
|
|
32
|
+
expect(upgradeAlreadyNotified(r, "2.94.0")).toBe(true);
|
|
33
|
+
// a genuinely NEW latest → whisper once more
|
|
34
|
+
expect(shouldSurfaceUpgrade(r, "2.95.0", "feature")).toBe(true);
|
|
35
|
+
markUpgradeNotified(r, "2.95.0", "feature");
|
|
36
|
+
expect(shouldSurfaceUpgrade(r, "2.95.0", "feature")).toBe(false);
|
|
37
|
+
// ...but the OLD one stays silent (we moved on)
|
|
38
|
+
expect(upgradeAlreadyNotified(r, "2.95.0")).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
it("W3 security → surface ALWAYS (a duty, never deduped)", () => {
|
|
41
|
+
const r = repo();
|
|
42
|
+
markUpgradeNotified(r, "2.94.0", "security");
|
|
43
|
+
// even already-notified, security surfaces every time
|
|
44
|
+
expect(shouldSurfaceUpgrade(r, "2.94.0", "security")).toBe(true);
|
|
45
|
+
expect(shouldSurfaceUpgrade(r, "2.94.0", "security")).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it("W4 cosmetic → never the loud block (inbox/glyph only)", () => {
|
|
48
|
+
const r = repo();
|
|
49
|
+
expect(shouldSurfaceUpgrade(r, "2.93.1", "cosmetic")).toBe(false);
|
|
50
|
+
expect(shouldSurfaceUpgrade(r, "2.93.2", "cosmetic")).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it("W5 reducing repetition only — distinct latests are tracked independently", () => {
|
|
53
|
+
const r = repo();
|
|
54
|
+
expect(upgradeAlreadyNotified(r, "2.94.0")).toBe(false);
|
|
55
|
+
markUpgradeNotified(r, "2.94.0", "feature");
|
|
56
|
+
expect(upgradeAlreadyNotified(r, "2.94.0")).toBe(true);
|
|
57
|
+
expect(upgradeAlreadyNotified(r, "2.95.0")).toBe(false); // a different version is its own decision
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=notify_state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify_state.test.js","sourceRoot":"","sources":["../../src/upgrade_visibility/notify_state.test.ts"],"names":[],"mappings":"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"}
|