@pella-labs/pinakes 0.3.4 → 0.3.6
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/dist/cli/audit-wiki.d.ts +14 -0
- package/dist/cli/audit-wiki.d.ts.map +1 -0
- package/dist/cli/audit-wiki.js +187 -0
- package/dist/cli/audit-wiki.js.map +1 -0
- package/dist/cli/audit.d.ts +0 -2
- package/dist/cli/audit.d.ts.map +1 -1
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/contradiction-cli.d.ts +0 -1
- package/dist/cli/contradiction-cli.d.ts.map +1 -1
- package/dist/cli/contradiction-cli.js +3 -5
- package/dist/cli/contradiction-cli.js.map +1 -1
- package/dist/cli/export.d.ts +0 -1
- package/dist/cli/export.d.ts.map +1 -1
- package/dist/cli/export.js.map +1 -1
- package/dist/cli/import.d.ts +0 -1
- package/dist/cli/import.d.ts.map +1 -1
- package/dist/cli/import.js.map +1 -1
- package/dist/cli/index.js +23 -17
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/purge.d.ts +0 -1
- package/dist/cli/purge.d.ts.map +1 -1
- package/dist/cli/purge.js.map +1 -1
- package/dist/cli/rebuild.d.ts +1 -3
- package/dist/cli/rebuild.d.ts.map +1 -1
- package/dist/cli/rebuild.js +1 -1
- package/dist/cli/rebuild.js.map +1 -1
- package/dist/cli/serve.d.ts +1 -3
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +82 -12
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/status.d.ts +0 -2
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/ingest/repo-mirror.d.ts +17 -0
- package/dist/ingest/repo-mirror.d.ts.map +1 -0
- package/dist/ingest/repo-mirror.js +124 -0
- package/dist/ingest/repo-mirror.js.map +1 -0
- package/dist/init/copy.d.ts +18 -0
- package/dist/init/copy.d.ts.map +1 -0
- package/dist/init/copy.js +40 -0
- package/dist/init/copy.js.map +1 -0
- package/dist/init/ignore.d.ts +29 -0
- package/dist/init/ignore.d.ts.map +1 -0
- package/dist/init/ignore.js +206 -0
- package/dist/init/ignore.js.map +1 -0
- package/dist/init/scanner.d.ts +12 -0
- package/dist/init/scanner.d.ts.map +1 -0
- package/dist/init/scanner.js +92 -0
- package/dist/init/scanner.js.map +1 -0
- package/dist/paths.d.ts +19 -6
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +40 -5
- package/dist/paths.js.map +1 -1
- package/dist/server.js +0 -12
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { logger } from '../observability/logger.js';
|
|
4
|
+
// .pinakesignore — filter which repo .md files get copied into the wiki.
|
|
5
|
+
//
|
|
6
|
+
// Supports a subset of .gitignore syntax:
|
|
7
|
+
// dir/ → ignore everything under this top-level directory
|
|
8
|
+
// ** /dir/ → ignore this directory name at any depth
|
|
9
|
+
// ** /dir/** → same as above
|
|
10
|
+
// dir/** → same as dir/
|
|
11
|
+
// filename.md → ignore files with this exact name anywhere
|
|
12
|
+
// *.ext → ignore files with this extension
|
|
13
|
+
// !pattern → re-include a previously ignored pattern
|
|
14
|
+
// # lines → comments
|
|
15
|
+
// blank lines → ignored
|
|
16
|
+
// Built-in defaults — applied before .pinakesignore patterns.
|
|
17
|
+
// These filter out source-code directories whose READMEs are typically
|
|
18
|
+
// boilerplate and not useful project documentation.
|
|
19
|
+
const BUILTIN_IGNORE = `
|
|
20
|
+
# Source code directories — their .md files are usually boilerplate
|
|
21
|
+
**/src/
|
|
22
|
+
**/lib/
|
|
23
|
+
**/pkg/
|
|
24
|
+
**/cmd/
|
|
25
|
+
**/internal/
|
|
26
|
+
**/test/
|
|
27
|
+
**/tests/
|
|
28
|
+
**/spec/
|
|
29
|
+
**/fixtures/
|
|
30
|
+
**/testdata/
|
|
31
|
+
**/mocks/
|
|
32
|
+
**/__tests__/
|
|
33
|
+
**/__mocks__/
|
|
34
|
+
|
|
35
|
+
# Build & tooling
|
|
36
|
+
**/bin/
|
|
37
|
+
**/scripts/
|
|
38
|
+
**/tools/
|
|
39
|
+
**/hack/
|
|
40
|
+
**/.changeset/
|
|
41
|
+
|
|
42
|
+
# Language-specific source trees
|
|
43
|
+
**/crates/
|
|
44
|
+
**/packages/
|
|
45
|
+
**/apps/
|
|
46
|
+
|
|
47
|
+
# UI/frontend source
|
|
48
|
+
**/components/
|
|
49
|
+
**/pages/
|
|
50
|
+
**/views/
|
|
51
|
+
**/layouts/
|
|
52
|
+
**/public/
|
|
53
|
+
|
|
54
|
+
# Examples & evals (usually not core docs)
|
|
55
|
+
**/examples/
|
|
56
|
+
**/evals/
|
|
57
|
+
**/benchmarks/
|
|
58
|
+
**/samples/
|
|
59
|
+
`;
|
|
60
|
+
/**
|
|
61
|
+
* Load ignore patterns from `.pinakesignore` in the project root,
|
|
62
|
+
* merged with built-in defaults. User patterns override defaults.
|
|
63
|
+
*/
|
|
64
|
+
export function loadIgnorePatterns(projectRoot) {
|
|
65
|
+
const patterns = [];
|
|
66
|
+
// Built-in defaults first
|
|
67
|
+
patterns.push(...parsePatterns(BUILTIN_IGNORE));
|
|
68
|
+
// User overrides from .pinakesignore
|
|
69
|
+
const ignorePath = resolve(projectRoot, '.pinakesignore');
|
|
70
|
+
if (existsSync(ignorePath)) {
|
|
71
|
+
const content = readFileSync(ignorePath, 'utf-8');
|
|
72
|
+
patterns.push(...parsePatterns(content));
|
|
73
|
+
}
|
|
74
|
+
return patterns;
|
|
75
|
+
}
|
|
76
|
+
const DEFAULT_PINAKESIGNORE = `# .pinakesignore — controls which repo .md files get copied into the wiki.
|
|
77
|
+
# Uses .gitignore-style patterns. Built-in defaults already exclude common
|
|
78
|
+
# source directories (src/, bin/, crates/, examples/, etc.).
|
|
79
|
+
# Add project-specific patterns below.
|
|
80
|
+
|
|
81
|
+
# To re-include a directory excluded by defaults, use negation:
|
|
82
|
+
# !**/src/
|
|
83
|
+
|
|
84
|
+
# Project-specific ignores:
|
|
85
|
+
`;
|
|
86
|
+
/**
|
|
87
|
+
* Create a default `.pinakesignore` in the project root if one doesn't exist.
|
|
88
|
+
* Called during serve startup alongside .gitignore generation.
|
|
89
|
+
*/
|
|
90
|
+
export function ensurePinakesIgnoreFile(projectRoot) {
|
|
91
|
+
const ignorePath = resolve(projectRoot, '.pinakesignore');
|
|
92
|
+
if (existsSync(ignorePath))
|
|
93
|
+
return;
|
|
94
|
+
writeFileSync(ignorePath, DEFAULT_PINAKESIGNORE, 'utf-8');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Remove wiki files that match the current ignore patterns.
|
|
98
|
+
* Called when `.pinakesignore` changes to clean up previously-copied files.
|
|
99
|
+
*/
|
|
100
|
+
export function cleanIgnoredFromWiki(_projectRoot, wikiRoot, patterns) {
|
|
101
|
+
let removed = 0;
|
|
102
|
+
function walkWiki(dir) {
|
|
103
|
+
let entries;
|
|
104
|
+
try {
|
|
105
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
for (const entry of entries) {
|
|
111
|
+
const full = join(dir, entry.name);
|
|
112
|
+
if (entry.isDirectory()) {
|
|
113
|
+
walkWiki(full);
|
|
114
|
+
// Clean up empty dirs after removing files
|
|
115
|
+
try {
|
|
116
|
+
const remaining = readdirSync(full);
|
|
117
|
+
if (remaining.length === 0)
|
|
118
|
+
rmSync(full, { recursive: true });
|
|
119
|
+
}
|
|
120
|
+
catch { /* ignore */ }
|
|
121
|
+
}
|
|
122
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
123
|
+
const relFromWiki = relative(wikiRoot, full);
|
|
124
|
+
if (shouldIgnore(relFromWiki, patterns)) {
|
|
125
|
+
rmSync(full);
|
|
126
|
+
removed++;
|
|
127
|
+
logger.debug({ path: relFromWiki }, 'removed ignored file from wiki');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
walkWiki(wikiRoot);
|
|
133
|
+
return removed;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if a relative path should be ignored based on the patterns.
|
|
137
|
+
* Later patterns (including negations) override earlier ones.
|
|
138
|
+
*/
|
|
139
|
+
export function shouldIgnore(relativePath, patterns) {
|
|
140
|
+
// Normalize: ensure forward slashes, no leading ./
|
|
141
|
+
const normalized = relativePath.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
142
|
+
let ignored = false;
|
|
143
|
+
for (const pattern of patterns) {
|
|
144
|
+
if (pattern.test(normalized)) {
|
|
145
|
+
ignored = !pattern.negate;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return ignored;
|
|
149
|
+
}
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Pattern parsing
|
|
152
|
+
// ---------------------------------------------------------------------------
|
|
153
|
+
function parsePatterns(content) {
|
|
154
|
+
const patterns = [];
|
|
155
|
+
for (let line of content.split('\n')) {
|
|
156
|
+
line = line.trim();
|
|
157
|
+
if (line === '' || line.startsWith('#'))
|
|
158
|
+
continue;
|
|
159
|
+
const negate = line.startsWith('!');
|
|
160
|
+
const raw = line;
|
|
161
|
+
if (negate)
|
|
162
|
+
line = line.slice(1);
|
|
163
|
+
const test = compilePattern(line);
|
|
164
|
+
if (test) {
|
|
165
|
+
patterns.push({ raw, negate, test });
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return patterns;
|
|
169
|
+
}
|
|
170
|
+
function compilePattern(pattern) {
|
|
171
|
+
// `**/dir/` or `**/dir/**` → directory name anywhere in path
|
|
172
|
+
const anyDirMatch = pattern.match(/^\*\*\/([^/*]+)\/(\*\*)?$/);
|
|
173
|
+
if (anyDirMatch) {
|
|
174
|
+
const dirName = anyDirMatch[1];
|
|
175
|
+
return (p) => {
|
|
176
|
+
const segments = p.split('/');
|
|
177
|
+
// Check if any segment (except the last, which is the filename) matches
|
|
178
|
+
return segments.slice(0, -1).includes(dirName);
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// `dir/` or `dir/**` → top-level directory
|
|
182
|
+
const topDirMatch = pattern.match(/^([^/*]+)\/(\*\*)?$/);
|
|
183
|
+
if (topDirMatch) {
|
|
184
|
+
const dirName = topDirMatch[1];
|
|
185
|
+
return (p) => p.startsWith(dirName + '/');
|
|
186
|
+
}
|
|
187
|
+
// `*.ext` → extension match
|
|
188
|
+
if (pattern.startsWith('*.') && !pattern.includes('/')) {
|
|
189
|
+
const ext = pattern.slice(1); // includes the dot
|
|
190
|
+
return (p) => p.endsWith(ext);
|
|
191
|
+
}
|
|
192
|
+
// `filename` (no slashes, no wildcards) → basename match anywhere
|
|
193
|
+
if (!pattern.includes('/') && !pattern.includes('*')) {
|
|
194
|
+
return (p) => basename(p) === pattern;
|
|
195
|
+
}
|
|
196
|
+
// `dir/subdir/` → prefix match
|
|
197
|
+
if (pattern.endsWith('/') && !pattern.includes('*')) {
|
|
198
|
+
return (p) => p.startsWith(pattern) || p.startsWith(pattern.slice(0, -1) + '/');
|
|
199
|
+
}
|
|
200
|
+
// Fallback: treat as a prefix
|
|
201
|
+
if (!pattern.includes('*')) {
|
|
202
|
+
return (p) => p.startsWith(pattern) || p === pattern;
|
|
203
|
+
}
|
|
204
|
+
return null; // unsupported pattern — skip silently
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../src/init/ignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan a project directory for markdown files, respecting .gitignore
|
|
3
|
+
* and `.pinakesignore`.
|
|
4
|
+
*
|
|
5
|
+
* Primary strategy: `git ls-files` (fast, respects .gitignore).
|
|
6
|
+
* Fallback: recursive walk with hardcoded excludes (non-git repos).
|
|
7
|
+
* Both paths filter results through `.pinakesignore` + built-in defaults.
|
|
8
|
+
*
|
|
9
|
+
* Returns absolute paths, sorted deterministically.
|
|
10
|
+
*/
|
|
11
|
+
export declare function scanRepoMarkdownFiles(projectRoot: string): string[];
|
|
12
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/init/scanner.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BnE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { readdirSync } from 'node:fs';
|
|
3
|
+
import { relative, resolve } from 'node:path';
|
|
4
|
+
import { logger } from '../observability/logger.js';
|
|
5
|
+
import { loadIgnorePatterns, shouldIgnore } from './ignore.js';
|
|
6
|
+
/**
|
|
7
|
+
* Scan a project directory for markdown files, respecting .gitignore
|
|
8
|
+
* and `.pinakesignore`.
|
|
9
|
+
*
|
|
10
|
+
* Primary strategy: `git ls-files` (fast, respects .gitignore).
|
|
11
|
+
* Fallback: recursive walk with hardcoded excludes (non-git repos).
|
|
12
|
+
* Both paths filter results through `.pinakesignore` + built-in defaults.
|
|
13
|
+
*
|
|
14
|
+
* Returns absolute paths, sorted deterministically.
|
|
15
|
+
*/
|
|
16
|
+
export function scanRepoMarkdownFiles(projectRoot) {
|
|
17
|
+
const absRoot = resolve(projectRoot);
|
|
18
|
+
const patterns = loadIgnorePatterns(absRoot);
|
|
19
|
+
let files;
|
|
20
|
+
try {
|
|
21
|
+
files = scanViaGit(absRoot);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
logger.debug({ projectRoot }, 'git ls-files failed, falling back to recursive walk');
|
|
25
|
+
files = scanViaWalk(absRoot);
|
|
26
|
+
}
|
|
27
|
+
// Apply .pinakesignore filtering
|
|
28
|
+
const filtered = files.filter((absPath) => {
|
|
29
|
+
const rel = relative(absRoot, absPath);
|
|
30
|
+
return !shouldIgnore(rel, patterns);
|
|
31
|
+
});
|
|
32
|
+
if (filtered.length < files.length) {
|
|
33
|
+
logger.info({ total: files.length, kept: filtered.length, ignored: files.length - filtered.length }, '.pinakesignore: filtered repo markdown files');
|
|
34
|
+
}
|
|
35
|
+
return filtered;
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Git-based scan
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
function scanViaGit(projectRoot) {
|
|
41
|
+
const stdout = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard', '--', '*.md'], { cwd: projectRoot, encoding: 'utf-8', timeout: 10_000, maxBuffer: 4 * 1024 * 1024 });
|
|
42
|
+
return stdout
|
|
43
|
+
.split('\n')
|
|
44
|
+
.map((l) => l.trim())
|
|
45
|
+
.filter((l) => l.length > 0)
|
|
46
|
+
.filter((l) => !l.startsWith('.pinakes/'))
|
|
47
|
+
.map((rel) => resolve(projectRoot, rel))
|
|
48
|
+
.sort();
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Fallback recursive walk
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
const WALK_EXCLUDES = new Set([
|
|
54
|
+
'.git',
|
|
55
|
+
'.pinakes',
|
|
56
|
+
'node_modules',
|
|
57
|
+
'dist',
|
|
58
|
+
'build',
|
|
59
|
+
'coverage',
|
|
60
|
+
'.next',
|
|
61
|
+
'.nuxt',
|
|
62
|
+
'vendor',
|
|
63
|
+
'__pycache__',
|
|
64
|
+
'.tox',
|
|
65
|
+
'target',
|
|
66
|
+
]);
|
|
67
|
+
function scanViaWalk(projectRoot) {
|
|
68
|
+
const results = [];
|
|
69
|
+
walkDir(projectRoot, projectRoot, results);
|
|
70
|
+
return results.sort();
|
|
71
|
+
}
|
|
72
|
+
function walkDir(dir, projectRoot, results) {
|
|
73
|
+
let entries;
|
|
74
|
+
try {
|
|
75
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return; // permission denied, symlink loop, etc.
|
|
79
|
+
}
|
|
80
|
+
for (const entry of entries) {
|
|
81
|
+
if (WALK_EXCLUDES.has(entry.name))
|
|
82
|
+
continue;
|
|
83
|
+
const full = resolve(dir, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
walkDir(full, projectRoot, results);
|
|
86
|
+
}
|
|
87
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
88
|
+
results.push(full);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/init/scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Centralized path resolution for Pinakes.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Project wiki lives in-repo at `<projectRoot>/.pinakes/wiki/` (committed to
|
|
5
|
+
* git, team-shared). Index files (DB, manifest, audit) live under the
|
|
6
|
+
* centralized `~/.pinakes/projects/<mangled>/` directory (not committed).
|
|
7
|
+
* Personal data lives directly under `~/.pinakes/`.
|
|
8
8
|
*
|
|
9
9
|
* Layout:
|
|
10
|
+
* <projectRoot>/.pinakes/
|
|
11
|
+
* wiki/ # project wiki (committed)
|
|
12
|
+
* .gitignore # auto-generated (committed)
|
|
13
|
+
*
|
|
10
14
|
* ~/.pinakes/
|
|
11
15
|
* wiki/ # personal wiki
|
|
12
16
|
* pinakes.db # personal DB
|
|
@@ -14,7 +18,6 @@
|
|
|
14
18
|
* manifest.json # personal manifest
|
|
15
19
|
* projects/
|
|
16
20
|
* -Users-sebastian-dev-myproject/ # mangled project root
|
|
17
|
-
* wiki/ # project wiki
|
|
18
21
|
* pinakes.db # project DB
|
|
19
22
|
* audit.jsonl # project audit
|
|
20
23
|
* manifest.json # project manifest
|
|
@@ -40,6 +43,11 @@ export declare function pinakesRoot(): string;
|
|
|
40
43
|
*/
|
|
41
44
|
export declare function projectDataDir(projectRoot: string): string;
|
|
42
45
|
export declare function projectWikiPath(projectRoot: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Legacy wiki path (pre-v0.3): `~/.pinakes/projects/<mangled>/wiki/`.
|
|
48
|
+
* Used only by the migration function in serve.ts.
|
|
49
|
+
*/
|
|
50
|
+
export declare function legacyProjectWikiPath(projectRoot: string): string;
|
|
43
51
|
export declare function projectDbPath(projectRoot: string): string;
|
|
44
52
|
export declare function projectAuditJsonlPath(projectRoot: string): string;
|
|
45
53
|
export declare function projectManifestPath(projectRoot: string): string;
|
|
@@ -50,9 +58,14 @@ export declare function personalManifestPath(): string;
|
|
|
50
58
|
export interface CliPathOverrides {
|
|
51
59
|
projectRoot?: string;
|
|
52
60
|
dbPath?: string;
|
|
53
|
-
wikiPath?: string;
|
|
54
61
|
profileDbPath?: string;
|
|
55
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Ensure `<projectRoot>/.pinakes/.gitignore` exists so the DB, manifest, and
|
|
65
|
+
* audit files are never accidentally committed. Idempotent — skips if file
|
|
66
|
+
* already exists.
|
|
67
|
+
*/
|
|
68
|
+
export declare function ensurePinakesGitignore(projectRoot: string): void;
|
|
56
69
|
/**
|
|
57
70
|
* Resolve the DB path for a given scope, honoring CLI overrides.
|
|
58
71
|
* Shared by all CLI subcommands (status, audit, export, import, purge, etc.)
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE9D;AAMD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAIpC;AAMD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE/D;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAMD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAMhE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,SAAS,GAAG,UAAU,GAC5B,MAAM,CAOR"}
|
package/dist/paths.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Centralized path resolution for Pinakes.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Project wiki lives in-repo at `<projectRoot>/.pinakes/wiki/` (committed to
|
|
5
|
+
* git, team-shared). Index files (DB, manifest, audit) live under the
|
|
6
|
+
* centralized `~/.pinakes/projects/<mangled>/` directory (not committed).
|
|
7
|
+
* Personal data lives directly under `~/.pinakes/`.
|
|
8
8
|
*
|
|
9
9
|
* Layout:
|
|
10
|
+
* <projectRoot>/.pinakes/
|
|
11
|
+
* wiki/ # project wiki (committed)
|
|
12
|
+
* .gitignore # auto-generated (committed)
|
|
13
|
+
*
|
|
10
14
|
* ~/.pinakes/
|
|
11
15
|
* wiki/ # personal wiki
|
|
12
16
|
* pinakes.db # personal DB
|
|
@@ -14,11 +18,11 @@
|
|
|
14
18
|
* manifest.json # personal manifest
|
|
15
19
|
* projects/
|
|
16
20
|
* -Users-sebastian-dev-myproject/ # mangled project root
|
|
17
|
-
* wiki/ # project wiki
|
|
18
21
|
* pinakes.db # project DB
|
|
19
22
|
* audit.jsonl # project audit
|
|
20
23
|
* manifest.json # project manifest
|
|
21
24
|
*/
|
|
25
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
22
26
|
import { homedir } from 'node:os';
|
|
23
27
|
import { isAbsolute, resolve } from 'node:path';
|
|
24
28
|
// ---------------------------------------------------------------------------
|
|
@@ -63,6 +67,13 @@ export function projectDataDir(projectRoot) {
|
|
|
63
67
|
return resolve(pinakesRoot(), 'projects', mangleProjectPath(abs));
|
|
64
68
|
}
|
|
65
69
|
export function projectWikiPath(projectRoot) {
|
|
70
|
+
return resolve(resolveAbs(projectRoot), '.pinakes', 'wiki');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Legacy wiki path (pre-v0.3): `~/.pinakes/projects/<mangled>/wiki/`.
|
|
74
|
+
* Used only by the migration function in serve.ts.
|
|
75
|
+
*/
|
|
76
|
+
export function legacyProjectWikiPath(projectRoot) {
|
|
66
77
|
return resolve(projectDataDir(projectRoot), 'wiki');
|
|
67
78
|
}
|
|
68
79
|
export function projectDbPath(projectRoot) {
|
|
@@ -89,6 +100,30 @@ export function personalAuditJsonlPath() {
|
|
|
89
100
|
export function personalManifestPath() {
|
|
90
101
|
return resolve(pinakesRoot(), 'manifest.json');
|
|
91
102
|
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// .gitignore auto-generation
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
const PINAKES_GITIGNORE_CONTENT = `# Pinakes index files — NOT committed to git
|
|
107
|
+
# The wiki/ directory IS committed (shared team knowledge)
|
|
108
|
+
pinakes.db
|
|
109
|
+
manifest.json
|
|
110
|
+
audit.jsonl
|
|
111
|
+
*.db-wal
|
|
112
|
+
*.db-shm
|
|
113
|
+
`;
|
|
114
|
+
/**
|
|
115
|
+
* Ensure `<projectRoot>/.pinakes/.gitignore` exists so the DB, manifest, and
|
|
116
|
+
* audit files are never accidentally committed. Idempotent — skips if file
|
|
117
|
+
* already exists.
|
|
118
|
+
*/
|
|
119
|
+
export function ensurePinakesGitignore(projectRoot) {
|
|
120
|
+
const pinakesDir = resolve(resolveAbs(projectRoot), '.pinakes');
|
|
121
|
+
const gitignorePath = resolve(pinakesDir, '.gitignore');
|
|
122
|
+
if (existsSync(gitignorePath))
|
|
123
|
+
return;
|
|
124
|
+
mkdirSync(pinakesDir, { recursive: true });
|
|
125
|
+
writeFileSync(gitignorePath, PINAKES_GITIGNORE_CONTENT, 'utf-8');
|
|
126
|
+
}
|
|
92
127
|
/**
|
|
93
128
|
* Resolve the DB path for a given scope, honoring CLI overrides.
|
|
94
129
|
* Shared by all CLI subcommands (status, audit, export, import, purge, etc.)
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -3,10 +3,6 @@ import { serveCommand } from './cli/serve.js';
|
|
|
3
3
|
import { logger } from './observability/logger.js';
|
|
4
4
|
function parseArgs(argv) {
|
|
5
5
|
const out = {};
|
|
6
|
-
// Legacy env support — PINAKES_WIKI_PATH still works as wiki path override
|
|
7
|
-
if (process.env.PINAKES_WIKI_PATH) {
|
|
8
|
-
out.wikiPath = process.env.PINAKES_WIKI_PATH;
|
|
9
|
-
}
|
|
10
6
|
for (let i = 0; i < argv.length; i++) {
|
|
11
7
|
const arg = argv[i];
|
|
12
8
|
if (!arg)
|
|
@@ -18,13 +14,6 @@ function parseArgs(argv) {
|
|
|
18
14
|
else if (arg.startsWith('--project-root=')) {
|
|
19
15
|
out.projectRoot = arg.slice('--project-root='.length);
|
|
20
16
|
}
|
|
21
|
-
else if (arg === '--wiki-path' && argv[i + 1]) {
|
|
22
|
-
out.wikiPath = argv[i + 1];
|
|
23
|
-
i++;
|
|
24
|
-
}
|
|
25
|
-
else if (arg.startsWith('--wiki-path=')) {
|
|
26
|
-
out.wikiPath = arg.slice('--wiki-path='.length);
|
|
27
|
-
}
|
|
28
17
|
else if (arg === '--db-path' && argv[i + 1]) {
|
|
29
18
|
out.dbPath = argv[i + 1];
|
|
30
19
|
i++;
|
|
@@ -53,7 +42,6 @@ async function main() {
|
|
|
53
42
|
const args = parseArgs(process.argv.slice(2));
|
|
54
43
|
await serveCommand({
|
|
55
44
|
projectRoot: args.projectRoot,
|
|
56
|
-
wikiPath: args.wikiPath,
|
|
57
45
|
dbPath: args.dbPath,
|
|
58
46
|
profilePath: args.profilePath,
|
|
59
47
|
profileDbPath: args.profileDbPath,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AA2BnD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pella-labs/pinakes",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.6",
|
|
4
4
|
"description": "Local stdio MCP server that indexes a Karpathy-style two-level knowledge wiki into SQLite and exposes it to a coding LLM via Cloudflare-style code-mode.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|