@neurcode-ai/cli 0.4.0 → 0.5.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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Watch command - Start the Neurcode Watch service
3
+ *
4
+ * Starts a background service that watches for file changes and records
5
+ * them to support the "Time Machine" feature.
6
+ */
7
+ export declare function watchCommand(): Promise<void>;
8
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAsB,YAAY,kBAmCjC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.watchCommand = watchCommand;
4
+ const Sentinel_1 = require("../services/watch/Sentinel");
5
+ /**
6
+ * Watch command - Start the Neurcode Watch service
7
+ *
8
+ * Starts a background service that watches for file changes and records
9
+ * them to support the "Time Machine" feature.
10
+ */
11
+ async function watchCommand() {
12
+ try {
13
+ // Get project root (current working directory)
14
+ const projectRoot = process.cwd();
15
+ // Create and initialize Sentinel
16
+ const sentinel = new Sentinel_1.Sentinel(projectRoot);
17
+ await sentinel.initialize();
18
+ // Start watching
19
+ await sentinel.start();
20
+ console.log('āœ… Neurcode Watch is running...');
21
+ console.log(' Press Ctrl+C to stop\n');
22
+ // Handle graceful shutdown
23
+ const shutdown = async () => {
24
+ console.log('\nšŸ›‘ Shutting down...');
25
+ await sentinel.stop();
26
+ process.exit(0);
27
+ };
28
+ process.on('SIGINT', shutdown);
29
+ process.on('SIGTERM', shutdown);
30
+ // Keep the process alive
31
+ // The watcher will keep the event loop alive
32
+ }
33
+ catch (error) {
34
+ if (error instanceof Error) {
35
+ console.error('āŒ Error starting watch service:', error.message);
36
+ }
37
+ else {
38
+ console.error('āŒ Unknown error:', error);
39
+ }
40
+ process.exit(1);
41
+ }
42
+ }
43
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":";;AAQA,oCAmCC;AA3CD,yDAAsD;AAEtD;;;;;GAKG;AACI,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,iCAAiC;QACjC,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE5B,iBAAiB;QACjB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEvB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAEzC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,yBAAyB;QACzB,6CAA6C;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ const verify_1 = require("./commands/verify");
14
14
  const config_1 = require("./commands/config");
15
15
  const map_1 = require("./commands/map");
16
16
  const allow_1 = require("./commands/allow");
17
+ const watch_1 = require("./commands/watch");
17
18
  // Read version from package.json
18
19
  let version = '0.1.2'; // fallback
