brains-mcp 1.61.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +95 -0
- package/dist/access/projectShares.d.ts +48 -0
- package/dist/access/projectShares.d.ts.map +1 -0
- package/dist/access/projectShares.js +203 -0
- package/dist/access/projectShares.js.map +1 -0
- package/dist/access/sharedInstructionsNote.d.ts +37 -0
- package/dist/access/sharedInstructionsNote.d.ts.map +1 -0
- package/dist/access/sharedInstructionsNote.js +76 -0
- package/dist/access/sharedInstructionsNote.js.map +1 -0
- package/dist/admin/seedUsers.d.ts +23 -0
- package/dist/admin/seedUsers.d.ts.map +1 -0
- package/dist/admin/seedUsers.js +168 -0
- package/dist/admin/seedUsers.js.map +1 -0
- package/dist/api/openapi.d.ts +2 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +942 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/auth/clientStore.d.ts +43 -0
- package/dist/auth/clientStore.d.ts.map +1 -0
- package/dist/auth/clientStore.js +168 -0
- package/dist/auth/clientStore.js.map +1 -0
- package/dist/auth/deleteAccount.d.ts +34 -0
- package/dist/auth/deleteAccount.d.ts.map +1 -0
- package/dist/auth/deleteAccount.js +203 -0
- package/dist/auth/deleteAccount.js.map +1 -0
- package/dist/auth/oauth.d.ts +118 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +491 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/patStore.d.ts +87 -0
- package/dist/auth/patStore.d.ts.map +1 -0
- package/dist/auth/patStore.js +308 -0
- package/dist/auth/patStore.js.map +1 -0
- package/dist/auth/supabase.d.ts +15 -0
- package/dist/auth/supabase.d.ts.map +1 -0
- package/dist/auth/supabase.js +66 -0
- package/dist/auth/supabase.js.map +1 -0
- package/dist/auth/tokenStore.d.ts +73 -0
- package/dist/auth/tokenStore.d.ts.map +1 -0
- package/dist/auth/tokenStore.js +261 -0
- package/dist/auth/tokenStore.js.map +1 -0
- package/dist/backup/drive.d.ts +24 -0
- package/dist/backup/drive.d.ts.map +1 -0
- package/dist/backup/drive.js +70 -0
- package/dist/backup/drive.js.map +1 -0
- package/dist/billing/tierStore.d.ts +59 -0
- package/dist/billing/tierStore.d.ts.map +1 -0
- package/dist/billing/tierStore.js +152 -0
- package/dist/billing/tierStore.js.map +1 -0
- package/dist/digest/activityDigest.d.ts +32 -0
- package/dist/digest/activityDigest.d.ts.map +1 -0
- package/dist/digest/activityDigest.js +299 -0
- package/dist/digest/activityDigest.js.map +1 -0
- package/dist/digest/digestCron.d.ts +40 -0
- package/dist/digest/digestCron.d.ts.map +1 -0
- package/dist/digest/digestCron.js +146 -0
- package/dist/digest/digestCron.js.map +1 -0
- package/dist/digest/digestPreferences.d.ts +25 -0
- package/dist/digest/digestPreferences.d.ts.map +1 -0
- package/dist/digest/digestPreferences.js +79 -0
- package/dist/digest/digestPreferences.js.map +1 -0
- package/dist/digest/emailSender.d.ts +20 -0
- package/dist/digest/emailSender.d.ts.map +1 -0
- package/dist/digest/emailSender.js +35 -0
- package/dist/digest/emailSender.js.map +1 -0
- package/dist/drive/client.d.ts +43 -0
- package/dist/drive/client.d.ts.map +1 -0
- package/dist/drive/client.js +282 -0
- package/dist/drive/client.js.map +1 -0
- package/dist/drive/errors.d.ts +27 -0
- package/dist/drive/errors.d.ts.map +1 -0
- package/dist/drive/errors.js +51 -0
- package/dist/drive/errors.js.map +1 -0
- package/dist/drive/fileCache.d.ts +22 -0
- package/dist/drive/fileCache.d.ts.map +1 -0
- package/dist/drive/fileCache.js +57 -0
- package/dist/drive/fileCache.js.map +1 -0
- package/dist/governance/accessControl.d.ts +87 -0
- package/dist/governance/accessControl.d.ts.map +1 -0
- package/dist/governance/accessControl.js +179 -0
- package/dist/governance/accessControl.js.map +1 -0
- package/dist/html/components.d.ts +8 -0
- package/dist/html/components.d.ts.map +1 -0
- package/dist/html/components.js +19 -0
- package/dist/html/components.js.map +1 -0
- package/dist/html/layout.d.ts +7 -0
- package/dist/html/layout.d.ts.map +1 -0
- package/dist/html/layout.js +24 -0
- package/dist/html/layout.js.map +1 -0
- package/dist/html/metricsUi.d.ts +8 -0
- package/dist/html/metricsUi.d.ts.map +1 -0
- package/dist/html/metricsUi.js +271 -0
- package/dist/html/metricsUi.js.map +1 -0
- package/dist/httpServer.d.ts +19 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +3913 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/asyncJobRegistry.d.ts +30 -0
- package/dist/jobs/asyncJobRegistry.d.ts.map +1 -0
- package/dist/jobs/asyncJobRegistry.js +70 -0
- package/dist/jobs/asyncJobRegistry.js.map +1 -0
- package/dist/observability/metricsQuery.d.ts +41 -0
- package/dist/observability/metricsQuery.d.ts.map +1 -0
- package/dist/observability/metricsQuery.js +106 -0
- package/dist/observability/metricsQuery.js.map +1 -0
- package/dist/observability/relevanceSignal.d.ts +26 -0
- package/dist/observability/relevanceSignal.d.ts.map +1 -0
- package/dist/observability/relevanceSignal.js +95 -0
- package/dist/observability/relevanceSignal.js.map +1 -0
- package/dist/observability/requestEvents.d.ts +31 -0
- package/dist/observability/requestEvents.d.ts.map +1 -0
- package/dist/observability/requestEvents.js +54 -0
- package/dist/observability/requestEvents.js.map +1 -0
- package/dist/observability/slowQueryAlert.d.ts +25 -0
- package/dist/observability/slowQueryAlert.d.ts.map +1 -0
- package/dist/observability/slowQueryAlert.js +67 -0
- package/dist/observability/slowQueryAlert.js.map +1 -0
- package/dist/observability/zeroResultTriage.d.ts +22 -0
- package/dist/observability/zeroResultTriage.d.ts.map +1 -0
- package/dist/observability/zeroResultTriage.js +116 -0
- package/dist/observability/zeroResultTriage.js.map +1 -0
- package/dist/search/embeddings.d.ts +31 -0
- package/dist/search/embeddings.d.ts.map +1 -0
- package/dist/search/embeddings.js +91 -0
- package/dist/search/embeddings.js.map +1 -0
- package/dist/search/fileWatcher.d.ts +28 -0
- package/dist/search/fileWatcher.d.ts.map +1 -0
- package/dist/search/fileWatcher.js +103 -0
- package/dist/search/fileWatcher.js.map +1 -0
- package/dist/search/hotQueryCache.d.ts +31 -0
- package/dist/search/hotQueryCache.d.ts.map +1 -0
- package/dist/search/hotQueryCache.js +103 -0
- package/dist/search/hotQueryCache.js.map +1 -0
- package/dist/search/postgresIndex.d.ts +439 -0
- package/dist/search/postgresIndex.d.ts.map +1 -0
- package/dist/search/postgresIndex.js +1610 -0
- package/dist/search/postgresIndex.js.map +1 -0
- package/dist/search/sqliteIndex.d.ts +66 -0
- package/dist/search/sqliteIndex.d.ts.map +1 -0
- package/dist/search/sqliteIndex.js +342 -0
- package/dist/search/sqliteIndex.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +532 -0
- package/dist/server.js.map +1 -0
- package/dist/session/bundle.d.ts +53 -0
- package/dist/session/bundle.d.ts.map +1 -0
- package/dist/session/bundle.js +97 -0
- package/dist/session/bundle.js.map +1 -0
- package/dist/storage/client.d.ts +157 -0
- package/dist/storage/client.d.ts.map +1 -0
- package/dist/storage/client.js +825 -0
- package/dist/storage/client.js.map +1 -0
- package/dist/tools/addWebhookPattern.d.ts +15 -0
- package/dist/tools/addWebhookPattern.d.ts.map +1 -0
- package/dist/tools/addWebhookPattern.js +15 -0
- package/dist/tools/addWebhookPattern.js.map +1 -0
- package/dist/tools/appendLog.d.ts +18 -0
- package/dist/tools/appendLog.d.ts.map +1 -0
- package/dist/tools/appendLog.js +18 -0
- package/dist/tools/appendLog.js.map +1 -0
- package/dist/tools/auditIndex.d.ts +15 -0
- package/dist/tools/auditIndex.d.ts.map +1 -0
- package/dist/tools/auditIndex.js +165 -0
- package/dist/tools/auditIndex.js.map +1 -0
- package/dist/tools/batchDeletePages.d.ts +18 -0
- package/dist/tools/batchDeletePages.d.ts.map +1 -0
- package/dist/tools/batchDeletePages.js +143 -0
- package/dist/tools/batchDeletePages.js.map +1 -0
- package/dist/tools/coerce.d.ts +3 -0
- package/dist/tools/coerce.d.ts.map +1 -0
- package/dist/tools/coerce.js +12 -0
- package/dist/tools/coerce.js.map +1 -0
- package/dist/tools/createPage.d.ts +24 -0
- package/dist/tools/createPage.d.ts.map +1 -0
- package/dist/tools/createPage.js +99 -0
- package/dist/tools/createPage.js.map +1 -0
- package/dist/tools/createPages.d.ts +51 -0
- package/dist/tools/createPages.d.ts.map +1 -0
- package/dist/tools/createPages.js +91 -0
- package/dist/tools/createPages.js.map +1 -0
- package/dist/tools/deletePage.d.ts +19 -0
- package/dist/tools/deletePage.d.ts.map +1 -0
- package/dist/tools/deletePage.js +127 -0
- package/dist/tools/deletePage.js.map +1 -0
- package/dist/tools/exportWiki.d.ts +48 -0
- package/dist/tools/exportWiki.d.ts.map +1 -0
- package/dist/tools/exportWiki.js +233 -0
- package/dist/tools/exportWiki.js.map +1 -0
- package/dist/tools/extractLinks.d.ts +14 -0
- package/dist/tools/extractLinks.d.ts.map +1 -0
- package/dist/tools/extractLinks.js +25 -0
- package/dist/tools/extractLinks.js.map +1 -0
- package/dist/tools/generateClaudeInstructions.d.ts +27 -0
- package/dist/tools/generateClaudeInstructions.d.ts.map +1 -0
- package/dist/tools/generateClaudeInstructions.js +263 -0
- package/dist/tools/generateClaudeInstructions.js.map +1 -0
- package/dist/tools/generateGptInstructions.d.ts +27 -0
- package/dist/tools/generateGptInstructions.d.ts.map +1 -0
- package/dist/tools/generateGptInstructions.js +208 -0
- package/dist/tools/generateGptInstructions.js.map +1 -0
- package/dist/tools/getBacklinks.d.ts +12 -0
- package/dist/tools/getBacklinks.d.ts.map +1 -0
- package/dist/tools/getBacklinks.js +13 -0
- package/dist/tools/getBacklinks.js.map +1 -0
- package/dist/tools/getRelated.d.ts +12 -0
- package/dist/tools/getRelated.d.ts.map +1 -0
- package/dist/tools/getRelated.js +13 -0
- package/dist/tools/getRelated.js.map +1 -0
- package/dist/tools/healthCheck.d.ts +5 -0
- package/dist/tools/healthCheck.d.ts.map +1 -0
- package/dist/tools/healthCheck.js +167 -0
- package/dist/tools/healthCheck.js.map +1 -0
- package/dist/tools/importBrainSource.d.ts +36 -0
- package/dist/tools/importBrainSource.d.ts.map +1 -0
- package/dist/tools/importBrainSource.js +314 -0
- package/dist/tools/importBrainSource.js.map +1 -0
- package/dist/tools/importWikiZip.d.ts +60 -0
- package/dist/tools/importWikiZip.d.ts.map +1 -0
- package/dist/tools/importWikiZip.js +379 -0
- package/dist/tools/importWikiZip.js.map +1 -0
- package/dist/tools/initProject.d.ts +34 -0
- package/dist/tools/initProject.d.ts.map +1 -0
- package/dist/tools/initProject.js +443 -0
- package/dist/tools/initProject.js.map +1 -0
- package/dist/tools/instructionContext.d.ts +60 -0
- package/dist/tools/instructionContext.d.ts.map +1 -0
- package/dist/tools/instructionContext.js +210 -0
- package/dist/tools/instructionContext.js.map +1 -0
- package/dist/tools/listArchivedPages.d.ts +17 -0
- package/dist/tools/listArchivedPages.d.ts.map +1 -0
- package/dist/tools/listArchivedPages.js +51 -0
- package/dist/tools/listArchivedPages.js.map +1 -0
- package/dist/tools/listPages.d.ts +28 -0
- package/dist/tools/listPages.d.ts.map +1 -0
- package/dist/tools/listPages.js +166 -0
- package/dist/tools/listPages.js.map +1 -0
- package/dist/tools/listWebhooks.d.ts +7 -0
- package/dist/tools/listWebhooks.d.ts.map +1 -0
- package/dist/tools/listWebhooks.js +10 -0
- package/dist/tools/listWebhooks.js.map +1 -0
- package/dist/tools/movePage.d.ts +18 -0
- package/dist/tools/movePage.d.ts.map +1 -0
- package/dist/tools/movePage.js +182 -0
- package/dist/tools/movePage.js.map +1 -0
- package/dist/tools/pageHistory.d.ts +36 -0
- package/dist/tools/pageHistory.d.ts.map +1 -0
- package/dist/tools/pageHistory.js +60 -0
- package/dist/tools/pageHistory.js.map +1 -0
- package/dist/tools/patchPage.d.ts +141 -0
- package/dist/tools/patchPage.d.ts.map +1 -0
- package/dist/tools/patchPage.js +287 -0
- package/dist/tools/patchPage.js.map +1 -0
- package/dist/tools/pullSessionBundle.d.ts +34 -0
- package/dist/tools/pullSessionBundle.d.ts.map +1 -0
- package/dist/tools/pullSessionBundle.js +432 -0
- package/dist/tools/pullSessionBundle.js.map +1 -0
- package/dist/tools/purgeWiki.d.ts +23 -0
- package/dist/tools/purgeWiki.d.ts.map +1 -0
- package/dist/tools/purgeWiki.js +113 -0
- package/dist/tools/purgeWiki.js.map +1 -0
- package/dist/tools/pushSessionBundle.d.ts +139 -0
- package/dist/tools/pushSessionBundle.d.ts.map +1 -0
- package/dist/tools/pushSessionBundle.js +282 -0
- package/dist/tools/pushSessionBundle.js.map +1 -0
- package/dist/tools/readGovernanceAudit.d.ts +17 -0
- package/dist/tools/readGovernanceAudit.d.ts.map +1 -0
- package/dist/tools/readGovernanceAudit.js +21 -0
- package/dist/tools/readGovernanceAudit.js.map +1 -0
- package/dist/tools/readPage.d.ts +13 -0
- package/dist/tools/readPage.d.ts.map +1 -0
- package/dist/tools/readPage.js +46 -0
- package/dist/tools/readPage.js.map +1 -0
- package/dist/tools/removeWebhook.d.ts +14 -0
- package/dist/tools/removeWebhook.d.ts.map +1 -0
- package/dist/tools/removeWebhook.js +12 -0
- package/dist/tools/removeWebhook.js.map +1 -0
- package/dist/tools/resolveProject.d.ts +58 -0
- package/dist/tools/resolveProject.d.ts.map +1 -0
- package/dist/tools/resolveProject.js +175 -0
- package/dist/tools/resolveProject.js.map +1 -0
- package/dist/tools/restorePage.d.ts +47 -0
- package/dist/tools/restorePage.d.ts.map +1 -0
- package/dist/tools/restorePage.js +111 -0
- package/dist/tools/restorePage.js.map +1 -0
- package/dist/tools/searchPages.d.ts +28 -0
- package/dist/tools/searchPages.d.ts.map +1 -0
- package/dist/tools/searchPages.js +372 -0
- package/dist/tools/searchPages.js.map +1 -0
- package/dist/tools/setWebhook.d.ts +30 -0
- package/dist/tools/setWebhook.d.ts.map +1 -0
- package/dist/tools/setWebhook.js +30 -0
- package/dist/tools/setWebhook.js.map +1 -0
- package/dist/tools/shareProject.d.ts +25 -0
- package/dist/tools/shareProject.d.ts.map +1 -0
- package/dist/tools/shareProject.js +56 -0
- package/dist/tools/shareProject.js.map +1 -0
- package/dist/tools/suggestLinks.d.ts +29 -0
- package/dist/tools/suggestLinks.d.ts.map +1 -0
- package/dist/tools/suggestLinks.js +214 -0
- package/dist/tools/suggestLinks.js.map +1 -0
- package/dist/tools/updatePage.d.ts +27 -0
- package/dist/tools/updatePage.d.ts.map +1 -0
- package/dist/tools/updatePage.js +118 -0
- package/dist/tools/updatePage.js.map +1 -0
- package/dist/webhooks/dispatch.d.ts +49 -0
- package/dist/webhooks/dispatch.d.ts.map +1 -0
- package/dist/webhooks/dispatch.js +159 -0
- package/dist/webhooks/dispatch.js.map +1 -0
- package/dist/webhooks/webhookRules.d.ts +34 -0
- package/dist/webhooks/webhookRules.d.ts.map +1 -0
- package/dist/webhooks/webhookRules.js +129 -0
- package/dist/webhooks/webhookRules.js.map +1 -0
- package/dist/wiki/frontmatter.d.ts +45 -0
- package/dist/wiki/frontmatter.d.ts.map +1 -0
- package/dist/wiki/frontmatter.js +68 -0
- package/dist/wiki/frontmatter.js.map +1 -0
- package/dist/wiki/index.d.ts +22 -0
- package/dist/wiki/index.d.ts.map +1 -0
- package/dist/wiki/index.js +203 -0
- package/dist/wiki/index.js.map +1 -0
- package/dist/wiki/ingestPolicy.d.ts +18 -0
- package/dist/wiki/ingestPolicy.d.ts.map +1 -0
- package/dist/wiki/ingestPolicy.js +64 -0
- package/dist/wiki/ingestPolicy.js.map +1 -0
- package/dist/wiki/layoutLint.d.ts +51 -0
- package/dist/wiki/layoutLint.d.ts.map +1 -0
- package/dist/wiki/layoutLint.js +146 -0
- package/dist/wiki/layoutLint.js.map +1 -0
- package/dist/wiki/links.d.ts +6 -0
- package/dist/wiki/links.d.ts.map +1 -0
- package/dist/wiki/links.js +45 -0
- package/dist/wiki/links.js.map +1 -0
- package/dist/wiki/log.d.ts +58 -0
- package/dist/wiki/log.d.ts.map +1 -0
- package/dist/wiki/log.js +126 -0
- package/dist/wiki/log.js.map +1 -0
- package/dist/wiki/path.d.ts +8 -0
- package/dist/wiki/path.d.ts.map +1 -0
- package/dist/wiki/path.js +25 -0
- package/dist/wiki/path.js.map +1 -0
- package/dist/wiki/storageLimits.d.ts +163 -0
- package/dist/wiki/storageLimits.d.ts.map +1 -0
- package/dist/wiki/storageLimits.js +281 -0
- package/dist/wiki/storageLimits.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { resolveIndexOwnerSubject } from "../storage/client.js";
|
|
6
|
+
import { parsePage } from "../wiki/frontmatter.js";
|
|
7
|
+
import { getPostgresSearchIndex } from "../search/postgresIndex.js";
|
|
8
|
+
import { DriveNotFoundError } from "../drive/errors.js";
|
|
9
|
+
import { appendLogEntry } from "../wiki/log.js";
|
|
10
|
+
import { generateClaudeInstructions, generateClaudeInstructionsInputSchema, } from "./generateClaudeInstructions.js";
|
|
11
|
+
import { generateGptInstructions, generateGptInstructionsInputSchema, } from "./generateGptInstructions.js";
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
const SEED_DIR = path.resolve(__dirname, "../../seed/instructions");
|
|
15
|
+
const FOUNDATION_SEEDS = [
|
|
16
|
+
"agent-instruction-schema-v1.md",
|
|
17
|
+
"agent-instruction-template-v1.md",
|
|
18
|
+
"brain-routing.md",
|
|
19
|
+
"brain-structure.md",
|
|
20
|
+
"brains-protocol.md",
|
|
21
|
+
"structure-audit.md",
|
|
22
|
+
"session-sync-ritual.md",
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Cross-project trackers. These live at the **brain root**, not under
|
|
26
|
+
* `projects/`.
|
|
27
|
+
*
|
|
28
|
+
* They used to be created at `projects/active-*.md`, which breaks
|
|
29
|
+
* brain-structure.md invariant 1 — `projects/` holds only `<slug>/` folders
|
|
30
|
+
* plus a single `readme.md`, and cross-project trackers belong at the root.
|
|
31
|
+
* structure-audit.md's sanctioned root set already lists `active-*.md`, so
|
|
32
|
+
* every wiki `init_project` touched was seeded into a state its own linter
|
|
33
|
+
* flags.
|
|
34
|
+
*/
|
|
35
|
+
const ACTIVE_TRACKING_PAGES = [
|
|
36
|
+
"active-open-loops.md",
|
|
37
|
+
"active-unanswered-questions.md",
|
|
38
|
+
"active-next-actions.md",
|
|
39
|
+
"decisions/core-decisions-log.md",
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Where each tracker was created before the paths were corrected.
|
|
43
|
+
*
|
|
44
|
+
* Existing wikis carry the legacy copies and there is no migration here — if
|
|
45
|
+
* one is present we keep using it rather than creating a root twin, because
|
|
46
|
+
* two pages holding the same tracker is invariant 5 (diverged duplicates),
|
|
47
|
+
* which is worse than one page at a non-compliant path. Move the legacy page
|
|
48
|
+
* with `move_page` to adopt the compliant path.
|
|
49
|
+
*/
|
|
50
|
+
const LEGACY_ACTIVE_TRACKING_PATHS = {
|
|
51
|
+
"active-open-loops.md": "projects/active-open-loops.md",
|
|
52
|
+
"active-unanswered-questions.md": "projects/active-unanswered-questions.md",
|
|
53
|
+
"active-next-actions.md": "projects/active-next-actions.md",
|
|
54
|
+
};
|
|
55
|
+
export function slugify(name) {
|
|
56
|
+
return name
|
|
57
|
+
.toLowerCase()
|
|
58
|
+
.replace(/[^a-z0-9\s-]/g, "")
|
|
59
|
+
.trim()
|
|
60
|
+
.replace(/[\s_]+/g, "-")
|
|
61
|
+
.replace(/-+/g, "-")
|
|
62
|
+
.replace(/^-+|-+$/g, "");
|
|
63
|
+
}
|
|
64
|
+
export const initProjectInputSchema = z.object({
|
|
65
|
+
projectSlug: z
|
|
66
|
+
.string()
|
|
67
|
+
.optional()
|
|
68
|
+
.describe("Kebab-case project identifier (e.g. my-project). Auto-derived from projectName if omitted — omit when the user provides a single word or a name without spaces."),
|
|
69
|
+
projectName: z
|
|
70
|
+
.string()
|
|
71
|
+
.min(1)
|
|
72
|
+
.describe("Human-readable project name used in instruction headers and the project readme."),
|
|
73
|
+
platform: z
|
|
74
|
+
.enum(["claude", "gpt"])
|
|
75
|
+
.default("claude")
|
|
76
|
+
.describe("Target platform for generated instructions."),
|
|
77
|
+
variant: z
|
|
78
|
+
.enum(["minimal", "extended"])
|
|
79
|
+
.default("extended")
|
|
80
|
+
.describe("Instruction verbosity level. 'extended' is recommended."),
|
|
81
|
+
writeInstructionFile: z
|
|
82
|
+
.boolean()
|
|
83
|
+
.default(true)
|
|
84
|
+
.describe("If true, save rendered instructions to projects/<slug>/instructions/<platform>.md."),
|
|
85
|
+
seedFoundation: z
|
|
86
|
+
.boolean()
|
|
87
|
+
.default(true)
|
|
88
|
+
.describe("If true, copy missing foundation seed pages from seed/instructions/ into the brain."),
|
|
89
|
+
ensureActiveTrackingPages: z
|
|
90
|
+
.boolean()
|
|
91
|
+
.default(true)
|
|
92
|
+
.describe("If true, create stub active tracking pages if they do not exist."),
|
|
93
|
+
execute: z
|
|
94
|
+
.boolean()
|
|
95
|
+
.default(false)
|
|
96
|
+
.describe("If false, returns a preview of planned operations. If true, applies the changes."),
|
|
97
|
+
});
|
|
98
|
+
function todayIso() {
|
|
99
|
+
return new Date().toISOString().slice(0, 10);
|
|
100
|
+
}
|
|
101
|
+
function projectReadmeContent(projectSlug, projectName, platform, instructionFilePath) {
|
|
102
|
+
return [
|
|
103
|
+
"---",
|
|
104
|
+
`title: ${projectName}`,
|
|
105
|
+
`updated: ${todayIso()}`,
|
|
106
|
+
`tags: [${projectSlug}]`,
|
|
107
|
+
"status: active",
|
|
108
|
+
`summary: Project readme for ${projectName}.`,
|
|
109
|
+
"---",
|
|
110
|
+
"",
|
|
111
|
+
`# ${projectName}`,
|
|
112
|
+
"",
|
|
113
|
+
`Project page for ${projectName}.`,
|
|
114
|
+
"",
|
|
115
|
+
"## Setup",
|
|
116
|
+
"",
|
|
117
|
+
`- Initialized: ${todayIso()}`,
|
|
118
|
+
`- Platform: ${platform}`,
|
|
119
|
+
`- Instructions: \`${instructionFilePath}\``,
|
|
120
|
+
"",
|
|
121
|
+
"## Open Loops",
|
|
122
|
+
"",
|
|
123
|
+
"- [ ] Boot sequence not yet verified in a new chat",
|
|
124
|
+
"",
|
|
125
|
+
].join("\n");
|
|
126
|
+
}
|
|
127
|
+
function initDecisionEntry(projectSlug, projectName, platform, variant, instructionFilePath) {
|
|
128
|
+
return [
|
|
129
|
+
`### ${todayIso()} Init: ${projectName}`,
|
|
130
|
+
"",
|
|
131
|
+
`- Created project \`${projectSlug}\` via \`init_project\``,
|
|
132
|
+
`- Platform: ${platform}, variant: ${variant}`,
|
|
133
|
+
`- Instruction file: \`${instructionFilePath}\``,
|
|
134
|
+
`- Tracking pages: seeded`,
|
|
135
|
+
"",
|
|
136
|
+
].join("\n");
|
|
137
|
+
}
|
|
138
|
+
function initOpenLoopEntry(projectSlug) {
|
|
139
|
+
return `- [ ] ${projectSlug}: Boot sequence not yet verified in a new chat\n`;
|
|
140
|
+
}
|
|
141
|
+
async function appendToWikiPage(drive, pagePath, content) {
|
|
142
|
+
const existing = await drive
|
|
143
|
+
.readFile(pagePath)
|
|
144
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
145
|
+
if (!existing)
|
|
146
|
+
return false;
|
|
147
|
+
const base = existing.content.endsWith("\n")
|
|
148
|
+
? existing.content
|
|
149
|
+
: existing.content + "\n";
|
|
150
|
+
await drive.updateFile(existing.fileId, base + content, existing.revision);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Resolve a tracker to the path this wiki actually uses: the legacy
|
|
155
|
+
* `projects/active-*.md` if it is already there, otherwise the compliant
|
|
156
|
+
* root path.
|
|
157
|
+
*/
|
|
158
|
+
async function resolveTrackingPath(drive, canonicalPath) {
|
|
159
|
+
const legacyPath = LEGACY_ACTIVE_TRACKING_PATHS[canonicalPath];
|
|
160
|
+
if (!legacyPath)
|
|
161
|
+
return canonicalPath;
|
|
162
|
+
const legacy = await drive
|
|
163
|
+
.readFile(legacyPath)
|
|
164
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
165
|
+
return legacy ? legacyPath : canonicalPath;
|
|
166
|
+
}
|
|
167
|
+
function activeTrackingPageContent(pagePath) {
|
|
168
|
+
// Keyed on the compliant root path; a legacy projects/ copy gets the same
|
|
169
|
+
// body.
|
|
170
|
+
const key = pagePath.startsWith("projects/active-")
|
|
171
|
+
? pagePath.slice("projects/".length)
|
|
172
|
+
: pagePath;
|
|
173
|
+
const configs = {
|
|
174
|
+
"active-open-loops.md": {
|
|
175
|
+
title: "Active Open Loops",
|
|
176
|
+
tags: "active, tracking",
|
|
177
|
+
summary: "Cross-project active open loops tracker.",
|
|
178
|
+
heading: "## Open Loops",
|
|
179
|
+
},
|
|
180
|
+
"active-unanswered-questions.md": {
|
|
181
|
+
title: "Active Unanswered Questions",
|
|
182
|
+
tags: "active, tracking",
|
|
183
|
+
summary: "Cross-project active unanswered questions tracker.",
|
|
184
|
+
heading: "## Unanswered Questions",
|
|
185
|
+
},
|
|
186
|
+
"active-next-actions.md": {
|
|
187
|
+
title: "Active Next Actions",
|
|
188
|
+
tags: "active, tracking",
|
|
189
|
+
summary: "Cross-project active next actions tracker.",
|
|
190
|
+
heading: "## Next Actions",
|
|
191
|
+
},
|
|
192
|
+
"decisions/core-decisions-log.md": {
|
|
193
|
+
title: "Core Decisions Log",
|
|
194
|
+
tags: "decisions, tracking",
|
|
195
|
+
summary: "Cross-project core decisions log.",
|
|
196
|
+
heading: "## Decisions",
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
const cfg = configs[key] ?? {
|
|
200
|
+
title: pagePath,
|
|
201
|
+
tags: "tracking",
|
|
202
|
+
summary: pagePath,
|
|
203
|
+
heading: "## Content",
|
|
204
|
+
};
|
|
205
|
+
return [
|
|
206
|
+
"---",
|
|
207
|
+
`title: ${cfg.title}`,
|
|
208
|
+
`updated: ${todayIso()}`,
|
|
209
|
+
`tags: [${cfg.tags}]`,
|
|
210
|
+
"status: active",
|
|
211
|
+
`summary: ${cfg.summary}`,
|
|
212
|
+
"---",
|
|
213
|
+
"",
|
|
214
|
+
cfg.heading,
|
|
215
|
+
"",
|
|
216
|
+
].join("\n");
|
|
217
|
+
}
|
|
218
|
+
async function buildInstructionMarkdown(projectSlug, projectName, platform, variant, drive, userId = "") {
|
|
219
|
+
const projectPage = `projects/${projectSlug}/readme.md`;
|
|
220
|
+
if (platform === "claude") {
|
|
221
|
+
const result = (await generateClaudeInstructions(generateClaudeInstructionsInputSchema.parse({
|
|
222
|
+
projectName,
|
|
223
|
+
variant,
|
|
224
|
+
projectPage,
|
|
225
|
+
}), drive, userId));
|
|
226
|
+
return result.markdown;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const result = (await generateGptInstructions(generateGptInstructionsInputSchema.parse({
|
|
230
|
+
projectName,
|
|
231
|
+
variant,
|
|
232
|
+
projectPage,
|
|
233
|
+
}), drive, userId));
|
|
234
|
+
return result.markdown;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function buildPointerMarkdown(projectSlug, projectName, platform) {
|
|
238
|
+
const projectPage = `projects/${projectSlug}/readme.md`;
|
|
239
|
+
if (platform === "claude") {
|
|
240
|
+
const result = (await generateClaudeInstructions(generateClaudeInstructionsInputSchema.parse({
|
|
241
|
+
projectName,
|
|
242
|
+
variant: "pointer",
|
|
243
|
+
projectPage,
|
|
244
|
+
})));
|
|
245
|
+
return result.markdown;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
const result = (await generateGptInstructions(generateGptInstructionsInputSchema.parse({
|
|
249
|
+
projectName,
|
|
250
|
+
variant: "pointer",
|
|
251
|
+
projectPage,
|
|
252
|
+
})));
|
|
253
|
+
return result.markdown;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
export async function initProject(drive, input, userId = "") {
|
|
257
|
+
const { projectSlug: rawSlug, projectName, platform, variant, writeInstructionFile, seedFoundation, ensureActiveTrackingPages, execute, } = input;
|
|
258
|
+
const projectSlug = rawSlug ?? slugify(projectName);
|
|
259
|
+
const slugPattern = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
260
|
+
if (!slugPattern.test(projectSlug)) {
|
|
261
|
+
throw new Error(`Invalid projectSlug "${projectSlug}": must be kebab-case (lowercase letters, digits, hyphens only; no leading or trailing hyphens).`);
|
|
262
|
+
}
|
|
263
|
+
const instructionFilePath = `projects/${projectSlug}/instructions/${platform}.md`;
|
|
264
|
+
const instructionMarkdown = await buildInstructionMarkdown(projectSlug, projectName, platform, variant, drive, userId);
|
|
265
|
+
const systemPromptMarkdown = await buildPointerMarkdown(projectSlug, projectName, platform);
|
|
266
|
+
const operations = [];
|
|
267
|
+
// 1. Project readme
|
|
268
|
+
const projectReadmePath = `projects/${projectSlug}/readme.md`;
|
|
269
|
+
{
|
|
270
|
+
const existing = await drive
|
|
271
|
+
.readFile(projectReadmePath)
|
|
272
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
273
|
+
operations.push({
|
|
274
|
+
path: projectReadmePath,
|
|
275
|
+
action: existing ? "unchanged" : "create",
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// 2. Instruction file
|
|
279
|
+
if (writeInstructionFile) {
|
|
280
|
+
const existing = await drive
|
|
281
|
+
.readFile(instructionFilePath)
|
|
282
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
283
|
+
if (!existing) {
|
|
284
|
+
operations.push({ path: instructionFilePath, action: "create" });
|
|
285
|
+
}
|
|
286
|
+
else if (existing.content === instructionMarkdown) {
|
|
287
|
+
operations.push({ path: instructionFilePath, action: "unchanged" });
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
operations.push({
|
|
291
|
+
path: instructionFilePath,
|
|
292
|
+
action: "exists",
|
|
293
|
+
reason: "File exists with different content. Re-run with explicit overwrite if needed.",
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// 3. Foundation seed pages
|
|
298
|
+
if (seedFoundation) {
|
|
299
|
+
for (const basename of FOUNDATION_SEEDS) {
|
|
300
|
+
const seedPath = `instructions/${basename}`;
|
|
301
|
+
const existing = await drive
|
|
302
|
+
.readFile(seedPath)
|
|
303
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
304
|
+
operations.push({
|
|
305
|
+
path: seedPath,
|
|
306
|
+
action: existing ? "unchanged" : "create",
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// 4. Active tracking pages
|
|
311
|
+
if (ensureActiveTrackingPages) {
|
|
312
|
+
for (const canonicalPath of ACTIVE_TRACKING_PAGES) {
|
|
313
|
+
const trackingPath = await resolveTrackingPath(drive, canonicalPath);
|
|
314
|
+
const existing = await drive
|
|
315
|
+
.readFile(trackingPath)
|
|
316
|
+
.catch((err) => err instanceof DriveNotFoundError ? null : Promise.reject(err));
|
|
317
|
+
operations.push({
|
|
318
|
+
path: trackingPath,
|
|
319
|
+
action: existing ? "unchanged" : "create",
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (!execute) {
|
|
324
|
+
const skippedCount = operations.filter((op) => op.action !== "create").length;
|
|
325
|
+
return {
|
|
326
|
+
success: true,
|
|
327
|
+
mode: "preview",
|
|
328
|
+
projectSlug,
|
|
329
|
+
projectName,
|
|
330
|
+
platform,
|
|
331
|
+
instructionFilePath,
|
|
332
|
+
instructionMarkdown,
|
|
333
|
+
systemPromptMarkdown,
|
|
334
|
+
operations,
|
|
335
|
+
appliedCount: 0,
|
|
336
|
+
skippedCount,
|
|
337
|
+
errors: [],
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
// Execute mode: apply create operations
|
|
341
|
+
const errors = [];
|
|
342
|
+
let appliedCount = 0;
|
|
343
|
+
let skippedCount = 0;
|
|
344
|
+
for (const op of operations) {
|
|
345
|
+
if (op.action !== "create") {
|
|
346
|
+
skippedCount++;
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
let content;
|
|
351
|
+
if (op.path === projectReadmePath) {
|
|
352
|
+
content = projectReadmeContent(projectSlug, projectName, platform, instructionFilePath);
|
|
353
|
+
}
|
|
354
|
+
else if (op.path === instructionFilePath) {
|
|
355
|
+
// Frontmatter, same as every other page this tool writes. Without it
|
|
356
|
+
// read_page returned `frontmatter: {}` plus missing-title/updated
|
|
357
|
+
// warnings, and the indexed row had no title to match on — the
|
|
358
|
+
// instruction file was the one page in a project that did not satisfy
|
|
359
|
+
// the schema the rest of the wiki is held to (D5, GH #443).
|
|
360
|
+
content = [
|
|
361
|
+
"---",
|
|
362
|
+
`title: ${projectName} Agent Instructions`,
|
|
363
|
+
`updated: ${todayIso()}`,
|
|
364
|
+
`tags: [${projectSlug}, instructions]`,
|
|
365
|
+
"status: active",
|
|
366
|
+
`summary: Agent instructions for ${projectName} (${platform}).`,
|
|
367
|
+
"---",
|
|
368
|
+
"",
|
|
369
|
+
instructionMarkdown,
|
|
370
|
+
].join("\n");
|
|
371
|
+
}
|
|
372
|
+
else if (op.path.startsWith("instructions/") &&
|
|
373
|
+
FOUNDATION_SEEDS.some((s) => op.path.endsWith(s))) {
|
|
374
|
+
const basename = path.basename(op.path);
|
|
375
|
+
content = await fs.readFile(path.join(SEED_DIR, basename), "utf8");
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
content = activeTrackingPageContent(op.path);
|
|
379
|
+
}
|
|
380
|
+
const written = await drive.createFile(op.path, content);
|
|
381
|
+
// Index it. drive.createFile only writes Storage, and every discovery
|
|
382
|
+
// path — list_pages, search_pages, pull_session_bundle — reads Postgres.
|
|
383
|
+
// Without this a freshly created project is invisible: measured 0 rows
|
|
384
|
+
// indexed against 2 objects in Storage, so the first bundle pull after
|
|
385
|
+
// init_project returned nothing at all (GH #433).
|
|
386
|
+
const parsedNew = parsePage(content);
|
|
387
|
+
await getPostgresSearchIndex()
|
|
388
|
+
.upsertPage(op.path, parsedNew.frontmatter, content, written.revision, written.modifiedTime, resolveIndexOwnerSubject(drive, op.path, userId))
|
|
389
|
+
.catch((err) => {
|
|
390
|
+
console.warn(`[init_project] index upsert failed for '${op.path}':`, err instanceof Error ? err.message : err);
|
|
391
|
+
});
|
|
392
|
+
appliedCount++;
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
op.action = "error";
|
|
396
|
+
op.reason = err instanceof Error ? err.message : String(err);
|
|
397
|
+
errors.push({ path: op.path, reason: op.reason });
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// Write-back: only when the project readme was freshly created (first init).
|
|
401
|
+
// Appends an init decision entry and an open-loop reminder to cross-project trackers.
|
|
402
|
+
const readmeWasCreated = operations.some((op) => op.path === projectReadmePath && op.action === "create");
|
|
403
|
+
const writeBack = {
|
|
404
|
+
decisions: false,
|
|
405
|
+
openLoops: false,
|
|
406
|
+
};
|
|
407
|
+
if (readmeWasCreated && errors.length === 0) {
|
|
408
|
+
const decisionEntry = initDecisionEntry(projectSlug, projectName, platform, variant, instructionFilePath);
|
|
409
|
+
const openLoopEntry = initOpenLoopEntry(projectSlug);
|
|
410
|
+
const openLoopsPath = await resolveTrackingPath(drive, "active-open-loops.md");
|
|
411
|
+
await Promise.all([
|
|
412
|
+
appendToWikiPage(drive, "decisions/core-decisions-log.md", decisionEntry)
|
|
413
|
+
.then((ok) => { writeBack.decisions = ok; })
|
|
414
|
+
.catch(() => { }),
|
|
415
|
+
appendToWikiPage(drive, openLoopsPath, openLoopEntry)
|
|
416
|
+
.then((ok) => { writeBack.openLoops = ok; })
|
|
417
|
+
.catch(() => { }),
|
|
418
|
+
]);
|
|
419
|
+
}
|
|
420
|
+
await appendLogEntry(drive, {
|
|
421
|
+
type: "ingest",
|
|
422
|
+
title: `init_project: ${projectSlug}`,
|
|
423
|
+
detail: `projectName=${projectName}, platform=${platform}, applied=${appliedCount}, errors=${errors.length}`,
|
|
424
|
+
}).catch(() => {
|
|
425
|
+
/* non-fatal */
|
|
426
|
+
});
|
|
427
|
+
return {
|
|
428
|
+
success: errors.length === 0,
|
|
429
|
+
mode: "execute",
|
|
430
|
+
projectSlug,
|
|
431
|
+
projectName,
|
|
432
|
+
platform,
|
|
433
|
+
instructionFilePath,
|
|
434
|
+
instructionMarkdown,
|
|
435
|
+
systemPromptMarkdown,
|
|
436
|
+
operations,
|
|
437
|
+
appliedCount,
|
|
438
|
+
skippedCount,
|
|
439
|
+
errors,
|
|
440
|
+
writeBack,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=initProject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initProject.js","sourceRoot":"","sources":["../../src/tools/initProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type StorageClient } from "../storage/client.js";
|
|
2
|
+
/**
|
|
3
|
+
* What a generated instruction block can only know by looking at the wiki.
|
|
4
|
+
*
|
|
5
|
+
* The generator used to render a template from a slug and two defaults, which
|
|
6
|
+
* made its output wrong in a specific and expensive way: it asserted write-back
|
|
7
|
+
* paths without knowing whether any of them existed. On a real project that
|
|
8
|
+
* ambiguity led a maintainer to conclude twice in one session that the paths
|
|
9
|
+
* were invented, and to hand-edit the correct ones out (GH #457, D13).
|
|
10
|
+
*
|
|
11
|
+
* Everything here is best-effort. A brand-new project has no pages yet — that is
|
|
12
|
+
* the `init_project` case, and an empty context degrades to exactly the old
|
|
13
|
+
* behaviour, which is correct for a project where nothing exists yet.
|
|
14
|
+
*/
|
|
15
|
+
export interface ProjectContext {
|
|
16
|
+
/** Whether the project folder has any pages at all. */
|
|
17
|
+
exists: boolean;
|
|
18
|
+
pageCount: number;
|
|
19
|
+
/** Category subdirectories the project actually uses, e.g. `canonical`, `data`. */
|
|
20
|
+
subdirs: string[];
|
|
21
|
+
/** Nested sub-projects, as `projects/<parent>/projects/<child>` slugs. */
|
|
22
|
+
subProjects: string[];
|
|
23
|
+
/** A declared filing system from the project readme's `filing:` frontmatter. */
|
|
24
|
+
filing?: string;
|
|
25
|
+
/** Which of the candidate write-back targets already exist. */
|
|
26
|
+
existingPaths: Set<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Hand-written content carried forward from an existing instruction file,
|
|
29
|
+
* already wrapped in its markers. Undefined when there is nothing to preserve.
|
|
30
|
+
*/
|
|
31
|
+
preservedRegion?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare const DOMAIN_CONTEXT_START = "<!-- brains:domain-context start -->";
|
|
34
|
+
export declare const DOMAIN_CONTEXT_END = "<!-- brains:domain-context end -->";
|
|
35
|
+
/**
|
|
36
|
+
* Section headings the generators themselves emit, in either platform's block.
|
|
37
|
+
*
|
|
38
|
+
* Exported and covered by a test that renders every variant of both generators
|
|
39
|
+
* and asserts nothing it emits is missing here. That test is the point: a
|
|
40
|
+
* heading absent from this set is treated as hand-written and preserved, so a
|
|
41
|
+
* renamed or added generated section would silently start duplicating itself on
|
|
42
|
+
* every refresh. Three GPT headings were already missing when this was written.
|
|
43
|
+
*/
|
|
44
|
+
export declare const GENERATED_HEADINGS: Set<string>;
|
|
45
|
+
/**
|
|
46
|
+
* Pull the hand-written part of an existing instruction file forward.
|
|
47
|
+
*
|
|
48
|
+
* Explicit markers are the supported path. Without them the whole file is still
|
|
49
|
+
* inspected rather than discarded, because the alternative — silently dropping
|
|
50
|
+
* a project's channel voice, contacts and conventions on every refresh — is why
|
|
51
|
+
* nobody refreshes an instruction file and why they rot.
|
|
52
|
+
*/
|
|
53
|
+
export declare function extractPreservedRegion(content: string): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Read what the wiki actually contains for a project. Never throws: every lookup
|
|
56
|
+
* degrades to "unknown", and an unknown is rendered as "created on first use",
|
|
57
|
+
* which is the pre-existing behaviour.
|
|
58
|
+
*/
|
|
59
|
+
export declare function gatherProjectContext(drive: StorageClient, slug: string, platform: "claude" | "gpt", candidatePaths: string[], userId?: string): Promise<ProjectContext>;
|
|
60
|
+
//# sourceMappingURL=instructionContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instructionContext.d.ts","sourceRoot":"","sources":["../../src/tools/instructionContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAK1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,oBAAoB,yCAAyC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,uCAAuC,CAAC;AAkBvE;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,aAsB7B,CAAC;AAMH;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA+C1E;AAuBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAC1B,cAAc,EAAE,MAAM,EAAE,EACxB,MAAM,SAAK,GACV,OAAO,CAAC,cAAc,CAAC,CA6EzB"}
|