ctxr-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +25 -0
- package/dist/adapter.d.ts +18 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +4 -0
- package/dist/adapter.js.map +1 -0
- package/dist/adapters/builtin/index.d.ts +10 -0
- package/dist/adapters/builtin/index.d.ts.map +1 -0
- package/dist/adapters/builtin/index.js +11 -0
- package/dist/adapters/builtin/index.js.map +1 -0
- package/dist/adapters/forge/github.d.ts +9 -0
- package/dist/adapters/forge/github.d.ts.map +1 -0
- package/dist/adapters/forge/github.js +36 -0
- package/dist/adapters/forge/github.js.map +1 -0
- package/dist/adapters/forge/types.d.ts +23 -0
- package/dist/adapters/forge/types.d.ts.map +1 -0
- package/dist/adapters/forge/types.js +2 -0
- package/dist/adapters/forge/types.js.map +1 -0
- package/dist/adapters/harness/claude-code.d.ts +9 -0
- package/dist/adapters/harness/claude-code.d.ts.map +1 -0
- package/dist/adapters/harness/claude-code.js +42 -0
- package/dist/adapters/harness/claude-code.js.map +1 -0
- package/dist/adapters/identity/claude-code.d.ts +11 -0
- package/dist/adapters/identity/claude-code.d.ts.map +1 -0
- package/dist/adapters/identity/claude-code.js +18 -0
- package/dist/adapters/identity/claude-code.js.map +1 -0
- package/dist/adapters/registry.d.ts +16 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +29 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +65 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +12 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/adapters-generate.d.ts +23 -0
- package/dist/commands/adapters-generate.d.ts.map +1 -0
- package/dist/commands/adapters-generate.js +59 -0
- package/dist/commands/adapters-generate.js.map +1 -0
- package/dist/commands/archive.d.ts +28 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +66 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/catalog-build.d.ts +7 -0
- package/dist/commands/catalog-build.d.ts.map +1 -0
- package/dist/commands/catalog-build.js +15 -0
- package/dist/commands/catalog-build.js.map +1 -0
- package/dist/commands/catalog-check.d.ts +22 -0
- package/dist/commands/catalog-check.d.ts.map +1 -0
- package/dist/commands/catalog-check.js +49 -0
- package/dist/commands/catalog-check.js.map +1 -0
- package/dist/commands/catalog-show.d.ts +13 -0
- package/dist/commands/catalog-show.d.ts.map +1 -0
- package/dist/commands/catalog-show.js +19 -0
- package/dist/commands/catalog-show.js.map +1 -0
- package/dist/commands/check.d.ts +22 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +43 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/doctor.d.ts +27 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +53 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/graph-build.d.ts +24 -0
- package/dist/commands/graph-build.d.ts.map +1 -0
- package/dist/commands/graph-build.js +36 -0
- package/dist/commands/graph-build.js.map +1 -0
- package/dist/commands/graph-query.d.ts +41 -0
- package/dist/commands/graph-query.d.ts.map +1 -0
- package/dist/commands/graph-query.js +63 -0
- package/dist/commands/graph-query.js.map +1 -0
- package/dist/commands/ingest.d.ts +28 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +60 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/init.d.ts +28 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +203 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +30 -0
- package/dist/commands/lint.d.ts.map +1 -0
- package/dist/commands/lint.js +48 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/migrate.d.ts +30 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +56 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/note-resolve.d.ts +14 -0
- package/dist/commands/note-resolve.d.ts.map +1 -0
- package/dist/commands/note-resolve.js +24 -0
- package/dist/commands/note-resolve.js.map +1 -0
- package/dist/commands/rollup-gather.d.ts +21 -0
- package/dist/commands/rollup-gather.d.ts.map +1 -0
- package/dist/commands/rollup-gather.js +40 -0
- package/dist/commands/rollup-gather.js.map +1 -0
- package/dist/commands/rollup-write.d.ts +25 -0
- package/dist/commands/rollup-write.d.ts.map +1 -0
- package/dist/commands/rollup-write.js +43 -0
- package/dist/commands/rollup-write.js.map +1 -0
- package/dist/commands/session-abandon.d.ts +13 -0
- package/dist/commands/session-abandon.d.ts.map +1 -0
- package/dist/commands/session-abandon.js +22 -0
- package/dist/commands/session-abandon.js.map +1 -0
- package/dist/commands/session-list.d.ts +14 -0
- package/dist/commands/session-list.d.ts.map +1 -0
- package/dist/commands/session-list.js +19 -0
- package/dist/commands/session-list.js.map +1 -0
- package/dist/commands/session-reap.d.ts +22 -0
- package/dist/commands/session-reap.d.ts.map +1 -0
- package/dist/commands/session-reap.js +47 -0
- package/dist/commands/session-reap.js.map +1 -0
- package/dist/commands/session-start.d.ts +18 -0
- package/dist/commands/session-start.d.ts.map +1 -0
- package/dist/commands/session-start.js +36 -0
- package/dist/commands/session-start.js.map +1 -0
- package/dist/commands/session-submit.d.ts +27 -0
- package/dist/commands/session-submit.d.ts.map +1 -0
- package/dist/commands/session-submit.js +68 -0
- package/dist/commands/session-submit.js.map +1 -0
- package/dist/commands/source-check.d.ts +21 -0
- package/dist/commands/source-check.d.ts.map +1 -0
- package/dist/commands/source-check.js +54 -0
- package/dist/commands/source-check.js.map +1 -0
- package/dist/commands/source-hash.d.ts +14 -0
- package/dist/commands/source-hash.d.ts.map +1 -0
- package/dist/commands/source-hash.js +34 -0
- package/dist/commands/source-hash.js.map +1 -0
- package/dist/commands/update.d.ts +17 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +25 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +23 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +126 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/config/defaults.d.ts +69 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +71 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/load.d.ts +11 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +49 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/render.d.ts +9 -0
- package/dist/config/render.d.ts.map +1 -0
- package/dist/config/render.js +15 -0
- package/dist/config/render.js.map +1 -0
- package/dist/config/schema.d.ts +124 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +142 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/agents-doc.d.ts +80 -0
- package/dist/core/agents-doc.d.ts.map +1 -0
- package/dist/core/agents-doc.js +207 -0
- package/dist/core/agents-doc.js.map +1 -0
- package/dist/core/catalog/build.d.ts +49 -0
- package/dist/core/catalog/build.d.ts.map +1 -0
- package/dist/core/catalog/build.js +113 -0
- package/dist/core/catalog/build.js.map +1 -0
- package/dist/core/catalog/model.d.ts +33 -0
- package/dist/core/catalog/model.d.ts.map +1 -0
- package/dist/core/catalog/model.js +58 -0
- package/dist/core/catalog/model.js.map +1 -0
- package/dist/core/checks/catalog-checks.d.ts +4 -0
- package/dist/core/checks/catalog-checks.d.ts.map +1 -0
- package/dist/core/checks/catalog-checks.js +65 -0
- package/dist/core/checks/catalog-checks.js.map +1 -0
- package/dist/core/checks/identity-checks.d.ts +11 -0
- package/dist/core/checks/identity-checks.d.ts.map +1 -0
- package/dist/core/checks/identity-checks.js +39 -0
- package/dist/core/checks/identity-checks.js.map +1 -0
- package/dist/core/checks/integrity-checks.d.ts +23 -0
- package/dist/core/checks/integrity-checks.d.ts.map +1 -0
- package/dist/core/checks/integrity-checks.js +132 -0
- package/dist/core/checks/integrity-checks.js.map +1 -0
- package/dist/core/checks/manifest.d.ts +7 -0
- package/dist/core/checks/manifest.d.ts.map +1 -0
- package/dist/core/checks/manifest.js +20 -0
- package/dist/core/checks/manifest.js.map +1 -0
- package/dist/core/checks/organize-checks.d.ts +18 -0
- package/dist/core/checks/organize-checks.d.ts.map +1 -0
- package/dist/core/checks/organize-checks.js +97 -0
- package/dist/core/checks/organize-checks.js.map +1 -0
- package/dist/core/checks/registry.d.ts +24 -0
- package/dist/core/checks/registry.d.ts.map +1 -0
- package/dist/core/checks/registry.js +33 -0
- package/dist/core/checks/registry.js.map +1 -0
- package/dist/core/checks/types.d.ts +72 -0
- package/dist/core/checks/types.d.ts.map +1 -0
- package/dist/core/checks/types.js +4 -0
- package/dist/core/checks/types.js.map +1 -0
- package/dist/core/checks/write-lifecycle-checks.d.ts +24 -0
- package/dist/core/checks/write-lifecycle-checks.d.ts.map +1 -0
- package/dist/core/checks/write-lifecycle-checks.js +205 -0
- package/dist/core/checks/write-lifecycle-checks.js.map +1 -0
- package/dist/core/command.d.ts +23 -0
- package/dist/core/command.d.ts.map +1 -0
- package/dist/core/command.js +2 -0
- package/dist/core/command.js.map +1 -0
- package/dist/core/content/canonicalize.d.ts +14 -0
- package/dist/core/content/canonicalize.d.ts.map +1 -0
- package/dist/core/content/canonicalize.js +34 -0
- package/dist/core/content/canonicalize.js.map +1 -0
- package/dist/core/conventions.d.ts +21 -0
- package/dist/core/conventions.d.ts.map +1 -0
- package/dist/core/conventions.js +73 -0
- package/dist/core/conventions.js.map +1 -0
- package/dist/core/disclosure/model.d.ts +18 -0
- package/dist/core/disclosure/model.d.ts.map +1 -0
- package/dist/core/disclosure/model.js +45 -0
- package/dist/core/disclosure/model.js.map +1 -0
- package/dist/core/env.d.ts +40 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/env.js +24 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/envelope.d.ts +46 -0
- package/dist/core/envelope.d.ts.map +1 -0
- package/dist/core/envelope.js +21 -0
- package/dist/core/envelope.js.map +1 -0
- package/dist/core/errors.d.ts +96 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +267 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/exit-codes.d.ts +32 -0
- package/dist/core/exit-codes.d.ts.map +1 -0
- package/dist/core/exit-codes.js +31 -0
- package/dist/core/exit-codes.js.map +1 -0
- package/dist/core/fs/atomic.d.ts +10 -0
- package/dist/core/fs/atomic.d.ts.map +1 -0
- package/dist/core/fs/atomic.js +31 -0
- package/dist/core/fs/atomic.js.map +1 -0
- package/dist/core/fs/fenced-region.d.ts +47 -0
- package/dist/core/fs/fenced-region.d.ts.map +1 -0
- package/dist/core/fs/fenced-region.js +122 -0
- package/dist/core/fs/fenced-region.js.map +1 -0
- package/dist/core/git/exec.d.ts +28 -0
- package/dist/core/git/exec.d.ts.map +1 -0
- package/dist/core/git/exec.js +21 -0
- package/dist/core/git/exec.js.map +1 -0
- package/dist/core/git/repo.d.ts +63 -0
- package/dist/core/git/repo.d.ts.map +1 -0
- package/dist/core/git/repo.js +91 -0
- package/dist/core/git/repo.js.map +1 -0
- package/dist/core/git/staged.d.ts +10 -0
- package/dist/core/git/staged.d.ts.map +1 -0
- package/dist/core/git/staged.js +49 -0
- package/dist/core/git/staged.js.map +1 -0
- package/dist/core/git/worktree.d.ts +29 -0
- package/dist/core/git/worktree.d.ts.map +1 -0
- package/dist/core/git/worktree.js +61 -0
- package/dist/core/git/worktree.js.map +1 -0
- package/dist/core/graph/model.d.ts +43 -0
- package/dist/core/graph/model.d.ts.map +1 -0
- package/dist/core/graph/model.js +60 -0
- package/dist/core/graph/model.js.map +1 -0
- package/dist/core/graph/persist.d.ts +7 -0
- package/dist/core/graph/persist.d.ts.map +1 -0
- package/dist/core/graph/persist.js +23 -0
- package/dist/core/graph/persist.js.map +1 -0
- package/dist/core/graph/query.d.ts +16 -0
- package/dist/core/graph/query.d.ts.map +1 -0
- package/dist/core/graph/query.js +91 -0
- package/dist/core/graph/query.js.map +1 -0
- package/dist/core/graph/visibility-filter.d.ts +13 -0
- package/dist/core/graph/visibility-filter.d.ts.map +1 -0
- package/dist/core/graph/visibility-filter.js +26 -0
- package/dist/core/graph/visibility-filter.js.map +1 -0
- package/dist/core/hooks.d.ts +34 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +89 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/identity.d.ts +14 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +36 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/core/ingest/identity.d.ts +15 -0
- package/dist/core/ingest/identity.d.ts.map +1 -0
- package/dist/core/ingest/identity.js +17 -0
- package/dist/core/ingest/identity.js.map +1 -0
- package/dist/core/ingest/model.d.ts +17 -0
- package/dist/core/ingest/model.d.ts.map +1 -0
- package/dist/core/ingest/model.js +24 -0
- package/dist/core/ingest/model.js.map +1 -0
- package/dist/core/json-config-merge.d.ts +13 -0
- package/dist/core/json-config-merge.d.ts.map +1 -0
- package/dist/core/json-config-merge.js +43 -0
- package/dist/core/json-config-merge.js.map +1 -0
- package/dist/core/markers.d.ts +17 -0
- package/dist/core/markers.d.ts.map +1 -0
- package/dist/core/markers.js +16 -0
- package/dist/core/markers.js.map +1 -0
- package/dist/core/migrations/registry.d.ts +6 -0
- package/dist/core/migrations/registry.d.ts.map +1 -0
- package/dist/core/migrations/registry.js +8 -0
- package/dist/core/migrations/registry.js.map +1 -0
- package/dist/core/migrations/rename-visibility-field.d.ts +3 -0
- package/dist/core/migrations/rename-visibility-field.d.ts.map +1 -0
- package/dist/core/migrations/rename-visibility-field.js +62 -0
- package/dist/core/migrations/rename-visibility-field.js.map +1 -0
- package/dist/core/migrations/types.d.ts +27 -0
- package/dist/core/migrations/types.d.ts.map +1 -0
- package/dist/core/migrations/types.js +2 -0
- package/dist/core/migrations/types.js.map +1 -0
- package/dist/core/notes/checks.d.ts +20 -0
- package/dist/core/notes/checks.d.ts.map +1 -0
- package/dist/core/notes/checks.js +58 -0
- package/dist/core/notes/checks.js.map +1 -0
- package/dist/core/notes/list.d.ts +26 -0
- package/dist/core/notes/list.d.ts.map +1 -0
- package/dist/core/notes/list.js +84 -0
- package/dist/core/notes/list.js.map +1 -0
- package/dist/core/notes/parse.d.ts +12 -0
- package/dist/core/notes/parse.d.ts.map +1 -0
- package/dist/core/notes/parse.js +36 -0
- package/dist/core/notes/parse.js.map +1 -0
- package/dist/core/notes/render.d.ts +7 -0
- package/dist/core/notes/render.d.ts.map +1 -0
- package/dist/core/notes/render.js +13 -0
- package/dist/core/notes/render.js.map +1 -0
- package/dist/core/notes/visibility.d.ts +26 -0
- package/dist/core/notes/visibility.d.ts.map +1 -0
- package/dist/core/notes/visibility.js +41 -0
- package/dist/core/notes/visibility.js.map +1 -0
- package/dist/core/procedures.d.ts +44 -0
- package/dist/core/procedures.d.ts.map +1 -0
- package/dist/core/procedures.js +154 -0
- package/dist/core/procedures.js.map +1 -0
- package/dist/core/queue.d.ts +16 -0
- package/dist/core/queue.d.ts.map +1 -0
- package/dist/core/queue.js +75 -0
- package/dist/core/queue.js.map +1 -0
- package/dist/core/reconcile.d.ts +18 -0
- package/dist/core/reconcile.d.ts.map +1 -0
- package/dist/core/reconcile.js +49 -0
- package/dist/core/reconcile.js.map +1 -0
- package/dist/core/records.d.ts +16 -0
- package/dist/core/records.d.ts.map +1 -0
- package/dist/core/records.js +36 -0
- package/dist/core/records.js.map +1 -0
- package/dist/core/reporter.d.ts +20 -0
- package/dist/core/reporter.d.ts.map +1 -0
- package/dist/core/reporter.js +25 -0
- package/dist/core/reporter.js.map +1 -0
- package/dist/core/root.d.ts +24 -0
- package/dist/core/root.d.ts.map +1 -0
- package/dist/core/root.js +51 -0
- package/dist/core/root.js.map +1 -0
- package/dist/core/security/secrets.d.ts +17 -0
- package/dist/core/security/secrets.d.ts.map +1 -0
- package/dist/core/security/secrets.js +21 -0
- package/dist/core/security/secrets.js.map +1 -0
- package/dist/core/session.d.ts +15 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +27 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/store.d.ts +15 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +19 -0
- package/dist/core/store.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/prompt/inquirer-prompter.d.ts +14 -0
- package/dist/prompt/inquirer-prompter.d.ts.map +1 -0
- package/dist/prompt/inquirer-prompter.js +27 -0
- package/dist/prompt/inquirer-prompter.js.map +1 -0
- package/dist/prompt/prompter.d.ts +24 -0
- package/dist/prompt/prompter.d.ts.map +1 -0
- package/dist/prompt/prompter.js +2 -0
- package/dist/prompt/prompter.js.map +1 -0
- package/dist/run.d.ts +16 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +464 -0
- package/dist/run.js.map +1 -0
- package/dist/taxonomy/profiles.d.ts +31 -0
- package/dist/taxonomy/profiles.d.ts.map +1 -0
- package/dist/taxonomy/profiles.js +45 -0
- package/dist/taxonomy/profiles.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +56 -0
- package/templates/.gitkeep +0 -0
- package/templates/hooks/pre-commit.sh +21 -0
- package/templates/hooks/pre-push.sh +24 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parseNoteText } from './notes/parse.js';
|
|
4
|
+
const HEADING_RE = /^#\s+(.+)$/m;
|
|
5
|
+
/** The skill-layout filename: `<slug>/SKILL.md` — what harnesses with skill auto-discovery read. */
|
|
6
|
+
export const SKILL_FILE_NAME = 'SKILL.md';
|
|
7
|
+
export function extractDocMetadata(raw, relativePath) {
|
|
8
|
+
let frontmatter;
|
|
9
|
+
let body = raw;
|
|
10
|
+
try {
|
|
11
|
+
const parsed = parseNoteText(raw, relativePath);
|
|
12
|
+
frontmatter = parsed.frontmatter;
|
|
13
|
+
body = parsed.body;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Malformed frontmatter in a doc file falls back to heading/filename — these
|
|
17
|
+
// are instructions, not notes; indexing must not fail loud on them.
|
|
18
|
+
}
|
|
19
|
+
const fmTitle = frontmatter?.title ?? frontmatter?.name; // SKILL.md files declare `name`
|
|
20
|
+
const fmDescription = frontmatter?.description;
|
|
21
|
+
const heading = HEADING_RE.exec(body)?.[1]?.trim();
|
|
22
|
+
// A `<slug>/SKILL.md` file's natural fallback name is its directory, not "SKILL".
|
|
23
|
+
const fallback = path.basename(relativePath) === SKILL_FILE_NAME ? path.basename(path.dirname(relativePath)) : path.basename(relativePath, '.md');
|
|
24
|
+
return {
|
|
25
|
+
path: relativePath,
|
|
26
|
+
title: (typeof fmTitle === 'string' && fmTitle.length > 0 ? fmTitle : undefined) ??
|
|
27
|
+
(heading && heading.length > 0 ? heading : undefined) ??
|
|
28
|
+
fallback,
|
|
29
|
+
description: typeof fmDescription === 'string' && fmDescription.length > 0 ? fmDescription : null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export async function scanDocsDir(root, dirRelativePath) {
|
|
33
|
+
const dir = path.join(root, dirRelativePath);
|
|
34
|
+
let entries;
|
|
35
|
+
try {
|
|
36
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (err.code === 'ENOENT')
|
|
40
|
+
return [];
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
// Two layouts, both indexed: flat `<name>.md` files, and the skill layout
|
|
44
|
+
// `<slug>/SKILL.md` (the format harnesses with skill auto-discovery read).
|
|
45
|
+
const docs = [];
|
|
46
|
+
for (const entry of [...entries].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
47
|
+
let fileRelativePath;
|
|
48
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
49
|
+
fileRelativePath = path.join(dirRelativePath, entry.name);
|
|
50
|
+
}
|
|
51
|
+
else if (entry.isDirectory()) {
|
|
52
|
+
const candidate = path.join(dir, entry.name, SKILL_FILE_NAME);
|
|
53
|
+
try {
|
|
54
|
+
await readFile(candidate, 'utf8');
|
|
55
|
+
fileRelativePath = path.join(dirRelativePath, entry.name, SKILL_FILE_NAME);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (!fileRelativePath)
|
|
62
|
+
continue;
|
|
63
|
+
const relativePath = fileRelativePath.split(path.sep).join('/');
|
|
64
|
+
const raw = await readFile(path.join(root, relativePath), 'utf8');
|
|
65
|
+
docs.push(extractDocMetadata(raw, relativePath));
|
|
66
|
+
}
|
|
67
|
+
return docs;
|
|
68
|
+
}
|
|
69
|
+
/** Every operator convention doc currently at the configured path. */
|
|
70
|
+
export function scanConventions(root, config) {
|
|
71
|
+
return scanDocsDir(root, config.harness.conventions_path);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=conventions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../../src/core/conventions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StoreConfig } from '../../config/schema.js';
|
|
2
|
+
import type { Note } from '../notes/list.js';
|
|
3
|
+
export type DisclosureVerdict = 'allow' | 'deny' | 'ask';
|
|
4
|
+
export type DisclosureRung = 'hard_wall' | 'explicit_tag' | 'internal_visibility' | 'external_default';
|
|
5
|
+
export interface DisclosureResult {
|
|
6
|
+
verdict: DisclosureVerdict;
|
|
7
|
+
rung: DisclosureRung;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* disclosure-policy spec: ordered walls-before-allows evaluation, stopping
|
|
11
|
+
* at the first rung that produces a verdict. Rung 3 (internal-audience-
|
|
12
|
+
* from-visibility) only applies when the requested audience is one the
|
|
13
|
+
* operator has declared internal — for any other (external) audience, rung
|
|
14
|
+
* 3 is skipped entirely and evaluation falls straight to rung 4's ASK, so an
|
|
15
|
+
* external verdict is never derived from visibility alone.
|
|
16
|
+
*/
|
|
17
|
+
export declare function evaluateDisclosure(config: StoreConfig, note: Note, audience: string): DisclosureResult;
|
|
18
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/core/disclosure/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,cAAc,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAEvG,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;CACtB;AAoBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAkBtG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { canSee, resolveVisibility } from '../notes/visibility.js';
|
|
2
|
+
/**
|
|
3
|
+
* The frontmatter key a note uses to explicitly declare which audiences may
|
|
4
|
+
* see it disclosed (rung 2). Unlike the visibility field (context-store
|
|
5
|
+
* spec), nothing asks this key to be configurable, so it lives here as the
|
|
6
|
+
* one literal — same discipline as every other single-purpose constant in
|
|
7
|
+
* this codebase, just without a dedicated defaults.ts entry since no other
|
|
8
|
+
* module needs to reference it.
|
|
9
|
+
*/
|
|
10
|
+
const AUDIENCE_FIELD_KEY = 'audience';
|
|
11
|
+
function matchesWall(wall, note, audience) {
|
|
12
|
+
if (wall.audience !== '*' && wall.audience !== audience)
|
|
13
|
+
return false;
|
|
14
|
+
if (wall.except?.includes(audience))
|
|
15
|
+
return false;
|
|
16
|
+
if (!wall.note_path_prefix)
|
|
17
|
+
return true;
|
|
18
|
+
const prefix = wall.note_path_prefix.endsWith('/') ? wall.note_path_prefix : `${wall.note_path_prefix}/`;
|
|
19
|
+
return note.path === wall.note_path_prefix || note.path.startsWith(prefix);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* disclosure-policy spec: ordered walls-before-allows evaluation, stopping
|
|
23
|
+
* at the first rung that produces a verdict. Rung 3 (internal-audience-
|
|
24
|
+
* from-visibility) only applies when the requested audience is one the
|
|
25
|
+
* operator has declared internal — for any other (external) audience, rung
|
|
26
|
+
* 3 is skipped entirely and evaluation falls straight to rung 4's ASK, so an
|
|
27
|
+
* external verdict is never derived from visibility alone.
|
|
28
|
+
*/
|
|
29
|
+
export function evaluateDisclosure(config, note, audience) {
|
|
30
|
+
for (const wall of config.disclosure.hard_walls) {
|
|
31
|
+
if (matchesWall(wall, note, audience)) {
|
|
32
|
+
return { verdict: wall.verdict, rung: 'hard_wall' };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const tags = note.frontmatter?.[AUDIENCE_FIELD_KEY];
|
|
36
|
+
if (Array.isArray(tags) && tags.includes(audience)) {
|
|
37
|
+
return { verdict: 'allow', rung: 'explicit_tag' };
|
|
38
|
+
}
|
|
39
|
+
if (config.disclosure.internal_audiences.includes(audience)) {
|
|
40
|
+
const resolved = resolveVisibility(config, note);
|
|
41
|
+
return { verdict: canSee(config, audience, resolved.value) ? 'allow' : 'deny', rung: 'internal_visibility' };
|
|
42
|
+
}
|
|
43
|
+
return { verdict: 'ask', rung: 'external_default' };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/core/disclosure/model.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAWnE;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAEtC,SAAS,WAAW,CAAC,IAAoB,EAAE,IAAU,EAAE,QAAgB;IACrE,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtE,IAAI,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC;IACzG,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC7E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB,EAAE,IAAU,EAAE,QAAgB;IAClF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;QAChD,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACtD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACjD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IAC/G,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Prompter } from '../prompt/prompter.js';
|
|
2
|
+
import type { GitRunner } from './git/exec.js';
|
|
3
|
+
/**
|
|
4
|
+
* The injected environment every command runs against. `run(argv, env)` is
|
|
5
|
+
* the one testable seam in the whole CLI: tests build a fake RunEnv (piped
|
|
6
|
+
* streams, a spy Prompter, a fake GitRunner) and get real command behavior
|
|
7
|
+
* with no process-global mutation and no real subprocess needed for unit
|
|
8
|
+
* tests. Only src/bin.ts constructs `realEnv()`.
|
|
9
|
+
*/
|
|
10
|
+
export interface Io {
|
|
11
|
+
stdin: NodeJS.ReadableStream & {
|
|
12
|
+
isTTY?: boolean;
|
|
13
|
+
};
|
|
14
|
+
stdout: NodeJS.WritableStream & {
|
|
15
|
+
isTTY?: boolean;
|
|
16
|
+
};
|
|
17
|
+
stderr: NodeJS.WritableStream & {
|
|
18
|
+
isTTY?: boolean;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface RunEnv {
|
|
22
|
+
cwd: string;
|
|
23
|
+
env: Readonly<Record<string, string | undefined>>;
|
|
24
|
+
io: Io;
|
|
25
|
+
/** Set by program.ts before a command runs: the --no-input flag, or implied by --json. */
|
|
26
|
+
noInput: boolean;
|
|
27
|
+
prompter: Prompter;
|
|
28
|
+
git: GitRunner;
|
|
29
|
+
now(): Date;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* interactive ⇔ stdin.isTTY && stdout.isTTY && !noInput.
|
|
33
|
+
*
|
|
34
|
+
* Deliberately no `CI` env-var sniffing: inferring intent from an env var is
|
|
35
|
+
* exactly the guessed fallback the fail-loud contract forbids. `--json`
|
|
36
|
+
* setting `noInput` is enforced by program.ts, not here.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isInteractive(env: RunEnv): boolean;
|
|
39
|
+
export declare function realEnv(): RunEnv;
|
|
40
|
+
//# sourceMappingURL=env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI/C;;;;;;GAMG;AACH,MAAM,WAAW,EAAE;IACjB,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACpD,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACrD;AAED,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAClD,EAAE,EAAE,EAAE,CAAC;IACP,0FAA0F;IAC1F,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,SAAS,CAAC;IACf,GAAG,IAAI,IAAI,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,OAAO,IAAI,MAAM,CAUhC"}
|
package/dist/core/env.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createExecFileGitRunner } from './git/exec.js';
|
|
2
|
+
import { createInquirerPrompter } from '../prompt/inquirer-prompter.js';
|
|
3
|
+
/**
|
|
4
|
+
* interactive ⇔ stdin.isTTY && stdout.isTTY && !noInput.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately no `CI` env-var sniffing: inferring intent from an env var is
|
|
7
|
+
* exactly the guessed fallback the fail-loud contract forbids. `--json`
|
|
8
|
+
* setting `noInput` is enforced by program.ts, not here.
|
|
9
|
+
*/
|
|
10
|
+
export function isInteractive(env) {
|
|
11
|
+
return Boolean(env.io.stdin.isTTY) && Boolean(env.io.stdout.isTTY) && !env.noInput;
|
|
12
|
+
}
|
|
13
|
+
export function realEnv() {
|
|
14
|
+
return {
|
|
15
|
+
cwd: process.cwd(),
|
|
16
|
+
env: process.env,
|
|
17
|
+
io: { stdin: process.stdin, stdout: process.stdout, stderr: process.stderr },
|
|
18
|
+
noInput: false,
|
|
19
|
+
prompter: createInquirerPrompter(),
|
|
20
|
+
git: createExecFileGitRunner(),
|
|
21
|
+
now: () => new Date(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AA0BxE;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QAC5E,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,sBAAsB,EAAE;QAClC,GAAG,EAAE,uBAAuB,EAAE;QAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ExitCode } from './exit-codes.js';
|
|
2
|
+
/**
|
|
3
|
+
* The `--json` output envelope every contexture command shares (cli-contract
|
|
4
|
+
* spec). Snake_case throughout, matching contexture.yaml's own `schema_version`
|
|
5
|
+
* — an agent parsing --json output shouldn't have to remember that config is
|
|
6
|
+
* snake_case but output is camelCase.
|
|
7
|
+
*
|
|
8
|
+
* `envelope_version` is the stability lever: additive-only within version 1;
|
|
9
|
+
* a breaking reshape bumps it, and both shapes ship for one minor release.
|
|
10
|
+
*/
|
|
11
|
+
export type Status = 'ok' | 'failed' | 'error';
|
|
12
|
+
export interface Finding {
|
|
13
|
+
/** Stable, machine-readable id, e.g. "root.not_found", "config.schema_version.newer". */
|
|
14
|
+
code: string;
|
|
15
|
+
severity: 'error' | 'warning' | 'info';
|
|
16
|
+
/** One human sentence. */
|
|
17
|
+
message: string;
|
|
18
|
+
/** The thing the finding is about: a path, a config key, a check id. */
|
|
19
|
+
subject?: string;
|
|
20
|
+
details?: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
export interface Envelope<TData = unknown> {
|
|
23
|
+
envelope_version: 1;
|
|
24
|
+
cli_version: string;
|
|
25
|
+
/** Dot-joined command path, e.g. "init", "doctor", later "note.resolve". */
|
|
26
|
+
command: string;
|
|
27
|
+
status: Status;
|
|
28
|
+
exit_code: number;
|
|
29
|
+
store: {
|
|
30
|
+
root: string | null;
|
|
31
|
+
schema_version: number | null;
|
|
32
|
+
};
|
|
33
|
+
findings: Finding[];
|
|
34
|
+
data: TData | null;
|
|
35
|
+
}
|
|
36
|
+
export interface BuildEnvelopeInput<TData> {
|
|
37
|
+
cliVersion: string;
|
|
38
|
+
command: string;
|
|
39
|
+
storeRoot: string | null;
|
|
40
|
+
schemaVersion: number | null;
|
|
41
|
+
findings: Finding[];
|
|
42
|
+
data: TData | null;
|
|
43
|
+
exitCode: ExitCode;
|
|
44
|
+
}
|
|
45
|
+
export declare function buildEnvelope<TData>(input: BuildEnvelopeInput<TData>): Envelope<TData>;
|
|
46
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/core/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/C,MAAM,WAAW,OAAO;IACtB,yFAAyF;IACzF,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,QAAQ,CAAC,KAAK,GAAG,OAAO;IACvC,gBAAgB,EAAE,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB,CAAC,KAAK;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAQD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAWtF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ExitCode } from './exit-codes.js';
|
|
2
|
+
function statusForExitCode(exitCode) {
|
|
3
|
+
if (exitCode === ExitCode.Ok)
|
|
4
|
+
return 'ok';
|
|
5
|
+
if (exitCode === ExitCode.Internal || exitCode === ExitCode.Usage)
|
|
6
|
+
return 'error';
|
|
7
|
+
return 'failed';
|
|
8
|
+
}
|
|
9
|
+
export function buildEnvelope(input) {
|
|
10
|
+
return {
|
|
11
|
+
envelope_version: 1,
|
|
12
|
+
cli_version: input.cliVersion,
|
|
13
|
+
command: input.command,
|
|
14
|
+
status: statusForExitCode(input.exitCode),
|
|
15
|
+
exit_code: input.exitCode,
|
|
16
|
+
store: { root: input.storeRoot, schema_version: input.schemaVersion },
|
|
17
|
+
findings: input.findings,
|
|
18
|
+
data: input.data,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/core/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AA8C3C,SAAS,iBAAiB,CAAC,QAAkB;IAC3C,IAAI,QAAQ,KAAK,QAAQ,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa,CAAQ,KAAgC;IACnE,OAAO;QACL,gBAAgB,EAAE,CAAC;QACnB,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC;QACzC,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE;QACrE,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { ExitCode } from './exit-codes.js';
|
|
2
|
+
import type { Finding } from './envelope.js';
|
|
3
|
+
/**
|
|
4
|
+
* Base for every error contexture raises deliberately (as opposed to a bug,
|
|
5
|
+
* which throws something else and is mapped to ExitCode.Internal). Each
|
|
6
|
+
* carries the finding that explains, in the fail-loud contract's terms,
|
|
7
|
+
* exactly what could not be determined — never a guessed fallback.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ContextureError extends Error {
|
|
10
|
+
readonly exitCode: ExitCode;
|
|
11
|
+
readonly finding: Finding;
|
|
12
|
+
constructor(exitCode: ExitCode, finding: Finding);
|
|
13
|
+
}
|
|
14
|
+
export declare class NoStoreRootError extends ContextureError {
|
|
15
|
+
constructor(checked: {
|
|
16
|
+
flag: boolean;
|
|
17
|
+
env: boolean;
|
|
18
|
+
cwd: string;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export declare class NotAGitRepositoryError extends ContextureError {
|
|
22
|
+
constructor(root: string);
|
|
23
|
+
}
|
|
24
|
+
export declare class SchemaVersionNewerError extends ContextureError {
|
|
25
|
+
constructor(storeVersion: number, supportedVersion: number);
|
|
26
|
+
}
|
|
27
|
+
export declare class SchemaVersionMissingError extends ContextureError {
|
|
28
|
+
constructor(configPath: string);
|
|
29
|
+
}
|
|
30
|
+
export declare class InvalidConfigError extends ContextureError {
|
|
31
|
+
constructor(configPath: string, issues: readonly {
|
|
32
|
+
path: string;
|
|
33
|
+
message: string;
|
|
34
|
+
}[]);
|
|
35
|
+
}
|
|
36
|
+
export declare class InvalidNoteFrontmatterError extends ContextureError {
|
|
37
|
+
constructor(notePath: string, detail: string);
|
|
38
|
+
}
|
|
39
|
+
export declare class SessionNotFoundError extends ContextureError {
|
|
40
|
+
constructor(branch: string);
|
|
41
|
+
}
|
|
42
|
+
export declare class SessionValidationFailedError extends ContextureError {
|
|
43
|
+
constructor(findings: Finding[]);
|
|
44
|
+
}
|
|
45
|
+
export declare class NoRemoteConfiguredError extends ContextureError {
|
|
46
|
+
constructor();
|
|
47
|
+
}
|
|
48
|
+
export declare class CatalogSectionNotFoundError extends ContextureError {
|
|
49
|
+
constructor(sectionId: string);
|
|
50
|
+
}
|
|
51
|
+
export declare class GraphIdentityCollisionError extends ContextureError {
|
|
52
|
+
constructor(ids: readonly string[]);
|
|
53
|
+
}
|
|
54
|
+
export declare class NoteNotFoundError extends ContextureError {
|
|
55
|
+
constructor(notePath: string);
|
|
56
|
+
}
|
|
57
|
+
export declare class AlreadyIngestedError extends ContextureError {
|
|
58
|
+
constructor(notePath: string);
|
|
59
|
+
}
|
|
60
|
+
export declare class NoteNotTrackedError extends ContextureError {
|
|
61
|
+
constructor(notePath: string);
|
|
62
|
+
}
|
|
63
|
+
export declare class ArchiveDestinationExistsError extends ContextureError {
|
|
64
|
+
constructor(destinationPath: string);
|
|
65
|
+
}
|
|
66
|
+
export declare class AdapterNotFoundError extends ContextureError {
|
|
67
|
+
constructor(kind: string, id: string);
|
|
68
|
+
}
|
|
69
|
+
export declare class AdapterVersionMismatchError extends ContextureError {
|
|
70
|
+
constructor(kind: string, id: string, declaredVersion: number, supportedVersion: number);
|
|
71
|
+
}
|
|
72
|
+
export declare class GraphNotBuiltError extends ContextureError {
|
|
73
|
+
constructor();
|
|
74
|
+
}
|
|
75
|
+
export declare class GraphNodeNotFoundError extends ContextureError {
|
|
76
|
+
constructor(nodeId: string);
|
|
77
|
+
}
|
|
78
|
+
export declare class MarkerMismatchError extends ContextureError {
|
|
79
|
+
constructor(filePath: string, detail: string);
|
|
80
|
+
}
|
|
81
|
+
export declare class GitIdentityMissingError extends ContextureError {
|
|
82
|
+
constructor();
|
|
83
|
+
}
|
|
84
|
+
export declare class TaxonomySelectionConflictError extends ContextureError {
|
|
85
|
+
constructor();
|
|
86
|
+
}
|
|
87
|
+
export declare class InvalidTaxonomyFileError extends ContextureError {
|
|
88
|
+
constructor(filePath: string, issues: readonly {
|
|
89
|
+
path: string;
|
|
90
|
+
message: string;
|
|
91
|
+
}[]);
|
|
92
|
+
}
|
|
93
|
+
export declare class UnknownTaxonomyProfileError extends ContextureError {
|
|
94
|
+
constructor(given: string, knownIds: readonly string[]);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"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"}
|