@nex-ai/nex 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/attribute.d.ts +4 -0
- package/dist/commands/attribute.js +75 -0
- package/dist/commands/attribute.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +4 -0
- package/dist/commands/config-cmd.js +53 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.js +135 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/insight.d.ts +4 -0
- package/dist/commands/insight.js +39 -0
- package/dist/commands/insight.js.map +1 -0
- package/dist/commands/integrate.d.ts +4 -0
- package/dist/commands/integrate.js +136 -0
- package/dist/commands/integrate.js.map +1 -0
- package/dist/commands/list-job.d.ts +4 -0
- package/dist/commands/list-job.js +41 -0
- package/dist/commands/list-job.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.js +148 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/note.d.ts +4 -0
- package/dist/commands/note.js +77 -0
- package/dist/commands/note.js.map +1 -0
- package/dist/commands/object.d.ts +4 -0
- package/dist/commands/object.js +78 -0
- package/dist/commands/object.js.map +1 -0
- package/dist/commands/record.d.ts +4 -0
- package/dist/commands/record.js +126 -0
- package/dist/commands/record.js.map +1 -0
- package/dist/commands/register.d.ts +4 -0
- package/dist/commands/register.js +23 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/relationship.d.ts +4 -0
- package/dist/commands/relationship.js +80 -0
- package/dist/commands/relationship.js.map +1 -0
- package/dist/commands/scan.d.ts +4 -0
- package/dist/commands/scan.js +58 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.js +22 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/session.d.ts +4 -0
- package/dist/commands/session.js +31 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +10 -0
- package/dist/commands/setup.js +254 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/task.d.ts +4 -0
- package/dist/commands/task.js +114 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/capture-filter.d.ts +9 -0
- package/dist/lib/capture-filter.js +14 -0
- package/dist/lib/capture-filter.js.map +1 -0
- package/dist/lib/client.d.ts +19 -0
- package/dist/lib/client.js +115 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +34 -0
- package/dist/lib/config.js +59 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/context-format.d.ts +7 -0
- package/dist/lib/context-format.js +21 -0
- package/dist/lib/context-format.js.map +1 -0
- package/dist/lib/errors.d.ts +18 -0
- package/dist/lib/errors.js +30 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/file-scanner.d.ts +38 -0
- package/dist/lib/file-scanner.js +178 -0
- package/dist/lib/file-scanner.js.map +1 -0
- package/dist/lib/installers.d.ts +19 -0
- package/dist/lib/installers.js +205 -0
- package/dist/lib/installers.js.map +1 -0
- package/dist/lib/output.d.ts +7 -0
- package/dist/lib/output.js +50 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/platform-detect.d.ts +16 -0
- package/dist/lib/platform-detect.js +188 -0
- package/dist/lib/platform-detect.js.map +1 -0
- package/dist/lib/project-config.d.ts +53 -0
- package/dist/lib/project-config.js +151 -0
- package/dist/lib/project-config.js.map +1 -0
- package/dist/lib/prompt.d.ts +4 -0
- package/dist/lib/prompt.js +21 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/rate-limiter.d.ts +13 -0
- package/dist/lib/rate-limiter.js +49 -0
- package/dist/lib/rate-limiter.js.map +1 -0
- package/dist/lib/recall-filter.d.ts +6 -0
- package/dist/lib/recall-filter.js +58 -0
- package/dist/lib/recall-filter.js.map +1 -0
- package/dist/lib/session-store.d.ts +15 -0
- package/dist/lib/session-store.js +62 -0
- package/dist/lib/session-store.js.map +1 -0
- package/package.json +32 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const DATA_DIR = join(homedir(), ".nex");
|
|
5
|
+
const STATE_FILE = join(DATA_DIR, "recall-state.json");
|
|
6
|
+
const DEBOUNCE_MS = 30_000;
|
|
7
|
+
const QUESTION_WORDS = /\b(who|what|when|where|why|how|which|tell|explain|describe|summarize|summarise|list|find|show|get|any|does|did|is|are|was|were|have|has|do|can|could|should|would|will)\b/i;
|
|
8
|
+
const TOOL_COMMANDS = /^\s*(run|build|test|lint|format|deploy|install|uninstall|start|stop|restart|commit|push|pull|merge|rebase|checkout|fetch|init|fix|refactor|rename|move|delete|remove|add|create|update|upgrade|downgrade|migrate|generate|scaffold|compile|bundle|watch|serve|debug|profile|bench|clean|reset|undo|redo|revert|squash|cherry-pick|tag|release|publish|npm|npx|yarn|pnpm|bun|pip|cargo|go|make|docker|kubectl|terraform|git|gh|cd|ls|cat|grep|find|mkdir|rm|cp|mv|touch|echo|export|source|chmod|chown|curl|wget|ssh|scp)\b/i;
|
|
9
|
+
const FILE_REF = /(?:[\w./\\-]+\.\w{1,10}|src\/|lib\/|dist\/|node_modules\/|\.\/|\.\.\/)/;
|
|
10
|
+
function isCodeHeavy(text) {
|
|
11
|
+
const alpha = text.replace(/[^a-zA-Z]/g, "").length;
|
|
12
|
+
return alpha < text.length * 0.5;
|
|
13
|
+
}
|
|
14
|
+
function readState() {
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(readFileSync(STATE_FILE, "utf-8"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return { lastRecallAt: 0 };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function writeState(state) {
|
|
23
|
+
try {
|
|
24
|
+
mkdirSync(DATA_DIR, { recursive: true });
|
|
25
|
+
writeFileSync(STATE_FILE, JSON.stringify(state), "utf-8");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* best-effort */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function recordRecall() {
|
|
32
|
+
writeState({ lastRecallAt: Date.now() });
|
|
33
|
+
}
|
|
34
|
+
export function shouldRecall(prompt, isFirstPrompt) {
|
|
35
|
+
const trimmed = prompt.trim();
|
|
36
|
+
if (isFirstPrompt)
|
|
37
|
+
return { shouldRecall: true, reason: "first-prompt" };
|
|
38
|
+
if (trimmed.startsWith("!"))
|
|
39
|
+
return { shouldRecall: false, reason: "opt-out" };
|
|
40
|
+
if (trimmed.length < 15)
|
|
41
|
+
return { shouldRecall: false, reason: "too-short" };
|
|
42
|
+
const hasQuestion = QUESTION_WORDS.test(trimmed);
|
|
43
|
+
if (!hasQuestion) {
|
|
44
|
+
const state = readState();
|
|
45
|
+
if (state.lastRecallAt > 0 &&
|
|
46
|
+
Date.now() - state.lastRecallAt < DEBOUNCE_MS) {
|
|
47
|
+
return { shouldRecall: false, reason: "debounce" };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (TOOL_COMMANDS.test(trimmed) && !hasQuestion)
|
|
51
|
+
return { shouldRecall: false, reason: "tool-command" };
|
|
52
|
+
if (isCodeHeavy(trimmed) && FILE_REF.test(trimmed) && !hasQuestion)
|
|
53
|
+
return { shouldRecall: false, reason: "code-prompt" };
|
|
54
|
+
if (hasQuestion)
|
|
55
|
+
return { shouldRecall: true, reason: "question" };
|
|
56
|
+
return { shouldRecall: true, reason: "default" };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=recall-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recall-filter.js","sourceRoot":"","sources":["../../src/lib/recall-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class SessionStore {
|
|
2
|
+
private filePath;
|
|
3
|
+
private maxSize;
|
|
4
|
+
constructor(config?: {
|
|
5
|
+
maxSize?: number;
|
|
6
|
+
dataDir?: string;
|
|
7
|
+
});
|
|
8
|
+
private readStore;
|
|
9
|
+
private writeStore;
|
|
10
|
+
get(key: string): string | undefined;
|
|
11
|
+
set(key: string, value: string): void;
|
|
12
|
+
delete(key: string): boolean;
|
|
13
|
+
list(): Record<string, string>;
|
|
14
|
+
clear(): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const DEFAULT_MAX = 100;
|
|
5
|
+
const DEFAULT_DATA_DIR = join(homedir(), ".nex");
|
|
6
|
+
export class SessionStore {
|
|
7
|
+
filePath;
|
|
8
|
+
maxSize;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
const dataDir = config?.dataDir ?? DEFAULT_DATA_DIR;
|
|
11
|
+
this.maxSize = config?.maxSize ?? DEFAULT_MAX;
|
|
12
|
+
this.filePath = join(dataDir, "cli-sessions.json");
|
|
13
|
+
mkdirSync(dataDir, { recursive: true });
|
|
14
|
+
}
|
|
15
|
+
readStore() {
|
|
16
|
+
try {
|
|
17
|
+
const data = JSON.parse(readFileSync(this.filePath, "utf-8"));
|
|
18
|
+
if (data && typeof data === "object" && !Array.isArray(data))
|
|
19
|
+
return data;
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
writeStore(store) {
|
|
27
|
+
try {
|
|
28
|
+
writeFileSync(this.filePath, JSON.stringify(store), "utf-8");
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* best-effort */
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
get(key) {
|
|
35
|
+
return this.readStore()[key];
|
|
36
|
+
}
|
|
37
|
+
set(key, value) {
|
|
38
|
+
const store = this.readStore();
|
|
39
|
+
store[key] = value;
|
|
40
|
+
const keys = Object.keys(store);
|
|
41
|
+
while (keys.length > this.maxSize) {
|
|
42
|
+
delete store[keys.shift()];
|
|
43
|
+
}
|
|
44
|
+
this.writeStore(store);
|
|
45
|
+
}
|
|
46
|
+
delete(key) {
|
|
47
|
+
const store = this.readStore();
|
|
48
|
+
if (key in store) {
|
|
49
|
+
delete store[key];
|
|
50
|
+
this.writeStore(store);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
list() {
|
|
56
|
+
return this.readStore();
|
|
57
|
+
}
|
|
58
|
+
clear() {
|
|
59
|
+
this.writeStore({});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/lib/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,OAAO,YAAY;IACf,QAAQ,CAAS;IACjB,OAAO,CAAS;IAExB,YAAY,MAA+C;QACzD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,gBAAgB,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,WAAW,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACnD,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAEO,SAAS;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC1D,OAAO,IAA8B,CAAC;YACxC,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAA6B;QAC9C,IAAI,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAa;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAG,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nex-ai/nex",
|
|
3
|
+
"version": "0.1.7",
|
|
4
|
+
"description": "Nex CLI provides organizational context & memory to AI agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"nex": "dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"start": "node dist/index.js",
|
|
16
|
+
"dev": "tsx src/index.ts",
|
|
17
|
+
"test": "node --import tsx --test tests/**/*.test.ts tests/**/**/*.test.ts",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"commander": "^13.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^22.0.0",
|
|
25
|
+
"tsx": "^4.19.0",
|
|
26
|
+
"typescript": "^5.7.0"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"license": "MIT"
|
|
32
|
+
}
|