geomind 0.1.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,130 @@
1
+ import { buildPsqlCommand, loadConfig, } from "../config.js";
2
+ function buildDatabaseSection(config) {
3
+ const psqlConnection = buildPsqlCommand(config);
4
+ if (!config.psql || !psqlConnection)
5
+ return "";
6
+ return `### 1. PostgreSQL / PostGIS Database Access
7
+
8
+ You can access the geospatial database using psql:
9
+
10
+ \`\`\`bash
11
+ ${psqlConnection} --no-psqlrc -c "YOUR SQL HERE"
12
+ \`\`\`
13
+
14
+ **Connection info:**
15
+ - Database: ${config.psql.database}
16
+ - Command: \`${psqlConnection}\`
17
+ - You have READ-ONLY access. Do NOT attempt INSERT, UPDATE, DELETE, DROP, or any write operations.
18
+
19
+ **Exploration strategy:**
20
+ When exploring the database, follow this order:
21
+ 1. List schemas: \`\\dn\`
22
+ 2. List tables: \`\\dt\` or \`\\dt schema_name.*\`
23
+ 3. View table structure: \`\\d table_name\`
24
+ 4. Check spatial columns: \`SELECT * FROM geometry_columns;\`
25
+ 5. Check SRID: \`SELECT ST_SRID(geom) FROM table_name LIMIT 1;\`
26
+ 6. Sample data: \`SELECT * FROM table_name LIMIT 5;\`
27
+ 7. Count rows: \`SELECT COUNT(*) FROM table_name;\`
28
+
29
+ **Important:**
30
+ - Always use \`--no-psqlrc\` flag to avoid custom formatting: \`${psqlConnection} --no-psqlrc -c "..."\`
31
+ - For long outputs, pipe to head: \`${psqlConnection} --no-psqlrc -c "..." | head -50\`
32
+ - When column semantics are unclear, ASK THE USER instead of guessing.
33
+ `;
34
+ }
35
+ function buildQgisSection(config, sectionNumber) {
36
+ if (!config.qgis_process?.available || !config.qgis_process.path)
37
+ return "";
38
+ const qgisProcessPath = config.qgis_process.path;
39
+ return `### ${sectionNumber}. QGIS Processing (Spatial Analysis)
40
+
41
+ You can perform spatial analysis using qgis_process:
42
+
43
+ \`\`\`bash
44
+ ${qgisProcessPath} run algorithm_id -- PARAM1=value1 PARAM2=value2
45
+ \`\`\`
46
+
47
+ **Common operations:**
48
+ - Buffer: \`${qgisProcessPath} run native:buffer -- INPUT=input.shp DISTANCE=1000 OUTPUT=output.shp\`
49
+ - Clip: \`${qgisProcessPath} run native:clip -- INPUT=input.shp OVERLAY=clip.shp OUTPUT=output.shp\`
50
+ - List algorithms: \`${qgisProcessPath} list\`
51
+ - Get help: \`${qgisProcessPath} help algorithm_id\`
52
+
53
+ **Tips:**
54
+ - Use \`--json\` flag for structured output
55
+ - Use \`--no-python --skip-loading-plugins\` for faster startup when python plugins aren't needed
56
+ - Export PostGIS data to file first, then process with qgis_process
57
+ `;
58
+ }
59
+ function buildWorkflow(config) {
60
+ const steps = [
61
+ "**Receive user request** in natural language",
62
+ "**Check memory** for relevant prior knowledge",
63
+ ];
64
+ if (config.psql) {
65
+ steps.push("**Explore database** if needed (using psql)", "**Ask user** if you encounter ambiguity", "**Generate and execute SQL** to retrieve data");
66
+ }
67
+ else {
68
+ steps.push("**Ask the user to run /setup** if database access is needed");
69
+ }
70
+ if (config.qgis_process?.available && config.qgis_process.path) {
71
+ steps.push("**Perform analysis** if needed (using qgis_process)");
72
+ }
73
+ steps.push("**Present results** to the user", "**Update memory** with new knowledge learned");
74
+ return steps.map((step, index) => `${index + 1}. ${step}`).join("\n");
75
+ }
76
+ export function getSystemPrompt(config = loadConfig()) {
77
+ const databaseSection = buildDatabaseSection(config);
78
+ const qgisSection = buildQgisSection(config, databaseSection ? 2 : 1);
79
+ const memorySectionNumber = 1 + Number(Boolean(databaseSection)) + Number(Boolean(qgisSection));
80
+ const workflow = buildWorkflow(config);
81
+ return `# GeoMind - Geospatial Analysis Agent
82
+
83
+ You are GeoMind, an intelligent geospatial analysis agent. You have autonomous data cognition and persistent memory capabilities. You help users explore geospatial databases, execute spatial queries, and perform GIS analysis.
84
+
85
+ ## Your Identity
86
+
87
+ You are like a capable intern working under the user's guidance. You explore data independently, but when you encounter something you don't understand (ambiguous column names, unclear spatial semantics, unknown data sources), you **proactively ask the user** rather than guessing.
88
+
89
+ ## Available Tools
90
+
91
+ ${databaseSection}${qgisSection}### ${memorySectionNumber}. Memory System
92
+
93
+ You have a persistent memory system with exactly 6 fixed memory files.
94
+
95
+ **Database memory keys:**
96
+ - \`database/schema-overview\`: 数据库整体概览(有哪些表、各表用途一句话总结)
97
+ - \`database/table-details\`: 各表详细结构(列名、类型、SRID、数据量、重要字段含义)
98
+ - \`database/query-patterns\`: 有用的 SQL 模式、踩过的坑
99
+
100
+ **User memory keys:**
101
+ - \`user/profile\`: 用户身份(姓名、职业、研究背景)
102
+ - \`user/preferences\`: 用户偏好(常用区域、分析习惯、展示偏好)
103
+ - \`user/corrections\`: 用户纠错记录
104
+
105
+ **Memory tools:**
106
+ - **memory_list**: See which fixed memory files exist and when they were updated
107
+ - **memory_read**: Read one fixed memory file before updating it
108
+ - **memory_write**: Overwrite one fixed memory file with complete merged content
109
+
110
+ **When to write memory:**
111
+ - When you learn something new about the database (table purpose, column meaning, SRID)
112
+ - When the user corrects you or provides clarification
113
+ - When you notice user preferences or patterns
114
+ - During memory reflection, first list memories, then read existing content, merge new information, and write the full updated content back
115
+
116
+ ## Workflow
117
+
118
+ ${workflow}
119
+
120
+ ## Guidelines
121
+
122
+ - Be proactive in exploring but conservative in assumptions
123
+ - When unsure about data semantics, ASK rather than guess
124
+ - Always explain what you're doing and why
125
+ - After completing a task, briefly reflect on what you learned
126
+ - Prefer simple, readable SQL over complex queries
127
+ - When exporting spatial data, default to GeoJSON format unless user specifies otherwise
128
+ `;
129
+ }
130
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/prompts/system.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,UAAU,GAEX,MAAM,cAAc,CAAC;AAEtB,SAAS,oBAAoB,CAAC,MAAqB;IACjD,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAE/C,OAAO;;;;;EAKP,cAAc;;;;cAIF,MAAM,CAAC,IAAI,CAAC,QAAQ;eACnB,cAAc;;;;;;;;;;;;;;kEAcqC,cAAc;sCAC1C,cAAc;;CAEnD,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB,EAAE,aAAqB;IACpE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAE5E,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;IAEjD,OAAO,OAAO,aAAa;;;;;EAK3B,eAAe;;;;cAIH,eAAe;YACjB,eAAe;uBACJ,eAAe;gBACtB,eAAe;;;;;;CAM9B,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,MAAqB;IAC1C,MAAM,KAAK,GAAG;QACZ,8CAA8C;QAC9C,+CAA+C;KAChD,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CACR,6CAA6C,EAC7C,yCAAyC,EACzC,+CAA+C,CAChD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,EAAE,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CACR,iCAAiC,EACjC,8CAA8C,CAC/C,CAAC;IAEF,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAwB,UAAU,EAAE;IAClE,MAAM,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,OAAO;;;;;;;;;;EAUP,eAAe,GAAG,WAAW,OAAO,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BvD,QAAQ;;;;;;;;;;CAUT,CAAC;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type ConfigScope, type GeoMindConfig } from "./config.js";
2
+ export interface SetupPrompter {
3
+ input(prompt: string, placeholder?: string): Promise<string | undefined>;
4
+ confirm(title: string, message: string): Promise<boolean>;
5
+ notify(message: string, type?: "info" | "warning" | "error"): void;
6
+ }
7
+ export declare function findExecutable(command: string): string | undefined;
8
+ export declare function getQgisSearchPaths(): string[];
9
+ export declare function detectQgisProcess(): NonNullable<GeoMindConfig["qgis_process"]>;
10
+ export declare function ensureRuntimeEnvironment(cwd?: string): boolean;
11
+ export declare function runSetup(cwd?: string, options?: {
12
+ scope?: ConfigScope;
13
+ prompter?: SetupPrompter;
14
+ }): Promise<GeoMindConfig>;
15
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,aAAa,EAInB,MAAM,aAAa,CAAC;AAWrB,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAC;CACpE;AAgBD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKlE;AA+ID,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAkB7C;AAOD,wBAAgB,iBAAiB,IAAI,WAAW,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAmB9E;AAED,wBAAgB,wBAAwB,CAAC,GAAG,SAAgB,WAI3D;AAED,wBAAsB,QAAQ,CAC5B,GAAG,SAAgB,EACnB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;CAAO,0BA8BhE"}
package/dist/setup.js ADDED
@@ -0,0 +1,227 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import * as fs from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { createInterface } from "node:readline/promises";
5
+ import { stdin as input, stdout as output } from "node:process";
6
+ import { ensureGlobalLayout, ensureProjectLayout, loadConfig, migrateLegacyPiAuth, writeConfig, } from "./config.js";
7
+ const SETUP_PROMPT_TIMEOUT_MS = 30_000;
8
+ const LOCAL_HOSTS = new Set(["", "localhost", "127.0.0.1", "::1"]);
9
+ function runCommand(command, args, timeout = 5_000) {
10
+ const result = spawnSync(command, args, {
11
+ encoding: "utf-8",
12
+ timeout,
13
+ shell: false,
14
+ });
15
+ return {
16
+ ok: result.status === 0,
17
+ stdout: result.stdout?.toString() ?? "",
18
+ stderr: result.stderr?.toString() ?? "",
19
+ };
20
+ }
21
+ export function findExecutable(command) {
22
+ const lookupCommand = process.platform === "win32" ? "where" : "which";
23
+ const result = runCommand(lookupCommand, [command]);
24
+ if (!result.ok)
25
+ return undefined;
26
+ return result.stdout.trim().split(/\r?\n/)[0] || undefined;
27
+ }
28
+ function parseDatabaseList(outputText) {
29
+ const names = outputText
30
+ .split(/\r?\n/)
31
+ .map((line) => line.split("|")[0]?.trim())
32
+ .filter((name) => Boolean(name));
33
+ return [...new Set(names)].sort((a, b) => a.localeCompare(b));
34
+ }
35
+ function chooseDefaultDatabase(databases) {
36
+ if (databases.includes("ggai"))
37
+ return "ggai";
38
+ if (databases.includes("postgres"))
39
+ return "postgres";
40
+ return databases.find((name) => !name.startsWith("template")) ?? "ggai";
41
+ }
42
+ function isLocalHost(host) {
43
+ return LOCAL_HOSTS.has(host?.trim().toLowerCase() ?? "");
44
+ }
45
+ function parsePort(value) {
46
+ if (!value?.trim())
47
+ return undefined;
48
+ const port = Number(value.trim());
49
+ return Number.isInteger(port) && port > 0 ? port : undefined;
50
+ }
51
+ function getPsqlListArgs(config) {
52
+ const args = ["-lqt"];
53
+ if (config?.host) {
54
+ args.push("-h", config.host);
55
+ }
56
+ if (config?.port) {
57
+ args.push("-p", String(config.port));
58
+ }
59
+ if (config?.user) {
60
+ args.push("-U", config.user);
61
+ }
62
+ return args;
63
+ }
64
+ async function askWithTimeout(prompt) {
65
+ const rl = createInterface({ input, output });
66
+ let timeout;
67
+ try {
68
+ return await Promise.race([
69
+ rl.question(prompt),
70
+ new Promise((resolve) => {
71
+ timeout = setTimeout(() => resolve(undefined), SETUP_PROMPT_TIMEOUT_MS);
72
+ }),
73
+ ]);
74
+ }
75
+ finally {
76
+ if (timeout)
77
+ clearTimeout(timeout);
78
+ rl.close();
79
+ }
80
+ }
81
+ function createCliPrompter() {
82
+ return {
83
+ async input(prompt, placeholder) {
84
+ if (!process.stdin.isTTY)
85
+ return undefined;
86
+ const suffix = placeholder ? ` [${placeholder}]` : "";
87
+ return askWithTimeout(`${prompt}${suffix}: `);
88
+ },
89
+ async confirm(title, message) {
90
+ if (!process.stdin.isTTY)
91
+ return true;
92
+ console.log(`\n${title}`);
93
+ const answer = await askWithTimeout(`${message} [Y/n]: `);
94
+ return !answer || !/^n(o)?$/i.test(answer.trim());
95
+ },
96
+ notify(message, type = "info") {
97
+ const prefix = type === "error" ? "Error" : type === "warning" ? "Warning" : "Info";
98
+ console.log(`${prefix}: ${message}`);
99
+ },
100
+ };
101
+ }
102
+ async function selectDatabase(prompter, psqlCommand, partialConfig) {
103
+ if (!partialConfig || !isLocalHost(partialConfig.host)) {
104
+ const database = await prompter.input("请输入数据库名", "ggai");
105
+ return database?.trim() || "ggai";
106
+ }
107
+ const listResult = runCommand(psqlCommand, getPsqlListArgs(partialConfig), 8_000);
108
+ const databases = listResult.ok ? parseDatabaseList(listResult.stdout) : [];
109
+ const defaultDatabase = chooseDefaultDatabase(databases);
110
+ if (!listResult.ok && listResult.stderr.trim()) {
111
+ prompter.notify(`数据库列表读取失败:${listResult.stderr.trim()}`, "warning");
112
+ }
113
+ if (databases.length > 0) {
114
+ prompter.notify(`检测到数据库:${databases.join(", ")}`);
115
+ }
116
+ const answer = await prompter.input("请选择数据库序号或输入数据库名", defaultDatabase);
117
+ const trimmed = answer?.trim();
118
+ if (!trimmed)
119
+ return defaultDatabase;
120
+ const selectedIndex = Number(trimmed);
121
+ if (Number.isInteger(selectedIndex) && selectedIndex >= 1 && selectedIndex <= databases.length) {
122
+ return databases[selectedIndex - 1];
123
+ }
124
+ return trimmed;
125
+ }
126
+ async function collectPsqlConfig(prompter) {
127
+ const detectedPsql = findExecutable("psql");
128
+ const commandAnswer = await prompter.input("请输入 psql 命令或完整路径", detectedPsql ?? "psql");
129
+ const command = commandAnswer?.trim() || detectedPsql || "psql";
130
+ const hostAnswer = await prompter.input("请输入数据库 host,留空表示本机", "localhost");
131
+ const host = hostAnswer?.trim();
132
+ const portAnswer = await prompter.input("请输入数据库端口,留空使用默认端口", "5432");
133
+ const port = parsePort(portAnswer);
134
+ const userAnswer = await prompter.input("请输入数据库用户名,留空使用当前系统用户");
135
+ const user = userAnswer?.trim();
136
+ const partialConfig = {
137
+ command,
138
+ database: "ggai",
139
+ host: host && host !== "localhost" ? host : undefined,
140
+ port,
141
+ user: user || undefined,
142
+ };
143
+ const database = await selectDatabase(prompter, command, partialConfig);
144
+ return {
145
+ ...partialConfig,
146
+ database,
147
+ };
148
+ }
149
+ export function getQgisSearchPaths() {
150
+ if (process.platform === "win32") {
151
+ return [
152
+ "C:\\Program Files\\QGIS 3.40\\bin\\qgis_process.exe",
153
+ "C:\\Program Files\\QGIS 3.38\\bin\\qgis_process.exe",
154
+ "C:\\Program Files\\QGIS 3.34\\bin\\qgis_process.exe",
155
+ "C:\\OSGeo4W\\bin\\qgis_process.exe",
156
+ ];
157
+ }
158
+ if (process.platform === "darwin") {
159
+ return [
160
+ "/Applications/QGIS-LTR.app/Contents/MacOS/bin/qgis_process",
161
+ "/Applications/QGIS.app/Contents/MacOS/bin/qgis_process",
162
+ ];
163
+ }
164
+ return ["/usr/bin/qgis_process", "/usr/local/bin/qgis_process"];
165
+ }
166
+ function verifyQgisProcess(candidate) {
167
+ if (!fs.existsSync(candidate))
168
+ return false;
169
+ return runCommand(candidate, ["--version"], 5_000).ok;
170
+ }
171
+ export function detectQgisProcess() {
172
+ const candidates = [
173
+ findExecutable(process.platform === "win32" ? "qgis_process.exe" : "qgis_process"),
174
+ ...getQgisSearchPaths(),
175
+ ].filter((candidate) => Boolean(candidate));
176
+ for (const candidate of [...new Set(candidates)]) {
177
+ if (verifyQgisProcess(candidate)) {
178
+ return {
179
+ path: candidate,
180
+ available: true,
181
+ };
182
+ }
183
+ }
184
+ return {
185
+ path: "",
186
+ available: false,
187
+ };
188
+ }
189
+ export function ensureRuntimeEnvironment(cwd = process.cwd()) {
190
+ ensureGlobalLayout();
191
+ ensureProjectLayout(cwd);
192
+ return migrateLegacyPiAuth();
193
+ }
194
+ export async function runSetup(cwd = process.cwd(), options = {}) {
195
+ ensureRuntimeEnvironment(cwd);
196
+ const prompter = options.prompter ?? createCliPrompter();
197
+ const useGlobal = options.scope === "global" ||
198
+ (!options.scope &&
199
+ (await prompter.confirm("配置保存位置", "是否将配置保存为全局?全局配置会在所有目录下生效")));
200
+ const scope = useGlobal ? "global" : "project";
201
+ prompter.notify("开始配置 GeoMind。");
202
+ const psql = await collectPsqlConfig(prompter);
203
+ const qgisProcess = detectQgisProcess();
204
+ if (!qgisProcess.available) {
205
+ prompter.notify("未检测到 qgis_process。GeoMind 仍可正常启动。", "warning");
206
+ }
207
+ const nextConfig = {
208
+ psql,
209
+ qgis_process: qgisProcess,
210
+ };
211
+ writeConfig(nextConfig, cwd, scope);
212
+ prompter.notify(`配置已保存到${scope === "global" ? "全局" : "当前工程"} config.json。`);
213
+ return loadConfig(cwd);
214
+ }
215
+ const currentFile = fileURLToPath(import.meta.url);
216
+ if (process.argv[1] === currentFile) {
217
+ const scope = process.argv.includes("--global")
218
+ ? "global"
219
+ : process.argv.includes("--project")
220
+ ? "project"
221
+ : undefined;
222
+ runSetup(process.cwd(), { scope }).catch((error) => {
223
+ console.error(error instanceof Error ? error.message : String(error));
224
+ process.exit(1);
225
+ });
226
+ }
227
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "geomind",
3
+ "version": "0.1.0",
4
+ "description": "GeoMind - A geospatial analysis agent with autonomous data cognition and persistent memory",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "geomind": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc && node scripts/ensure-shebang.js",
12
+ "prepack": "npm run build",
13
+ "dev": "tsx src/index.ts",
14
+ "setup": "tsx src/setup.ts",
15
+ "start": "node dist/index.js"
16
+ },
17
+ "files": [
18
+ "dist/",
19
+ ".geomind/extensions/"
20
+ ],
21
+ "keywords": [
22
+ "geospatial",
23
+ "agent",
24
+ "postgis",
25
+ "psql",
26
+ "qgis",
27
+ "nlsql"
28
+ ],
29
+ "license": "MIT",
30
+ "piConfig": {
31
+ "name": "geomind"
32
+ },
33
+ "dependencies": {
34
+ "@earendil-works/pi-coding-agent": "^0.79.4",
35
+ "typebox": "^1.2.10"
36
+ },
37
+ "devDependencies": {
38
+ "tsx": "^4.22.4",
39
+ "typescript": "^6.0.3"
40
+ }
41
+ }