@arshdelight/practi 0.9.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/LICENSE +21 -0
- package/README.md +81 -0
- package/dist/client.js +84 -0
- package/dist/client.js.map +1 -0
- package/dist/cmd/blob.js +97 -0
- package/dist/cmd/blob.js.map +1 -0
- package/dist/cmd/clone.js +76 -0
- package/dist/cmd/clone.js.map +1 -0
- package/dist/cmd/comment.js +210 -0
- package/dist/cmd/comment.js.map +1 -0
- package/dist/cmd/config.js +30 -0
- package/dist/cmd/config.js.map +1 -0
- package/dist/cmd/edit.js +122 -0
- package/dist/cmd/edit.js.map +1 -0
- package/dist/cmd/init.js +11 -0
- package/dist/cmd/init.js.map +1 -0
- package/dist/cmd/lifecycle.js +69 -0
- package/dist/cmd/lifecycle.js.map +1 -0
- package/dist/cmd/login.js +125 -0
- package/dist/cmd/login.js.map +1 -0
- package/dist/cmd/ls.js +59 -0
- package/dist/cmd/ls.js.map +1 -0
- package/dist/cmd/new.js +57 -0
- package/dist/cmd/new.js.map +1 -0
- package/dist/cmd/pull.js +94 -0
- package/dist/cmd/pull.js.map +1 -0
- package/dist/cmd/push.js +84 -0
- package/dist/cmd/push.js.map +1 -0
- package/dist/cmd/remote.js +48 -0
- package/dist/cmd/remote.js.map +1 -0
- package/dist/cmd/search.js +137 -0
- package/dist/cmd/search.js.map +1 -0
- package/dist/cmd/show.js +61 -0
- package/dist/cmd/show.js.map +1 -0
- package/dist/cmd/skill.js +198 -0
- package/dist/cmd/skill.js.map +1 -0
- package/dist/cmd/spec.js +10 -0
- package/dist/cmd/spec.js.map +1 -0
- package/dist/cmd/update.js +60 -0
- package/dist/cmd/update.js.map +1 -0
- package/dist/credentials.js +65 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.js +412 -0
- package/dist/index.js.map +1 -0
- package/dist/oauth.js +244 -0
- package/dist/oauth.js.map +1 -0
- package/dist/render.js +25 -0
- package/dist/render.js.map +1 -0
- package/dist/state.js +74 -0
- package/dist/state.js.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/dist/web.js +243 -0
- package/dist/web.js.map +1 -0
- package/dist/workspace.js +38 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +48 -0
- package/skills/use-practi/SKILL.md +186 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { CLI_VERSION } from '../version.js';
|
|
5
|
+
const PKG = '@arshdelight/practi';
|
|
6
|
+
/** Windows 上 npm 是 npm.cmd(.cmd 必须免 shell 调用,否则触发 DEP0190) */
|
|
7
|
+
const NPM = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
8
|
+
function npmOut(args) {
|
|
9
|
+
const r = spawnSync(NPM, args, { encoding: 'utf8' });
|
|
10
|
+
return (r.stdout ?? '').trim();
|
|
11
|
+
}
|
|
12
|
+
/** 点分数值比较:a>b 返回 1,a<b 返回 -1,相等返回 0 */
|
|
13
|
+
function cmpSemver(a, b) {
|
|
14
|
+
const pa = a.split('.').map(Number);
|
|
15
|
+
const pb = b.split('.').map(Number);
|
|
16
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
17
|
+
const d = (pa[i] ?? 0) - (pb[i] ?? 0);
|
|
18
|
+
if (d !== 0)
|
|
19
|
+
return d > 0 ? 1 : -1;
|
|
20
|
+
}
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* practi update:向 registry 查 latest,比当前新就 npm install -g 自更新。
|
|
25
|
+
* dev 安装(npm link 的符号链接)会被 registry 安装覆盖——检测到时先警告。
|
|
26
|
+
*/
|
|
27
|
+
export async function runUpdate(_opts) {
|
|
28
|
+
const registry = npmOut(['config', 'get', 'registry']) || 'https://registry.npmjs.org';
|
|
29
|
+
console.log(`checking ${registry} for ${PKG} …`);
|
|
30
|
+
const res = await fetch(`${registry.replace(/\/+$/, '')}/${PKG.replace('/', '%2F')}`);
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
console.error(`error: registry returned HTTP ${res.status}`);
|
|
33
|
+
return 1;
|
|
34
|
+
}
|
|
35
|
+
const meta = (await res.json());
|
|
36
|
+
const latest = meta['dist-tags']?.latest;
|
|
37
|
+
if (!latest) {
|
|
38
|
+
console.error('error: registry response carries no dist-tags.latest');
|
|
39
|
+
return 1;
|
|
40
|
+
}
|
|
41
|
+
if (cmpSemver(latest, CLI_VERSION) <= 0) {
|
|
42
|
+
console.log(`already up to date: ${CLI_VERSION} (registry latest ${latest})`);
|
|
43
|
+
return 0;
|
|
44
|
+
}
|
|
45
|
+
const prefix = npmOut(['prefix', '-g']);
|
|
46
|
+
const installedDir = prefix ? path.join(prefix, 'node_modules', PKG) : '';
|
|
47
|
+
if (installedDir && fs.existsSync(installedDir) && fs.lstatSync(installedDir).isSymbolicLink()) {
|
|
48
|
+
console.error(`warning: ${installedDir} is a linked development install — updating replaces the link with a registry install`);
|
|
49
|
+
}
|
|
50
|
+
console.log(`updating: ${CLI_VERSION} → ${latest}`);
|
|
51
|
+
const r = spawnSync(NPM, ['install', '-g', `${PKG}@${latest}`], { stdio: 'inherit' });
|
|
52
|
+
if (r.status !== 0) {
|
|
53
|
+
console.error('error: npm install failed — run it manually:');
|
|
54
|
+
console.error(` npm install -g ${PKG}@${latest}`);
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
console.log(`updated to ${latest} (takes effect on the next run)`);
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cmd/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* 登录凭证(refresh/access token 等),独立于 workspace 状态(practi.json)存放:
|
|
5
|
+
* 数据目录是 POP workspace,可能在 git 仓库里,practi.json 不应携带密钥。
|
|
6
|
+
* 存在 $dataDir/practi.auth.json;POSIX 上 chmod 600(Windows 依赖用户级目录权限)。
|
|
7
|
+
* 旧名 pop.auth.json 仍可读(读旧写新)——改名前的登录不失效。
|
|
8
|
+
*/
|
|
9
|
+
export const AUTH_FILE = 'practi.auth.json';
|
|
10
|
+
const LEGACY_AUTH_FILE = 'pop.auth.json';
|
|
11
|
+
export function authPath(dataDir) {
|
|
12
|
+
return path.join(dataDir, AUTH_FILE);
|
|
13
|
+
}
|
|
14
|
+
function findAuthFile(dataDir) {
|
|
15
|
+
const p = path.join(dataDir, AUTH_FILE);
|
|
16
|
+
if (fs.existsSync(p))
|
|
17
|
+
return p;
|
|
18
|
+
const legacy = path.join(dataDir, LEGACY_AUTH_FILE);
|
|
19
|
+
if (fs.existsSync(legacy))
|
|
20
|
+
return legacy;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/** 实际存放凭证的文件(practi.auth.json,或改名前的 pop.auth.json)——显示用 */
|
|
24
|
+
export function existingAuthFile(dataDir) {
|
|
25
|
+
return findAuthFile(dataDir);
|
|
26
|
+
}
|
|
27
|
+
export function loadCredentials(dataDir) {
|
|
28
|
+
const p = findAuthFile(dataDir);
|
|
29
|
+
if (p === null)
|
|
30
|
+
return null;
|
|
31
|
+
try {
|
|
32
|
+
const rec = JSON.parse(fs.readFileSync(p, 'utf8'));
|
|
33
|
+
if (typeof rec === 'object' && rec !== null && typeof rec.refresh_token === 'string') {
|
|
34
|
+
return rec;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function saveCredentials(dataDir, creds) {
|
|
43
|
+
fs.mkdirSync(dataDir, { recursive: true });
|
|
44
|
+
const p = authPath(dataDir);
|
|
45
|
+
fs.writeFileSync(p, JSON.stringify(creds, null, 2) + '\n', 'utf8');
|
|
46
|
+
if (process.platform !== 'win32') {
|
|
47
|
+
try {
|
|
48
|
+
fs.chmodSync(p, 0o600);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// chmod 失败不阻塞写入(如某些只读挂载)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function deleteCredentials(dataDir) {
|
|
56
|
+
for (const f of [authPath(dataDir), path.join(dataDir, LEGACY_AUTH_FILE)]) {
|
|
57
|
+
if (fs.existsSync(f))
|
|
58
|
+
fs.unlinkSync(f);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** access token 是否仍有效(未过期 + 有值) */
|
|
62
|
+
export function isAccessTokenFresh(creds) {
|
|
63
|
+
return !!creds.access_token && !!creds.expires_at && creds.expires_at > Date.now() + 30_000;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAC5C,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAoBzC,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAQ,GAA+B,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YAClH,OAAO,GAAkB,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAkB;IACjE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACnD,OAAO,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;AAC9F,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from 'node:util';
|
|
3
|
+
import { PracticeError } from '@arshdelight/pop-sdk';
|
|
4
|
+
import { runInit } from './cmd/init.js';
|
|
5
|
+
import { runConfig } from './cmd/config.js';
|
|
6
|
+
import { runRemote } from './cmd/remote.js';
|
|
7
|
+
import { runLs } from './cmd/ls.js';
|
|
8
|
+
import { runNew } from './cmd/new.js';
|
|
9
|
+
import { runEdit } from './cmd/edit.js';
|
|
10
|
+
import { runShow } from './cmd/show.js';
|
|
11
|
+
import { runLogin, runLogout, runMe } from './cmd/login.js';
|
|
12
|
+
import { runWeb } from './web.js';
|
|
13
|
+
import { runBlobAdd } from './cmd/blob.js';
|
|
14
|
+
import { runPush } from './cmd/push.js';
|
|
15
|
+
import { runPull } from './cmd/pull.js';
|
|
16
|
+
import { runClone } from './cmd/clone.js';
|
|
17
|
+
import { runSearch } from './cmd/search.js';
|
|
18
|
+
import { runComment } from './cmd/comment.js';
|
|
19
|
+
import { runSubmit, runUnpublish, runDelete } from './cmd/lifecycle.js';
|
|
20
|
+
import { runUpdate } from './cmd/update.js';
|
|
21
|
+
import { runSpec } from './cmd/spec.js';
|
|
22
|
+
import { runSkill } from './cmd/skill.js';
|
|
23
|
+
import { CLI_VERSION, POP_SPEC_VERSION } from './version.js';
|
|
24
|
+
function printVersion() {
|
|
25
|
+
console.log(`practi ${CLI_VERSION}`);
|
|
26
|
+
console.log(`pop-spec ${POP_SPEC_VERSION} (via @arshdelight/pop-sdk)`);
|
|
27
|
+
return 0;
|
|
28
|
+
}
|
|
29
|
+
const USAGE = `practi — local registry for POP (Protocol of Practice), syncing to PractiHub
|
|
30
|
+
|
|
31
|
+
usage:
|
|
32
|
+
practi blob add <file-or-url> stage an attachment; emits the attachment entry
|
|
33
|
+
(hashes the bytes, stores local blobs in the workspace)
|
|
34
|
+
practi clone <hash> fetch a public POP and claim it (fork: local direct + remote claim)
|
|
35
|
+
practi comment list|tally|add|edit|delete|report
|
|
36
|
+
node comments on the remote (hub extension; source-scoped list,
|
|
37
|
+
--node for a shared node's full view; --json for agents)
|
|
38
|
+
practi config show data dir, remote, registry summary
|
|
39
|
+
practi delete <hash> remove your direct claim on the remote (hash required)
|
|
40
|
+
practi edit <hash> <file.json> replace a direct POP (new hash; auto-revision + GC)
|
|
41
|
+
| practi edit <hash> --json '<text>' | practi edit <hash> < file.json
|
|
42
|
+
[--message <text>] [--no-revision] [--keep]
|
|
43
|
+
practi init [path] initialize a data directory (default: ~/.practi)
|
|
44
|
+
practi login [--no-open] OAuth login in the browser (--no-open prints the URL only)
|
|
45
|
+
practi logout clear stored credentials (revokes on the server)
|
|
46
|
+
practi ls [-a] [--json] list direct pops (-a also lists indirect nodes)
|
|
47
|
+
practi me show the authenticated practihub user
|
|
48
|
+
practi new <file.json> create a POP from a JSON document
|
|
49
|
+
| practi new --json '<text>'
|
|
50
|
+
| practi new < file.json
|
|
51
|
+
practi pull [hash] sync YOUR claims from the remote (default: all of mine)
|
|
52
|
+
practi push [hash] push new local claims to the remote (git-style: only new ones)
|
|
53
|
+
practi remote set <url> set the remote provider (e.g. https://practihub.com)
|
|
54
|
+
practi remote show | remove inspect / clear the remote
|
|
55
|
+
practi search [query...] search pops (remote by default; --local the workspace)
|
|
56
|
+
[--local] [--scope public|me|all] [--limit N] [--json]
|
|
57
|
+
practi show <hash> [--json] [--doc] inspect one node (hash prefix OK)
|
|
58
|
+
practi skill install install the bundled use-practi skill (default: ~/.agents/skills)
|
|
59
|
+
practi skill update refresh the installed use-practi skill (--dir to override)
|
|
60
|
+
practi skill uninstall remove the installed use-practi skill
|
|
61
|
+
practi skill import <dir> replay a practi skill export directory back into a POP (sidecar required;
|
|
62
|
+
foreign skills enter POP by authoring, not import)
|
|
63
|
+
practi skill export <ref> [--dir] project a POP as an installable skill directory (SKILL.md + sidecar)
|
|
64
|
+
practi spec print pop-spec.md (bundled with the SDK; no network)
|
|
65
|
+
practi submit [hash] submit pops for public review (default: all direct)
|
|
66
|
+
practi unpublish [hash] withdraw a submission / take one back out of public
|
|
67
|
+
practi update self-update via npm (checks the registry's latest)
|
|
68
|
+
practi version | --version show CLI + pop-spec versions
|
|
69
|
+
practi web [--port 4317] [--no-open] browse direct pops in a local web UI
|
|
70
|
+
|
|
71
|
+
options:
|
|
72
|
+
--data-dir <path> target data directory (same default as init)
|
|
73
|
+
|
|
74
|
+
the data directory is a POP workspace: nodes are content-addressed (nodes/*.md),
|
|
75
|
+
practi.json records the remote and registered direct roots; login credentials live
|
|
76
|
+
in practi.auth.json (kept out of practi.json so the workspace stays commit-safe).
|
|
77
|
+
`;
|
|
78
|
+
const COMMON = {
|
|
79
|
+
'data-dir': { type: 'string' },
|
|
80
|
+
help: { type: 'boolean', short: 'h' },
|
|
81
|
+
};
|
|
82
|
+
function str(v) {
|
|
83
|
+
return v;
|
|
84
|
+
}
|
|
85
|
+
async function main(argv) {
|
|
86
|
+
const cmd = argv[0] ?? 'help';
|
|
87
|
+
const rest = argv.slice(1);
|
|
88
|
+
if (cmd === 'version' || argv.includes('--version') || argv.includes('-v')) {
|
|
89
|
+
return printVersion();
|
|
90
|
+
}
|
|
91
|
+
switch (cmd) {
|
|
92
|
+
case 'init': {
|
|
93
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
94
|
+
if (values.help) {
|
|
95
|
+
console.log('usage: practi init [path]');
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
return runInit({ dataDir: str(values['data-dir']), positional: positionals });
|
|
99
|
+
}
|
|
100
|
+
case 'config': {
|
|
101
|
+
const { values } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
102
|
+
if (values.help) {
|
|
103
|
+
console.log('usage: practi config');
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
return runConfig({ dataDir: str(values['data-dir']) });
|
|
107
|
+
}
|
|
108
|
+
case 'remote': {
|
|
109
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
110
|
+
if (values.help) {
|
|
111
|
+
console.log('usage: practi remote set <url> | show | remove');
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
return runRemote({ dataDir: str(values['data-dir']), positional: positionals });
|
|
115
|
+
}
|
|
116
|
+
case 'ls': {
|
|
117
|
+
const { values } = parseArgs({
|
|
118
|
+
args: rest,
|
|
119
|
+
options: { ...COMMON, all: { type: 'boolean', short: 'a' }, json: { type: 'boolean' } },
|
|
120
|
+
allowPositionals: true,
|
|
121
|
+
});
|
|
122
|
+
if (values.help) {
|
|
123
|
+
console.log('usage: practi ls [-a] [--json]');
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
return runLs({ dataDir: str(values['data-dir']), all: values.all === true, json: values.json === true });
|
|
127
|
+
}
|
|
128
|
+
case 'new': {
|
|
129
|
+
const { values, positionals } = parseArgs({
|
|
130
|
+
args: rest,
|
|
131
|
+
options: { ...COMMON, json: { type: 'string' }, file: { type: 'string' } },
|
|
132
|
+
allowPositionals: true,
|
|
133
|
+
});
|
|
134
|
+
if (values.help) {
|
|
135
|
+
console.log('usage: practi new <file.json> | practi new --json \'<text>\' | practi new < file.json');
|
|
136
|
+
return 0;
|
|
137
|
+
}
|
|
138
|
+
return runNew({ dataDir: str(values['data-dir']), json: values.json, file: values.file, positional: positionals });
|
|
139
|
+
}
|
|
140
|
+
case 'edit': {
|
|
141
|
+
const { values, positionals } = parseArgs({
|
|
142
|
+
args: rest,
|
|
143
|
+
options: {
|
|
144
|
+
...COMMON,
|
|
145
|
+
json: { type: 'string' },
|
|
146
|
+
file: { type: 'string' },
|
|
147
|
+
message: { type: 'string' },
|
|
148
|
+
'no-revision': { type: 'boolean' },
|
|
149
|
+
keep: { type: 'boolean' },
|
|
150
|
+
},
|
|
151
|
+
allowPositionals: true,
|
|
152
|
+
});
|
|
153
|
+
if (values.help) {
|
|
154
|
+
console.log('usage: practi edit <hash> <file.json> [--message <text>] [--no-revision] [--keep]');
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
return runEdit({
|
|
158
|
+
dataDir: str(values['data-dir']),
|
|
159
|
+
json: values.json,
|
|
160
|
+
file: values.file,
|
|
161
|
+
message: values.message,
|
|
162
|
+
noRevision: values['no-revision'] === true,
|
|
163
|
+
keep: values.keep === true,
|
|
164
|
+
positional: positionals,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
case 'show': {
|
|
168
|
+
const { values, positionals } = parseArgs({
|
|
169
|
+
args: rest,
|
|
170
|
+
options: { ...COMMON, json: { type: 'boolean' }, doc: { type: 'boolean' } },
|
|
171
|
+
allowPositionals: true,
|
|
172
|
+
});
|
|
173
|
+
if (values.help || positionals.length === 0) {
|
|
174
|
+
console.log('usage: practi show <hash> [--json] [--doc]');
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
return runShow({ dataDir: str(values['data-dir']), hash: positionals[0], json: values.json === true, doc: values.doc === true });
|
|
178
|
+
}
|
|
179
|
+
case 'web': {
|
|
180
|
+
const { values } = parseArgs({
|
|
181
|
+
args: rest,
|
|
182
|
+
options: {
|
|
183
|
+
...COMMON,
|
|
184
|
+
port: { type: 'string' },
|
|
185
|
+
open: { type: 'boolean', default: true },
|
|
186
|
+
'no-open': { type: 'boolean' },
|
|
187
|
+
},
|
|
188
|
+
allowPositionals: true,
|
|
189
|
+
});
|
|
190
|
+
if (values.help) {
|
|
191
|
+
console.log('usage: practi web [--port 4317] [--no-open]');
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
const port = values.port ? Number(values.port) : 4317;
|
|
195
|
+
return runWeb({ dataDir: str(values['data-dir']), port: Number.isInteger(port) && port > 0 ? port : 4317, open: values['no-open'] !== true });
|
|
196
|
+
}
|
|
197
|
+
case 'login': {
|
|
198
|
+
const { values } = parseArgs({
|
|
199
|
+
args: rest,
|
|
200
|
+
options: { ...COMMON, 'no-open': { type: 'boolean' } },
|
|
201
|
+
allowPositionals: true,
|
|
202
|
+
});
|
|
203
|
+
if (values.help) {
|
|
204
|
+
console.log('usage: practi login [--no-open]');
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
return runLogin({ dataDir: str(values['data-dir']), noOpen: values['no-open'] === true });
|
|
208
|
+
}
|
|
209
|
+
case 'logout': {
|
|
210
|
+
const { values } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
211
|
+
if (values.help) {
|
|
212
|
+
console.log('usage: practi logout');
|
|
213
|
+
return 0;
|
|
214
|
+
}
|
|
215
|
+
return runLogout({ dataDir: str(values['data-dir']) });
|
|
216
|
+
}
|
|
217
|
+
case 'me': {
|
|
218
|
+
const { values } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
219
|
+
if (values.help) {
|
|
220
|
+
console.log('usage: practi me');
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
return runMe({ dataDir: str(values['data-dir']) });
|
|
224
|
+
}
|
|
225
|
+
case 'push': {
|
|
226
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
227
|
+
if (values.help) {
|
|
228
|
+
console.log('usage: practi push [hash]');
|
|
229
|
+
return 0;
|
|
230
|
+
}
|
|
231
|
+
return runPush({ dataDir: str(values['data-dir']), positional: positionals });
|
|
232
|
+
}
|
|
233
|
+
case 'pull': {
|
|
234
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
235
|
+
if (values.help) {
|
|
236
|
+
console.log('usage: practi pull [hash]');
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
return runPull({ dataDir: str(values['data-dir']), positional: positionals });
|
|
240
|
+
}
|
|
241
|
+
case 'clone': {
|
|
242
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
243
|
+
if (values.help || positionals.length === 0) {
|
|
244
|
+
console.log('usage: practi clone <hash>');
|
|
245
|
+
return 0;
|
|
246
|
+
}
|
|
247
|
+
return runClone({ dataDir: str(values['data-dir']), positional: positionals });
|
|
248
|
+
}
|
|
249
|
+
case 'comment': {
|
|
250
|
+
const { values, positionals } = parseArgs({
|
|
251
|
+
args: rest,
|
|
252
|
+
options: {
|
|
253
|
+
...COMMON,
|
|
254
|
+
node: { type: 'string' },
|
|
255
|
+
cursor: { type: 'string' },
|
|
256
|
+
limit: { type: 'string' },
|
|
257
|
+
valence: { type: 'string' },
|
|
258
|
+
message: { type: 'string', short: 'm' },
|
|
259
|
+
reason: { type: 'string' },
|
|
260
|
+
detail: { type: 'string' },
|
|
261
|
+
json: { type: 'boolean' },
|
|
262
|
+
},
|
|
263
|
+
allowPositionals: true,
|
|
264
|
+
});
|
|
265
|
+
if (values.help) {
|
|
266
|
+
console.log('usage: practi comment list|tally|add|edit|delete|report (see `practi comment` help)');
|
|
267
|
+
return 0;
|
|
268
|
+
}
|
|
269
|
+
return runComment({
|
|
270
|
+
dataDir: str(values['data-dir']),
|
|
271
|
+
positional: positionals,
|
|
272
|
+
node: values.node,
|
|
273
|
+
cursor: values.cursor,
|
|
274
|
+
limit: values.limit,
|
|
275
|
+
valence: values.valence,
|
|
276
|
+
message: values.message,
|
|
277
|
+
reason: values.reason,
|
|
278
|
+
detail: values.detail,
|
|
279
|
+
json: values.json === true,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
case 'search': {
|
|
283
|
+
const { values, positionals } = parseArgs({
|
|
284
|
+
args: rest,
|
|
285
|
+
options: {
|
|
286
|
+
...COMMON,
|
|
287
|
+
local: { type: 'boolean' },
|
|
288
|
+
scope: { type: 'string', default: 'public' },
|
|
289
|
+
limit: { type: 'string' },
|
|
290
|
+
json: { type: 'boolean' },
|
|
291
|
+
},
|
|
292
|
+
allowPositionals: true,
|
|
293
|
+
});
|
|
294
|
+
if (values.help) {
|
|
295
|
+
console.log('usage: practi search [query...] [--local] [--scope public|me|all] [--limit N] [--json]');
|
|
296
|
+
return 0;
|
|
297
|
+
}
|
|
298
|
+
const limit = values.limit ? Number(values.limit) : 20;
|
|
299
|
+
return runSearch({
|
|
300
|
+
dataDir: str(values['data-dir']),
|
|
301
|
+
positional: positionals,
|
|
302
|
+
scope: values.scope ?? 'public',
|
|
303
|
+
limit: Number.isInteger(limit) && limit > 0 ? Math.min(limit, 50) : 20,
|
|
304
|
+
json: values.json === true,
|
|
305
|
+
local: values.local === true,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
case 'submit': {
|
|
309
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
310
|
+
if (values.help) {
|
|
311
|
+
console.log('usage: practi submit [hash] (default: all direct pops)');
|
|
312
|
+
return 0;
|
|
313
|
+
}
|
|
314
|
+
return runSubmit({ dataDir: str(values['data-dir']), positional: positionals });
|
|
315
|
+
}
|
|
316
|
+
case 'unpublish': {
|
|
317
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
318
|
+
if (values.help) {
|
|
319
|
+
console.log('usage: practi unpublish [hash] (default: all direct pops)');
|
|
320
|
+
return 0;
|
|
321
|
+
}
|
|
322
|
+
return runUnpublish({ dataDir: str(values['data-dir']), positional: positionals });
|
|
323
|
+
}
|
|
324
|
+
case 'delete': {
|
|
325
|
+
const { values, positionals } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
326
|
+
if (values.help || positionals.length === 0) {
|
|
327
|
+
console.log('usage: practi delete <hash> (explicit hash required)');
|
|
328
|
+
return 0;
|
|
329
|
+
}
|
|
330
|
+
return runDelete({ dataDir: str(values['data-dir']), positional: positionals });
|
|
331
|
+
}
|
|
332
|
+
case 'blob': {
|
|
333
|
+
const sub = rest[0];
|
|
334
|
+
const { values, positionals } = parseArgs({
|
|
335
|
+
args: rest.slice(1),
|
|
336
|
+
options: { ...COMMON, name: { type: 'string' } },
|
|
337
|
+
allowPositionals: true,
|
|
338
|
+
});
|
|
339
|
+
if (values.help) {
|
|
340
|
+
console.log('usage: practi blob add <file-or-url> [--name <name>]');
|
|
341
|
+
return 0;
|
|
342
|
+
}
|
|
343
|
+
if (sub === 'add') {
|
|
344
|
+
return runBlobAdd({ dataDir: str(values['data-dir']), name: values.name, positional: positionals });
|
|
345
|
+
}
|
|
346
|
+
console.error('usage: practi blob add <file-or-url> [--name <name>]');
|
|
347
|
+
return 1;
|
|
348
|
+
}
|
|
349
|
+
case 'skill': {
|
|
350
|
+
const sub = rest[0];
|
|
351
|
+
const { values, positionals } = parseArgs({
|
|
352
|
+
args: rest.slice(1),
|
|
353
|
+
options: { ...COMMON, dir: { type: 'string' } },
|
|
354
|
+
allowPositionals: true,
|
|
355
|
+
});
|
|
356
|
+
const known = ['install', 'update', 'uninstall', 'import', 'export'];
|
|
357
|
+
const action = known.find((k) => k === sub);
|
|
358
|
+
if (values.help || action === undefined) {
|
|
359
|
+
console.log('usage: practi skill install|update|uninstall [--dir <skills-dir>] (default dir: ~/.agents/skills)');
|
|
360
|
+
console.log(' practi skill import <skill-dir> [--data-dir <dir>] replay a `practi skill export` directory (sidecar required)');
|
|
361
|
+
console.log(' practi skill export <ref> [--dir <out-dir>] [--data-dir <dir>] POP → skill directory');
|
|
362
|
+
return sub !== undefined && !values.help ? 1 : 0;
|
|
363
|
+
}
|
|
364
|
+
return runSkill({ action, dir: values.dir, dataDir: str(values['data-dir']), positional: positionals[0] });
|
|
365
|
+
}
|
|
366
|
+
case 'spec': {
|
|
367
|
+
const { values } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
368
|
+
if (values.help) {
|
|
369
|
+
console.log('usage: practi spec (print the bundled pop-spec.md)');
|
|
370
|
+
return 0;
|
|
371
|
+
}
|
|
372
|
+
return runSpec({ dataDir: str(values['data-dir']) });
|
|
373
|
+
}
|
|
374
|
+
case 'update': {
|
|
375
|
+
const { values } = parseArgs({ args: rest, options: COMMON, allowPositionals: true });
|
|
376
|
+
if (values.help) {
|
|
377
|
+
console.log('usage: practi update (self-update via npm; checks the registry\'s latest)');
|
|
378
|
+
return 0;
|
|
379
|
+
}
|
|
380
|
+
return await runUpdate({ dataDir: str(values['data-dir']) });
|
|
381
|
+
}
|
|
382
|
+
case 'help':
|
|
383
|
+
case '--help':
|
|
384
|
+
case '-h':
|
|
385
|
+
console.log(USAGE);
|
|
386
|
+
return 0;
|
|
387
|
+
default:
|
|
388
|
+
console.error(`unknown command: ${cmd}`);
|
|
389
|
+
console.error(USAGE);
|
|
390
|
+
return 1;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
(async () => {
|
|
394
|
+
try {
|
|
395
|
+
process.exitCode = await main(process.argv.slice(2));
|
|
396
|
+
}
|
|
397
|
+
catch (e) {
|
|
398
|
+
if (e instanceof PracticeError) {
|
|
399
|
+
console.error(`error [${e.code}]: ${e.message}`);
|
|
400
|
+
if (e.hint)
|
|
401
|
+
console.error(` hint: ${e.hint}`);
|
|
402
|
+
}
|
|
403
|
+
else if (e instanceof Error) {
|
|
404
|
+
console.error(`error: ${e.message}`);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
console.error(`error: ${String(e)}`);
|
|
408
|
+
}
|
|
409
|
+
process.exitCode = 1;
|
|
410
|
+
}
|
|
411
|
+
})();
|
|
412
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|