19
20
  try {
@@ -93,6 +94,12 @@ program
93
94
  .action((filePath) => {
94
95
  (0, allow_1.allowCommand)(filePath);
95
96
  });
97
+ program
98
+ .command('watch')
99
+ .description('Start Neurcode Watch - A local background service that records file changes for Time Machine feature')
100
+ .action(() => {
101
+ (0, watch_1.watchCommand)();
102
+ });
96
103
  program
97
104
  .command('verify')
98
105
  .description('Verify plan adherence - Compare current changes against an Architect Plan')
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * BlobStore - Content-Addressable Storage for file content
3
+ *
4
+ * Stores compressed file content in .neurcode/blobs/ directory.
5
+ * Filename is the SHA-256 hash of the content.
6
+ */
7
+ export declare class BlobStore {
8
+ private readonly blobsDir;
9
+ constructor(projectRoot: string);
10
+ /**
11
+ * Initialize the blob store directory
12
+ */
13
+ initialize(): Promise<void>;
14
+ /**
15
+ * Store content and return its hash
16
+ * @param content - The file content to store
17
+ * @returns The SHA-256 hash of the content
18
+ */
19
+ store(content: string): Promise<string>;
20
+ /**
21
+ * Check if a blob exists by hash
22
+ * @param hash - The SHA-256 hash
23
+ * @returns True if the blob exists
24
+ */
25
+ exists(hash: string): Promise<boolean>;
26
+ /**
27
+ * Get the path to a blob by hash
28
+ * @param hash - The SHA-256 hash
29
+ * @returns The full path to the blob file
30
+ */
31
+ getBlobPath(hash: string): string;
32
+ }
33
+ //# sourceMappingURL=BlobStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlobStore.d.ts","sourceRoot":"","sources":["../../../src/services/watch/BlobStore.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB7C;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAGlC"}
@@ -0,0 +1,108 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BlobStore = void 0;
37
+ const crypto_1 = require("crypto");
38
+ const zlib_1 = require("zlib");
39
+ const fs_1 = require("fs");
40
+ const path = __importStar(require("path"));
41
+ const fsExtra = __importStar(require("fs-extra"));
42
+ /**
43
+ * BlobStore - Content-Addressable Storage for file content
44
+ *
45
+ * Stores compressed file content in .neurcode/blobs/ directory.
46
+ * Filename is the SHA-256 hash of the content.
47
+ */
48
+ class BlobStore {
49
+ blobsDir;
50
+ constructor(projectRoot) {
51
+ this.blobsDir = path.join(projectRoot, '.neurcode', 'blobs');
52
+ }
53
+ /**
54
+ * Initialize the blob store directory
55
+ */
56
+ async initialize() {
57
+ await fsExtra.ensureDir(this.blobsDir);
58
+ }
59
+ /**
60
+ * Store content and return its hash
61
+ * @param content - The file content to store
62
+ * @returns The SHA-256 hash of the content
63
+ */
64
+ async store(content) {
65
+ // Compute SHA-256 hash
66
+ const hash = (0, crypto_1.createHash)('sha256').update(content, 'utf8').digest('hex');
67
+ const blobPath = path.join(this.blobsDir, hash);
68
+ // Check if blob already exists
69
+ try {
70
+ await fs_1.promises.access(blobPath);
71
+ // Blob already exists, return hash
72
+ return hash;
73
+ }
74
+ catch {
75
+ // Blob doesn't exist, create it
76
+ }
77
+ // Compress content with GZIP
78
+ const compressed = (0, zlib_1.gzipSync)(Buffer.from(content, 'utf8'));
79
+ // Write compressed content to disk
80
+ await fs_1.promises.writeFile(blobPath, compressed);
81
+ return hash;
82
+ }
83
+ /**
84
+ * Check if a blob exists by hash
85
+ * @param hash - The SHA-256 hash
86
+ * @returns True if the blob exists
87
+ */
88
+ async exists(hash) {
89
+ const blobPath = path.join(this.blobsDir, hash);
90
+ try {
91
+ await fs_1.promises.access(blobPath);
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ }
98
+ /**
99
+ * Get the path to a blob by hash
100
+ * @param hash - The SHA-256 hash
101
+ * @returns The full path to the blob file
102
+ */
103
+ getBlobPath(hash) {
104
+ return path.join(this.blobsDir, hash);
105
+ }
106
+ }
107
+ exports.BlobStore = BlobStore;
108
+ //# sourceMappingURL=BlobStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlobStore.js","sourceRoot":"","sources":["../../../src/services/watch/BlobStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAoC;AACpC,+BAAgC;AAChC,2BAAoC;AACpC,2CAA6B;AAC7B,kDAAoC;AAEpC;;;;;GAKG;AACH,MAAa,SAAS;IACH,QAAQ,CAAS;IAElC,YAAY,WAAmB;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,uBAAuB;QACvB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEhD,+BAA+B;QAC/B,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,mCAAmC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;QAED,6BAA6B;QAC7B,MAAM,UAAU,GAAG,IAAA,eAAQ,EAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAE1D,mCAAmC;QACnC,MAAM,aAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC;CACF;AAjED,8BAiEC"}
@@ -0,0 +1,60 @@
1
+ export interface Session {
2
+ id: string;
3
+ startTime: number;
4
+ }
5
+ export interface Event {
6
+ id?: number;
7
+ sessionId: string;
8
+ filePath: string;
9
+ hash: string;
10
+ timestamp: number;
11
+ }
12
+ /**
13
+ * Journal - SQLite database for tracking file change history
14
+ *
15
+ * Stores sessions and events in .neurcode/history.db
16
+ */
17
+ export declare class Journal {
18
+ private db;
19
+ private readonly dbPath;
20
+ constructor(projectRoot: string);
21
+ /**
22
+ * Initialize database schema
23
+ */
24
+ private initializeSchema;
25
+ /**
26
+ * Create a new session
27
+ * @returns The session ID
28
+ */
29
+ createSession(): string;
30
+ /**
31
+ * Record a file change event
32
+ * @param sessionId - The session ID
33
+ * @param filePath - The path to the changed file
34
+ * @param hash - The SHA-256 hash of the file content
35
+ */
36
+ recordEvent(sessionId: string, filePath: string, hash: string): void;
37
+ /**
38
+ * Get all events for a session
39
+ * @param sessionId - The session ID
40
+ * @returns Array of events
41
+ */
42
+ getSessionEvents(sessionId: string): Event[];
43
+ /**
44
+ * Get all events for a file
45
+ * @param filePath - The file path
46
+ * @returns Array of events
47
+ */
48
+ getFileEvents(filePath: string): Event[];
49
+ /**
50
+ * Get the latest event for a file
51
+ * @param filePath - The file path
52
+ * @returns The latest event or null
53
+ */
54
+ getLatestFileEvent(filePath: string): Event | null;
55
+ /**
56
+ * Close the database connection
57
+ */
58
+ close(): void;
59
+ }
60
+ //# sourceMappingURL=Journal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Journal.d.ts","sourceRoot":"","sources":["../../../src/services/watch/Journal.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAe;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,WAAW,EAAE,MAAM;IAgB/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;;OAGG;IACH,aAAa,IAAI,MAAM;IAavB;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAWpE;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE;IAW5C;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE;IAWxC;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI;IAalD;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,174 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.Journal = void 0;
40
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
41
+ const path = __importStar(require("path"));
42
+ const fsExtra = __importStar(require("fs-extra"));
43
+ const uuid_1 = require("uuid");
44
+ /**
45
+ * Journal - SQLite database for tracking file change history
46
+ *
47
+ * Stores sessions and events in .neurcode/history.db
48
+ */
49
+ class Journal {
50
+ db;
51
+ dbPath;
52
+ constructor(projectRoot) {
53
+ this.dbPath = path.join(projectRoot, '.neurcode', 'history.db');
54
+ // Ensure .neurcode directory exists
55
+ fsExtra.ensureDirSync(path.dirname(this.dbPath));
56
+ // Open database connection
57
+ this.db = new better_sqlite3_1.default(this.dbPath);
58
+ // Enable WAL mode for better performance
59
+ this.db.pragma('journal_mode = WAL');
60
+ // Initialize schema
61
+ this.initializeSchema();
62
+ }
63
+ /**
64
+ * Initialize database schema
65
+ */
66
+ initializeSchema() {
67
+ // Create sessions table
68
+ this.db.exec(`
69
+ CREATE TABLE IF NOT EXISTS sessions (
70
+ id TEXT PRIMARY KEY,
71
+ start_time INTEGER NOT NULL
72
+ )
73
+ `);
74
+ // Create events table
75
+ this.db.exec(`
76
+ CREATE TABLE IF NOT EXISTS events (
77
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
78
+ session_id TEXT NOT NULL,
79
+ file_path TEXT NOT NULL,
80
+ hash TEXT NOT NULL,
81
+ timestamp INTEGER NOT NULL,
82
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
83
+ )
84
+ `);
85
+ // Create index on session_id for faster queries
86
+ this.db.exec(`
87
+ CREATE INDEX IF NOT EXISTS idx_events_session_id ON events(session_id)
88
+ `);
89
+ // Create index on file_path for faster queries
90
+ this.db.exec(`
91
+ CREATE INDEX IF NOT EXISTS idx_events_file_path ON events(file_path)
92
+ `);
93
+ }
94
+ /**
95
+ * Create a new session
96
+ * @returns The session ID
97
+ */
98
+ createSession() {
99
+ const sessionId = (0, uuid_1.v4)();
100
+ const startTime = Date.now();
101
+ const stmt = this.db.prepare(`
102
+ INSERT INTO sessions (id, start_time)
103
+ VALUES (?, ?)
104
+ `);
105
+ stmt.run(sessionId, startTime);
106
+ return sessionId;
107
+ }
108
+ /**
109
+ * Record a file change event
110
+ * @param sessionId - The session ID
111
+ * @param filePath - The path to the changed file
112
+ * @param hash - The SHA-256 hash of the file content
113
+ */
114
+ recordEvent(sessionId, filePath, hash) {
115
+ const timestamp = Date.now();
116
+ const stmt = this.db.prepare(`
117
+ INSERT INTO events (session_id, file_path, hash, timestamp)
118
+ VALUES (?, ?, ?, ?)
119
+ `);
120
+ stmt.run(sessionId, filePath, hash, timestamp);
121
+ }
122
+ /**
123
+ * Get all events for a session
124
+ * @param sessionId - The session ID
125
+ * @returns Array of events
126
+ */
127
+ getSessionEvents(sessionId) {
128
+ const stmt = this.db.prepare(`
129
+ SELECT id, session_id, file_path, hash, timestamp
130
+ FROM events
131
+ WHERE session_id = ?
132
+ ORDER BY timestamp ASC
133
+ `);
134
+ return stmt.all(sessionId);
135
+ }
136
+ /**
137
+ * Get all events for a file
138
+ * @param filePath - The file path
139
+ * @returns Array of events
140
+ */
141
+ getFileEvents(filePath) {
142
+ const stmt = this.db.prepare(`
143
+ SELECT id, session_id, file_path, hash, timestamp
144
+ FROM events
145
+ WHERE file_path = ?
146
+ ORDER BY timestamp DESC
147
+ `);
148
+ return stmt.all(filePath);
149
+ }
150
+ /**
151
+ * Get the latest event for a file
152
+ * @param filePath - The file path
153
+ * @returns The latest event or null
154
+ */
155
+ getLatestFileEvent(filePath) {
156
+ const stmt = this.db.prepare(`
157
+ SELECT id, session_id, file_path, hash, timestamp
158
+ FROM events
159
+ WHERE file_path = ?
160
+ ORDER BY timestamp DESC
161
+ LIMIT 1
162
+ `);
163
+ const result = stmt.get(filePath);
164
+ return result || null;
165
+ }
166
+ /**
167
+ * Close the database connection
168
+ */
169
+ close() {
170
+ this.db.close();
171
+ }
172
+ }
173
+ exports.Journal = Journal;
174
+ //# sourceMappingURL=Journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Journal.js","sourceRoot":"","sources":["../../../src/services/watch/Journal.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oEAAsC;AAEtC,2CAA6B;AAC7B,kDAAoC;AACpC,+BAAoC;AAepC;;;;GAIG;AACH,MAAa,OAAO;IACV,EAAE,CAAe;IACR,MAAM,CAAS;IAEhC,YAAY,WAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;QAEhE,oCAAoC;QACpC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEjD,2BAA2B;QAC3B,IAAI,CAAC,EAAE,GAAG,IAAI,wBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpC,yCAAyC;QACzC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAErC,oBAAoB;QACpB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,wBAAwB;QACxB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;KAKZ,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;KASZ,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;KAEZ,CAAC,CAAC;QAEH,+CAA+C;QAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;;KAEZ,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,SAAiB,EAAE,QAAgB,EAAE,IAAY;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACjD,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,SAAiB;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAY,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,QAAgB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;KAK5B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAY,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,QAAgB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAsB,CAAC;QACvD,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAjJD,0BAiJC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Sentinel - File system watcher that records file changes
3
+ *
4
+ * Watches the project root for file changes, stores content in BlobStore,
5
+ * and records events in Journal. Uses debouncing to prevent high CPU usage.
6
+ */
7
+ export declare class Sentinel {
8
+ private watcher;
9
+ private blobStore;
10
+ private journal;
11
+ private sessionId;
12
+ private projectRoot;
13
+ private debounceTimer;
14
+ private pendingChanges;
15
+ private readonly debounceMs;
16
+ constructor(projectRoot: string);
17
+ /**
18
+ * Initialize the watch service
19
+ */
20
+ initialize(): Promise<void>;
21
+ /**
22
+ * Start watching the project root
23
+ */
24
+ start(): Promise<void>;
25
+ /**
26
+ * Handle a file change event (with debouncing)
27
+ */
28
+ private handleChange;
29
+ /**
30
+ * Process all pending changes after debounce period
31
+ */
32
+ private processPendingChanges;
33
+ /**
34
+ * Stop watching
35
+ */
36
+ stop(): Promise<void>;
37
+ /**
38
+ * Get the current session ID
39
+ */
40
+ getSessionId(): string;
41
+ }
42
+ //# sourceMappingURL=Sentinel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sentinel.d.ts","sourceRoot":"","sources":["../../../src/services/watch/Sentinel.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,cAAc,CAAuD;IAC7E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;gBAEtB,WAAW,EAAE,MAAM;IAO/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC5B;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;YACW,qBAAqB;IAoCnC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B;;OAEG;IACH,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,179 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Sentinel = void 0;
37
+ const chokidar = __importStar(require("chokidar"));
38
+ const path = __importStar(require("path"));
39
+ const fs_1 = require("fs");
40
+ const BlobStore_1 = require("./BlobStore");
41
+ const Journal_1 = require("./Journal");
42
+ /**
43
+ * Sentinel - File system watcher that records file changes
44
+ *
45
+ * Watches the project root for file changes, stores content in BlobStore,
46
+ * and records events in Journal. Uses debouncing to prevent high CPU usage.
47
+ */
48
+ class Sentinel {
49
+ watcher = null;
50
+ blobStore;
51
+ journal;
52
+ sessionId;
53
+ projectRoot;
54
+ debounceTimer = null;
55
+ pendingChanges = new Map();
56
+ debounceMs = 500;
57
+ constructor(projectRoot) {
58
+ this.projectRoot = projectRoot;
59
+ this.blobStore = new BlobStore_1.BlobStore(projectRoot);
60
+ this.journal = new Journal_1.Journal(projectRoot);
61
+ this.sessionId = this.journal.createSession();
62
+ }
63
+ /**
64
+ * Initialize the watch service
65
+ */
66
+ async initialize() {
67
+ await this.blobStore.initialize();
68
+ }
69
+ /**
70
+ * Start watching the project root
71
+ */
72
+ async start() {
73
+ if (this.watcher) {
74
+ throw new Error('Sentinel is already watching');
75
+ }
76
+ // Ignore patterns for common directories and files
77
+ const ignored = [
78
+ '**/.git/**',
79
+ '**/node_modules/**',
80
+ '**/.neurcode/**',
81
+ '**/.next/**',
82
+ '**/dist/**',
83
+ '**/build/**',
84
+ '**/.DS_Store',
85
+ '**/Thumbs.db',
86
+ ];
87
+ this.watcher = chokidar.watch(this.projectRoot, {
88
+ ignored,
89
+ persistent: true,
90
+ ignoreInitial: true, // Don't process existing files on startup
91
+ awaitWriteFinish: {
92
+ stabilityThreshold: 200,
93
+ pollInterval: 100,
94
+ },
95
+ });
96
+ // Handle file changes
97
+ this.watcher.on('add', (filePath) => this.handleChange(filePath, 'add'));
98
+ this.watcher.on('change', (filePath) => this.handleChange(filePath, 'change'));
99
+ this.watcher.on('unlink', (filePath) => this.handleChange(filePath, 'unlink'));
100
+ this.watcher.on('error', (error) => {
101
+ console.error('āŒ Watch error:', error);
102
+ });
103
+ console.log(`šŸ‘ļø Watching: ${this.projectRoot}`);
104
+ console.log(`šŸ“ Session ID: ${this.sessionId}`);
105
+ }
106
+ /**
107
+ * Handle a file change event (with debouncing)
108
+ */
109
+ handleChange(filePath, eventType) {
110
+ // Normalize path relative to project root
111
+ const relativePath = path.relative(this.projectRoot, filePath);
112
+ // Store the most recent event type for this file
113
+ this.pendingChanges.set(relativePath, eventType);
114
+ // Clear existing debounce timer
115
+ if (this.debounceTimer) {
116
+ clearTimeout(this.debounceTimer);
117
+ }
118
+ // Set new debounce timer
119
+ this.debounceTimer = setTimeout(() => {
120
+ this.processPendingChanges();
121
+ }, this.debounceMs);
122
+ }
123
+ /**
124
+ * Process all pending changes after debounce period
125
+ */
126
+ async processPendingChanges() {
127
+ const changes = Array.from(this.pendingChanges.entries());
128
+ this.pendingChanges.clear();
129
+ if (changes.length === 0) {
130
+ return;
131
+ }
132
+ for (const [filePath, eventType] of changes) {
133
+ try {
134
+ if (eventType === 'unlink') {
135
+ // File was deleted - we can't read it, but we can record the deletion
136
+ // For now, we'll skip recording deletions (or record with a special marker)
137
+ continue;
138
+ }
139
+ // Read file content
140
+ const fullPath = path.join(this.projectRoot, filePath);
141
+ const content = await fs_1.promises.readFile(fullPath, 'utf-8');
142
+ // Store content in blob store
143
+ const hash = await this.blobStore.store(content);
144
+ // Record event in journal
145
+ this.journal.recordEvent(this.sessionId, filePath, hash);
146
+ console.log(`šŸ“ Recorded: ${filePath} (${hash.substring(0, 8)}...)`);
147
+ }
148
+ catch (error) {
149
+ // Skip files that can't be read (permissions, binary files, etc.)
150
+ if (error instanceof Error) {
151
+ // Silently skip - this is expected for some files
152
+ }
153
+ }
154
+ }
155
+ }
156
+ /**
157
+ * Stop watching
158
+ */
159
+ async stop() {
160
+ if (this.debounceTimer) {
161
+ clearTimeout(this.debounceTimer);
162
+ this.debounceTimer = null;
163
+ }
164
+ if (this.watcher) {
165
+ await this.watcher.close();
166
+ this.watcher = null;
167
+ }
168
+ this.journal.close();
169
+ console.log('šŸ›‘ Watch stopped');
170
+ }
171
+ /**
172
+ * Get the current session ID
173
+ */
174
+ getSessionId() {
175
+ return this.sessionId;
176
+ }
177
+ }
178
+ exports.Sentinel = Sentinel;
179
+ //# sourceMappingURL=Sentinel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sentinel.js","sourceRoot":"","sources":["../../../src/services/watch/Sentinel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurcode-ai/cli",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Neurcode CLI - AI code governance and diff analysis",
5
5
  "bin": {
6
6
  "neurcode": "./dist/index.js"
@@ -38,17 +38,24 @@
38
38
  "dependencies": {
39
39
  "@neurcode-ai/diff-parser": "^0.1.0",
40
40
  "@neurcode-ai/policy-engine": "^0.1.0",
41
+ "better-sqlite3": "^12.5.0",
41
42
  "chalk": "^4.1.2",
43
+ "chokidar": "^3.6.0",
42
44
  "commander": "^11.1.0",
45
+ "fs-extra": "^11.2.0",
43
46
  "glob": "^10.3.10",
44
- "ts-morph": "^24.0.0"
47
+ "ts-morph": "^24.0.0",
48
+ "uuid": "^9.0.1"
45
49
  },
46
50
  "publishConfig": {
47
51
  "access": "public"
48
52
  },
49
53
  "devDependencies": {
50
- "@types/node": "^20.10.0",
54
+ "@types/better-sqlite3": "^7.6.11",
55
+ "@types/fs-extra": "^11.0.4",
51
56
  "@types/glob": "^8.1.0",
57
+ "@types/node": "^20.10.0",
58
+ "@types/uuid": "^9.0.8",
52
59
  "typescript": "^5.3.0"
53
60
  }
54
61
  }