@maadb/core 0.0.1 → 0.7.9
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/LICENSE +21 -0
- package/README.md +371 -3
- package/dist/architect.d.ts +2 -0
- package/dist/architect.d.ts.map +1 -0
- package/dist/architect.js +273 -0
- package/dist/architect.js.map +1 -0
- package/dist/auth/resolve.d.ts +36 -0
- package/dist/auth/resolve.d.ts.map +1 -0
- package/dist/auth/resolve.js +77 -0
- package/dist/auth/resolve.js.map +1 -0
- package/dist/auth/token-store.d.ts +82 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +464 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/types.d.ts +75 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +15 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/backend/adapter.d.ts +57 -0
- package/dist/backend/adapter.d.ts.map +1 -0
- package/dist/backend/adapter.js +6 -0
- package/dist/backend/adapter.js.map +1 -0
- package/dist/backend/index.d.ts +3 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +2 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/sqlite/index.d.ts +63 -0
- package/dist/backend/sqlite/index.d.ts.map +1 -0
- package/dist/backend/sqlite/index.js +521 -0
- package/dist/backend/sqlite/index.js.map +1 -0
- package/dist/backend/sqlite/schema.d.ts +2 -0
- package/dist/backend/sqlite/schema.d.ts.map +1 -0
- package/dist/backend/sqlite/schema.js +88 -0
- package/dist/backend/sqlite/schema.js.map +1 -0
- package/dist/claude-md.d.ts +2 -0
- package/dist/claude-md.d.ts.map +1 -0
- package/dist/claude-md.js +97 -0
- package/dist/claude-md.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +39 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +8 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +242 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/discover.d.ts +5 -0
- package/dist/cli/commands/discover.d.ts.map +1 -0
- package/dist/cli/commands/discover.js +48 -0
- package/dist/cli/commands/discover.js.map +1 -0
- package/dist/cli/commands/maintain.d.ts +6 -0
- package/dist/cli/commands/maintain.d.ts.map +1 -0
- package/dist/cli/commands/maintain.js +168 -0
- package/dist/cli/commands/maintain.js.map +1 -0
- package/dist/cli/commands/read.d.ts +7 -0
- package/dist/cli/commands/read.d.ts.map +1 -0
- package/dist/cli/commands/read.js +139 -0
- package/dist/cli/commands/read.js.map +1 -0
- package/dist/cli/commands/write.d.ts +4 -0
- package/dist/cli/commands/write.d.ts.map +1 -0
- package/dist/cli/commands/write.js +99 -0
- package/dist/cli/commands/write.js.map +1 -0
- package/dist/cli/helpers.d.ts +8 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +17 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +296 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/engine/audit.d.ts +15 -0
- package/dist/engine/audit.d.ts.map +1 -0
- package/dist/engine/audit.js +42 -0
- package/dist/engine/audit.js.map +1 -0
- package/dist/engine/composites.d.ts +6 -0
- package/dist/engine/composites.d.ts.map +1 -0
- package/dist/engine/composites.js +102 -0
- package/dist/engine/composites.js.map +1 -0
- package/dist/engine/context.d.ts +47 -0
- package/dist/engine/context.d.ts.map +1 -0
- package/dist/engine/context.js +55 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/docid-safe.d.ts +8 -0
- package/dist/engine/docid-safe.d.ts.map +1 -0
- package/dist/engine/docid-safe.js +0 -0
- package/dist/engine/docid-safe.js.map +1 -0
- package/dist/engine/helpers.d.ts +8 -0
- package/dist/engine/helpers.d.ts.map +1 -0
- package/dist/engine/helpers.js +102 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/index.d.ts +209 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +489 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/indexing.d.ts +14 -0
- package/dist/engine/indexing.d.ts.map +1 -0
- package/dist/engine/indexing.js +225 -0
- package/dist/engine/indexing.js.map +1 -0
- package/dist/engine/journal.d.ts +32 -0
- package/dist/engine/journal.d.ts.map +1 -0
- package/dist/engine/journal.js +111 -0
- package/dist/engine/journal.js.map +1 -0
- package/dist/engine/logger.d.ts +19 -0
- package/dist/engine/logger.d.ts.map +1 -0
- package/dist/engine/logger.js +40 -0
- package/dist/engine/logger.js.map +1 -0
- package/dist/engine/maintenance.d.ts +15 -0
- package/dist/engine/maintenance.d.ts.map +1 -0
- package/dist/engine/maintenance.js +87 -0
- package/dist/engine/maintenance.js.map +1 -0
- package/dist/engine/mutex.d.ts +24 -0
- package/dist/engine/mutex.d.ts.map +1 -0
- package/dist/engine/mutex.js +50 -0
- package/dist/engine/mutex.js.map +1 -0
- package/dist/engine/pathguard.d.ts +16 -0
- package/dist/engine/pathguard.d.ts.map +1 -0
- package/dist/engine/pathguard.js +41 -0
- package/dist/engine/pathguard.js.map +1 -0
- package/dist/engine/reads.d.ts +24 -0
- package/dist/engine/reads.d.ts.map +1 -0
- package/dist/engine/reads.js +701 -0
- package/dist/engine/reads.js.map +1 -0
- package/dist/engine/types.d.ts +350 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +5 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/writes.d.ts +10 -0
- package/dist/engine/writes.d.ts.map +1 -0
- package/dist/engine/writes.js +606 -0
- package/dist/engine/writes.js.map +1 -0
- package/dist/engine.d.ts +3 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +6 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +17 -0
- package/dist/errors.js.map +1 -0
- package/dist/extractor/fields.d.ts +3 -0
- package/dist/extractor/fields.d.ts.map +1 -0
- package/dist/extractor/fields.js +58 -0
- package/dist/extractor/fields.js.map +1 -0
- package/dist/extractor/index.d.ts +7 -0
- package/dist/extractor/index.d.ts.map +1 -0
- package/dist/extractor/index.js +22 -0
- package/dist/extractor/index.js.map +1 -0
- package/dist/extractor/normalizers.d.ts +22 -0
- package/dist/extractor/normalizers.d.ts.map +1 -0
- package/dist/extractor/normalizers.js +250 -0
- package/dist/extractor/normalizers.js.map +1 -0
- package/dist/extractor/objects.d.ts +3 -0
- package/dist/extractor/objects.d.ts.map +1 -0
- package/dist/extractor/objects.js +33 -0
- package/dist/extractor/objects.js.map +1 -0
- package/dist/extractor/relationships.d.ts +3 -0
- package/dist/extractor/relationships.d.ts.map +1 -0
- package/dist/extractor/relationships.js +58 -0
- package/dist/extractor/relationships.js.map +1 -0
- package/dist/git/commit.d.ts +63 -0
- package/dist/git/commit.d.ts.map +1 -0
- package/dist/git/commit.js +161 -0
- package/dist/git/commit.js.map +1 -0
- package/dist/git/diff.d.ts +4 -0
- package/dist/git/diff.d.ts.map +1 -0
- package/dist/git/diff.js +56 -0
- package/dist/git/diff.js.map +1 -0
- package/dist/git/index.d.ts +41 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +86 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/log.d.ts +13 -0
- package/dist/git/log.d.ts.map +1 -0
- package/dist/git/log.js +116 -0
- package/dist/git/log.js.map +1 -0
- package/dist/git/snapshot.d.ts +4 -0
- package/dist/git/snapshot.d.ts.map +1 -0
- package/dist/git/snapshot.js +65 -0
- package/dist/git/snapshot.js.map +1 -0
- package/dist/instance/config.d.ts +19 -0
- package/dist/instance/config.d.ts.map +1 -0
- package/dist/instance/config.js +107 -0
- package/dist/instance/config.js.map +1 -0
- package/dist/instance/pool.d.ts +138 -0
- package/dist/instance/pool.d.ts.map +1 -0
- package/dist/instance/pool.js +335 -0
- package/dist/instance/pool.js.map +1 -0
- package/dist/instance/session.d.ts +140 -0
- package/dist/instance/session.d.ts.map +1 -0
- package/dist/instance/session.js +267 -0
- package/dist/instance/session.js.map +1 -0
- package/dist/logging.d.ts +108 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +120 -0
- package/dist/logging.js.map +1 -0
- package/dist/maad-md.d.ts +11 -0
- package/dist/maad-md.d.ts.map +1 -0
- package/dist/maad-md.js +252 -0
- package/dist/maad-md.js.map +1 -0
- package/dist/mcp/bulk-cap.d.ts +10 -0
- package/dist/mcp/bulk-cap.d.ts.map +1 -0
- package/dist/mcp/bulk-cap.js +37 -0
- package/dist/mcp/bulk-cap.js.map +1 -0
- package/dist/mcp/config.d.ts +18 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +20 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/ctx.d.ts +17 -0
- package/dist/mcp/ctx.d.ts.map +1 -0
- package/dist/mcp/ctx.js +7 -0
- package/dist/mcp/ctx.js.map +1 -0
- package/dist/mcp/guardrails.d.ts +21 -0
- package/dist/mcp/guardrails.d.ts.map +1 -0
- package/dist/mcp/guardrails.js +39 -0
- package/dist/mcp/guardrails.js.map +1 -0
- package/dist/mcp/idempotency.d.ts +69 -0
- package/dist/mcp/idempotency.d.ts.map +1 -0
- package/dist/mcp/idempotency.js +168 -0
- package/dist/mcp/idempotency.js.map +1 -0
- package/dist/mcp/instance-reload.d.ts +23 -0
- package/dist/mcp/instance-reload.d.ts.map +1 -0
- package/dist/mcp/instance-reload.js +126 -0
- package/dist/mcp/instance-reload.js.map +1 -0
- package/dist/mcp/kinds.d.ts +22 -0
- package/dist/mcp/kinds.d.ts.map +1 -0
- package/dist/mcp/kinds.js +110 -0
- package/dist/mcp/kinds.js.map +1 -0
- package/dist/mcp/lifecycle.d.ts +8 -0
- package/dist/mcp/lifecycle.d.ts.map +1 -0
- package/dist/mcp/lifecycle.js +65 -0
- package/dist/mcp/lifecycle.js.map +1 -0
- package/dist/mcp/notifications.d.ts +87 -0
- package/dist/mcp/notifications.d.ts.map +1 -0
- package/dist/mcp/notifications.js +154 -0
- package/dist/mcp/notifications.js.map +1 -0
- package/dist/mcp/query-depth.d.ts +28 -0
- package/dist/mcp/query-depth.d.ts.map +1 -0
- package/dist/mcp/query-depth.js +43 -0
- package/dist/mcp/query-depth.js.map +1 -0
- package/dist/mcp/rate-limit.d.ts +60 -0
- package/dist/mcp/rate-limit.d.ts.map +1 -0
- package/dist/mcp/rate-limit.js +203 -0
- package/dist/mcp/rate-limit.js.map +1 -0
- package/dist/mcp/reload-signal.d.ts +13 -0
- package/dist/mcp/reload-signal.d.ts.map +1 -0
- package/dist/mcp/reload-signal.js +68 -0
- package/dist/mcp/reload-signal.js.map +1 -0
- package/dist/mcp/response.d.ts +109 -0
- package/dist/mcp/response.d.ts.map +1 -0
- package/dist/mcp/response.js +132 -0
- package/dist/mcp/response.js.map +1 -0
- package/dist/mcp/roles.d.ts +7 -0
- package/dist/mcp/roles.d.ts.map +1 -0
- package/dist/mcp/roles.js +56 -0
- package/dist/mcp/roles.js.map +1 -0
- package/dist/mcp/server.d.ts +33 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +242 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/shutdown.d.ts +32 -0
- package/dist/mcp/shutdown.d.ts.map +1 -0
- package/dist/mcp/shutdown.js +130 -0
- package/dist/mcp/shutdown.js.map +1 -0
- package/dist/mcp/tools/audit.d.ts +4 -0
- package/dist/mcp/tools/audit.d.ts.map +1 -0
- package/dist/mcp/tools/audit.js +45 -0
- package/dist/mcp/tools/audit.js.map +1 -0
- package/dist/mcp/tools/auth.d.ts +4 -0
- package/dist/mcp/tools/auth.d.ts.map +1 -0
- package/dist/mcp/tools/auth.js +181 -0
- package/dist/mcp/tools/auth.js.map +1 -0
- package/dist/mcp/tools/discover.d.ts +4 -0
- package/dist/mcp/tools/discover.d.ts.map +1 -0
- package/dist/mcp/tools/discover.js +83 -0
- package/dist/mcp/tools/discover.js.map +1 -0
- package/dist/mcp/tools/instance.d.ts +15 -0
- package/dist/mcp/tools/instance.d.ts.map +1 -0
- package/dist/mcp/tools/instance.js +207 -0
- package/dist/mcp/tools/instance.js.map +1 -0
- package/dist/mcp/tools/maintain.d.ts +4 -0
- package/dist/mcp/tools/maintain.d.ts.map +1 -0
- package/dist/mcp/tools/maintain.js +118 -0
- package/dist/mcp/tools/maintain.js.map +1 -0
- package/dist/mcp/tools/read.d.ts +4 -0
- package/dist/mcp/tools/read.d.ts.map +1 -0
- package/dist/mcp/tools/read.js +260 -0
- package/dist/mcp/tools/read.js.map +1 -0
- package/dist/mcp/tools/write.d.ts +4 -0
- package/dist/mcp/tools/write.d.ts.map +1 -0
- package/dist/mcp/tools/write.js +342 -0
- package/dist/mcp/tools/write.js.map +1 -0
- package/dist/mcp/transport/auth.d.ts +41 -0
- package/dist/mcp/transport/auth.d.ts.map +1 -0
- package/dist/mcp/transport/auth.js +115 -0
- package/dist/mcp/transport/auth.js.map +1 -0
- package/dist/mcp/transport/http.d.ts +62 -0
- package/dist/mcp/transport/http.d.ts.map +1 -0
- package/dist/mcp/transport/http.js +357 -0
- package/dist/mcp/transport/http.js.map +1 -0
- package/dist/mcp/transport/pin.d.ts +15 -0
- package/dist/mcp/transport/pin.d.ts.map +1 -0
- package/dist/mcp/transport/pin.js +71 -0
- package/dist/mcp/transport/pin.js.map +1 -0
- package/dist/mcp/transport/telemetry.d.ts +79 -0
- package/dist/mcp/transport/telemetry.d.ts.map +1 -0
- package/dist/mcp/transport/telemetry.js +97 -0
- package/dist/mcp/transport/telemetry.js.map +1 -0
- package/dist/mcp/with-session.d.ts +26 -0
- package/dist/mcp/with-session.d.ts.map +1 -0
- package/dist/mcp/with-session.js +275 -0
- package/dist/mcp/with-session.js.map +1 -0
- package/dist/parser/annotations.d.ts +3 -0
- package/dist/parser/annotations.d.ts.map +1 -0
- package/dist/parser/annotations.js +41 -0
- package/dist/parser/annotations.js.map +1 -0
- package/dist/parser/blocks.d.ts +3 -0
- package/dist/parser/blocks.d.ts.map +1 -0
- package/dist/parser/blocks.js +99 -0
- package/dist/parser/blocks.js.map +1 -0
- package/dist/parser/frontmatter.d.ts +9 -0
- package/dist/parser/frontmatter.d.ts.map +1 -0
- package/dist/parser/frontmatter.js +33 -0
- package/dist/parser/frontmatter.js.map +1 -0
- package/dist/parser/index.d.ts +11 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +54 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/matter.d.ts +3 -0
- package/dist/parser/matter.d.ts.map +1 -0
- package/dist/parser/matter.js +32 -0
- package/dist/parser/matter.js.map +1 -0
- package/dist/parser/tags.d.ts +3 -0
- package/dist/parser/tags.d.ts.map +1 -0
- package/dist/parser/tags.js +32 -0
- package/dist/parser/tags.js.map +1 -0
- package/dist/parser/verbatim.d.ts +4 -0
- package/dist/parser/verbatim.d.ts.map +1 -0
- package/dist/parser/verbatim.js +121 -0
- package/dist/parser/verbatim.js.map +1 -0
- package/dist/parser/yaml-profile.d.ts +4 -0
- package/dist/parser/yaml-profile.d.ts.map +1 -0
- package/dist/parser/yaml-profile.js +73 -0
- package/dist/parser/yaml-profile.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +2 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +4 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +147 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +2 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +5 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/scanner.d.ts +57 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +223 -0
- package/dist/scanner.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/loader.d.ts +4 -0
- package/dist/schema/loader.d.ts.map +1 -0
- package/dist/schema/loader.js +303 -0
- package/dist/schema/loader.js.map +1 -0
- package/dist/schema/precision.d.ts +6 -0
- package/dist/schema/precision.d.ts.map +1 -0
- package/dist/schema/precision.js +59 -0
- package/dist/schema/precision.js.map +1 -0
- package/dist/schema/validator.d.ts +21 -0
- package/dist/schema/validator.d.ts.map +1 -0
- package/dist/schema/validator.js +200 -0
- package/dist/schema/validator.js.map +1 -0
- package/dist/schema-md.d.ts +8 -0
- package/dist/schema-md.d.ts.map +1 -0
- package/dist/schema-md.js +98 -0
- package/dist/schema-md.js.map +1 -0
- package/dist/skill-files.d.ts +3 -0
- package/dist/skill-files.d.ts.map +1 -0
- package/dist/skill-files.js +362 -0
- package/dist/skill-files.js.map +1 -0
- package/dist/skills-scaffold.d.ts +10 -0
- package/dist/skills-scaffold.d.ts.map +1 -0
- package/dist/skills-scaffold.js +52 -0
- package/dist/skills-scaffold.js.map +1 -0
- package/dist/types.d.ts +309 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +111 -0
- package/dist/types.js.map +1 -0
- package/dist/writer/index.d.ts +7 -0
- package/dist/writer/index.d.ts.map +1 -0
- package/dist/writer/index.js +32 -0
- package/dist/writer/index.js.map +1 -0
- package/dist/writer/serializer.d.ts +4 -0
- package/dist/writer/serializer.d.ts.map +1 -0
- package/dist/writer/serializer.js +103 -0
- package/dist/writer/serializer.js.map +1 -0
- package/dist/writer/template.d.ts +3 -0
- package/dist/writer/template.d.ts.map +1 -0
- package/dist/writer/template.js +27 -0
- package/dist/writer/template.js.map +1 -0
- package/package.json +59 -7
package/dist/maad-md.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// MAAD.md Generator
|
|
3
|
+
// Generates the LLM instruction file for a MAAD project.
|
|
4
|
+
// Content is STABLE — no volatile counts, no project-state details.
|
|
5
|
+
// Regenerated on every reindex so interface changes propagate.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
export function generateMaadMd(ctx) {
|
|
8
|
+
const cmd = buildCmdPrefix(ctx.enginePath, ctx.projectRoot);
|
|
9
|
+
const sections = [];
|
|
10
|
+
sections.push(generateHeader(cmd));
|
|
11
|
+
sections.push(generateQuickStart(cmd, ctx));
|
|
12
|
+
sections.push(generateFullCommandRef(cmd));
|
|
13
|
+
sections.push(generatePrimitives());
|
|
14
|
+
sections.push(generateRules());
|
|
15
|
+
sections.push(generateCompositionPatterns(cmd));
|
|
16
|
+
sections.push(generateFeedback());
|
|
17
|
+
return sections.join('\n\n---\n\n') + '\n';
|
|
18
|
+
}
|
|
19
|
+
function buildCmdPrefix(enginePath, projectRoot) {
|
|
20
|
+
return `node ${enginePath} --project ${projectRoot}`;
|
|
21
|
+
}
|
|
22
|
+
// ---- Sections -------------------------------------------------------------
|
|
23
|
+
function generateHeader(cmd) {
|
|
24
|
+
return `# MAAD.md — LLM Interface
|
|
25
|
+
|
|
26
|
+
> Auto-generated by the MAAD engine. Do not edit.
|
|
27
|
+
>
|
|
28
|
+
> **This is a test/evaluation project.** If you find issues or have improvement ideas,
|
|
29
|
+
> create a feedback file: \`feedback-YYYY-MM-DD-<model>.md\` (e.g. \`feedback-2026-04-07-gpt-5.md\`).
|
|
30
|
+
|
|
31
|
+
## What is this?
|
|
32
|
+
|
|
33
|
+
A **MAAD project** — a markdown-native database. Markdown files are the records. A queryable index gives you structured access without reading full files.
|
|
34
|
+
|
|
35
|
+
**This file** = stable operating instructions. Read once per session.
|
|
36
|
+
**\`maad_summary\` tool** = live project snapshot. Run once per session to see what's here.
|
|
37
|
+
**SCHEMA.md** = deep structural reference. Read only when \`maad_schema\` isn't enough.
|
|
38
|
+
|
|
39
|
+
## How to access data
|
|
40
|
+
|
|
41
|
+
Use **MAAD MCP tools** for all data operations. Do not use shell commands or direct file reads for data access. If \`maad_summary\` reports an empty project, read \`_skills/architect-core.md\` and enter Architect mode to design and deploy the schema.
|
|
42
|
+
|
|
43
|
+
If using CLI for debugging:
|
|
44
|
+
\`\`\`
|
|
45
|
+
${cmd} <command> [args]
|
|
46
|
+
\`\`\``;
|
|
47
|
+
}
|
|
48
|
+
function generateQuickStart(cmd, _ctx) {
|
|
49
|
+
return `## Boot Sequence
|
|
50
|
+
|
|
51
|
+
**1. You just read this file.** You now know the commands.
|
|
52
|
+
|
|
53
|
+
**2. Run \`summary\` to see what's in this project:**
|
|
54
|
+
\`\`\`
|
|
55
|
+
${cmd} summary
|
|
56
|
+
\`\`\`
|
|
57
|
+
Returns: types + counts, sample doc_ids, extracted object inventory.
|
|
58
|
+
|
|
59
|
+
That's it. You're oriented. Now use the commands below as needed.
|
|
60
|
+
|
|
61
|
+
### Reading data
|
|
62
|
+
- \`get <doc_id> hot\` — frontmatter only (cheapest)
|
|
63
|
+
- \`get <doc_id> full\` — resolved record: refs, objects, related docs
|
|
64
|
+
- \`get <doc_id> warm <block_id>\` — frontmatter + one section
|
|
65
|
+
- \`get <doc_id> cold\` — full file (expensive, use sparingly)
|
|
66
|
+
|
|
67
|
+
### Before writing
|
|
68
|
+
- \`schema <type>\` — field definitions, required fields, enum values
|
|
69
|
+
|
|
70
|
+
### Reference (not needed for boot)
|
|
71
|
+
- **SCHEMA.md** has full field-level detail for every type. Read it when \`schema <type>\` isn't enough.
|
|
72
|
+
- **\`audit\`** shows recent git activity if you need project history.`;
|
|
73
|
+
}
|
|
74
|
+
function generateFullCommandRef(cmd) {
|
|
75
|
+
return `## All Commands
|
|
76
|
+
|
|
77
|
+
> Commands shown below in CLI form for explicit syntax. **MCP tool names prefix \`maad_\`** (e.g. \`get\` → \`maad_get\`, \`bulk_create\` → \`maad_bulk_create\`). Agent workflows use the MCP variants; CLI is for operator debugging.
|
|
78
|
+
|
|
79
|
+
### Discover
|
|
80
|
+
| Command | What it does |
|
|
81
|
+
|---------|-------------|
|
|
82
|
+
| \`scan <file.md>\` | Structural analysis of a raw file (no registry needed) |
|
|
83
|
+
| \`scan <dir/>\` | Corpus-level patterns: recurring fields, headings, document families |
|
|
84
|
+
| \`summary\` | **Start here.** Types, counts, sample IDs, object inventory |
|
|
85
|
+
|
|
86
|
+
### Read
|
|
87
|
+
| \`describe\` | Project overview: types, doc counts, primitives |
|
|
88
|
+
| \`get <doc_id> hot\` | Frontmatter only (cheapest read) |
|
|
89
|
+
| \`get <doc_id> warm <block>\` | Frontmatter + one section |
|
|
90
|
+
| \`get <doc_id> cold\` | Full document (expensive — use sparingly) |
|
|
91
|
+
| \`get <doc_id> full\` | Resolved record: refs resolved, objects, related, latest note |
|
|
92
|
+
| \`query <type>\` | All documents of a type |
|
|
93
|
+
| \`query <type> --filter field=value\` | Filtered (ops: eq, neq, gt, gte, lt, lte, in, contains) |
|
|
94
|
+
| \`query <type> --fields name,status\` | Return frontmatter fields in results (projection) |
|
|
95
|
+
| \`search <primitive>\` | Cross-document object search |
|
|
96
|
+
| \`search <primitive> --subtype <s>\` | Filter by subtype (e.g. person, attorney) |
|
|
97
|
+
| \`search <primitive> --query <text>\` | Substring match on values (alias: --contains) |
|
|
98
|
+
| \`related <doc_id> both\` | All connected documents (outgoing + incoming) |
|
|
99
|
+
| \`related <doc_id> outgoing\` | Documents this one references |
|
|
100
|
+
| \`related <doc_id> incoming\` | Documents that reference this one |
|
|
101
|
+
| \`schema <type>\` | Field definitions, ID prefix, format hints (use before writes) |
|
|
102
|
+
| \`aggregate\` | Group by a field with count/sum/avg/min/max. **Use instead of iterating records to compute totals.** Supports multi-hop ref chains (\`a->b->c\`) for cross-doctype aggregates. Filters accept \`between\` shortcut and array-of-ops (AND). |
|
|
103
|
+
| \`join\` | Query + follow refs + project fields from both sides in one call. **Use instead of \`query\` → \`get\` → \`get\` chains.** |
|
|
104
|
+
| \`verify mode=field\` | Fact-check a field value: grounded true/false + actual value + source |
|
|
105
|
+
| \`verify mode=count\` | Fact-check a document count: grounded true/false + actual count |
|
|
106
|
+
| \`changes_since <cursor>\` | Delta feed — records modified since cursor. Opaque base64url cursor, stable order on (updated_at ASC, doc_id ASC). Empty cursor = from the beginning. |
|
|
107
|
+
|
|
108
|
+
### Write
|
|
109
|
+
| Command | What it does |
|
|
110
|
+
|---------|-------------|
|
|
111
|
+
| \`create <type> --field k=v [--field k=v ...] [--body "text"] [--id custom-id]\` | Create a new record |
|
|
112
|
+
| \`update <doc_id> --field k=v [--field k=v ...]\` | Update frontmatter fields |
|
|
113
|
+
| \`update <doc_id> --append "text"\` | Append to document body |
|
|
114
|
+
| \`update <doc_id> --body "text"\` | Replace document body |
|
|
115
|
+
| \`bulk_create\` | Create multiple records in one call (MCP only) |
|
|
116
|
+
| \`bulk_update\` | Update multiple records in one call (MCP only) |
|
|
117
|
+
| \`delete <doc_id>\` | Remove a record (soft by default, \`--hard\` for hard delete) |
|
|
118
|
+
|
|
119
|
+
### Maintain
|
|
120
|
+
| Command | What it does |
|
|
121
|
+
|---------|-------------|
|
|
122
|
+
| \`validate\` | Validate all documents against schemas |
|
|
123
|
+
| \`validate <doc_id>\` | Validate one document |
|
|
124
|
+
| \`reindex --force\` | Rebuild the full index from markdown |
|
|
125
|
+
| \`reload\` | Reload registry + schemas without restart (after editing \`_registry/\` or \`_schema/\`) |
|
|
126
|
+
| \`health\` | Engine status — write queue depth, last write op, disk headroom, git clean flag, transport + session telemetry |
|
|
127
|
+
| \`parse <file.md>\` | Parse one file, show structure |
|
|
128
|
+
|
|
129
|
+
### Audit (requires git)
|
|
130
|
+
| Command | What it does |
|
|
131
|
+
|---------|-------------|
|
|
132
|
+
| \`history <doc_id>\` | Change history for a document |
|
|
133
|
+
| \`audit\` | Project-wide activity |
|
|
134
|
+
| \`audit --since <date>\` | Activity since a date |
|
|
135
|
+
|
|
136
|
+
### Field syntax for create/update
|
|
137
|
+
- String: \`--field name=Acme Corp\`
|
|
138
|
+
- Enum: \`--field status=open\`
|
|
139
|
+
- Ref: \`--field client=cli-acme\`
|
|
140
|
+
- Array: \`--field tags=[enterprise,priority]\`
|
|
141
|
+
- Date: \`--field opened_at=2026-04-07\``;
|
|
142
|
+
}
|
|
143
|
+
function generatePrimitives() {
|
|
144
|
+
return `## Extraction Primitives
|
|
145
|
+
|
|
146
|
+
Inline annotations in markdown body use \`[[type:value|label]]\` syntax. The engine extracts and indexes them.
|
|
147
|
+
|
|
148
|
+
| Primitive | Captures | Search example |
|
|
149
|
+
|-----------|----------|---------------|
|
|
150
|
+
| \`entity\` | person, org, team, product | \`search entity --subtype person\` |
|
|
151
|
+
| \`date\` | date, datetime | \`search date --contains 2026\` |
|
|
152
|
+
| \`duration\` | time span (3 hours, 2 weeks) | \`search duration\` |
|
|
153
|
+
| \`amount\` | currency (100.00 USD, $500) | \`search amount\` |
|
|
154
|
+
| \`measure\` | value + unit (500mg, 6 feet) | \`search measure\` |
|
|
155
|
+
| \`quantity\` | bare count (42, 1800) | \`search quantity\` |
|
|
156
|
+
| \`percentage\` | ratio (15%, 0.85) | \`search percentage\` |
|
|
157
|
+
| \`location\` | place, address | \`search location\` |
|
|
158
|
+
| \`identifier\` | case number, invoice, code | \`search identifier\` |
|
|
159
|
+
| \`contact\` | email, phone, URL | \`search contact\` |
|
|
160
|
+
| \`media\` | image, video, audio, document | \`search media\` |`;
|
|
161
|
+
}
|
|
162
|
+
function generateRules() {
|
|
163
|
+
return `## Rules
|
|
164
|
+
|
|
165
|
+
1. **Run \`summary\` first** in every new session — one call to orient
|
|
166
|
+
2. **Use \`hot\` reads by default** — escalate to \`full\`, \`warm\`, then \`cold\` only when needed
|
|
167
|
+
3. **Use \`schema <type>\` before writes** — know what fields are required
|
|
168
|
+
4. **Use MAAD MCP tools for writes** — never edit markdown files directly; CLI forms above are for operator debugging only
|
|
169
|
+
5. **Use \`search\` for cross-document queries** — don't open files to find people/dates/amounts
|
|
170
|
+
6. **Use \`related\` for graph traversal** — don't manually search for connected docs
|
|
171
|
+
7. **Cite \`doc_id\` and \`block_id\`** in answers for traceability
|
|
172
|
+
8. **\`reindex --force\`** recovers from any stale state
|
|
173
|
+
9. **Inspect \`_meta.warnings[]\` on write responses** — the engine surfaces soft-validation signals (precision drift, deprecation hints) alongside successful writes. Agents self-correct on warnings, not just on errors
|
|
174
|
+
10. **Use \`aggregate\` for group-by totals** — don't iterate records to compute counts, sums, averages, mins, or maxes. One \`aggregate\` call with \`metric\` + \`groupBy\` returns the answer; use the \`a->b->c\` ref-chain form for cross-doctype groupings.
|
|
175
|
+
11. **Use \`join\` to follow refs in one call** — don't chain \`query\` → \`get\` → \`get\` to collect related fields. \`join\` projects fields from both sides of a ref in one pass.
|
|
176
|
+
|
|
177
|
+
## Grounding Rules (CRITICAL)
|
|
178
|
+
|
|
179
|
+
**Never state a number, date, amount, count, or ID from memory.** Always query first.
|
|
180
|
+
|
|
181
|
+
- Before reporting a field value → call \`get\` or \`verify\` with the doc_id and field
|
|
182
|
+
- Before reporting a count → call \`verify\` in count mode or \`query\` with the type and filters
|
|
183
|
+
- Before reporting a relationship → call \`related\` or \`join\`
|
|
184
|
+
- If you cannot ground a claim from the database → say "unable to verify from records"
|
|
185
|
+
|
|
186
|
+
Use \`maad_verify\` to fact-check before answering:
|
|
187
|
+
- \`verify mode=field docId=cas-001 field=claim_amount expected="1500000.00 USD"\`
|
|
188
|
+
- \`verify mode=count docType=case expectedCount=12 filters={status: "open"}\`
|
|
189
|
+
|
|
190
|
+
**The pattern:** query or verify → confirm grounded → then answer. Never the reverse.`;
|
|
191
|
+
}
|
|
192
|
+
function generateCompositionPatterns(cmd) {
|
|
193
|
+
return `## Composition Patterns
|
|
194
|
+
|
|
195
|
+
These are common multi-step operations built from primitives. The engine does not provide these as single commands — you compose them.
|
|
196
|
+
|
|
197
|
+
### Deep inspect (full engine internals for a document)
|
|
198
|
+
\`\`\`
|
|
199
|
+
${cmd} get <doc_id> hot # frontmatter + metadata
|
|
200
|
+
${cmd} validate <doc_id> # schema validation state
|
|
201
|
+
${cmd} related <doc_id> both # all relationships
|
|
202
|
+
${cmd} search entity --doc <doc_id> # all extracted objects
|
|
203
|
+
\`\`\`
|
|
204
|
+
|
|
205
|
+
### Onboard raw files (bootstrap a new project)
|
|
206
|
+
\`\`\`
|
|
207
|
+
${cmd} scan <directory> # corpus-level patterns
|
|
208
|
+
# Read the output, then:
|
|
209
|
+
# 1. Create _registry/object_types.yaml with detected families
|
|
210
|
+
# 2. Create _schema/*.yaml with detected field patterns
|
|
211
|
+
# 3. Add frontmatter to each file
|
|
212
|
+
${cmd} reindex --force # build the index
|
|
213
|
+
${cmd} summary # confirm orientation
|
|
214
|
+
\`\`\``;
|
|
215
|
+
}
|
|
216
|
+
function generateFeedback() {
|
|
217
|
+
return `## Feedback
|
|
218
|
+
|
|
219
|
+
This is a test/evaluation project. If you encounter issues, friction, or have improvement suggestions:
|
|
220
|
+
|
|
221
|
+
1. Create a file in the project root: \`feedback-YYYY-MM-DD-<model>.md\`
|
|
222
|
+
- Example: \`feedback-2026-04-07-gpt-5.md\`
|
|
223
|
+
- Example: \`feedback-2026-04-08-claude-opus.md\`
|
|
224
|
+
2. Structure your feedback with:
|
|
225
|
+
- **Observations** — what happened, what you expected
|
|
226
|
+
- **Suggestions** — how to improve it
|
|
227
|
+
- **Context** — what you were trying to do when the issue occurred
|
|
228
|
+
3. Do not modify existing feedback files from other models`;
|
|
229
|
+
}
|
|
230
|
+
export function generateStubMaadMd(enginePath, projectRoot) {
|
|
231
|
+
const cmd = buildCmdPrefix(enginePath, projectRoot);
|
|
232
|
+
return `# MAAD.md — LLM Interface
|
|
233
|
+
|
|
234
|
+
> Auto-generated by the MAAD engine.
|
|
235
|
+
> Run \`reindex\` after adding types and schemas to update this file.
|
|
236
|
+
>
|
|
237
|
+
> **This is a test/evaluation project.** If you find issues, create a feedback file:
|
|
238
|
+
> \`feedback-YYYY-MM-DD-<model>.md\`
|
|
239
|
+
|
|
240
|
+
This is a **MAAD project** — a markdown-native database.
|
|
241
|
+
|
|
242
|
+
## Getting Started
|
|
243
|
+
|
|
244
|
+
1. Define types in \`_registry/object_types.yaml\`
|
|
245
|
+
2. Create schemas in \`_schema/\`
|
|
246
|
+
3. Add markdown records
|
|
247
|
+
4. Run: \`${cmd} reindex --force\`
|
|
248
|
+
|
|
249
|
+
This file will be regenerated with full type/command reference after the first reindex.
|
|
250
|
+
`;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=maad-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maad-md.js","sourceRoot":"","sources":["../src/maad-md.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oBAAoB;AACpB,yDAAyD;AACzD,oEAAoE;AACpE,+DAA+D;AAC/D,+EAA+E;AAY/E,MAAM,UAAU,cAAc,CAAC,GAAkB;IAC/C,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAElC,OAAO,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,UAAkB,EAAE,WAAmB;IAC7D,OAAO,QAAQ,UAAU,cAAc,WAAW,EAAE,CAAC;AACvD,CAAC;AAED,8EAA8E;AAE9E,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,GAAG;OACE,CAAC;AACR,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW,EAAE,IAAmB;IAC1D,OAAO;;;;;;EAMP,GAAG;;;;;;;;;;;;;;;;;uEAiBkE,CAAC;AACxE,CAAC;AAED,SAAS,sBAAsB,CAAC,GAAW;IACzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yCAkEgC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;;;;;;;;;;;;;;;;iEAgBwD,CAAC;AAClE,CAAC;AAED,SAAS,aAAa;IACpB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;sFA2B6E,CAAC;AACvF,CAAC;AAED,SAAS,2BAA2B,CAAC,GAAW;IAC9C,OAAO;;;;;;EAMP,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;;;;;EAKH,GAAG;;;;;EAKH,GAAG;EACH,GAAG;OACE,CAAC;AACR,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO;;;;;;;;;;;2DAWkD,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,WAAmB;IACxE,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACpD,OAAO;;;;;;;;;;;;;;;YAeG,GAAG;;;CAGd,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function getBulkMaxItems(env?: NodeJS.ProcessEnv): number;
|
|
2
|
+
export interface BulkCapRejection {
|
|
3
|
+
tool: string;
|
|
4
|
+
received: number;
|
|
5
|
+
limit: number;
|
|
6
|
+
suggestedChunkSize: number;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function checkBulkSize(toolName: string, count: number, env?: NodeJS.ProcessEnv): BulkCapRejection | null;
|
|
10
|
+
//# sourceMappingURL=bulk-cap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-cap.d.ts","sourceRoot":"","sources":["../../src/mcp/bulk-cap.ts"],"names":[],"mappings":"AAeA,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAO5E;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,gBAAgB,GAAG,IAAI,CAUzB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Bulk-tool item-count cap (0.7.3, fup-2026-190 §1).
|
|
3
|
+
//
|
|
4
|
+
// Defense-in-depth flood control for maad_bulk_create / maad_bulk_update.
|
|
5
|
+
// Independent of per-session write rate limits — those throttle frequency,
|
|
6
|
+
// this caps per-request blast radius. Also bounds memory cost of bulk results
|
|
7
|
+
// (per-record validation reports, audit events, notification fanouts).
|
|
8
|
+
//
|
|
9
|
+
// Default cap: 50. Configurable via MAAD_BULK_MAX_ITEMS, clamped to [1, 1000]
|
|
10
|
+
// to keep the floor meaningful even under operator misconfiguration.
|
|
11
|
+
// ============================================================================
|
|
12
|
+
const DEFAULT_BULK_MAX = 50;
|
|
13
|
+
const HARD_BULK_MAX = 1000;
|
|
14
|
+
export function getBulkMaxItems(env = process.env) {
|
|
15
|
+
const raw = env.MAAD_BULK_MAX_ITEMS;
|
|
16
|
+
if (!raw)
|
|
17
|
+
return DEFAULT_BULK_MAX;
|
|
18
|
+
const n = Number.parseInt(raw, 10);
|
|
19
|
+
if (!Number.isFinite(n) || n < 1)
|
|
20
|
+
return DEFAULT_BULK_MAX;
|
|
21
|
+
if (n > HARD_BULK_MAX)
|
|
22
|
+
return HARD_BULK_MAX;
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
export function checkBulkSize(toolName, count, env = process.env) {
|
|
26
|
+
const max = getBulkMaxItems(env);
|
|
27
|
+
if (count <= max)
|
|
28
|
+
return null;
|
|
29
|
+
return {
|
|
30
|
+
tool: toolName,
|
|
31
|
+
received: count,
|
|
32
|
+
limit: max,
|
|
33
|
+
suggestedChunkSize: max,
|
|
34
|
+
message: `${toolName} accepts at most ${max} items per call (received ${count}). Split into chunks of <= ${max}.`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=bulk-cap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-cap.js","sourceRoot":"","sources":["../../src/mcp/bulk-cap.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,qDAAqD;AACrD,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,uEAAuE;AACvE,EAAE;AACF,8EAA8E;AAC9E,qEAAqE;AACrE,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAmB,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,OAAO,gBAAgB,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,CAAC,GAAG,aAAa;QAAE,OAAO,aAAa,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC;AAUD,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,KAAa,EACb,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,GAAG;QACV,kBAAkB,EAAE,GAAG;QACvB,OAAO,EAAE,GAAG,QAAQ,oBAAoB,GAAG,6BAA6B,KAAK,8BAA8B,GAAG,GAAG;KAClH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type Role } from './roles.js';
|
|
2
|
+
export type ProvenanceMode = 'off' | 'on' | 'detail';
|
|
3
|
+
export interface McpConfig {
|
|
4
|
+
projectRoot: string;
|
|
5
|
+
role: Role;
|
|
6
|
+
dryRun: boolean;
|
|
7
|
+
toolAllowlist: string[];
|
|
8
|
+
provenance: ProvenanceMode;
|
|
9
|
+
}
|
|
10
|
+
export declare function parseProvenance(raw: string | undefined): ProvenanceMode;
|
|
11
|
+
export declare function buildConfig(opts: {
|
|
12
|
+
projectRoot: string;
|
|
13
|
+
role?: string | undefined;
|
|
14
|
+
dryRun?: boolean | undefined;
|
|
15
|
+
toolAllowlist?: string[] | undefined;
|
|
16
|
+
provenance?: string | undefined;
|
|
17
|
+
}): McpConfig;
|
|
18
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAGvE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,GAAG,SAAS,CAQZ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// MCP Config — runtime configuration for the server
|
|
3
|
+
// Single source of truth for project root, role, flags.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { parseRole } from './roles.js';
|
|
6
|
+
export function parseProvenance(raw) {
|
|
7
|
+
if (raw === 'on' || raw === 'detail')
|
|
8
|
+
return raw;
|
|
9
|
+
return 'off';
|
|
10
|
+
}
|
|
11
|
+
export function buildConfig(opts) {
|
|
12
|
+
return {
|
|
13
|
+
projectRoot: opts.projectRoot,
|
|
14
|
+
role: parseRole(opts.role),
|
|
15
|
+
dryRun: opts.dryRun ?? false,
|
|
16
|
+
toolAllowlist: opts.toolAllowlist ?? [],
|
|
17
|
+
provenance: parseProvenance(opts.provenance),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oDAAoD;AACpD,wDAAwD;AACxD,+EAA+E;AAE/E,OAAO,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAYlD,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAM3B;IACC,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;QACvC,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EnginePool } from '../instance/pool.js';
|
|
2
|
+
import type { SessionRegistry } from '../instance/session.js';
|
|
3
|
+
import type { InstanceConfig } from '../instance/config.js';
|
|
4
|
+
import type { TokenStore } from '../auth/token-store.js';
|
|
5
|
+
export interface InstanceCtx {
|
|
6
|
+
instance: InstanceConfig;
|
|
7
|
+
pool: EnginePool;
|
|
8
|
+
sessions: SessionRegistry;
|
|
9
|
+
/**
|
|
10
|
+
* 0.7.0 — Token registry. Populated in HTTP mode from
|
|
11
|
+
* `<instance-root>/_auth/tokens.yaml`. Null in stdio / synthetic mode
|
|
12
|
+
* (no bearer channel). Callers that only apply when a token is present
|
|
13
|
+
* (auth middleware, identity propagation) check for null.
|
|
14
|
+
*/
|
|
15
|
+
tokens: TokenStore | null;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ctx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx.d.ts","sourceRoot":"","sources":["../../src/mcp/ctx.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3B"}
|
package/dist/mcp/ctx.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// InstanceCtx — the runtime context threaded through every tool handler.
|
|
3
|
+
// Holds pool + sessions so `withEngine` can resolve the correct engine
|
|
4
|
+
// per call.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=ctx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx.js","sourceRoot":"","sources":["../../src/mcp/ctx.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,yEAAyE;AACzE,uEAAuE;AACvE,YAAY;AACZ,+EAA+E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface GuardrailConfig {
|
|
2
|
+
dryRun?: boolean | undefined;
|
|
3
|
+
toolAllowlist?: string[] | undefined;
|
|
4
|
+
}
|
|
5
|
+
export declare function setGuardrailConfig(c: GuardrailConfig): void;
|
|
6
|
+
export declare function isDryRun(): boolean;
|
|
7
|
+
export declare function isToolAllowed(toolName: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Log every tool call for audit trail.
|
|
10
|
+
*/
|
|
11
|
+
export declare function auditToolCall(toolName: string, args: Record<string, unknown>): void;
|
|
12
|
+
/**
|
|
13
|
+
* Dry-run response: returns what would happen without executing.
|
|
14
|
+
*/
|
|
15
|
+
export declare function dryRunResponse(toolName: string, args: Record<string, unknown>): {
|
|
16
|
+
content: Array<{
|
|
17
|
+
type: 'text';
|
|
18
|
+
text: string;
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=guardrails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.d.ts","sourceRoot":"","sources":["../../src/mcp/guardrails.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC;AAID,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,CAE3D;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAYlI"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// AI Guardrails — tool allowlists, dry-run, audit logging
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { logger } from '../engine/logger.js';
|
|
5
|
+
let config = {};
|
|
6
|
+
export function setGuardrailConfig(c) {
|
|
7
|
+
config = c;
|
|
8
|
+
}
|
|
9
|
+
export function isDryRun() {
|
|
10
|
+
return config.dryRun ?? false;
|
|
11
|
+
}
|
|
12
|
+
export function isToolAllowed(toolName) {
|
|
13
|
+
if (!config.toolAllowlist || config.toolAllowlist.length === 0)
|
|
14
|
+
return true;
|
|
15
|
+
return config.toolAllowlist.includes(toolName);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Log every tool call for audit trail.
|
|
19
|
+
*/
|
|
20
|
+
export function auditToolCall(toolName, args) {
|
|
21
|
+
logger.info('mcp', 'tool_call', `${toolName}`, { args });
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Dry-run response: returns what would happen without executing.
|
|
25
|
+
*/
|
|
26
|
+
export function dryRunResponse(toolName, args) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{
|
|
29
|
+
type: 'text',
|
|
30
|
+
text: JSON.stringify({
|
|
31
|
+
ok: true,
|
|
32
|
+
dryRun: true,
|
|
33
|
+
tool: toolName,
|
|
34
|
+
wouldExecute: args,
|
|
35
|
+
}),
|
|
36
|
+
}],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../../src/mcp/guardrails.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,0DAA0D;AAC1D,+EAA+E;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAO7C,IAAI,MAAM,GAAoB,EAAE,CAAC;AAEjC,MAAM,UAAU,kBAAkB,CAAC,CAAkB;IACnD,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAA6B;IAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAA6B;IAC5E,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,EAAE,EAAE,IAAI;oBACR,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,QAAQ;oBACd,YAAY,EAAE,IAAI;iBACnB,CAAC;aACH,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface IdempotencyEntry {
|
|
2
|
+
response: unknown;
|
|
3
|
+
originalRequestId: string;
|
|
4
|
+
originalCompletedAt: string;
|
|
5
|
+
insertedAtMs: number;
|
|
6
|
+
}
|
|
7
|
+
export interface IdempotencyCacheOptions {
|
|
8
|
+
ttlMs?: number;
|
|
9
|
+
maxEntries?: number;
|
|
10
|
+
now?: () => number;
|
|
11
|
+
}
|
|
12
|
+
export declare class IdempotencyCache {
|
|
13
|
+
private ttlMs;
|
|
14
|
+
private maxEntries;
|
|
15
|
+
private now;
|
|
16
|
+
private entries;
|
|
17
|
+
constructor(opts?: IdempotencyCacheOptions);
|
|
18
|
+
/** Compose the cache key. Always use this — never pass raw strings. */
|
|
19
|
+
static composeKey(projectName: string, toolName: string, clientKey: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Return a cached entry if present and not expired, else null. Reinserts on
|
|
22
|
+
* hit so recent hits survive eviction.
|
|
23
|
+
*/
|
|
24
|
+
get(key: string): IdempotencyEntry | null;
|
|
25
|
+
/**
|
|
26
|
+
* Store a response. Evicts the least-recently-used entry if the cap is full.
|
|
27
|
+
* Only call this for successful responses — failures must not short-circuit
|
|
28
|
+
* retries.
|
|
29
|
+
*/
|
|
30
|
+
put(key: string, entry: Omit<IdempotencyEntry, 'insertedAtMs'>): void;
|
|
31
|
+
size(): number;
|
|
32
|
+
clear(): void;
|
|
33
|
+
}
|
|
34
|
+
/** Replace the singleton cache — called once from server startup with env-derived config. */
|
|
35
|
+
export declare function initIdempotencyCache(opts: IdempotencyCacheOptions): void;
|
|
36
|
+
/** Access the current singleton. Never returns null. */
|
|
37
|
+
export declare function getIdempotencyCache(): IdempotencyCache;
|
|
38
|
+
export declare function readIdempotencyEnv(): IdempotencyCacheOptions;
|
|
39
|
+
export type McpToolResponse = {
|
|
40
|
+
content: Array<{
|
|
41
|
+
type: 'text';
|
|
42
|
+
text: string;
|
|
43
|
+
}>;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Returns true if the response body (parsed from content[0].text) has
|
|
47
|
+
* `ok: true`. Silent false on parse failure — never cache anything we can't
|
|
48
|
+
* confirm succeeded.
|
|
49
|
+
*/
|
|
50
|
+
export declare function isSuccessfulResponse(response: McpToolResponse): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Build a replay response: identical body to the cached original, plus a fresh
|
|
53
|
+
* `_meta` envelope identifying this as a replay. Clients that ignore `_meta`
|
|
54
|
+
* see a normal successful response.
|
|
55
|
+
*/
|
|
56
|
+
export declare function buildReplayResponse(cached: IdempotencyEntry, currentRequestId: string): McpToolResponse;
|
|
57
|
+
/**
|
|
58
|
+
* Wrapper for mutating tool handlers. If `clientKey` is provided, checks the
|
|
59
|
+
* cache for a prior completed call matching `(projectName, toolName, clientKey)`.
|
|
60
|
+
* On hit: returns the cached response with fresh replay metadata.
|
|
61
|
+
* On miss: runs `fn()`, caches if successful, returns the result.
|
|
62
|
+
*
|
|
63
|
+
* `currentRequestId` is the request ID for this specific call (used both for
|
|
64
|
+
* _meta on replays and as `originalRequestId` when caching a fresh response).
|
|
65
|
+
* H6 will supply a real request ID from the MCP wrapper; for now callers can
|
|
66
|
+
* pass `crypto.randomUUID()` to satisfy the signature.
|
|
67
|
+
*/
|
|
68
|
+
export declare function withIdempotency(projectName: string, toolName: string, clientKey: string | undefined, currentRequestId: string, fn: () => Promise<McpToolResponse>): Promise<McpToolResponse>;
|
|
69
|
+
//# sourceMappingURL=idempotency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/mcp/idempotency.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAKD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,GAAG,CAAe;IAG1B,OAAO,CAAC,OAAO,CAAuC;gBAE1C,IAAI,GAAE,uBAA4B;IAM9C,uEAAuE;IACvE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAInF;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAezC;;;;OAIG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAAG,IAAI;IAcrE,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AAMD,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAExE;AAED,wDAAwD;AACxD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAID,wBAAgB,kBAAkB,IAAI,uBAAuB,CAO5D;AAID,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAEjF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CASvE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,CAkBjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,gBAAgB,EAAE,MAAM,EACxB,EAAE,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,GACjC,OAAO,CAAC,eAAe,CAAC,CAkB1B"}
|