@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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { SimpleGit } from 'simple-git';
|
|
2
|
+
import type { DocId, DocType, CommitSha } from '../types.js';
|
|
3
|
+
interface GitCommitIdentityEnv {
|
|
4
|
+
GIT_AUTHOR_NAME: string;
|
|
5
|
+
GIT_AUTHOR_EMAIL: string;
|
|
6
|
+
GIT_COMMITTER_NAME: string;
|
|
7
|
+
GIT_COMMITTER_EMAIL: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveCommitAuthor(env?: NodeJS.ProcessEnv): GitCommitIdentityEnv;
|
|
10
|
+
/**
|
|
11
|
+
* 0.7.0 — Identity snapshot for commit-message enrichment. Populated from
|
|
12
|
+
* the session's token when `MAAD_COMMIT_IDENTITY` is on (default true in
|
|
13
|
+
* 0.7.0 per dec-maadb-071 since fup-066 resolved). Set to false in the
|
|
14
|
+
* deploy env to opt out for cautious deployments.
|
|
15
|
+
*/
|
|
16
|
+
export interface CommitIdentity {
|
|
17
|
+
role: string;
|
|
18
|
+
tokenId?: string;
|
|
19
|
+
agentId?: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface CommitOptions {
|
|
23
|
+
action: 'create' | 'update' | 'delete';
|
|
24
|
+
docId: DocId;
|
|
25
|
+
docType: DocType;
|
|
26
|
+
detail: string;
|
|
27
|
+
summary: string;
|
|
28
|
+
files: string[];
|
|
29
|
+
identity?: CommitIdentity;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 0.6.10 — Three-state commit outcome. Replaces the prior `CommitSha | null`
|
|
33
|
+
* return on autoCommit so callers can distinguish benign no-ops from real
|
|
34
|
+
* failures that left staged changes uncommitted.
|
|
35
|
+
*/
|
|
36
|
+
export type CommitOutcome = {
|
|
37
|
+
status: 'committed';
|
|
38
|
+
sha: CommitSha;
|
|
39
|
+
} | {
|
|
40
|
+
status: 'noop';
|
|
41
|
+
} | {
|
|
42
|
+
status: 'failed';
|
|
43
|
+
code: string;
|
|
44
|
+
message: string;
|
|
45
|
+
};
|
|
46
|
+
export declare function formatCommitMessage(opts: CommitOptions): string;
|
|
47
|
+
/**
|
|
48
|
+
* 0.7.0 — Default ON in 0.7.0 per dec-maadb-071 (fup-066 resolved in 0.6.10
|
|
49
|
+
* removed the silent-commit-failure concern that gated this). Operators opt
|
|
50
|
+
* out with MAAD_COMMIT_IDENTITY=false.
|
|
51
|
+
*/
|
|
52
|
+
export declare function isCommitIdentityEnabled(): boolean;
|
|
53
|
+
export interface ParsedCommitMessage {
|
|
54
|
+
action: string;
|
|
55
|
+
docId: string;
|
|
56
|
+
docType: string;
|
|
57
|
+
detail: string;
|
|
58
|
+
summary: string;
|
|
59
|
+
}
|
|
60
|
+
export declare function parseCommitMessage(message: string): ParsedCommitMessage | null;
|
|
61
|
+
export declare function autoCommit(git: SimpleGit, opts: CommitOptions): Promise<CommitOutcome>;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../src/git/commit.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmB7D,UAAU,oBAAoB;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,oBAAoB,CAa9F;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAMxD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAS/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAEjD;AAKD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAU9E;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,aAAa,CAAC,CA4ExB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Git Commit Builder
|
|
3
|
+
// Formats structured commit messages and auto-commits on write operations.
|
|
4
|
+
//
|
|
5
|
+
// CommitOutcome is a three-state discriminated union so callers can tell
|
|
6
|
+
// (a) we committed and here's the sha; (b) nothing was staged so no commit
|
|
7
|
+
// was needed (benign — e.g. an update that didn't actually change the file);
|
|
8
|
+
// (c) git failed and the working tree may now hold staged-but-uncommitted
|
|
9
|
+
// changes. Before 0.6.10 we returned `sha | null` and swallowed all errors
|
|
10
|
+
// silently — bulk_create races or a mid-run lock conflict would leave the
|
|
11
|
+
// engine ack'ing writes as durable while git quietly held staged state.
|
|
12
|
+
// ============================================================================
|
|
13
|
+
import { commitSha } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* 0.7.3 (fup-2026-095) — Per-invocation git identity. The engine should never
|
|
16
|
+
* depend on the host user's `git config user.name/user.email` — when the host
|
|
17
|
+
* lacks identity, every autoCommit silently fails with "Author identity
|
|
18
|
+
* unknown" and the working tree drifts (observed 2026-04-23 on the brain-app
|
|
19
|
+
* droplet: 21 staged-uncommitted files, gitClean=false stuck).
|
|
20
|
+
*
|
|
21
|
+
* Set GIT_AUTHOR_* / GIT_COMMITTER_* env vars per-invocation so simple-git
|
|
22
|
+
* passes them to the spawned git process. These take precedence over
|
|
23
|
+
* `git config` and don't require touching repo state. Defaults are stable
|
|
24
|
+
* synthetic values; override per-deployment with MAAD_COMMIT_AUTHOR_NAME /
|
|
25
|
+
* MAAD_COMMIT_AUTHOR_EMAIL.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_COMMIT_AUTHOR_NAME = 'maadb-engine';
|
|
28
|
+
const DEFAULT_COMMIT_AUTHOR_EMAIL = 'engine@maadb.local';
|
|
29
|
+
export function resolveCommitAuthor(env = process.env) {
|
|
30
|
+
const name = env.MAAD_COMMIT_AUTHOR_NAME && env.MAAD_COMMIT_AUTHOR_NAME.length > 0
|
|
31
|
+
? env.MAAD_COMMIT_AUTHOR_NAME
|
|
32
|
+
: DEFAULT_COMMIT_AUTHOR_NAME;
|
|
33
|
+
const email = env.MAAD_COMMIT_AUTHOR_EMAIL && env.MAAD_COMMIT_AUTHOR_EMAIL.length > 0
|
|
34
|
+
? env.MAAD_COMMIT_AUTHOR_EMAIL
|
|
35
|
+
: DEFAULT_COMMIT_AUTHOR_EMAIL;
|
|
36
|
+
return {
|
|
37
|
+
GIT_AUTHOR_NAME: name,
|
|
38
|
+
GIT_AUTHOR_EMAIL: email,
|
|
39
|
+
GIT_COMMITTER_NAME: name,
|
|
40
|
+
GIT_COMMITTER_EMAIL: email,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Format: maad:<action> <doc_id> [<doc_type>] <detail> — <summary>
|
|
44
|
+
// With identity (0.7.0 MAAD_COMMIT_IDENTITY=true): title unchanged, body
|
|
45
|
+
// appended with role/token/agent/user lines so `git log --grep` queries on
|
|
46
|
+
// identity stay simple without polluting the summary line.
|
|
47
|
+
export function formatCommitMessage(opts) {
|
|
48
|
+
const detail = opts.detail ? `${opts.detail} ` : '';
|
|
49
|
+
const title = `maad:${opts.action} ${opts.docId} [${opts.docType}] ${detail}— ${opts.summary}`;
|
|
50
|
+
if (!opts.identity)
|
|
51
|
+
return title;
|
|
52
|
+
const lines = [`role: ${opts.identity.role}`];
|
|
53
|
+
if (opts.identity.tokenId !== undefined)
|
|
54
|
+
lines.push(`token: ${opts.identity.tokenId}`);
|
|
55
|
+
if (opts.identity.agentId !== undefined)
|
|
56
|
+
lines.push(`agent: ${opts.identity.agentId}`);
|
|
57
|
+
if (opts.identity.userId !== undefined)
|
|
58
|
+
lines.push(`user: ${opts.identity.userId}`);
|
|
59
|
+
return `${title}\n\n${lines.join('\n')}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 0.7.0 — Default ON in 0.7.0 per dec-maadb-071 (fup-066 resolved in 0.6.10
|
|
63
|
+
* removed the silent-commit-failure concern that gated this). Operators opt
|
|
64
|
+
* out with MAAD_COMMIT_IDENTITY=false.
|
|
65
|
+
*/
|
|
66
|
+
export function isCommitIdentityEnabled() {
|
|
67
|
+
return process.env['MAAD_COMMIT_IDENTITY'] !== 'false';
|
|
68
|
+
}
|
|
69
|
+
// Parse a structured commit message back into components
|
|
70
|
+
const COMMIT_PARSE_REGEX = /^maad:(\w+)\s+([\w.-]+)\s+\[(\w+)\]\s*(.*?)\s*—\s*(.+)$/;
|
|
71
|
+
export function parseCommitMessage(message) {
|
|
72
|
+
const match = COMMIT_PARSE_REGEX.exec(message.split('\n')[0] ?? '');
|
|
73
|
+
if (!match)
|
|
74
|
+
return null;
|
|
75
|
+
return {
|
|
76
|
+
action: match[1],
|
|
77
|
+
docId: match[2],
|
|
78
|
+
docType: match[3],
|
|
79
|
+
detail: match[4].trim(),
|
|
80
|
+
summary: match[5].trim(),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
export async function autoCommit(git, opts) {
|
|
84
|
+
try {
|
|
85
|
+
// Stage specified files
|
|
86
|
+
try {
|
|
87
|
+
await git.add(opts.files);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
return {
|
|
91
|
+
status: 'failed',
|
|
92
|
+
code: 'GIT_ADD_FAILED',
|
|
93
|
+
message: `git add failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// Check if there's anything to commit. Update paths where the file
|
|
97
|
+
// actually equals its on-disk form produce an empty staged list — this
|
|
98
|
+
// is benign (record is durable; git history matches state).
|
|
99
|
+
let status;
|
|
100
|
+
try {
|
|
101
|
+
status = await git.status();
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
return {
|
|
105
|
+
status: 'failed',
|
|
106
|
+
code: 'GIT_STATUS_FAILED',
|
|
107
|
+
message: `git status failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
if (status.staged.length === 0) {
|
|
111
|
+
return { status: 'noop' };
|
|
112
|
+
}
|
|
113
|
+
const message = formatCommitMessage(opts);
|
|
114
|
+
let result;
|
|
115
|
+
try {
|
|
116
|
+
// 0.7.3 (fup-2026-095) — set identity env per-call so we never depend
|
|
117
|
+
// on the host's `git config user.name/user.email`. simple-git's .env()
|
|
118
|
+
// is chainable and applies to the next spawned git process.
|
|
119
|
+
const identity = resolveCommitAuthor();
|
|
120
|
+
result = await git
|
|
121
|
+
.env('GIT_AUTHOR_NAME', identity.GIT_AUTHOR_NAME)
|
|
122
|
+
.env('GIT_AUTHOR_EMAIL', identity.GIT_AUTHOR_EMAIL)
|
|
123
|
+
.env('GIT_COMMITTER_NAME', identity.GIT_COMMITTER_NAME)
|
|
124
|
+
.env('GIT_COMMITTER_EMAIL', identity.GIT_COMMITTER_EMAIL)
|
|
125
|
+
.commit(message);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
// The add succeeded but the commit itself failed — worst case, since
|
|
129
|
+
// the working tree is now dirty with staged but uncommitted changes.
|
|
130
|
+
// Callers use this signal to stamp `write_durable: false` on the MCP
|
|
131
|
+
// response so clients know to retry (or reconcile out-of-band).
|
|
132
|
+
return {
|
|
133
|
+
status: 'failed',
|
|
134
|
+
code: 'GIT_COMMIT_FAILED',
|
|
135
|
+
message: `git commit failed: ${e instanceof Error ? e.message : String(e)}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (!result.commit) {
|
|
139
|
+
// simple-git returned an empty commit field — shouldn't happen after a
|
|
140
|
+
// successful commit, but defend against it so durability tracking is
|
|
141
|
+
// truthful rather than optimistic.
|
|
142
|
+
return {
|
|
143
|
+
status: 'failed',
|
|
144
|
+
code: 'GIT_COMMIT_EMPTY',
|
|
145
|
+
message: 'git commit returned no commit sha',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return { status: 'committed', sha: commitSha(result.commit) };
|
|
149
|
+
}
|
|
150
|
+
catch (e) {
|
|
151
|
+
// Defense-in-depth: anything that escapes the inner try/catches above
|
|
152
|
+
// lands here so we never return undefined. Should be unreachable in
|
|
153
|
+
// practice.
|
|
154
|
+
return {
|
|
155
|
+
status: 'failed',
|
|
156
|
+
code: 'GIT_UNKNOWN_ERROR',
|
|
157
|
+
message: e instanceof Error ? e.message : String(e),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/git/commit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SimpleGit } from 'simple-git';
|
|
2
|
+
import { type DocId, type DiffResult } from '../types.js';
|
|
3
|
+
export declare function getDiff(git: SimpleGit, filePath: string, docId: DocId, from: string, to?: string): Promise<DiffResult | null>;
|
|
4
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAEL,KAAK,KAAK,EAEV,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAErB,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA2C5B"}
|
package/dist/git/diff.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Git Diff Parser
|
|
3
|
+
// Compares two versions of a document and returns structured changes.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { parseMatter } from '../parser/matter.js';
|
|
6
|
+
import { commitSha as toCommitSha, } from '../types.js';
|
|
7
|
+
export async function getDiff(git, filePath, docId, from, to) {
|
|
8
|
+
const toRef = to ?? 'HEAD';
|
|
9
|
+
// Get old and new file contents
|
|
10
|
+
let oldContent;
|
|
11
|
+
let newContent;
|
|
12
|
+
try {
|
|
13
|
+
oldContent = await git.show(`${from}:${filePath}`);
|
|
14
|
+
newContent = await git.show(`${toRef}:${filePath}`);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Parse frontmatter from both versions
|
|
20
|
+
const oldFm = parseFm(oldContent);
|
|
21
|
+
const newFm = parseFm(newContent);
|
|
22
|
+
// Diff frontmatter field by field
|
|
23
|
+
const frontmatterChanges = {};
|
|
24
|
+
const allKeys = new Set([...Object.keys(oldFm), ...Object.keys(newFm)]);
|
|
25
|
+
for (const key of allKeys) {
|
|
26
|
+
const oldVal = oldFm[key];
|
|
27
|
+
const newVal = newFm[key];
|
|
28
|
+
if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {
|
|
29
|
+
frontmatterChanges[key] = { from: oldVal ?? null, to: newVal ?? null };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Get unified diff for the body
|
|
33
|
+
let bodyDiff = '';
|
|
34
|
+
try {
|
|
35
|
+
bodyDiff = await git.diff([`${from}..${toRef}`, '--', filePath]);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
bodyDiff = '';
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
docId,
|
|
42
|
+
from: toCommitSha(from),
|
|
43
|
+
to: toCommitSha(toRef),
|
|
44
|
+
frontmatterChanges,
|
|
45
|
+
bodyDiff,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseFm(content) {
|
|
49
|
+
try {
|
|
50
|
+
return parseMatter(content).data;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kBAAkB;AAClB,sEAAsE;AACtE,+EAA+E;AAG/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,SAAS,IAAI,WAAW,GAIzB,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAc,EACd,QAAgB,EAChB,KAAY,EACZ,IAAY,EACZ,EAAW;IAEX,MAAM,KAAK,GAAG,EAAE,IAAI,MAAM,CAAC;IAE3B,gCAAgC;IAChC,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;QACnD,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAElC,kCAAkC;IAClC,MAAM,kBAAkB,GAAmD,EAAE,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO;QACL,KAAK;QACL,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QACvB,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC;QACtB,kBAAkB;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,IAA+B,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type SimpleGit } from 'simple-git';
|
|
2
|
+
import type { DocId, DocType, ParsedCommit, AuditEntry, DiffResult, SnapshotResult } from '../types.js';
|
|
3
|
+
import { type CommitOptions, type CommitOutcome } from './commit.js';
|
|
4
|
+
export { formatCommitMessage, parseCommitMessage } from './commit.js';
|
|
5
|
+
export type { CommitOptions, CommitOutcome } from './commit.js';
|
|
6
|
+
export declare class GitLayer {
|
|
7
|
+
private git;
|
|
8
|
+
private projectRoot;
|
|
9
|
+
constructor(projectRoot: string);
|
|
10
|
+
isRepo(): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Detect and recover from a stale .git/index.lock left by a prior crashed
|
|
13
|
+
* process. Returns a recovery action string if the lock was removed, or
|
|
14
|
+
* throws if the lock is recent (likely live) and should block startup.
|
|
15
|
+
*
|
|
16
|
+
* Threshold: 30 seconds. A lock younger than that is treated as a concurrent
|
|
17
|
+
* process signal and not touched.
|
|
18
|
+
*/
|
|
19
|
+
recoverStaleIndexLock(): {
|
|
20
|
+
action: 'none' | 'removed';
|
|
21
|
+
} | {
|
|
22
|
+
action: 'conflict';
|
|
23
|
+
mtime: Date;
|
|
24
|
+
};
|
|
25
|
+
initRepo(): Promise<void>;
|
|
26
|
+
commit(opts: CommitOptions): Promise<CommitOutcome>;
|
|
27
|
+
history(filePath: string, opts?: {
|
|
28
|
+
limit?: number;
|
|
29
|
+
since?: string;
|
|
30
|
+
}): Promise<ParsedCommit[]>;
|
|
31
|
+
audit(opts?: {
|
|
32
|
+
since?: string;
|
|
33
|
+
until?: string;
|
|
34
|
+
docType?: DocType;
|
|
35
|
+
action?: string;
|
|
36
|
+
}): Promise<AuditEntry[]>;
|
|
37
|
+
diff(filePath: string, docId: DocId, from: string, to?: string): Promise<DiffResult | null>;
|
|
38
|
+
snapshot(filePath: string, docId: DocId, at: string): Promise<SnapshotResult | null>;
|
|
39
|
+
getSimpleGit(): SimpleGit;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvD,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EAEP,YAAY,EACZ,UAAU,EACV,UAAU,EACV,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAmC,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAKtG,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEhE,qBAAa,QAAQ;IACnB,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAKzB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAMhC;;;;;;;OAOG;IACH,qBAAqB,IAAI;QAAE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE;IAgBvF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBzB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAInD,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC;IAIpB,KAAK,CAAC,IAAI,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAInB,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,MAAM,EACZ,EAAE,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIvB,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAIjC,YAAY,IAAI,SAAS;CAG1B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Git Layer — Public API
|
|
3
|
+
// Thin integration layer wrapping simple-git for MAAD operations.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { simpleGit } from 'simple-git';
|
|
6
|
+
import { existsSync, writeFileSync, statSync, unlinkSync } from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { autoCommit, resolveCommitAuthor } from './commit.js';
|
|
9
|
+
import { getHistory, getAudit } from './log.js';
|
|
10
|
+
import { getDiff } from './diff.js';
|
|
11
|
+
import { getSnapshot } from './snapshot.js';
|
|
12
|
+
export { formatCommitMessage, parseCommitMessage } from './commit.js';
|
|
13
|
+
export class GitLayer {
|
|
14
|
+
git;
|
|
15
|
+
projectRoot;
|
|
16
|
+
constructor(projectRoot) {
|
|
17
|
+
this.projectRoot = projectRoot;
|
|
18
|
+
this.git = simpleGit(projectRoot);
|
|
19
|
+
}
|
|
20
|
+
async isRepo() {
|
|
21
|
+
// Check if .git exists at the project root specifically — not a parent repo
|
|
22
|
+
const gitDir = path.join(this.projectRoot, '.git');
|
|
23
|
+
return existsSync(gitDir);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Detect and recover from a stale .git/index.lock left by a prior crashed
|
|
27
|
+
* process. Returns a recovery action string if the lock was removed, or
|
|
28
|
+
* throws if the lock is recent (likely live) and should block startup.
|
|
29
|
+
*
|
|
30
|
+
* Threshold: 30 seconds. A lock younger than that is treated as a concurrent
|
|
31
|
+
* process signal and not touched.
|
|
32
|
+
*/
|
|
33
|
+
recoverStaleIndexLock() {
|
|
34
|
+
const lockPath = path.join(this.projectRoot, '.git', 'index.lock');
|
|
35
|
+
if (!existsSync(lockPath))
|
|
36
|
+
return { action: 'none' };
|
|
37
|
+
const stat = statSync(lockPath);
|
|
38
|
+
const ageMs = Date.now() - stat.mtimeMs;
|
|
39
|
+
const STALE_MS = 30_000;
|
|
40
|
+
if (ageMs < STALE_MS) {
|
|
41
|
+
return { action: 'conflict', mtime: stat.mtime };
|
|
42
|
+
}
|
|
43
|
+
unlinkSync(lockPath);
|
|
44
|
+
return { action: 'removed' };
|
|
45
|
+
}
|
|
46
|
+
async initRepo() {
|
|
47
|
+
if (await this.isRepo())
|
|
48
|
+
return;
|
|
49
|
+
await this.git.init();
|
|
50
|
+
// Create .gitignore if it doesn't exist
|
|
51
|
+
const gitignorePath = path.join(this.projectRoot, '.gitignore');
|
|
52
|
+
if (!existsSync(gitignorePath)) {
|
|
53
|
+
writeFileSync(gitignorePath, '_backend/\n', 'utf-8');
|
|
54
|
+
}
|
|
55
|
+
// Initial commit. Identity env per fup-2026-095 — same fragility as
|
|
56
|
+
// autoCommit: a host without `git config user.name/email` would otherwise
|
|
57
|
+
// fail this initial commit too.
|
|
58
|
+
await this.git.add('.gitignore');
|
|
59
|
+
const identity = resolveCommitAuthor();
|
|
60
|
+
await this.git
|
|
61
|
+
.env('GIT_AUTHOR_NAME', identity.GIT_AUTHOR_NAME)
|
|
62
|
+
.env('GIT_AUTHOR_EMAIL', identity.GIT_AUTHOR_EMAIL)
|
|
63
|
+
.env('GIT_COMMITTER_NAME', identity.GIT_COMMITTER_NAME)
|
|
64
|
+
.env('GIT_COMMITTER_EMAIL', identity.GIT_COMMITTER_EMAIL)
|
|
65
|
+
.commit('maad:init — Initialize MAAD project');
|
|
66
|
+
}
|
|
67
|
+
async commit(opts) {
|
|
68
|
+
return autoCommit(this.git, opts);
|
|
69
|
+
}
|
|
70
|
+
async history(filePath, opts) {
|
|
71
|
+
return getHistory(this.git, filePath, opts);
|
|
72
|
+
}
|
|
73
|
+
async audit(opts) {
|
|
74
|
+
return getAudit(this.git, opts);
|
|
75
|
+
}
|
|
76
|
+
async diff(filePath, docId, from, to) {
|
|
77
|
+
return getDiff(this.git, filePath, docId, from, to);
|
|
78
|
+
}
|
|
79
|
+
async snapshot(filePath, docId, at) {
|
|
80
|
+
return getSnapshot(this.git, filePath, docId, at);
|
|
81
|
+
}
|
|
82
|
+
getSimpleGit() {
|
|
83
|
+
return this.git;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/git/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SimpleGit } from 'simple-git';
|
|
2
|
+
import { type DocType, type ParsedCommit, type AuditEntry } from '../types.js';
|
|
3
|
+
export declare function getHistory(git: SimpleGit, filePath: string, opts?: {
|
|
4
|
+
limit?: number;
|
|
5
|
+
since?: string;
|
|
6
|
+
}): Promise<ParsedCommit[]>;
|
|
7
|
+
export declare function getAudit(git: SimpleGit, opts?: {
|
|
8
|
+
since?: string;
|
|
9
|
+
until?: string;
|
|
10
|
+
docType?: DocType;
|
|
11
|
+
action?: string;
|
|
12
|
+
}): Promise<AuditEntry[]>;
|
|
13
|
+
//# sourceMappingURL=log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/git/log.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAKL,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AASrB,wBAAsB,UAAU,CAC9B,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC,CA4CzB;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,SAAS,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E,OAAO,CAAC,UAAU,EAAE,CAAC,CAkEvB"}
|
package/dist/git/log.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Git Log Parser
|
|
3
|
+
// Queries git history and parses structured MAAD commit messages.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
import { parseCommitMessage } from './commit.js';
|
|
6
|
+
import { logger } from '../engine/logger.js';
|
|
7
|
+
import { docId as toDocId, docType as toDocType, commitSha as toCommitSha, } from '../types.js';
|
|
8
|
+
// Git --since="2026-04-08" excludes commits from that day.
|
|
9
|
+
// Appending T00:00:00 makes it inclusive of the specified date.
|
|
10
|
+
function normalizeDateArg(value) {
|
|
11
|
+
if (/^\d{4}-\d{2}-\d{2}$/.test(value))
|
|
12
|
+
return `${value}T00:00:00`;
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
export async function getHistory(git, filePath, opts) {
|
|
16
|
+
const args = ['--follow', '--format=%H|%an|%aI|%s'];
|
|
17
|
+
if (opts?.limit)
|
|
18
|
+
args.push(`-n`, String(opts.limit));
|
|
19
|
+
if (opts?.since)
|
|
20
|
+
args.push(`--since=${normalizeDateArg(opts.since)}`);
|
|
21
|
+
args.push('--', filePath);
|
|
22
|
+
let logOutput;
|
|
23
|
+
try {
|
|
24
|
+
logOutput = await git.raw(['log', ...args]);
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
logger.bestEffort('git', 'history', `Git log failed for ${filePath}: ${e instanceof Error ? e.message : String(e)}`);
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
if (!logOutput.trim())
|
|
31
|
+
return [];
|
|
32
|
+
const commits = [];
|
|
33
|
+
for (const line of logOutput.trim().split('\n')) {
|
|
34
|
+
const parts = line.split('|');
|
|
35
|
+
if (parts.length < 4)
|
|
36
|
+
continue;
|
|
37
|
+
const sha = parts[0];
|
|
38
|
+
const author = parts[1];
|
|
39
|
+
const timestamp = parts[2];
|
|
40
|
+
const subject = parts.slice(3).join('|'); // subject may contain |
|
|
41
|
+
const parsed = parseCommitMessage(subject);
|
|
42
|
+
if (!parsed)
|
|
43
|
+
continue; // skip non-MAAD commits
|
|
44
|
+
commits.push({
|
|
45
|
+
action: parsed.action,
|
|
46
|
+
docId: toDocId(parsed.docId),
|
|
47
|
+
docType: toDocType(parsed.docType),
|
|
48
|
+
detail: parsed.detail,
|
|
49
|
+
summary: parsed.summary,
|
|
50
|
+
sha: toCommitSha(sha),
|
|
51
|
+
author,
|
|
52
|
+
timestamp,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return commits;
|
|
56
|
+
}
|
|
57
|
+
export async function getAudit(git, opts) {
|
|
58
|
+
const args = ['--format=%H|%an|%aI|%s'];
|
|
59
|
+
if (opts?.since)
|
|
60
|
+
args.push(`--since=${normalizeDateArg(opts.since)}`);
|
|
61
|
+
if (opts?.until)
|
|
62
|
+
args.push(`--until=${normalizeDateArg(opts.until)}`);
|
|
63
|
+
let logOutput;
|
|
64
|
+
try {
|
|
65
|
+
logOutput = await git.raw(['log', ...args]);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
logger.bestEffort('git', 'audit', `Git log failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
if (!logOutput.trim())
|
|
72
|
+
return [];
|
|
73
|
+
// Aggregate by docId
|
|
74
|
+
const byDoc = new Map();
|
|
75
|
+
for (const line of logOutput.trim().split('\n')) {
|
|
76
|
+
const parts = line.split('|');
|
|
77
|
+
if (parts.length < 4)
|
|
78
|
+
continue;
|
|
79
|
+
const author = parts[1];
|
|
80
|
+
const timestamp = parts[2];
|
|
81
|
+
const subject = parts.slice(3).join('|');
|
|
82
|
+
const parsed = parseCommitMessage(subject);
|
|
83
|
+
if (!parsed)
|
|
84
|
+
continue;
|
|
85
|
+
// Apply filters
|
|
86
|
+
if (opts?.docType && parsed.docType !== opts.docType)
|
|
87
|
+
continue;
|
|
88
|
+
if (opts?.action && parsed.action !== opts.action)
|
|
89
|
+
continue;
|
|
90
|
+
const existing = byDoc.get(parsed.docId);
|
|
91
|
+
if (existing) {
|
|
92
|
+
existing.actions++;
|
|
93
|
+
// Keep the most recent (first in git log, which is newest)
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
byDoc.set(parsed.docId, {
|
|
97
|
+
docType: parsed.docType,
|
|
98
|
+
actions: 1,
|
|
99
|
+
lastAction: parsed.action,
|
|
100
|
+
lastSummary: parsed.summary,
|
|
101
|
+
lastAuthor: author,
|
|
102
|
+
lastTimestamp: timestamp,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [...byDoc.entries()].map(([id, data]) => ({
|
|
107
|
+
docId: toDocId(id),
|
|
108
|
+
docType: toDocType(data.docType),
|
|
109
|
+
actions: data.actions,
|
|
110
|
+
lastAction: data.lastAction,
|
|
111
|
+
lastSummary: data.lastSummary,
|
|
112
|
+
lastAuthor: data.lastAuthor,
|
|
113
|
+
lastTimestamp: data.lastTimestamp,
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/git/log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SimpleGit } from 'simple-git';
|
|
2
|
+
import { type DocId, type SnapshotResult } from '../types.js';
|
|
3
|
+
export declare function getSnapshot(git: SimpleGit, filePath: string, docId: DocId, at: string): Promise<SnapshotResult | null>;
|
|
4
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../src/git/snapshot.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAEL,KAAK,KAAK,EAEV,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,wBAAsB,WAAW,CAC/B,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAuDhC"}
|