human-to-code 0.0.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/Readme.md +368 -38
  2. package/SECURITY.md +175 -11
  3. package/dist/adapters/general.d.ts +30 -0
  4. package/dist/adapters/general.d.ts.map +1 -0
  5. package/dist/adapters/general.js +77 -0
  6. package/dist/adapters/general.js.map +1 -0
  7. package/dist/adapters/node.d.ts +8 -0
  8. package/dist/adapters/node.d.ts.map +1 -0
  9. package/dist/adapters/node.js +1071 -0
  10. package/dist/adapters/node.js.map +1 -0
  11. package/dist/adapters/python.d.ts +7 -0
  12. package/dist/adapters/python.d.ts.map +1 -0
  13. package/dist/adapters/python.js +540 -0
  14. package/dist/adapters/python.js.map +1 -0
  15. package/dist/adapters/rust.d.ts +7 -0
  16. package/dist/adapters/rust.d.ts.map +1 -0
  17. package/dist/adapters/rust.js +517 -0
  18. package/dist/adapters/rust.js.map +1 -0
  19. package/dist/analyzer-types.d.ts +161 -0
  20. package/dist/analyzer-types.d.ts.map +1 -0
  21. package/dist/analyzer-types.js +8 -0
  22. package/dist/analyzer-types.js.map +1 -0
  23. package/dist/analyzer-utils.d.ts +40 -0
  24. package/dist/analyzer-utils.d.ts.map +1 -0
  25. package/dist/analyzer-utils.js +591 -0
  26. package/dist/analyzer-utils.js.map +1 -0
  27. package/dist/analyzer.d.ts +21 -0
  28. package/dist/analyzer.d.ts.map +1 -0
  29. package/dist/analyzer.js +111 -0
  30. package/dist/analyzer.js.map +1 -0
  31. package/dist/certification.d.ts +102 -0
  32. package/dist/certification.d.ts.map +1 -0
  33. package/dist/certification.js +193 -0
  34. package/dist/certification.js.map +1 -0
  35. package/dist/cli.d.ts +4 -0
  36. package/dist/cli.d.ts.map +1 -0
  37. package/dist/cli.js +566 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/compiler-skills.d.ts +25 -0
  40. package/dist/compiler-skills.d.ts.map +1 -0
  41. package/dist/compiler-skills.js +158 -0
  42. package/dist/compiler-skills.js.map +1 -0
  43. package/dist/compiler-tools.d.ts +29 -0
  44. package/dist/compiler-tools.d.ts.map +1 -0
  45. package/dist/compiler-tools.js +337 -0
  46. package/dist/compiler-tools.js.map +1 -0
  47. package/dist/config.d.ts +122 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +704 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/context.d.ts +153 -0
  52. package/dist/context.d.ts.map +1 -0
  53. package/dist/context.js +772 -0
  54. package/dist/context.js.map +1 -0
  55. package/dist/contracts.d.ts +196 -0
  56. package/dist/contracts.d.ts.map +1 -0
  57. package/dist/contracts.js +721 -0
  58. package/dist/contracts.js.map +1 -0
  59. package/dist/discovery.d.ts +34 -0
  60. package/dist/discovery.d.ts.map +1 -0
  61. package/dist/discovery.js +312 -0
  62. package/dist/discovery.js.map +1 -0
  63. package/dist/documentation.d.ts +44 -0
  64. package/dist/documentation.d.ts.map +1 -0
  65. package/dist/documentation.js +418 -0
  66. package/dist/documentation.js.map +1 -0
  67. package/dist/index.d.ts +23 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +21 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/patch.d.ts +71 -0
  72. package/dist/patch.d.ts.map +1 -0
  73. package/dist/patch.js +394 -0
  74. package/dist/patch.js.map +1 -0
  75. package/dist/pinned-http.d.ts +15 -0
  76. package/dist/pinned-http.d.ts.map +1 -0
  77. package/dist/pinned-http.js +170 -0
  78. package/dist/pinned-http.js.map +1 -0
  79. package/dist/planner.d.ts +30 -0
  80. package/dist/planner.d.ts.map +1 -0
  81. package/dist/planner.js +228 -0
  82. package/dist/planner.js.map +1 -0
  83. package/dist/provider.d.ts +168 -0
  84. package/dist/provider.d.ts.map +1 -0
  85. package/dist/provider.js +512 -0
  86. package/dist/provider.js.map +1 -0
  87. package/dist/providers.d.ts +41 -0
  88. package/dist/providers.d.ts.map +1 -0
  89. package/dist/providers.js +954 -0
  90. package/dist/providers.js.map +1 -0
  91. package/dist/run-store.d.ts +24 -0
  92. package/dist/run-store.d.ts.map +1 -0
  93. package/dist/run-store.js +285 -0
  94. package/dist/run-store.js.map +1 -0
  95. package/dist/schemas.d.ts +18 -0
  96. package/dist/schemas.d.ts.map +1 -0
  97. package/dist/schemas.js +228 -0
  98. package/dist/schemas.js.map +1 -0
  99. package/dist/secret-scan.d.ts +30 -0
  100. package/dist/secret-scan.d.ts.map +1 -0
  101. package/dist/secret-scan.js +122 -0
  102. package/dist/secret-scan.js.map +1 -0
  103. package/dist/snapshot.d.ts +33 -0
  104. package/dist/snapshot.d.ts.map +1 -0
  105. package/dist/snapshot.js +136 -0
  106. package/dist/snapshot.js.map +1 -0
  107. package/dist/support-matrix.d.ts +23 -0
  108. package/dist/support-matrix.d.ts.map +1 -0
  109. package/dist/support-matrix.js +199 -0
  110. package/dist/support-matrix.js.map +1 -0
  111. package/dist/types.d.ts +63 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +8 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/validation.d.ts +25 -0
  116. package/dist/validation.d.ts.map +1 -0
  117. package/dist/validation.js +388 -0
  118. package/dist/validation.js.map +1 -0
  119. package/dist/workflow.d.ts +65 -0
  120. package/dist/workflow.d.ts.map +1 -0
  121. package/dist/workflow.js +1636 -0
  122. package/dist/workflow.js.map +1 -0
  123. package/package.json +36 -9
  124. package/.claude/settings.local.json +0 -12
  125. package/.github/workflows/ci.yml +0 -18
  126. package/CONTRIBUTING.md +0 -40
  127. package/src/cli.ts +0 -218
  128. package/src/config.ts +0 -186
  129. package/src/discovery.ts +0 -186
  130. package/src/index.ts +0 -22
  131. package/src/types.ts +0 -74
  132. package/test/config.test.ts +0 -97
  133. package/test/discovery.test.ts +0 -91
  134. package/tsconfig.json +0 -17
