@xmemo/skill 1.1.25
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/LICENSE +21 -0
- package/README.md +34 -0
- package/bin/install.mjs +251 -0
- package/package.json +24 -0
- package/skill/CHANGELOG.md +279 -0
- package/skill/SKILL.md +464 -0
- package/skill/references/ledger-operations.md +147 -0
- package/skill/references/memory-operations.md +231 -0
- package/skill/references/runtime-operations.md +118 -0
- package/skill/references/troubleshooting.md +147 -0
- package/skill/scripts/commands/account.mjs +194 -0
- package/skill/scripts/commands/auth-login.mjs +234 -0
- package/skill/scripts/commands/auth-manage.mjs +201 -0
- package/skill/scripts/commands/ledger.mjs +175 -0
- package/skill/scripts/commands/memory.mjs +306 -0
- package/skill/scripts/commands/ops.mjs +236 -0
- package/skill/scripts/lib/api.mjs +311 -0
- package/skill/scripts/lib/auth-state.mjs +253 -0
- package/skill/scripts/lib/cli-input.mjs +288 -0
- package/skill/scripts/lib/core.mjs +247 -0
- package/skill/scripts/lib/help.mjs +179 -0
- package/skill/scripts/lib/muse-vault.mjs +198 -0
- package/skill/scripts/lib/openclaw-egress.mjs +63 -0
- package/skill/scripts/xmemo-skill.mjs +184 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025-2026 Yonro
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# @xmemo/skill
|
|
2
|
+
|
|
3
|
+
Standalone installer and distribution package for the official [XMemo](https://xmemo.dev) agent skill.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Install the skill into your local project or agent environment (zero network, offline):
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @xmemo/skill install
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### Installation Options
|
|
14
|
+
|
|
15
|
+
- `--target <dir>`: Specify destination directory (default: `xmemo-skill`, or `$XMEMO_SKILL_DIR`)
|
|
16
|
+
- `--dry-run`: Preview installation actions without writing files
|
|
17
|
+
- `--force`: Overwrite destination directory if it already exists
|
|
18
|
+
- `--json`: Output machine-readable JSON report
|
|
19
|
+
|
|
20
|
+
## Commands
|
|
21
|
+
|
|
22
|
+
- `xmemo-skill install`: Install the bundled skill files
|
|
23
|
+
- `xmemo-skill version`: Print the skill version (`1.1.25`)
|
|
24
|
+
- `xmemo-skill help`: Display command usage and options
|
|
25
|
+
|
|
26
|
+
## Package Integrity
|
|
27
|
+
|
|
28
|
+
- **Zero dependencies**: Uses Node.js standard library only (`fs`, `path`, `crypto`, `url`, `process`).
|
|
29
|
+
- **Offline only**: The installer performs zero network requests and transmits no credentials.
|
|
30
|
+
- **Byte-identical**: The staged skill payload matches the verified GitHub Release archive.
|
|
31
|
+
|
|
32
|
+
## License
|
|
33
|
+
|
|
34
|
+
MIT
|
package/bin/install.mjs
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import { realpathSync } from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import process from 'node:process';
|
|
9
|
+
|
|
10
|
+
const PACKAGE_NAME = '@xmemo/skill';
|
|
11
|
+
const DEFAULT_INSTALL_DIR = 'xmemo-skill';
|
|
12
|
+
|
|
13
|
+
export async function locateSkillSource(metaUrl = import.meta.url) {
|
|
14
|
+
const currentDir = path.dirname(fileURLToPath(metaUrl));
|
|
15
|
+
const candidateStaged = path.resolve(currentDir, '..', 'skill');
|
|
16
|
+
|
|
17
|
+
const stagedStat = await fs.stat(candidateStaged).catch(() => null);
|
|
18
|
+
if (stagedStat?.isDirectory()) return candidateStaged;
|
|
19
|
+
|
|
20
|
+
throw new Error(`Could not locate bundled skill directory: ${candidateStaged}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function readSkillVersion(source) {
|
|
24
|
+
for (const required of ['SKILL.md', path.join('scripts', 'xmemo-skill.mjs')]) {
|
|
25
|
+
const stat = await fs.stat(path.join(source, required)).catch(() => null);
|
|
26
|
+
if (!stat?.isFile()) throw new Error(`Missing required Skill file: ${required}`);
|
|
27
|
+
}
|
|
28
|
+
const runtime = await fs.readFile(path.join(source, 'scripts', 'xmemo-skill.mjs'), 'utf8');
|
|
29
|
+
const match = runtime.match(/const SKILL_VERSION = '([^']+)';/);
|
|
30
|
+
if (!match?.[1]) throw new Error('The XMemo Skill version could not be determined from scripts/xmemo-skill.mjs.');
|
|
31
|
+
return match[1];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function resolveRealPath(p) {
|
|
35
|
+
try {
|
|
36
|
+
return realpathSync(p);
|
|
37
|
+
} catch {
|
|
38
|
+
const parent = path.dirname(p);
|
|
39
|
+
try {
|
|
40
|
+
return path.join(realpathSync(parent), path.basename(p));
|
|
41
|
+
} catch {
|
|
42
|
+
return path.resolve(p);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function assertSafeTarget(packageRoot, source, target) {
|
|
48
|
+
if (target === path.parse(target).root) {
|
|
49
|
+
throw new Error('Refusing to install a Skill into a filesystem root.');
|
|
50
|
+
}
|
|
51
|
+
const realPkg = resolveRealPath(packageRoot);
|
|
52
|
+
const realSource = resolveRealPath(source);
|
|
53
|
+
const realTarget = resolveRealPath(target);
|
|
54
|
+
|
|
55
|
+
const relPkg = path.relative(realPkg, realTarget);
|
|
56
|
+
if (!relPkg || (!relPkg.startsWith('..') && !path.isAbsolute(relPkg))) {
|
|
57
|
+
throw new Error('Skill destination cannot be the package root or a directory inside it.');
|
|
58
|
+
}
|
|
59
|
+
const relSource = path.relative(realSource, realTarget);
|
|
60
|
+
if (!relSource || (!relSource.startsWith('..') && !path.isAbsolute(relSource))) {
|
|
61
|
+
throw new Error('Skill destination cannot be the skill source or a directory inside it.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function pathExists(target) {
|
|
66
|
+
try {
|
|
67
|
+
await fs.access(target);
|
|
68
|
+
return true;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (error?.code === 'ENOENT') return false;
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export async function atomicInstall(source, target, replace, { rename = fs.rename } = {}) {
|
|
76
|
+
const parent = path.dirname(target);
|
|
77
|
+
const base = path.basename(target);
|
|
78
|
+
const nonce = `${process.pid}-${randomUUID()}`;
|
|
79
|
+
const staging = path.join(parent, `.${base}.xmemo-staging-${nonce}`);
|
|
80
|
+
const backup = path.join(parent, `.${base}.xmemo-backup-${nonce}`);
|
|
81
|
+
let movedExisting = false;
|
|
82
|
+
|
|
83
|
+
await fs.mkdir(parent, { recursive: true });
|
|
84
|
+
try {
|
|
85
|
+
await fs.cp(source, staging, { recursive: true, errorOnExist: true, force: false });
|
|
86
|
+
if (replace) {
|
|
87
|
+
await rename(target, backup);
|
|
88
|
+
movedExisting = true;
|
|
89
|
+
}
|
|
90
|
+
await rename(staging, target);
|
|
91
|
+
if (movedExisting) {
|
|
92
|
+
await fs.rm(backup, { recursive: true, force: true });
|
|
93
|
+
movedExisting = false;
|
|
94
|
+
}
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (movedExisting && !(await pathExists(target))) {
|
|
97
|
+
await rename(backup, target).catch(() => {});
|
|
98
|
+
}
|
|
99
|
+
throw error;
|
|
100
|
+
} finally {
|
|
101
|
+
await fs.rm(staging, { recursive: true, force: true }).catch(() => {});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function parseInstallOptions(args) {
|
|
106
|
+
const flags = new Set(['--dry-run', '--force', '--json']);
|
|
107
|
+
const seen = new Set();
|
|
108
|
+
let target = undefined;
|
|
109
|
+
let dryRun = false;
|
|
110
|
+
let force = false;
|
|
111
|
+
let json = false;
|
|
112
|
+
|
|
113
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
114
|
+
const token = args[i];
|
|
115
|
+
if (token === '--help' || token === '-h') {
|
|
116
|
+
return { help: true };
|
|
117
|
+
}
|
|
118
|
+
if (token === '--target') {
|
|
119
|
+
if (seen.has(token)) throw new Error('Duplicate option: --target.');
|
|
120
|
+
const val = args[i + 1];
|
|
121
|
+
if (!val || val.startsWith('-')) throw new Error('Option --target requires a value.');
|
|
122
|
+
target = val;
|
|
123
|
+
seen.add(token);
|
|
124
|
+
i += 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!flags.has(token)) {
|
|
128
|
+
throw new Error(`Unknown skill install option: ${token}`);
|
|
129
|
+
}
|
|
130
|
+
if (seen.has(token)) {
|
|
131
|
+
throw new Error(`Duplicate option: ${token}.`);
|
|
132
|
+
}
|
|
133
|
+
seen.add(token);
|
|
134
|
+
if (token === '--dry-run') dryRun = true;
|
|
135
|
+
if (token === '--force') force = true;
|
|
136
|
+
if (token === '--json') json = true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { help: false, target, dryRun, force, json };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function printHelp(stdout = console.log) {
|
|
143
|
+
stdout('XMemo Skill installer (@xmemo/skill)');
|
|
144
|
+
stdout('');
|
|
145
|
+
stdout('Usage:');
|
|
146
|
+
stdout(' xmemo-skill install [--target <dir>] [--dry-run] [--force] [--json]');
|
|
147
|
+
stdout(' xmemo-skill version [--json]');
|
|
148
|
+
stdout(' xmemo-skill help');
|
|
149
|
+
stdout('');
|
|
150
|
+
stdout('Commands:');
|
|
151
|
+
stdout(' install Install the XMemo Skill locally (offline, zero-network)');
|
|
152
|
+
stdout(' version Print the skill version');
|
|
153
|
+
stdout(' help Print this help message');
|
|
154
|
+
stdout('');
|
|
155
|
+
stdout('Options:');
|
|
156
|
+
stdout(' --target <dir> Installation directory (default: xmemo-skill, or $XMEMO_SKILL_DIR)');
|
|
157
|
+
stdout(' --dry-run Simulate installation without writing files');
|
|
158
|
+
stdout(' --force Overwrite destination directory if it already exists');
|
|
159
|
+
stdout(' --json Output results as JSON');
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export async function runCli(argv = process.argv.slice(2), { cwd = process.cwd(), env = process.env, metaUrl = import.meta.url } = {}) {
|
|
163
|
+
const subcommand = argv[0] ?? 'help';
|
|
164
|
+
|
|
165
|
+
if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
|
|
166
|
+
printHelp();
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const source = await locateSkillSource(metaUrl);
|
|
171
|
+
const packageRoot = path.resolve(path.dirname(fileURLToPath(metaUrl)), '..');
|
|
172
|
+
const skillVersion = await readSkillVersion(source);
|
|
173
|
+
|
|
174
|
+
if (subcommand === 'version' || subcommand === '--version' || subcommand === '-v') {
|
|
175
|
+
const isJson = argv.includes('--json');
|
|
176
|
+
if (isJson) {
|
|
177
|
+
console.log(JSON.stringify({ package: PACKAGE_NAME, version: skillVersion, skillVersion }, null, 2));
|
|
178
|
+
} else {
|
|
179
|
+
console.log(skillVersion);
|
|
180
|
+
}
|
|
181
|
+
return 0;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (subcommand !== 'install') {
|
|
185
|
+
throw new Error(`Unknown command: ${subcommand}. Run "xmemo-skill help" for usage.`);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const optionArgs = argv.slice(1);
|
|
189
|
+
const options = parseInstallOptions(optionArgs);
|
|
190
|
+
if (options.help) {
|
|
191
|
+
printHelp();
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const targetDir = options.target ?? env.XMEMO_SKILL_DIR ?? DEFAULT_INSTALL_DIR;
|
|
196
|
+
const target = path.resolve(cwd, targetDir);
|
|
197
|
+
|
|
198
|
+
assertSafeTarget(packageRoot, source, target);
|
|
199
|
+
|
|
200
|
+
const exists = await pathExists(target);
|
|
201
|
+
if (exists && !options.force) {
|
|
202
|
+
throw new Error(`Skill destination already exists: ${target}. Use --force to replace it.`);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const report = {
|
|
206
|
+
package: PACKAGE_NAME,
|
|
207
|
+
skillVersion,
|
|
208
|
+
source,
|
|
209
|
+
target,
|
|
210
|
+
dryRun: options.dryRun,
|
|
211
|
+
force: options.force,
|
|
212
|
+
replaced: exists && !options.dryRun,
|
|
213
|
+
installed: false,
|
|
214
|
+
networkUsed: false,
|
|
215
|
+
tokenSent: false,
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
if (!options.dryRun) {
|
|
219
|
+
await atomicInstall(source, target, exists);
|
|
220
|
+
report.installed = true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
if (options.json) {
|
|
224
|
+
console.log(JSON.stringify(report, null, 2));
|
|
225
|
+
} else {
|
|
226
|
+
console.log(`${options.dryRun ? 'Would install' : 'Installed'} XMemo Skill ${skillVersion} to ${target}`);
|
|
227
|
+
console.log(`Source: ${PACKAGE_NAME} ${skillVersion} (offline; no credential used)`);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function isDirectExecution() {
|
|
234
|
+
if (!process.argv[1]) return false;
|
|
235
|
+
const currentPath = fileURLToPath(import.meta.url);
|
|
236
|
+
if (process.argv[1] === currentPath || path.resolve(process.argv[1]) === currentPath) {
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
try {
|
|
240
|
+
return realpathSync(process.argv[1]) === realpathSync(currentPath);
|
|
241
|
+
} catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (isDirectExecution()) {
|
|
247
|
+
runCli().catch((err) => {
|
|
248
|
+
console.error(err.message || String(err));
|
|
249
|
+
process.exit(1);
|
|
250
|
+
});
|
|
251
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xmemo/skill",
|
|
3
|
+
"version": "1.1.25",
|
|
4
|
+
"description": "Standalone installer and distribution package for the XMemo agent skill.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"xmemo-skill": "bin/install.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin",
|
|
11
|
+
"skill",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.0.0"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/yonro/memory-os-cli.git",
|
|
21
|
+
"directory": "skills/xmemo"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT"
|
|
24
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# XMemo Skill Change Log
|
|
2
|
+
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## 1.1.25
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Support Meta Muse Secure Vault credentials (credential resolution order: `XMEMO_KEY` → `muse-vault` surrogate token via local socket → user credential file; surrogate tokens are restricted strictly to `https://xmemo.dev` and are never stored to disk or printed).
|
|
10
|
+
- Support OpenClaw secret egress proxying: `XMEMO_KEY` holding an OpenClaw sentinel token is reported as `openclaw-secret`; outbound requests fail closed unless the egress proxy environment (`HTTPS_PROXY` or `https_proxy`, and truthy `NODE_USE_ENV_PROXY`) is active, and sentinels are only sent to `https://xmemo.dev`.
|
|
11
|
+
|
|
12
|
+
## 1.1.24
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Enforce a 512 KiB input size limit on `remember` via stdin and `--file` (matching the server single-item limit), using bounded reads that reject non-regular files and prevent unbounded buffering.
|
|
17
|
+
- Standardize `restart-snapshot` and `restart-restore` failure output under `--json` mode into the unified `{ok: false, error: {code, message, request_id}}` envelope, preserving HTTP exit code mapping.
|
|
18
|
+
- Split monolithic operations reference into scoped `memory-operations.md`, `ledger-operations.md`, and `runtime-operations.md` guides (each under 12 KB), updating cross-document links and security documentation phrasing.
|
|
19
|
+
|
|
20
|
+
## 1.1.23
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- Split the runtime into a small entrypoint plus `scripts/lib/` and `scripts/commands/` modules (12 files, each under 12 KB). Commands, options, terminal and `--json` output, exit codes, and installation are unchanged.
|
|
25
|
+
|
|
26
|
+
## 1.1.22
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Lean skill package: removed maintainer smoke test script (`smoke-test.mjs`) and release workflow documentation, keeping only consumer skill assets; maintainer workflows migrated to repository-level `scripts/` and `docs/`.
|
|
31
|
+
|
|
32
|
+
## 1.1.21
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- Wrap `restart-snapshot` and `restart-restore` successful `--json` output in standard `{"ok": true}` envelope matching other skill commands.
|
|
37
|
+
|
|
38
|
+
## 1.1.20
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- Add pre-release smoke-test script (`scripts/smoke-test.mjs`) to validate exit codes, `--json` envelope keys (`ok: true`, error `error.code`), and command safety across all read-only commands by default, gating write commands behind `--execute-writes` and outputting structured failure checklists.
|
|
43
|
+
- Support stdin (`--content -`) and file import (`--file <path>`) for `remember`, mutually exclusive with `--content <text>`, with byte-identical payload validation and transmission.
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- Append server `request_id` to terminal error output when returned in server error responses.
|
|
48
|
+
- Display remaining authorization validity countdown while waiting for authorization in `login` (e.g. `Waiting for authorization... (valid for 9m32s)`).
|
|
49
|
+
- Automatically default to JSON output when stdout is not a TTY (e.g. piped or redirected) unless explicit `--terminal` (`--no-json`, `--plain`) is provided.
|
|
50
|
+
- Merge duplicate usage blocks into a single source of truth, aligning command arguments and eliminating drift between `--help` and command-specific help.
|
|
51
|
+
- Normalize process exit codes across all commands: `0` for success/help/version/valid empty states, `1` for user argument/flag/file validation and 4xx client errors, `2` for missing credentials and 401/403 authentication/authorization errors, and `3` for 5xx server errors, connection refusal, timeouts, and oversize response limits.
|
|
52
|
+
|
|
53
|
+
## 1.1.19
|
|
54
|
+
|
|
55
|
+
### Changed
|
|
56
|
+
|
|
57
|
+
- Route `overview`, `activity`, `ledger-list`, and `ledger-summary` commands to key-authenticated `POST /v1/skill/operations` instead of session-backed `/v1/me/*`.
|
|
58
|
+
- Enforce strict parameter allow-listing and client-side argument mapping for `overview`, `activity`, `ledger-list`, and `ledger-summary` without sending `owner_id` or `user_id`.
|
|
59
|
+
- Preserve 403 authorization rejections without downgrade and clearly prompt for re-authorization to explicitly grant required scopes (`memory:read` / `ledger:read`).
|
|
60
|
+
- Consolidate `SKILL.md` middle section into unified Bundled Command Reference with organized subsections for Direct Memory, Ledger, Diagnostics, Knowledge, and Auth.
|
|
61
|
+
|
|
62
|
+
### Fixed
|
|
63
|
+
|
|
64
|
+
- Support `reminders` array in `extractList` for `todo-list` terminal rendering when server returns `{ reminders: [...] }`.
|
|
65
|
+
|
|
66
|
+
## 1.1.18
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- Add read-only `read` command to retrieve a single memory by ID via `GET /v1/memories/{id}/explain?include_embedding=false` with character-window pagination (`--offset`, `--limit`) and minimal projection.
|
|
71
|
+
- Add write-side `update` command to modify an existing memory via `PATCH /v1/memories/{id}` with `--content`, `--path`, `--metadata`, `--bucket`, and `--scope`.
|
|
72
|
+
- Add write-side `forget` command for soft deletion via `POST /v1/memories/{id}/forget` with mode `soft_delete` and mandatory `--confirm` protection against accidental deletion.
|
|
73
|
+
- Add strictly read-only `ledger-list` command to retrieve personal financial transactions via `GET /v1/me/ledger/transactions` with filtering and local `--month` date-range resolution.
|
|
74
|
+
- Add strictly read-only `ledger-summary` command to aggregate monthly financial totals via `GET /v1/me/ledger/monthly-summary`.
|
|
75
|
+
- Add strictly read-only `overview` command to view personal account metrics (memory counts, storage usage, active agents, tokens) via `GET /v1/me/overview`.
|
|
76
|
+
- Add strictly read-only `activity` command to inspect recent account activity via `GET /v1/me/activity` with optional `--limit`.
|
|
77
|
+
- Add strictly read-only `stats` command to inspect memory statistics and dimensional aggregations via `GET /v1/memories/stats` with strict query filtering and `--top-n` bounds.
|
|
78
|
+
|
|
79
|
+
### Fixed
|
|
80
|
+
|
|
81
|
+
- Harmonize `read --json` output envelope with `ok: true`.
|
|
82
|
+
- Replace fallback literal `'v1'` version string in `read` projection with `null` (rendered as `(unknown)` in terminal mode).
|
|
83
|
+
- Pass through server 400 `invalid_memory_id` responses on `update` and default unexpected 400s to `invalid_request`.
|
|
84
|
+
- Display `(unknown)` instead of `0` in `ledger-list` terminal rendering when transaction amount is missing.
|
|
85
|
+
- Preserve all existing command contracts, requests, authentication, scopes, and runtime behavior.
|
|
86
|
+
|
|
87
|
+
## 1.1.17
|
|
88
|
+
|
|
89
|
+
- Clarify TODO completion and creation terminal feedback by extracting and
|
|
90
|
+
displaying confirmed resource IDs on `todo-add` and `todo-done`.
|
|
91
|
+
- Improve `restart-restore` terminal reporting when no active restart snapshot
|
|
92
|
+
exists to restore.
|
|
93
|
+
- Preserve existing requests, authentication, scopes, service APIs, and all
|
|
94
|
+
runtime command behavior.
|
|
95
|
+
|
|
96
|
+
## 1.1.16
|
|
97
|
+
|
|
98
|
+
- Preserve the read-only `doctor --json` discovery summary when a service omits
|
|
99
|
+
top-level `service_version`: expose the separately advertised standalone Skill
|
|
100
|
+
package version without inferring it is a service version.
|
|
101
|
+
- Preserve existing requests, authentication, scopes, service APIs, and all
|
|
102
|
+
runtime command behavior.
|
|
103
|
+
|
|
104
|
+
## 1.1.15
|
|
105
|
+
|
|
106
|
+
- Add explicit read-only Knowledge support to `recall-context` through the
|
|
107
|
+
opt-in `--include_knowledge true` flag; the default request remains
|
|
108
|
+
Memory-only for backward compatibility.
|
|
109
|
+
- Request the least-privilege `knowledge:read` scope during new formal Skill
|
|
110
|
+
device login. Existing credentials are never expanded automatically; use
|
|
111
|
+
verified reauthorization when Knowledge access is needed.
|
|
112
|
+
- Include `recall-context` in top-level help and document the Knowledge scope,
|
|
113
|
+
service feature, temporary-token, and untrusted-context boundaries.
|
|
114
|
+
- Tests cover the opt-in request field, strict boolean parsing, login scope,
|
|
115
|
+
top-level help, and Knowledge authorization documentation.
|
|
116
|
+
|
|
117
|
+
## 1.1.14
|
|
118
|
+
|
|
119
|
+
- Align the documented standalone Skill runtime with the MemoryOS Node.js
|
|
120
|
+
baseline: Node.js 22.22.0 or newer.
|
|
121
|
+
- Keep the runtime behavior, authentication, scopes, service APIs, and package
|
|
122
|
+
metadata unchanged.
|
|
123
|
+
|
|
124
|
+
## 1.1.13
|
|
125
|
+
|
|
126
|
+
- Add the read-only `recall-context` command for the service's bounded,
|
|
127
|
+
prompt-ready `/v1/recall/context` response, with client-side budget validation.
|
|
128
|
+
- Preserve existing authentication, scopes, temporary-sandbox limits, and all
|
|
129
|
+
other runtime commands.
|
|
130
|
+
|
|
131
|
+
## 1.1.12
|
|
132
|
+
|
|
133
|
+
- Add a short first-successful-run path: anonymous service health check,
|
|
134
|
+
deliberate credential choice, and credential verification before memory work.
|
|
135
|
+
- Preserve runtime commands, network requests, authentication, scopes,
|
|
136
|
+
credential behavior, service APIs, and MCP fallback behavior.
|
|
137
|
+
|
|
138
|
+
## 1.1.11
|
|
139
|
+
|
|
140
|
+
- Simplify the standalone Skill description so agents can discover its core
|
|
141
|
+
memory, continuity, TODO, expense, and diagnostics workflows without an
|
|
142
|
+
exhaustive command list.
|
|
143
|
+
- Preserve the existing runtime commands, authentication, scopes, service
|
|
144
|
+
requests, and MCP fallback behavior.
|
|
145
|
+
|
|
146
|
+
## 1.1.10
|
|
147
|
+
|
|
148
|
+
- Clarify plain-text `doctor` output: an explicit `--anonymous` health check
|
|
149
|
+
now says authentication was not checked, while a normal no-credential check
|
|
150
|
+
prints the formal-login next command.
|
|
151
|
+
- Preserve the existing read-only health request, JSON diagnostics, credential
|
|
152
|
+
lookup, authentication, scope, and degraded-discovery behavior.
|
|
153
|
+
|
|
154
|
+
## 1.1.9
|
|
155
|
+
|
|
156
|
+
- Expand the bounded, read-only `doctor --json` discovery summary with the
|
|
157
|
+
advertised service version, MCP URL, and supported clients so agents can
|
|
158
|
+
diagnose compatibility without parsing the raw discovery document.
|
|
159
|
+
- Preserve existing anonymous, credential, health-check, and degraded-discovery
|
|
160
|
+
behavior; the new fields come only from the public discovery response.
|
|
161
|
+
|
|
162
|
+
## 1.1.8
|
|
163
|
+
|
|
164
|
+
- Consolidate repeated command examples in `SKILL.md`: document each canonical
|
|
165
|
+
command once, while retaining `auth-status` as a runtime compatibility alias.
|
|
166
|
+
|
|
167
|
+
## 1.1.7
|
|
168
|
+
|
|
169
|
+
- Stop shipping `install.sh` and `install.ps1` inside the published Skill. Their
|
|
170
|
+
only job is to download this archive, so packaging them within it was circular
|
|
171
|
+
and left two unused scripts in every install destination. They now live beside
|
|
172
|
+
the Skill in the source repository and remain available from the published
|
|
173
|
+
installer endpoints.
|
|
174
|
+
- Skill runtime, commands, credential handling, and network behaviour are
|
|
175
|
+
unchanged; this release only removes two files that no runtime path used.
|
|
176
|
+
|
|
177
|
+
## 1.1.6
|
|
178
|
+
|
|
179
|
+
- Remove repeated standalone-installation links from `SKILL.md`; installation
|
|
180
|
+
distribution remains owned by the package and release surfaces, while this
|
|
181
|
+
Skill starts at runtime selection and explicit credential setup.
|
|
182
|
+
|
|
183
|
+
## 1.1.5
|
|
184
|
+
|
|
185
|
+
- Add zero-dependency POSIX and PowerShell installers for the published
|
|
186
|
+
standalone Skill archive. Both enforce HTTPS-only download paths, reject
|
|
187
|
+
non-HTTPS redirects, verify the bundled runtime entrypoint, and never accept
|
|
188
|
+
or send XMemo credentials.
|
|
189
|
+
- Document the installer commands and their destination/origin boundaries;
|
|
190
|
+
installation remains separate from explicit login and credential setup.
|
|
191
|
+
- Regression coverage pins the HTTPS, redirect, entrypoint, and no-token
|
|
192
|
+
guarantees for both installer scripts.
|
|
193
|
+
|
|
194
|
+
## 1.1.4
|
|
195
|
+
|
|
196
|
+
- `scripts/xmemo-skill.mjs`: add a bounded, token-free `clientDiagnostics`
|
|
197
|
+
block to `doctor --json`, including read-only discovery service/capability
|
|
198
|
+
summary and a concrete next credential-check or sign-in command.
|
|
199
|
+
- Diagnostics: when discovery is unavailable, report a stable degraded status
|
|
200
|
+
without failing an otherwise healthy doctor operation or changing any auth,
|
|
201
|
+
write, or restart-continuity behavior.
|
|
202
|
+
- Tests and Skill documentation: cover authenticated, anonymous, and degraded
|
|
203
|
+
discovery output while preserving the no-Authorization-header guarantee for
|
|
204
|
+
`doctor --anonymous`.
|
|
205
|
+
|
|
206
|
+
## 1.1.3
|
|
207
|
+
|
|
208
|
+
- `scripts/xmemo-skill.mjs`: report a clear empty-state result when a successful
|
|
209
|
+
`restore-state` response contains no saved state, while preserving the
|
|
210
|
+
requested key and an explicit empty-content marker for valid state objects.
|
|
211
|
+
- Tests: cover empty and partially populated state-restore responses so the
|
|
212
|
+
standalone command does not print `undefined` to users.
|
|
213
|
+
|
|
214
|
+
## 1.1.2
|
|
215
|
+
|
|
216
|
+
- `SKILL.md` and references: distinguish the public generic
|
|
217
|
+
`/v1/skill/operations` discovery list from the formal-account-only direct
|
|
218
|
+
restart-continuity routes. This prevents a missing restart entry in
|
|
219
|
+
`standalone_skill.operations` from being misread as an unavailable command.
|
|
220
|
+
- Documentation and tests: clarify that temporary agents never receive restart
|
|
221
|
+
continuity, that discovery alone is not authorization, and that an
|
|
222
|
+
unauthenticated `401` is route reachability rather than a write-capability
|
|
223
|
+
proof.
|
|
224
|
+
|
|
225
|
+
## 1.1.1
|
|
226
|
+
|
|
227
|
+
- `scripts/xmemo-skill.mjs`: add formal-account `restart-snapshot` and
|
|
228
|
+
`restart-restore` commands for the Memory OS v0.4.335 full-continuity
|
|
229
|
+
contract, without replacing the lightweight `save-state` / `restore-state`
|
|
230
|
+
workflow or widening temporary-agent permissions.
|
|
231
|
+
- `scripts/xmemo-skill.mjs`: validate restart snapshot limits, TTLs, metadata,
|
|
232
|
+
and restore booleans; keep normal output bounded to IDs/timestamps while
|
|
233
|
+
retaining redacted `--json` output for trusted callers.
|
|
234
|
+
- `SKILL.md` and references: explain when to use single-state handoff,
|
|
235
|
+
full restart continuity, or native MCP restart tools.
|
|
236
|
+
- Tests: pin the advertised runtime version to the newest change-log heading so
|
|
237
|
+
a released section is never reopened for new work.
|
|
238
|
+
|
|
239
|
+
## 1.1.0
|
|
240
|
+
|
|
241
|
+
- `scripts/xmemo-skill.mjs`: align the advertised and runtime version at `1.1.0` while preserving the `XMemo Memory` package identity and formal-account-first login policy.
|
|
242
|
+
- `scripts/xmemo-skill.mjs`: add the discovery-compatible `auth-status` alias and `auth claim-deny` for the server's two-phase temporary-account bind flow.
|
|
243
|
+
- `scripts/xmemo-skill.mjs`: read temporary item/expiry limits from `/.well-known/xmemo-agent.json`, disclose them immediately after registration, and use the documented production limits as a non-blocking fallback when discovery is unavailable.
|
|
244
|
+
- `scripts/xmemo-skill.mjs`: route temporary `search` to `/v1/memories/search`, keep `recall` on `/v1/recall`, and retain temporary access only for `remember`, `recall`, and `search`.
|
|
245
|
+
- `scripts/xmemo-skill.mjs`: parse `--metadata` as a JSON object, parse `--explain` and `--prefer_working` as strict booleans, and validate state `--ttl_seconds` against the hosted `0..604800` contract.
|
|
246
|
+
- `scripts/xmemo-skill.mjs`: retain the established formal device-login scopes, including `ledger:read`; no server API contract or destructive memory command was added.
|
|
247
|
+
- `SKILL.md` and references: document the formal-account default, temporary limits, status alias, bind-denial flow, and typed argument examples without exposing credential values.
|
|
248
|
+
- Tests: cover dynamic temporary limits, temporary search routing, bind denial and pending-token cleanup, typed arguments, the `auth-status` alias, version output, and documentation invariants.
|
|
249
|
+
|
|
250
|
+
## 1.0.9
|
|
251
|
+
|
|
252
|
+
- Removed the non-runtime `skill-card.md` file. No user-facing, documentation, or runtime behavior changed in this marketplace release.
|
|
253
|
+
|
|
254
|
+
## 1.0.8
|
|
255
|
+
|
|
256
|
+
- `scripts/xmemo-skill.mjs`: advance the standalone runtime to `1.0.8` while preserving the existing REST operations, formal-login flow, temporary sandbox, and explicit plaintext fallback.
|
|
257
|
+
- `scripts/xmemo-skill.mjs`: stop displaying token prefixes and prevent `logout` from revoking an externally managed `XMEMO_KEY` unless `--revoke-environment-token` is explicitly supplied.
|
|
258
|
+
- `scripts/xmemo-skill.mjs`: add `doctor --anonymous`, command-specific login/register/logout help, `--version`, strict command parameter allowlists, required-argument validation, and sensitive command-line option rejection.
|
|
259
|
+
- `scripts/xmemo-skill.mjs`: require HTTPS for remote custom origins while retaining loopback HTTP for local development, warn before authenticated custom-origin requests, and add bounded request timeouts plus an 8 MiB response limit.
|
|
260
|
+
- `scripts/xmemo-skill.mjs`: honor device-login expiry, preserve the established formal-account memory and ledger scope set, redact sensitive fields from every JSON operation response, and sanitize human-readable server content for terminal safety.
|
|
261
|
+
- `SKILL.md` and references: document the compatible logout/anonymous-doctor behavior, timeout and origin boundaries, Node.js requirement, and copyable POSIX/PowerShell token-input examples.
|
|
262
|
+
- Tests: cover anonymous diagnostics, external environment-token logout, token-prefix suppression, unsafe origin and secret-option rejection, timeout/response limits, JSON redaction, the established formal-login scope set, device-login expiry, command help, and version output.
|
|
263
|
+
|
|
264
|
+
- `scripts/xmemo-skill.mjs`: keep `XMEMO_KEY` as the highest-priority credential source and never copy an environment token into local storage.
|
|
265
|
+
- `scripts/xmemo-skill.mjs`: require explicit `--allow-plaintext` consent before `login`, `auth add`, or temporary registration writes any bearer credential; replace the inaccurate “stored securely” claim with the exact storage path and an unencrypted-storage warning.
|
|
266
|
+
- `scripts/xmemo-skill.mjs`: restrict the XMemo credential directory/file to `0700`/`0600` where POSIX permissions are supported, record consent metadata, and warn when reading a legacy unmarked plaintext credential.
|
|
267
|
+
- `scripts/xmemo-skill.mjs`: minimize temporary credential metadata, redact token-shaped fields from JSON claim/error output, and clear pending confirmation data after handoff.
|
|
268
|
+
- `SKILL.md` and references: document credential precedence, explicit plaintext consent, temporary bind-URL handling, and migration guidance while keeping formal account login recommended.
|
|
269
|
+
|
|
270
|
+
- `scripts/xmemo-skill.mjs`: add an explicit, policy-gated `register --reason unattended|declined` fallback for the server's unauthenticated agent registration. Formal `login` remains the primary path.
|
|
271
|
+
- `scripts/xmemo-skill.mjs`: persist temporary credentials locally, route their allowed `remember`/`recall`/`search` requests to the temporary REST sandbox, reject unsupported commands clearly, and support claim-status/claim-confirm formal-token handoff.
|
|
272
|
+
- `SKILL.md` and references: document the temporary sandbox limits, required user disclosure, bind URL, and formal-account upgrade path.
|
|
273
|
+
|
|
274
|
+
- `scripts/xmemo-skill.mjs`: normalize successful list payloads (`result.results`, `result.todos`, or a bare array), so `recall`, `search`, and `todo-list` never call `forEach` on an API wrapper object.
|
|
275
|
+
- `scripts/xmemo-skill.mjs`: extract IDs from object or string results for `remember` and `expense-add`, preventing `[object Object]` output.
|
|
276
|
+
- `scripts/xmemo-skill.mjs`: parse every REST response through one guarded JSON helper. Empty or non-JSON gateway responses now include the HTTP status and a bounded server-response preview.
|
|
277
|
+
- `scripts/xmemo-skill.mjs`: add global and command-level `--help`, clear unknown-command errors, and `--compact` rendering for recall/search.
|
|
278
|
+
- `SKILL.md` and `references/*.md`: make every command relative to the Skill root (`node scripts/xmemo-skill.mjs ...`) and document compact output and help.
|
|
279
|
+
- `test/xmemo-standalone-skill.test.js`: add regression coverage for wrapped list payloads, object IDs, help output, and non-JSON responses.
|