@norescan/agent-adapters 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,9 @@
1
+ export interface AgentAdapter {
2
+ readonly name: string;
3
+ readonly displayName: string;
4
+ readonly description: string;
5
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
6
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ validate(projectRoot: string): Promise<boolean>;
8
+ }
9
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from '../adapter.js';
2
+ export declare class AntigravityAdapter implements AgentAdapter {
3
+ readonly name = "antigravity";
4
+ readonly displayName = "Google Antigravity";
5
+ readonly description = "Registers norescan MCP server in .gemini/antigravity/mcp/ and sets up workspace rules in AGENTS.md";
6
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
8
+ validate(projectRoot: string): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=antigravity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAY7C,qBAAa,kBAAmB,YAAW,YAAY;IACrD,SAAgB,IAAI,iBAAiB;IACrC,SAAgB,WAAW,wBAAwB;IACnD,SAAgB,WAAW,wGAAwG;IAEtH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C/D,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AntigravityAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const ANTIGRAVITY_RULE_BANNER = '<!-- norescan:ANTIGRAVITY:START -->';
10
+ const ANTIGRAVITY_RULE_CONTENT = `
11
+ ${ANTIGRAVITY_RULE_BANNER}
12
+ ## norescan Persistent Memory Protocol
13
+ Before substantial coding tasks, use norescan MCP tools (\`get_task_context\`) or run \`norescan context "<task>"\` to retrieve verified file analyses and dependencies without repeating full codebase scans. Always inspect live source files before editing. After completing work, record architectural decisions using \`record_decision\`.
14
+ <!-- norescan:ANTIGRAVITY:END -->
15
+ `;
16
+ class AntigravityAdapter {
17
+ name = 'antigravity';
18
+ displayName = 'Google Antigravity';
19
+ description = 'Registers norescan MCP server in .gemini/antigravity/mcp/ and sets up workspace rules in AGENTS.md';
20
+ async install(projectRoot, dryRun = false) {
21
+ const created = [];
22
+ // 1. MCP Configuration
23
+ const mcpDir = node_path_1.default.join(projectRoot, '.gemini', 'antigravity', 'mcp');
24
+ const mcpFile = node_path_1.default.join(mcpDir, 'norescan.json');
25
+ const mcpConfig = {
26
+ mcpServers: {
27
+ 'norescan': {
28
+ command: 'norescan-mcp',
29
+ args: [],
30
+ env: {},
31
+ },
32
+ },
33
+ };
34
+ if (!dryRun) {
35
+ await promises_1.default.mkdir(mcpDir, { recursive: true });
36
+ await promises_1.default.writeFile(mcpFile, JSON.stringify(mcpConfig, null, 2), 'utf8');
37
+ }
38
+ created.push(mcpFile);
39
+ // 2. Rules in AGENTS.md (idempotent)
40
+ const agentsMdPath = node_path_1.default.join(projectRoot, 'AGENTS.md');
41
+ let existingContent = '';
42
+ try {
43
+ existingContent = await promises_1.default.readFile(agentsMdPath, 'utf8');
44
+ }
45
+ catch {
46
+ // file doesn't exist
47
+ }
48
+ if (!existingContent.includes(ANTIGRAVITY_RULE_BANNER)) {
49
+ const newContent = existingContent
50
+ ? `${existingContent.trim()}\n\n${ANTIGRAVITY_RULE_CONTENT.trim()}\n`
51
+ : ANTIGRAVITY_RULE_CONTENT.trim() + '\n';
52
+ if (!dryRun) {
53
+ await promises_1.default.writeFile(agentsMdPath, newContent, 'utf8');
54
+ }
55
+ created.push(agentsMdPath);
56
+ }
57
+ return created;
58
+ }
59
+ async uninstall(projectRoot, dryRun = false) {
60
+ const removed = [];
61
+ const mcpFile = node_path_1.default.join(projectRoot, '.gemini', 'antigravity', 'mcp', 'norescan.json');
62
+ try {
63
+ if (!dryRun)
64
+ await promises_1.default.unlink(mcpFile);
65
+ removed.push(mcpFile);
66
+ }
67
+ catch { }
68
+ const agentsMdPath = node_path_1.default.join(projectRoot, 'AGENTS.md');
69
+ try {
70
+ const content = await promises_1.default.readFile(agentsMdPath, 'utf8');
71
+ if (content.includes(ANTIGRAVITY_RULE_BANNER)) {
72
+ const cleaned = content.replace(/<!-- norescan:ANTIGRAVITY:START -->[\s\S]*?<!-- norescan:ANTIGRAVITY:END -->/g, '').trim() + '\n';
73
+ if (!dryRun)
74
+ await promises_1.default.writeFile(agentsMdPath, cleaned, 'utf8');
75
+ removed.push(agentsMdPath);
76
+ }
77
+ }
78
+ catch { }
79
+ return removed;
80
+ }
81
+ async validate(projectRoot) {
82
+ try {
83
+ const mcpFile = node_path_1.default.join(projectRoot, '.gemini', 'antigravity', 'mcp', 'norescan.json');
84
+ const content = await promises_1.default.readFile(mcpFile, 'utf8');
85
+ return content.includes('norescan-mcp');
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ }
92
+ exports.AntigravityAdapter = AntigravityAdapter;
93
+ //# sourceMappingURL=antigravity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":";;;;;;AACA,gEAAkC;AAClC,0DAA6B;AAE7B,MAAM,uBAAuB,GAAG,qCAAqC,CAAC;AACtE,MAAM,wBAAwB,GAAG;EAC/B,uBAAuB;;;;CAIxB,CAAC;AAEF,MAAa,kBAAkB;IACb,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,oBAAoB,CAAC;IACnC,WAAW,GAAG,oGAAoG,CAAC;IAE5H,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAM,GAAG,KAAK;QACtD,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,uBAAuB;QACvB,MAAM,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG;YAChB,UAAU,EAAE;gBACV,UAAU,EAAE;oBACV,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,EAAE;oBACR,GAAG,EAAE,EAAE;iBACR;aACF;SACF,CAAC;QAEF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,kBAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,MAAM,kBAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtB,qCAAqC;QACrC,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,eAAe,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,eAAe,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,eAAe;gBAChC,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,wBAAwB,CAAC,IAAI,EAAE,IAAI;gBACrE,CAAC,CAAC,wBAAwB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACvD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,MAAM,GAAG,KAAK;QACxD,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACzF,IAAI,CAAC;YACH,IAAI,CAAC,MAAM;gBAAE,MAAM,kBAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QAEX,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,+EAA+E,EAC/E,EAAE,CACH,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,MAAM;oBAAE,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QAEX,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAmB;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YACzF,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnD,OAAO,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAlFD,gDAkFC"}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from '../adapter.js';
2
+ export declare class ClaudeCodeAdapter implements AgentAdapter {
3
+ readonly name = "claude-code";
4
+ readonly displayName = "Claude Code";
5
+ readonly description = "Configures Claude Code project MCP server in .claude/config.json and CLAUDE.md";
6
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
8
+ validate(projectRoot: string): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,qBAAa,iBAAkB,YAAW,YAAY;IACpD,SAAgB,IAAI,iBAAiB;IACrC,SAAgB,WAAW,iBAAiB;IAC5C,SAAgB,WAAW,oFAAoF;IAElG,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiD/D,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6BjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ClaudeCodeAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class ClaudeCodeAdapter {
10
+ name = 'claude-code';
11
+ displayName = 'Claude Code';
12
+ description = 'Configures Claude Code project MCP server in .claude/config.json and CLAUDE.md';
13
+ async install(projectRoot, dryRun = false) {
14
+ const created = [];
15
+ // 1. .claude/config.json
16
+ const claudeDir = node_path_1.default.join(projectRoot, '.claude');
17
+ const configFile = node_path_1.default.join(claudeDir, 'config.json');
18
+ let config = { mcpServers: {} };
19
+ try {
20
+ const existing = await promises_1.default.readFile(configFile, 'utf8');
21
+ config = JSON.parse(existing);
22
+ if (!config.mcpServers)
23
+ config.mcpServers = {};
24
+ }
25
+ catch { }
26
+ config.mcpServers['norescan'] = {
27
+ command: 'norescan-mcp',
28
+ args: [],
29
+ };
30
+ if (!dryRun) {
31
+ await promises_1.default.mkdir(claudeDir, { recursive: true });
32
+ await promises_1.default.writeFile(configFile, JSON.stringify(config, null, 2), 'utf8');
33
+ }
34
+ created.push(configFile);
35
+ // 2. CLAUDE.md
36
+ const claudeMd = node_path_1.default.join(projectRoot, 'CLAUDE.md');
37
+ const banner = '<!-- norescan:CLAUDE:START -->';
38
+ let existing = '';
39
+ try {
40
+ existing = await promises_1.default.readFile(claudeMd, 'utf8');
41
+ }
42
+ catch { }
43
+ if (!existing.includes(banner)) {
44
+ const instructions = `
45
+ ${banner}
46
+ # norescan Persistent Memory
47
+ - Before starting substantial tasks, call \`get_task_context\` to retrieve relevant files and avoid re-analyzing unchanged files.
48
+ - Inspect live source files before writing edits.
49
+ - Record architectural decisions using \`record_decision\`.
50
+ <!-- norescan:CLAUDE:END -->
51
+ `;
52
+ const updated = existing ? `${existing.trim()}\n\n${instructions.trim()}\n` : instructions.trim() + '\n';
53
+ if (!dryRun)
54
+ await promises_1.default.writeFile(claudeMd, updated, 'utf8');
55
+ created.push(claudeMd);
56
+ }
57
+ return created;
58
+ }
59
+ async uninstall(projectRoot, dryRun = false) {
60
+ const removed = [];
61
+ const configFile = node_path_1.default.join(projectRoot, '.claude', 'config.json');
62
+ try {
63
+ const content = await promises_1.default.readFile(configFile, 'utf8');
64
+ const parsed = JSON.parse(content);
65
+ if (parsed.mcpServers?.['norescan']) {
66
+ delete parsed.mcpServers['norescan'];
67
+ if (!dryRun)
68
+ await promises_1.default.writeFile(configFile, JSON.stringify(parsed, null, 2), 'utf8');
69
+ removed.push(configFile);
70
+ }
71
+ }
72
+ catch { }
73
+ const claudeMd = node_path_1.default.join(projectRoot, 'CLAUDE.md');
74
+ try {
75
+ const content = await promises_1.default.readFile(claudeMd, 'utf8');
76
+ if (content.includes('<!-- norescan:CLAUDE:START -->')) {
77
+ const cleaned = content.replace(/<!-- norescan:CLAUDE:START -->[\s\S]*?<!-- norescan:CLAUDE:END -->/g, '').trim() + '\n';
78
+ if (!dryRun)
79
+ await promises_1.default.writeFile(claudeMd, cleaned, 'utf8');
80
+ removed.push(claudeMd);
81
+ }
82
+ }
83
+ catch { }
84
+ return removed;
85
+ }
86
+ async validate(projectRoot) {
87
+ try {
88
+ const configFile = node_path_1.default.join(projectRoot, '.claude', 'config.json');
89
+ const content = await promises_1.default.readFile(configFile, 'utf8');
90
+ return content.includes('norescan-mcp');
91
+ }
92
+ catch {
93
+ return false;
94
+ }
95
+ }
96
+ }
97
+ exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
98
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/adapters/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from '../adapter.js';
2
+ export declare class CodexAdapter implements AgentAdapter {
3
+ readonly name = "codex";
4
+ readonly displayName = "OpenAI Codex";
5
+ readonly description = "Sets up CLI workflow instructions in AGENTS.md for OpenAI Codex";
6
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
8
+ validate(projectRoot: string): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,qBAAa,YAAa,YAAW,YAAY;IAC/C,SAAgB,IAAI,WAAW;IAC/B,SAAgB,WAAW,kBAAkB;IAC7C,SAAgB,WAAW,qEAAqE;IAEnF,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsB/D,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CodexAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class CodexAdapter {
10
+ name = 'codex';
11
+ displayName = 'OpenAI Codex';
12
+ description = 'Sets up CLI workflow instructions in AGENTS.md for OpenAI Codex';
13
+ async install(projectRoot, dryRun = false) {
14
+ const agentsMdPath = node_path_1.default.join(projectRoot, 'AGENTS.md');
15
+ const banner = '<!-- norescan:CODEX:START -->';
16
+ let existing = '';
17
+ try {
18
+ existing = await promises_1.default.readFile(agentsMdPath, 'utf8');
19
+ }
20
+ catch { }
21
+ if (!existing.includes(banner)) {
22
+ const instructions = `
23
+ ${banner}
24
+ # norescan Context Protocol for Codex
25
+ Run \`norescan context "<task description>"\` before modifying code to review existing file analyses, dependency blast radius, and architectural decisions.
26
+ <!-- norescan:CODEX:END -->
27
+ `;
28
+ const updated = existing ? `${existing.trim()}\n\n${instructions.trim()}\n` : instructions.trim() + '\n';
29
+ if (!dryRun)
30
+ await promises_1.default.writeFile(agentsMdPath, updated, 'utf8');
31
+ return [agentsMdPath];
32
+ }
33
+ return [];
34
+ }
35
+ async uninstall(projectRoot, dryRun = false) {
36
+ const agentsMdPath = node_path_1.default.join(projectRoot, 'AGENTS.md');
37
+ try {
38
+ const content = await promises_1.default.readFile(agentsMdPath, 'utf8');
39
+ if (content.includes('<!-- norescan:CODEX:START -->')) {
40
+ const cleaned = content.replace(/<!-- norescan:CODEX:START -->[\s\S]*?<!-- norescan:CODEX:END -->/g, '').trim() + '\n';
41
+ if (!dryRun)
42
+ await promises_1.default.writeFile(agentsMdPath, cleaned, 'utf8');
43
+ return [agentsMdPath];
44
+ }
45
+ }
46
+ catch { }
47
+ return [];
48
+ }
49
+ async validate(projectRoot) {
50
+ try {
51
+ const agentsMdPath = node_path_1.default.join(projectRoot, 'AGENTS.md');
52
+ const content = await promises_1.default.readFile(agentsMdPath, 'utf8');
53
+ return content.includes('norescan:CODEX');
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ }
60
+ exports.CodexAdapter = CodexAdapter;
61
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":";;;;;;AACA,gEAAkC;AAClC,0DAA6B;AAE7B,MAAa,YAAY;IACP,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,cAAc,CAAC;IAC7B,WAAW,GAAG,iEAAiE,CAAC;IAEzF,KAAK,CAAC,OAAO,CAAC,WAAmB,EAAE,MAAM,GAAG,KAAK;QACtD,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,+BAA+B,CAAC;QAC/C,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QAEX,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG;EACzB,MAAM;;;;CAIP,CAAC;YACI,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;YACzG,IAAI,CAAC,MAAM;gBAAE,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/D,OAAO,CAAC,YAAY,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,WAAmB,EAAE,MAAM,GAAG,KAAK;QACxD,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;gBACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,mEAAmE,EACnE,EAAE,CACH,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;gBAChB,IAAI,CAAC,MAAM;oBAAE,MAAM,kBAAE,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO,CAAC,YAAY,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAmB;QACvC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AApDD,oCAoDC"}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from '../adapter.js';
2
+ export declare class CursorAdapter implements AgentAdapter {
3
+ readonly name = "cursor";
4
+ readonly displayName = "Cursor / Windsurf";
5
+ readonly description = "Configures Cursor project MCP server in .cursor/mcp.json and rules in .cursor/rules/norescan.mdc";
6
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
8
+ validate(projectRoot: string): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,qBAAa,aAAc,YAAW,YAAY;IAChD,SAAgB,IAAI,YAAY;IAChC,SAAgB,WAAW,uBAAuB;IAClD,SAAgB,WAAW,sGAAsG;IAEpH,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA+C/D,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CursorAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class CursorAdapter {
10
+ name = 'cursor';
11
+ displayName = 'Cursor / Windsurf';
12
+ description = 'Configures Cursor project MCP server in .cursor/mcp.json and rules in .cursor/rules/norescan.mdc';
13
+ async install(projectRoot, dryRun = false) {
14
+ const created = [];
15
+ // 1. .cursor/mcp.json
16
+ const cursorDir = node_path_1.default.join(projectRoot, '.cursor');
17
+ const mcpFile = node_path_1.default.join(cursorDir, 'mcp.json');
18
+ let mcpConfig = { mcpServers: {} };
19
+ try {
20
+ const existing = await promises_1.default.readFile(mcpFile, 'utf8');
21
+ mcpConfig = JSON.parse(existing);
22
+ if (!mcpConfig.mcpServers)
23
+ mcpConfig.mcpServers = {};
24
+ }
25
+ catch { }
26
+ mcpConfig.mcpServers['norescan'] = {
27
+ command: 'norescan-mcp',
28
+ args: [],
29
+ };
30
+ if (!dryRun) {
31
+ await promises_1.default.mkdir(cursorDir, { recursive: true });
32
+ await promises_1.default.writeFile(mcpFile, JSON.stringify(mcpConfig, null, 2), 'utf8');
33
+ }
34
+ created.push(mcpFile);
35
+ // 2. .cursor/rules/norescan.mdc
36
+ const rulesDir = node_path_1.default.join(cursorDir, 'rules');
37
+ const ruleFile = node_path_1.default.join(rulesDir, 'norescan.mdc');
38
+ const ruleContent = `---
39
+ description: norescan Persistent Codebase Memory Rules
40
+ globs: *
41
+ ---
42
+ Before major refactoring or implementing features:
43
+ - Query norescan via MCP tools (get_task_context) to retrieve relevant files and dependencies.
44
+ - Avoid re-analyzing unchanged files when verified cached knowledge is available.
45
+ - Read physical source code before writing edits.
46
+ - Record architectural decisions using record_decision.
47
+ `;
48
+ if (!dryRun) {
49
+ await promises_1.default.mkdir(rulesDir, { recursive: true });
50
+ await promises_1.default.writeFile(ruleFile, ruleContent, 'utf8');
51
+ }
52
+ created.push(ruleFile);
53
+ return created;
54
+ }
55
+ async uninstall(projectRoot, dryRun = false) {
56
+ const removed = [];
57
+ const mcpFile = node_path_1.default.join(projectRoot, '.cursor', 'mcp.json');
58
+ try {
59
+ const content = await promises_1.default.readFile(mcpFile, 'utf8');
60
+ const parsed = JSON.parse(content);
61
+ if (parsed.mcpServers?.['norescan']) {
62
+ delete parsed.mcpServers['norescan'];
63
+ if (!dryRun)
64
+ await promises_1.default.writeFile(mcpFile, JSON.stringify(parsed, null, 2), 'utf8');
65
+ removed.push(mcpFile);
66
+ }
67
+ }
68
+ catch { }
69
+ const ruleFile = node_path_1.default.join(projectRoot, '.cursor', 'rules', 'norescan.mdc');
70
+ try {
71
+ if (!dryRun)
72
+ await promises_1.default.unlink(ruleFile);
73
+ removed.push(ruleFile);
74
+ }
75
+ catch { }
76
+ return removed;
77
+ }
78
+ async validate(projectRoot) {
79
+ try {
80
+ const mcpFile = node_path_1.default.join(projectRoot, '.cursor', 'mcp.json');
81
+ const content = await promises_1.default.readFile(mcpFile, 'utf8');
82
+ return content.includes('norescan-mcp');
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ }
89
+ exports.CursorAdapter = CursorAdapter;
90
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/adapters/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from '../adapter.js';
2
+ export declare class VSCodeAdapter implements AgentAdapter {
3
+ readonly name = "vscode";
4
+ readonly displayName = "VS Code / GitHub Copilot";
5
+ readonly description = "Configures .vscode/mcp.json and .github/copilot-instructions.md";
6
+ install(projectRoot: string, dryRun?: boolean): Promise<string[]>;
7
+ uninstall(projectRoot: string, dryRun?: boolean): Promise<string[]>;
8
+ validate(projectRoot: string): Promise<boolean>;
9
+ }
10
+ //# sourceMappingURL=vscode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.d.ts","sourceRoot":"","sources":["../../src/adapters/vscode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,qBAAa,aAAc,YAAW,YAAY;IAChD,SAAgB,IAAI,YAAY;IAChC,SAAgB,WAAW,8BAA8B;IACzD,SAAgB,WAAW,qEAAqE;IAEnF,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmD/D,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBjE,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAS7D"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.VSCodeAdapter = void 0;
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ class VSCodeAdapter {
10
+ name = 'vscode';
11
+ displayName = 'VS Code / GitHub Copilot';
12
+ description = 'Configures .vscode/mcp.json and .github/copilot-instructions.md';
13
+ async install(projectRoot, dryRun = false) {
14
+ const created = [];
15
+ // 1. .vscode/mcp.json
16
+ const vscodeDir = node_path_1.default.join(projectRoot, '.vscode');
17
+ const mcpFile = node_path_1.default.join(vscodeDir, 'mcp.json');
18
+ let mcpConfig = { mcpServers: {} };
19
+ try {
20
+ const existing = await promises_1.default.readFile(mcpFile, 'utf8');
21
+ mcpConfig = JSON.parse(existing);
22
+ if (!mcpConfig.mcpServers)
23
+ mcpConfig.mcpServers = {};
24
+ }
25
+ catch { }
26
+ mcpConfig.mcpServers['norescan'] = {
27
+ command: 'norescan-mcp',
28
+ args: [],
29
+ };
30
+ if (!dryRun) {
31
+ await promises_1.default.mkdir(vscodeDir, { recursive: true });
32
+ await promises_1.default.writeFile(mcpFile, JSON.stringify(mcpConfig, null, 2), 'utf8');
33
+ }
34
+ created.push(mcpFile);
35
+ // 2. .github/copilot-instructions.md
36
+ const githubDir = node_path_1.default.join(projectRoot, '.github');
37
+ const copilotFile = node_path_1.default.join(githubDir, 'copilot-instructions.md');
38
+ const banner = '<!-- norescan:COPILOT:START -->';
39
+ let existing = '';
40
+ try {
41
+ existing = await promises_1.default.readFile(copilotFile, 'utf8');
42
+ }
43
+ catch { }
44
+ if (!existing.includes(banner)) {
45
+ const instructions = `
46
+ ${banner}
47
+ # norescan Context Protocol
48
+ Query norescan (\`norescan context "<task>"\`) before modifying code to inspect cached structural summaries, routes, and dependency relationships.
49
+ <!-- norescan:COPILOT:END -->
50
+ `;
51
+ const updated = existing ? `${existing.trim()}\n\n${instructions.trim()}\n` : instructions.trim() + '\n';
52
+ if (!dryRun) {
53
+ await promises_1.default.mkdir(githubDir, { recursive: true });
54
+ await promises_1.default.writeFile(copilotFile, updated, 'utf8');
55
+ }
56
+ created.push(copilotFile);
57
+ }
58
+ return created;
59
+ }
60
+ async uninstall(projectRoot, dryRun = false) {
61
+ const removed = [];
62
+ const mcpFile = node_path_1.default.join(projectRoot, '.vscode', 'mcp.json');
63
+ try {
64
+ const content = await promises_1.default.readFile(mcpFile, 'utf8');
65
+ const parsed = JSON.parse(content);
66
+ if (parsed.mcpServers?.['norescan']) {
67
+ delete parsed.mcpServers['norescan'];
68
+ if (!dryRun)
69
+ await promises_1.default.writeFile(mcpFile, JSON.stringify(parsed, null, 2), 'utf8');
70
+ removed.push(mcpFile);
71
+ }
72
+ }
73
+ catch { }
74
+ return removed;
75
+ }
76
+ async validate(projectRoot) {
77
+ try {
78
+ const mcpFile = node_path_1.default.join(projectRoot, '.vscode', 'mcp.json');
79
+ const content = await promises_1.default.readFile(mcpFile, 'utf8');
80
+ return content.includes('norescan-mcp');
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ }
87
+ exports.VSCodeAdapter = VSCodeAdapter;
88
+ //# sourceMappingURL=vscode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vscode.js","sourceRoot":"","sources":["../../src/adapters/vscode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { AgentAdapter } from './adapter.js';
2
+ export * from './adapter.js';
3
+ export * from './adapters/antigravity.js';
4
+ export * from './adapters/cursor.js';
5
+ export * from './adapters/claude.js';
6
+ export * from './adapters/codex.js';
7
+ export * from './adapters/vscode.js';
8
+ export declare function getAdapter(name: string): AgentAdapter | undefined;
9
+ export declare function getAllAdapters(): AgentAdapter[];
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,cAAc,cAAc,CAAC;AAC7B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AAUrC,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEjE;AAED,wBAAgB,cAAc,IAAI,YAAY,EAAE,CAE/C"}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.getAdapter = getAdapter;
18
+ exports.getAllAdapters = getAllAdapters;
19
+ const antigravity_js_1 = require("./adapters/antigravity.js");
20
+ const cursor_js_1 = require("./adapters/cursor.js");
21
+ const claude_js_1 = require("./adapters/claude.js");
22
+ const codex_js_1 = require("./adapters/codex.js");
23
+ const vscode_js_1 = require("./adapters/vscode.js");
24
+ __exportStar(require("./adapter.js"), exports);
25
+ __exportStar(require("./adapters/antigravity.js"), exports);
26
+ __exportStar(require("./adapters/cursor.js"), exports);
27
+ __exportStar(require("./adapters/claude.js"), exports);
28
+ __exportStar(require("./adapters/codex.js"), exports);
29
+ __exportStar(require("./adapters/vscode.js"), exports);
30
+ const ADAPTER_REGISTRY = {
31
+ antigravity: new antigravity_js_1.AntigravityAdapter(),
32
+ cursor: new cursor_js_1.CursorAdapter(),
33
+ 'claude-code': new claude_js_1.ClaudeCodeAdapter(),
34
+ codex: new codex_js_1.CodexAdapter(),
35
+ vscode: new vscode_js_1.VSCodeAdapter(),
36
+ };
37
+ function getAdapter(name) {
38
+ return ADAPTER_REGISTRY[name.toLowerCase()];
39
+ }
40
+ function getAllAdapters() {
41
+ return Object.values(ADAPTER_REGISTRY);
42
+ }
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAsBA,gCAEC;AAED,wCAEC;AA3BD,8DAA+D;AAC/D,oDAAqD;AACrD,oDAAyD;AACzD,kDAAmD;AACnD,oDAAqD;AAErD,+CAA6B;AAC7B,4DAA0C;AAC1C,uDAAqC;AACrC,uDAAqC;AACrC,sDAAoC;AACpC,uDAAqC;AAErC,MAAM,gBAAgB,GAAiC;IACrD,WAAW,EAAE,IAAI,mCAAkB,EAAE;IACrC,MAAM,EAAE,IAAI,yBAAa,EAAE;IAC3B,aAAa,EAAE,IAAI,6BAAiB,EAAE;IACtC,KAAK,EAAE,IAAI,uBAAY,EAAE;IACzB,MAAM,EAAE,IAAI,yBAAa,EAAE;CAC5B,CAAC;AAEF,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,28 @@
1
1
  {
2
2
  "name": "@norescan/agent-adapters",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.1",
4
+ "description": "Universal coding agent configuration adapters and installers for norescan",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "dependencies": {
8
+ "@norescan/shared": "0.1.1"
9
+ },
10
+ "devDependencies": {
11
+ "@types/node": "^22.13.10",
12
+ "typescript": "^5.8.2",
13
+ "vitest": "^3.0.8"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "license": "Apache-2.0",
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "clean": "rimraf dist",
25
+ "typecheck": "tsc --noEmit",
26
+ "test": "vitest run"
27
+ }
6
28
  }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.