@@ -0,0 +1,228 @@
1
+ /** JSON Schema representations of every persisted v1 pipeline artifact. */
2
+ const SHA256 = "^[a-f0-9]{64}$";
3
+ const ID = "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$";
4
+ const WORKSPACE_ID = "^[A-Za-z0-9][A-Za-z0-9._:/@-]{0,511}$";
5
+ const PATH = "^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?![A-Za-z]:).+$";
6
+ const stringArray = (minimum = 0) => ({
7
+ type: "array",
8
+ items: { type: "string", minLength: 1 },
9
+ minItems: minimum,
10
+ uniqueItems: true,
11
+ });
12
+ const patchOperationSchemas = [
13
+ {
14
+ type: "object",
15
+ additionalProperties: false,
16
+ required: ["kind", "path", "content"],
17
+ properties: {
18
+ kind: { const: "create" },
19
+ path: { type: "string", pattern: PATH },
20
+ content: { type: "string", maxLength: 10_000_000 },
21
+ },
22
+ },
23
+ {
24
+ type: "object",
25
+ additionalProperties: false,
26
+ required: ["kind", "path", "baseHash", "oldText", "newText"],
27
+ properties: {
28
+ kind: { const: "edit" },
29
+ path: { type: "string", pattern: PATH },
30
+ baseHash: { type: "string", pattern: SHA256 },
31
+ oldText: { type: "string", minLength: 1, maxLength: 10_000_000 },
32
+ newText: { type: "string", maxLength: 10_000_000 },
33
+ },
34
+ },
35
+ {
36
+ type: "object",
37
+ additionalProperties: false,
38
+ required: ["kind", "path", "baseHash"],
39
+ properties: {
40
+ kind: { const: "delete" },
41
+ path: { type: "string", pattern: PATH },
42
+ baseHash: { type: "string", pattern: SHA256 },
43
+ },
44
+ },
45
+ {
46
+ type: "object",
47
+ additionalProperties: false,
48
+ required: ["kind", "from", "path", "baseHash"],
49
+ properties: {
50
+ kind: { const: "rename" },
51
+ from: { type: "string", pattern: PATH },
52
+ path: { type: "string", pattern: PATH },
53
+ baseHash: { type: "string", pattern: SHA256 },
54
+ },
55
+ },
56
+ ];
57
+ export const CHANGE_CONTRACT_SCHEMA_V1 = {
58
+ $schema: "https://json-schema.org/draft/2020-12/schema",
59
+ $id: "https://human-to-code.dev/schemas/change-contract-v1.json",
60
+ title: "ChangeContractV1",
61
+ type: "object",
62
+ additionalProperties: false,
63
+ required: [
64
+ "schemaVersion", "source", "projectFingerprint", "targetWorkspaces",
65
+ "targetSymbols", "requirements", "acceptanceCriteria", "scope",
66
+ "prohibitedChanges", "risks", "authorizedRisks", "unresolvedQuestions",
67
+ ],
68
+ properties: {
69
+ schemaVersion: { const: 1 },
70
+ source: {
71
+ type: "object", additionalProperties: false, required: ["path", "sha256"],
72
+ properties: { path: { type: "string", pattern: PATH }, sha256: { type: "string", pattern: SHA256 } },
73
+ },
74
+ projectFingerprint: { type: "string", pattern: SHA256 },
75
+ targetWorkspaces: { ...stringArray(1), items: { type: "string", pattern: WORKSPACE_ID } },
76
+ targetSymbols: stringArray(),
77
+ requirements: {
78
+ type: "array", minItems: 1,
79
+ items: {
80
+ type: "object", additionalProperties: false, required: ["id", "description"],
81
+ properties: { id: { type: "string", pattern: ID }, description: { type: "string", minLength: 1, maxLength: 16_384 } },
82
+ },
83
+ },
84
+ acceptanceCriteria: {
85
+ type: "object", additionalProperties: false, required: ["automated", "manual"],
86
+ properties: { automated: stringArray(), manual: stringArray() },
87
+ },
88
+ scope: {
89
+ type: "object", additionalProperties: false, required: ["allowedPaths", "allowedOperations", "prohibitedPaths"],
90
+ properties: {
91
+ allowedPaths: { ...stringArray(1), items: { type: "string", pattern: PATH } },
92
+ allowedOperations: { type: "array", minItems: 1, uniqueItems: true, items: { enum: ["create", "edit", "delete", "rename"] } },
93
+ prohibitedPaths: { ...stringArray(), items: { type: "string", pattern: PATH } },
94
+ },
95
+ },
96
+ prohibitedChanges: stringArray(),
97
+ risks: {
98
+ type: "array",
99
+ items: {
100
+ type: "object", additionalProperties: false, required: ["category", "reason"],
101
+ properties: {
102
+ category: { enum: ["dependency_change", "lockfile_change", "database_migration", "public_api_break", "authentication_change", "unsafe_rust", "ffi", "validation_config_change"] },
103
+ reason: { type: "string", minLength: 1, maxLength: 4096 },
104
+ },
105
+ },
106
+ },
107
+ authorizedRisks: { type: "array", uniqueItems: true, items: { enum: ["dependency_change", "lockfile_change", "database_migration", "public_api_break", "authentication_change", "unsafe_rust", "ffi", "validation_config_change"] } },
108
+ unresolvedQuestions: {
109
+ type: "array",
110
+ items: {
111
+ type: "object", additionalProperties: false, required: ["id", "question", "material"],
112
+ properties: { id: { type: "string", pattern: ID }, question: { type: "string", minLength: 1, maxLength: 8192 }, material: { type: "boolean" } },
113
+ },
114
+ },
115
+ },
116
+ };
117
+ /** Provider response schema. File modes are intentionally never model-controlled. */
118
+ export const PATCH_SET_SCHEMA_V1 = {
119
+ $schema: "https://json-schema.org/draft/2020-12/schema",
120
+ $id: "https://human-to-code.dev/schemas/patch-set-v1.json",
121
+ title: "PatchSetV1",
122
+ type: "object",
123
+ additionalProperties: false,
124
+ required: ["schemaVersion", "contractHash", "snapshotHash", "operations", "requirementIds", "proposedTests"],
125
+ properties: {
126
+ schemaVersion: { const: 1 },
127
+ contractHash: { type: "string", pattern: SHA256 },
128
+ snapshotHash: { type: "string", pattern: SHA256 },
129
+ operations: { type: "array", minItems: 1, maxItems: 200, items: { anyOf: patchOperationSchemas } },
130
+ requirementIds: { ...stringArray(1), items: { type: "string", pattern: ID } },
131
+ proposedTests: stringArray(),
132
+ },
133
+ };
134
+ const validationCommandSchema = {
135
+ type: "object",
136
+ additionalProperties: false,
137
+ required: ["id", "argv", "cwd", "timeoutMs", "required", "category"],
138
+ properties: {
139
+ id: { type: "string", pattern: ID },
140
+ argv: { type: "array", minItems: 1, items: { type: "string", minLength: 1 } },
141
+ cwd: { type: "string" },
142
+ timeoutMs: { type: "integer", minimum: 1000, maximum: 1_800_000 },
143
+ required: { type: "boolean" },
144
+ category: { enum: ["format", "lint", "typecheck", "test", "build", "integration", "security"] },
145
+ },
146
+ };
147
+ export const VALIDATION_PLAN_SCHEMA_V1 = {
148
+ $schema: "https://json-schema.org/draft/2020-12/schema",
149
+ $id: "https://human-to-code.dev/schemas/validation-plan-v1.json",
150
+ title: "ValidationPlanV1",
151
+ type: "object",
152
+ additionalProperties: false,
153
+ required: ["schemaVersion", "profileFingerprint", "commands", "manualChecks"],
154
+ properties: {
155
+ schemaVersion: { const: 1 },
156
+ profileFingerprint: { type: "string", pattern: SHA256 },
157
+ commands: { type: "array", minItems: 1, items: validationCommandSchema },
158
+ manualChecks: stringArray(),
159
+ },
160
+ };
161
+ const commandResultSchema = {
162
+ type: "object", additionalProperties: false,
163
+ required: ["id", "status", "exitCode", "signal", "durationMs", "stdout", "stderr", "timedOut", "flaky", "outputTruncated", "startedAt", "finishedAt"],
164
+ properties: {
165
+ id: { type: "string", pattern: ID }, status: { enum: ["passed", "failed", "skipped", "error"] },
166
+ exitCode: { type: ["integer", "null"] }, signal: { type: ["string", "null"] }, durationMs: { type: "integer", minimum: 0 },
167
+ stdout: { type: "string" }, stderr: { type: "string" }, timedOut: { type: "boolean" }, flaky: { type: "boolean" }, outputTruncated: { type: "boolean" },
168
+ startedAt: { type: "string", format: "date-time" }, finishedAt: { type: "string", format: "date-time" },
169
+ },
170
+ };
171
+ export const VALIDATION_REPORT_SCHEMA_V1 = {
172
+ $schema: "https://json-schema.org/draft/2020-12/schema",
173
+ $id: "https://human-to-code.dev/schemas/validation-report-v1.json",
174
+ title: "ValidationReportV1",
175
+ type: "object", additionalProperties: false,
176
+ required: ["schemaVersion", "status", "sandbox", "baseline", "candidate", "repairs", "manualChecks", "diagnostics", "startedAt", "finishedAt"],
177
+ properties: {
178
+ schemaVersion: { const: 1 }, status: { enum: ["validated", "non_regression_only", "unvalidated", "failed"] }, sandbox: { enum: ["strong", "degraded", "none"] },
179
+ baseline: { type: "array", items: commandResultSchema }, candidate: { type: "array", items: commandResultSchema },
180
+ repairs: { type: "array", items: { type: "object" } }, manualChecks: { type: "array", items: { type: "object" } }, diagnostics: stringArray(),
181
+ startedAt: { type: "string", format: "date-time" }, finishedAt: { type: "string", format: "date-time" },
182
+ },
183
+ };
184
+ export const CONTEXT_MANIFEST_SCHEMA_V1 = {
185
+ $schema: "https://json-schema.org/draft/2020-12/schema",
186
+ $id: "https://human-to-code.dev/schemas/context-manifest-v1.json",
187
+ title: "ContextManifestV1",
188
+ type: "object", additionalProperties: false,
189
+ required: ["schemaVersion", "projectFingerprint", "offline", "evidence", "exclusions", "budget", "redactionCount"],
190
+ properties: {
191
+ schemaVersion: { const: 1 }, projectFingerprint: { type: "string", pattern: SHA256 }, offline: { type: "boolean" },
192
+ evidence: { type: "array", items: { type: "object" } }, exclusions: { type: "array", items: { type: "object" } }, budget: { type: "object" },
193
+ redactionCount: { type: "integer", minimum: 0 },
194
+ },
195
+ };
196
+ export const RUN_RECORD_SCHEMA_V1 = {
197
+ $schema: "https://json-schema.org/draft/2020-12/schema",
198
+ $id: "https://human-to-code.dev/schemas/run-record-v1.json",
199
+ title: "RunRecordV1",
200
+ type: "object", additionalProperties: false,
201
+ required: ["runId", "schemaVersion", "createdAt", "updatedAt", "root", "status", "diagnostics"],
202
+ properties: {
203
+ runId: { type: "string", pattern: ID }, schemaVersion: { const: 1 }, createdAt: { type: "string", format: "date-time" }, updatedAt: { type: "string", format: "date-time" },
204
+ root: { type: "string" }, status: { enum: ["VERIFIED", "NEEDS_INPUT", "UNSUPPORTED", "INCONCLUSIVE", "FAILED", "SECURITY_BLOCKED"] },
205
+ contractHash: { type: "string", pattern: SHA256 }, contextManifestHash: { type: "string", pattern: SHA256 }, patchHash: { type: "string", pattern: SHA256 }, validationReportHash: { type: "string", pattern: SHA256 },
206
+ provider: { type: "object" },
207
+ usage: {
208
+ type: "object",
209
+ additionalProperties: false,
210
+ required: ["inputTokens", "outputTokens", "totalTokens", "requests"],
211
+ properties: {
212
+ inputTokens: { type: "integer", minimum: 0 }, outputTokens: { type: "integer", minimum: 0 },
213
+ totalTokens: { type: "integer", minimum: 0 }, requests: { type: "integer", minimum: 0 },
214
+ repairs: { type: "integer", minimum: 0, maximum: 2 }, costUsd: { type: "number", minimum: 0 },
215
+ },
216
+ },
217
+ diagnostics: stringArray(),
218
+ },
219
+ };
220
+ export const ARTIFACT_SCHEMAS_V1 = Object.freeze({
221
+ ChangeContractV1: CHANGE_CONTRACT_SCHEMA_V1,
222
+ ContextManifestV1: CONTEXT_MANIFEST_SCHEMA_V1,
223
+ PatchSetV1: PATCH_SET_SCHEMA_V1,
224
+ ValidationPlanV1: VALIDATION_PLAN_SCHEMA_V1,
225
+ ValidationReportV1: VALIDATION_REPORT_SCHEMA_V1,
226
+ RunRecordV1: RUN_RECORD_SCHEMA_V1,
227
+ });
228
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /** Fail-closed repository-wide credential scan performed before provider access. */
2
+ import { type SecretKind } from "./context.ts";
3
+ export interface ProjectSecretFindingV1 {
4
+ path: string;
5
+ kind: SecretKind;
6
+ line: number;
7
+ }
8
+ export interface ProjectSecretScanOptions {
9
+ maxFiles?: number;
10
+ maxBytes?: number;
11
+ maxFindings?: number;
12
+ }
13
+ export interface ProjectSecretScanResultV1 {
14
+ filesScanned: number;
15
+ bytesScanned: number;
16
+ symlinksSkipped: number;
17
+ findings: ProjectSecretFindingV1[];
18
+ }
19
+ export declare class ProjectSecretScanError extends Error {
20
+ readonly code: "INVALID_ROOT" | "PARTIAL_SCAN" | "SECRET_DETECTED";
21
+ readonly findings: readonly ProjectSecretFindingV1[];
22
+ constructor(code: ProjectSecretScanError["code"], message: string, findings?: readonly ProjectSecretFindingV1[]);
23
+ }
24
+ /**
25
+ * Scan first-party regular files, including ignored/untracked fixtures and
26
+ * logs. Dependency stores and VCS/tool internals are excluded because they are
27
+ * neither provider context nor first-party source.
28
+ */
29
+ export declare function scanProjectForSecrets(rootInput: string, options?: ProjectSecretScanOptions): Promise<ProjectSecretScanResultV1>;
30
+ //# sourceMappingURL=secret-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.d.ts","sourceRoot":"","sources":["../src/secret-scan.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAKpF,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAI5D,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CACpC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,GAAG,iBAAiB,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;gBAEzC,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,SAAS,sBAAsB,EAAO;CAMpH;AAMD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,yBAAyB,CAAC,CAwFpC"}
@@ -0,0 +1,122 @@
1
+ /** Fail-closed repository-wide credential scan performed before provider access. */
2
+ import { constants as fsConstants } from "node:fs";
3
+ import { lstat, open, readdir, realpath } from "node:fs/promises";
4
+ import { relative, resolve, sep } from "node:path";
5
+ import { scanSecrets } from "./context.js";
6
+ const SKIP_DIRECTORIES = new Set(["node_modules", ".venv", "venv", "target", ".git", ".hg", ".svn", ".human-to-code"]);
7
+ export class ProjectSecretScanError extends Error {
8
+ code;
9
+ findings;
10
+ constructor(code, message, findings = []) {
11
+ super(message);
12
+ this.name = "ProjectSecretScanError";
13
+ this.code = code;
14
+ this.findings = findings;
15
+ }
16
+ }
17
+ function toPosix(value) {
18
+ return value.split(sep).join("/");
19
+ }
20
+ /**
21
+ * Scan first-party regular files, including ignored/untracked fixtures and
22
+ * logs. Dependency stores and VCS/tool internals are excluded because they are
23
+ * neither provider context nor first-party source.
24
+ */
25
+ export async function scanProjectForSecrets(rootInput, options = {}) {
26
+ const root = resolve(rootInput);
27
+ const maximumFiles = options.maxFiles ?? 100_000;
28
+ const maximumBytes = options.maxBytes ?? 2 * 1024 * 1024 * 1024;
29
+ const maximumFindings = options.maxFindings ?? 100;
30
+ if (!Number.isSafeInteger(maximumFiles) || maximumFiles < 1 || !Number.isSafeInteger(maximumBytes) || maximumBytes < 1 || !Number.isSafeInteger(maximumFindings) || maximumFindings < 1) {
31
+ throw new RangeError("Secret scan budgets must be positive safe integers.");
32
+ }
33
+ const rootMetadata = await lstat(root).catch((cause) => {
34
+ throw new ProjectSecretScanError("INVALID_ROOT", `Cannot inspect secret-scan root: ${String(cause)}`);
35
+ });
36
+ if (!rootMetadata.isDirectory() || rootMetadata.isSymbolicLink())
37
+ throw new ProjectSecretScanError("INVALID_ROOT", "Secret-scan root must be a real directory.");
38
+ const canonicalRoot = await realpath(root);
39
+ const result = { filesScanned: 0, bytesScanned: 0, symlinksSkipped: 0, findings: [] };
40
+ const scanFile = async (absolute, path) => {
41
+ const before = await lstat(absolute).catch((cause) => {
42
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `Cannot inspect ${path}: ${String(cause)}`);
43
+ });
44
+ if (before.isSymbolicLink()) {
45
+ result.symlinksSkipped += 1;
46
+ return;
47
+ }
48
+ if (!before.isFile() || before.nlink > 1)
49
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `Secret scan encountered a non-regular or hard-linked file: ${path}.`);
50
+ if (result.filesScanned + 1 > maximumFiles || result.bytesScanned + before.size > maximumBytes)
51
+ throw new ProjectSecretScanError("PARTIAL_SCAN", "Repository exceeds the configured secret-scan budget.");
52
+ const handle = await open(absolute, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW).catch((cause) => {
53
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `Cannot securely open ${path}: ${String(cause)}`);
54
+ });
55
+ try {
56
+ const opened = await handle.stat();
57
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino || opened.size !== before.size)
58
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `File changed during secret scan: ${path}.`);
59
+ result.filesScanned += 1;
60
+ result.bytesScanned += opened.size;
61
+ let tail = "";
62
+ let priorLines = 0;
63
+ const stream = handle.createReadStream({ autoClose: false, highWaterMark: 256 * 1024 });
64
+ for await (const raw of stream) {
65
+ const chunk = Buffer.isBuffer(raw) ? raw : Buffer.from(raw);
66
+ const decoded = chunk.toString("utf8");
67
+ const searchable = `${tail}${decoded}`;
68
+ const tailLines = tail.match(/\n/gu)?.length ?? 0;
69
+ const findings = scanSecrets(searchable);
70
+ if (/-----BEGIN (?:[A-Z0-9 ]+ )?PRIVATE KEY-----/u.test(searchable) && !findings.some((item) => item.kind === "private_key")) {
71
+ findings.push({ kind: "private_key", line: 1, start: 0, end: 0 });
72
+ }
73
+ for (const finding of findings) {
74
+ result.findings.push({ path, kind: finding.kind, line: Math.max(1, priorLines - tailLines + finding.line) });
75
+ if (result.findings.length >= maximumFindings)
76
+ break;
77
+ }
78
+ if (result.findings.length >= maximumFindings)
79
+ break;
80
+ priorLines += decoded.match(/\n/gu)?.length ?? 0;
81
+ tail = searchable.slice(-4096);
82
+ }
83
+ }
84
+ finally {
85
+ await handle.close().catch(() => undefined);
86
+ }
87
+ };
88
+ const walk = async (directory) => {
89
+ const entries = await readdir(directory, { withFileTypes: true }).catch((cause) => {
90
+ const path = toPosix(relative(canonicalRoot, directory)) || ".";
91
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `Cannot read ${path}: ${String(cause)}`);
92
+ });
93
+ entries.sort((left, right) => left.name.localeCompare(right.name));
94
+ for (const entry of entries) {
95
+ if (result.findings.length >= maximumFindings)
96
+ return;
97
+ const absolute = resolve(directory, entry.name);
98
+ const path = toPosix(relative(canonicalRoot, absolute));
99
+ if (entry.isSymbolicLink()) {
100
+ result.symlinksSkipped += 1;
101
+ continue;
102
+ }
103
+ if (entry.isDirectory()) {
104
+ if (!SKIP_DIRECTORIES.has(entry.name))
105
+ await walk(absolute);
106
+ }
107
+ else if (entry.isFile()) {
108
+ await scanFile(absolute, path);
109
+ }
110
+ else {
111
+ throw new ProjectSecretScanError("PARTIAL_SCAN", `Secret scan encountered a special file: ${path}.`);
112
+ }
113
+ }
114
+ };
115
+ await walk(canonicalRoot);
116
+ if (result.findings.length > 0) {
117
+ const locations = result.findings.slice(0, 10).map((finding) => `${finding.path}:${finding.line} (${finding.kind})`).join(", ");
118
+ throw new ProjectSecretScanError("SECRET_DETECTED", `Credential-like content was found before provider/cache/report writes: ${locations}.`, result.findings);
119
+ }
120
+ return result;
121
+ }
122
+ //# sourceMappingURL=secret-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-scan.js","sourceRoot":"","sources":["../src/secret-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /** Isolated, content-addressed workspace snapshots used for validation. */
2
+ export interface SnapshotOptions {
3
+ includeNodeModules?: boolean;
4
+ maxFiles?: number;
5
+ maxBytes?: number;
6
+ excludeNames?: string[];
7
+ }
8
+ export interface SnapshotFile {
9
+ path: string;
10
+ sha256: string;
11
+ size: number;
12
+ mode: number;
13
+ }
14
+ export interface WorkspaceSnapshot {
15
+ sourceRoot: string;
16
+ root: string;
17
+ files: SnapshotFile[];
18
+ excluded: string[];
19
+ snapshotHash: string;
20
+ totalBytes: number;
21
+ }
22
+ export declare class SnapshotError extends Error {
23
+ readonly code: string;
24
+ constructor(code: string, message: string);
25
+ }
26
+ /**
27
+ * Create a private copy without VCS metadata or credential-bearing files.
28
+ * Symlinks and special files are rejected instead of copied or dereferenced.
29
+ */
30
+ export declare function createWorkspaceSnapshot(rootInput: string, options?: SnapshotOptions): Promise<WorkspaceSnapshot>;
31
+ export declare function cloneWorkspaceSnapshot(source: WorkspaceSnapshot, options?: SnapshotOptions): Promise<WorkspaceSnapshot>;
32
+ export declare function disposeWorkspaceSnapshot(snapshot: WorkspaceSnapshot): Promise<void>;
33
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAAA,2EAA2E;AA+B3E,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C;AAsBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CA0E5B;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,iBAAiB,CAAC,CAK5B;AAED,wBAAsB,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzF"}
@@ -0,0 +1,136 @@
1
+ /** Isolated, content-addressed workspace snapshots used for validation. */
2
+ import { chmod, copyFile, lstat, mkdir, mkdtemp, readdir, readFile, rm, } from "node:fs/promises";
3
+ import { basename, join, relative, resolve, sep } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { hashCanonical, sha256Bytes } from "./contracts.js";
6
+ const ALWAYS_EXCLUDE_NAMES = new Set([
7
+ ".git",
8
+ ".hg",
9
+ ".svn",
10
+ ".human-to-code",
11
+ "secrets.human",
12
+ ]);
13
+ const SECRET_FILE_PATTERNS = [
14
+ /^\.env(?:\.|$)/i,
15
+ /^(?:id_rsa|id_dsa|id_ecdsa|id_ed25519)(?:\.|$)/i,
16
+ /\.(?:pem|p12|pfx|key)$/i,
17
+ /^(?:credentials|service-account)(?:\.|$)/i,
18
+ ];
19
+ export class SnapshotError extends Error {
20
+ code;
21
+ constructor(code, message) {
22
+ super(message);
23
+ this.name = "SnapshotError";
24
+ this.code = code;
25
+ }
26
+ }
27
+ function toPosix(value) {
28
+ return value.split(sep).join("/");
29
+ }
30
+ function isSecretName(name) {
31
+ return SECRET_FILE_PATTERNS.some((pattern) => pattern.test(name));
32
+ }
33
+ async function assertRealDirectory(path) {
34
+ let info;
35
+ try {
36
+ info = await lstat(path);
37
+ }
38
+ catch (error) {
39
+ throw new SnapshotError("INVALID_ROOT", `Cannot inspect snapshot root: ${String(error)}.`);
40
+ }
41
+ if (!info.isDirectory() || info.isSymbolicLink()) {
42
+ throw new SnapshotError("INVALID_ROOT", "Snapshot root must be a real directory.");
43
+ }
44
+ }
45
+ /**
46
+ * Create a private copy without VCS metadata or credential-bearing files.
47
+ * Symlinks and special files are rejected instead of copied or dereferenced.
48
+ */
49
+ export async function createWorkspaceSnapshot(rootInput, options = {}) {
50
+ const sourceRoot = resolve(rootInput);
51
+ await assertRealDirectory(sourceRoot);
52
+ const container = await mkdtemp(join(tmpdir(), "human-to-code-snapshot-"));
53
+ await chmod(container, 0o700);
54
+ const root = join(container, "workspace");
55
+ await mkdir(root, { mode: 0o700 });
56
+ const excluded = [];
57
+ const files = [];
58
+ const excludedNames = new Set([...ALWAYS_EXCLUDE_NAMES, ...(options.excludeNames ?? [])]);
59
+ if (!options.includeNodeModules)
60
+ excludedNames.add("node_modules");
61
+ const maxFiles = options.maxFiles ?? 100_000;
62
+ const maxBytes = options.maxBytes ?? 2 * 1024 * 1024 * 1024;
63
+ let totalBytes = 0;
64
+ const walk = async (sourceDirectory, targetDirectory) => {
65
+ const entries = await readdir(sourceDirectory, { withFileTypes: true }).catch((error) => {
66
+ throw new SnapshotError("PARTIAL_SCAN", `Cannot read ${sourceDirectory}: ${String(error)}.`);
67
+ });
68
+ entries.sort((a, b) => a.name.localeCompare(b.name));
69
+ for (const entry of entries) {
70
+ const source = join(sourceDirectory, entry.name);
71
+ const target = join(targetDirectory, entry.name);
72
+ const relPath = toPosix(relative(sourceRoot, source));
73
+ if (excludedNames.has(entry.name) || isSecretName(entry.name)) {
74
+ excluded.push(relPath);
75
+ continue;
76
+ }
77
+ if (entry.isSymbolicLink()) {
78
+ throw new SnapshotError("SYMLINK_BLOCKED", `Snapshot contains a symlink: ${relPath}.`);
79
+ }
80
+ if (entry.isDirectory()) {
81
+ await mkdir(target, { mode: 0o700 });
82
+ await walk(source, target);
83
+ continue;
84
+ }
85
+ if (!entry.isFile()) {
86
+ throw new SnapshotError("SPECIAL_FILE_BLOCKED", `Snapshot contains a special file: ${relPath}.`);
87
+ }
88
+ const info = await lstat(source);
89
+ if (info.nlink > 1) {
90
+ throw new SnapshotError("HARDLINK_BLOCKED", `Snapshot contains a hard-linked file: ${relPath}.`);
91
+ }
92
+ if (files.length + 1 > maxFiles || totalBytes + info.size > maxBytes) {
93
+ throw new SnapshotError("SNAPSHOT_TOO_LARGE", "Workspace exceeds the configured snapshot budget.");
94
+ }
95
+ await copyFile(source, target);
96
+ const mode = info.mode & 0o777;
97
+ await chmod(target, mode);
98
+ const bytes = await readFile(target);
99
+ totalBytes += bytes.length;
100
+ files.push({ path: relPath, sha256: sha256Bytes(bytes), size: bytes.length, mode });
101
+ }
102
+ };
103
+ try {
104
+ await walk(sourceRoot, root);
105
+ }
106
+ catch (error) {
107
+ await rm(container, { recursive: true, force: true });
108
+ throw error;
109
+ }
110
+ files.sort((a, b) => a.path.localeCompare(b.path));
111
+ excluded.sort();
112
+ return {
113
+ sourceRoot,
114
+ root,
115
+ files,
116
+ excluded,
117
+ snapshotHash: hashCanonical(files),
118
+ totalBytes,
119
+ };
120
+ }
121
+ export async function cloneWorkspaceSnapshot(source, options = {}) {
122
+ return createWorkspaceSnapshot(source.root, {
123
+ ...options,
124
+ includeNodeModules: options.includeNodeModules ?? true,
125
+ });
126
+ }
127
+ export async function disposeWorkspaceSnapshot(snapshot) {
128
+ // The public root is always `<private temp>/workspace`; deleting its parent
129
+ // removes the snapshot atomically from the user's perspective.
130
+ const parent = resolve(snapshot.root, "..");
131
+ if (basename(snapshot.root) !== "workspace" || !basename(parent).startsWith("human-to-code-snapshot-")) {
132
+ throw new SnapshotError("INVALID_SNAPSHOT", "Refusing to remove a directory not owned by the snapshot store.");
133
+ }
134
+ await rm(parent, { recursive: true, force: true });
135
+ }
136
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Ecosystem, SupportDecision, SupportTier } from "./analyzer-types.ts";
2
+ export interface SupportMatrixEntry {
3
+ key: string;
4
+ ecosystem: Ecosystem;
5
+ variant: string;
6
+ versions: string;
7
+ tier: SupportTier;
8
+ capabilities: readonly string[];
9
+ limitations: readonly string[];
10
+ }
11
+ /**
12
+ * Versioned support declarations for the first analyzer release.
13
+ *
14
+ * Generation remains preview until the model/provider benchmark gate described
15
+ * by the reliability contract has actually run. Keeping that fact in data (and
16
+ * not in marketing copy) prevents a newly recognized project from being
17
+ * accidentally presented as certified.
18
+ */
19
+ export declare const SUPPORT_MATRIX_VERSION: "1.0.0";
20
+ /** Runtime-immutable: consumers cannot promote preview entries by mutation. */
21
+ export declare const SUPPORT_MATRIX: readonly SupportMatrixEntry[];
22
+ export declare function supportFor(ecosystem: Ecosystem, variant: string, matchedVersion?: string): SupportDecision;
23
+ //# sourceMappingURL=support-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-matrix.d.ts","sourceRoot":"","sources":["../src/support-matrix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAG,OAAgB,CAAC;AA+IvD,+EAA+E;AAC/E,eAAO,MAAM,cAAc,EAAE,SAAS,kBAAkB,EAMvD,CAAC;AAEF,wBAAgB,UAAU,CACxB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACtB,eAAe,CAuCjB"}