@hasna/contracts 0.1.1 → 0.2.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/README.md +15 -0
- package/dist/cli/index.js +145 -3
- package/dist/index.js +154 -3
- package/dist/schemas.d.ts +4462 -2364
- package/dist/schemas.js +154 -3
- package/dist/validators.js +145 -3
- package/examples/scaffold-install-record.invalid.json +12 -0
- package/examples/scaffold-install-record.valid.json +43 -0
- package/examples/scaffold-manifest.invalid.json +13 -0
- package/examples/scaffold-manifest.valid.json +62 -0
- package/package.json +4 -3
package/dist/schemas.js
CHANGED
|
@@ -3989,7 +3989,7 @@ var coerce = {
|
|
|
3989
3989
|
var NEVER = INVALID;
|
|
3990
3990
|
// src/schemas.ts
|
|
3991
3991
|
var CONTRACTS_PACKAGE_NAME = "@hasna/contracts";
|
|
3992
|
-
var CONTRACTS_PACKAGE_VERSION = "0.
|
|
3992
|
+
var CONTRACTS_PACKAGE_VERSION = "0.2.0";
|
|
3993
3993
|
var SCHEMA_IDS = {
|
|
3994
3994
|
actorRef: "hasna.actor_ref.v1",
|
|
3995
3995
|
resourceRef: "hasna.resource_ref.v1",
|
|
@@ -4001,7 +4001,9 @@ var SCHEMA_IDS = {
|
|
|
4001
4001
|
contextPack: "hasna.context_pack.v1",
|
|
4002
4002
|
agentTrajectory: "hasna.agent_trajectory.v1",
|
|
4003
4003
|
validationPlan: "hasna.validation_plan.v1",
|
|
4004
|
-
proofBundle: "hasna.proof_bundle.v1"
|
|
4004
|
+
proofBundle: "hasna.proof_bundle.v1",
|
|
4005
|
+
scaffoldManifest: "hasna.scaffold_manifest.v1",
|
|
4006
|
+
scaffoldInstallRecord: "hasna.scaffold_install_record.v1"
|
|
4005
4007
|
};
|
|
4006
4008
|
var SchemaIdSchema = exports_external.string().regex(/^hasna\.[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*\.v[0-9]+$/);
|
|
4007
4009
|
var TimestampSchema = exports_external.string().datetime();
|
|
@@ -4305,6 +4307,144 @@ var ValidationPlanSchema = contractBaseSchema(SCHEMA_IDS.validationPlan).extend(
|
|
|
4305
4307
|
verifier: ActorPointerSchema.optional(),
|
|
4306
4308
|
requiredEvidenceKinds: exports_external.array(EvidenceKindSchema).default([])
|
|
4307
4309
|
}).strict();
|
|
4310
|
+
var ScaffoldTypeSchema = exports_external.enum([
|
|
4311
|
+
"open_source",
|
|
4312
|
+
"internal_app",
|
|
4313
|
+
"platform",
|
|
4314
|
+
"app",
|
|
4315
|
+
"agent",
|
|
4316
|
+
"content",
|
|
4317
|
+
"overlay",
|
|
4318
|
+
"other"
|
|
4319
|
+
]);
|
|
4320
|
+
var ScaffoldStatusSchema = exports_external.enum(["draft", "active", "deprecated", "archived"]);
|
|
4321
|
+
var ScaffoldCapabilitySchema = exports_external.enum([
|
|
4322
|
+
"cli",
|
|
4323
|
+
"mcp",
|
|
4324
|
+
"library",
|
|
4325
|
+
"sdk",
|
|
4326
|
+
"rest_api",
|
|
4327
|
+
"dashboard",
|
|
4328
|
+
"database",
|
|
4329
|
+
"auth",
|
|
4330
|
+
"billing",
|
|
4331
|
+
"worker",
|
|
4332
|
+
"daemon",
|
|
4333
|
+
"native",
|
|
4334
|
+
"browser_extension",
|
|
4335
|
+
"ai_provider",
|
|
4336
|
+
"media_pipeline",
|
|
4337
|
+
"data_pipeline",
|
|
4338
|
+
"tests",
|
|
4339
|
+
"ci",
|
|
4340
|
+
"deployment",
|
|
4341
|
+
"docs",
|
|
4342
|
+
"other"
|
|
4343
|
+
]);
|
|
4344
|
+
var ScaffoldEnvVarSchema = exports_external.object({
|
|
4345
|
+
key: exports_external.string().regex(/^[A-Z][A-Z0-9_]*$/),
|
|
4346
|
+
description: exports_external.string().min(1),
|
|
4347
|
+
required: exports_external.boolean().default(false),
|
|
4348
|
+
secret: exports_external.boolean().default(false),
|
|
4349
|
+
group: exports_external.string().min(1).optional(),
|
|
4350
|
+
default: exports_external.string().optional()
|
|
4351
|
+
}).strict().superRefine((value, ctx) => {
|
|
4352
|
+
if (value.secret && value.default !== undefined) {
|
|
4353
|
+
ctx.addIssue({
|
|
4354
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4355
|
+
message: "Secret scaffold env vars cannot include defaults",
|
|
4356
|
+
path: ["default"]
|
|
4357
|
+
});
|
|
4358
|
+
}
|
|
4359
|
+
});
|
|
4360
|
+
var ScaffoldScriptSchema = exports_external.object({
|
|
4361
|
+
name: exports_external.string().min(1),
|
|
4362
|
+
command: exports_external.string().min(1),
|
|
4363
|
+
description: exports_external.string().min(1).optional(),
|
|
4364
|
+
required: exports_external.boolean().default(false)
|
|
4365
|
+
}).strict();
|
|
4366
|
+
var ScaffoldOutputShapeSchema = exports_external.object({
|
|
4367
|
+
packageManager: exports_external.enum(["bun", "npm", "pnpm", "yarn", "cargo", "pip", "other"]).optional(),
|
|
4368
|
+
languages: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4369
|
+
requiredFiles: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4370
|
+
requiredDirectories: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4371
|
+
optionalDirectories: exports_external.array(exports_external.string().min(1)).default([])
|
|
4372
|
+
}).strict();
|
|
4373
|
+
var ScaffoldManifestSchema = contractBaseSchema(SCHEMA_IDS.scaffoldManifest).extend({
|
|
4374
|
+
name: exports_external.string().min(1),
|
|
4375
|
+
version: exports_external.string().min(1),
|
|
4376
|
+
summary: exports_external.string().min(1),
|
|
4377
|
+
type: ScaffoldTypeSchema,
|
|
4378
|
+
status: ScaffoldStatusSchema.default("draft"),
|
|
4379
|
+
capabilities: exports_external.array(ScaffoldCapabilitySchema).default([]),
|
|
4380
|
+
techStack: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4381
|
+
tags: TagsSchema,
|
|
4382
|
+
source: ResourcePointerSchema.optional(),
|
|
4383
|
+
output: ScaffoldOutputShapeSchema,
|
|
4384
|
+
env: exports_external.array(ScaffoldEnvVarSchema).default([]),
|
|
4385
|
+
scripts: exports_external.array(ScaffoldScriptSchema).default([]),
|
|
4386
|
+
validationChecks: exports_external.array(ValidationCheckSchema).default([]),
|
|
4387
|
+
evidenceRefs: exports_external.array(EvidencePointerSchema).default([])
|
|
4388
|
+
}).strict().superRefine((value, ctx) => {
|
|
4389
|
+
if (value.source?.uri?.startsWith("file://")) {
|
|
4390
|
+
ctx.addIssue({
|
|
4391
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4392
|
+
message: "Public scaffold manifest source refs cannot use local file:// URIs",
|
|
4393
|
+
path: ["source", "uri"]
|
|
4394
|
+
});
|
|
4395
|
+
}
|
|
4396
|
+
if (value.status === "active" && value.validationChecks.length === 0) {
|
|
4397
|
+
ctx.addIssue({
|
|
4398
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4399
|
+
message: "Active scaffold manifests require validation checks",
|
|
4400
|
+
path: ["validationChecks"]
|
|
4401
|
+
});
|
|
4402
|
+
}
|
|
4403
|
+
if (value.status === "active" && value.output.requiredFiles.length === 0 && value.output.requiredDirectories.length === 0) {
|
|
4404
|
+
ctx.addIssue({
|
|
4405
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4406
|
+
message: "Active scaffold manifests require at least one required file or directory",
|
|
4407
|
+
path: ["output"]
|
|
4408
|
+
});
|
|
4409
|
+
}
|
|
4410
|
+
});
|
|
4411
|
+
var ScaffoldInstallStatusSchema = exports_external.enum(["installed", "failed", "cancelled", "partial", "unknown"]);
|
|
4412
|
+
var ScaffoldInstallRecordSchema = contractBaseSchema(SCHEMA_IDS.scaffoldInstallRecord).extend({
|
|
4413
|
+
scaffoldId: exports_external.string().min(1),
|
|
4414
|
+
scaffoldVersion: exports_external.string().min(1).optional(),
|
|
4415
|
+
manifestRef: ResourcePointerSchema.optional(),
|
|
4416
|
+
target: ResourcePointerSchema,
|
|
4417
|
+
status: ScaffoldInstallStatusSchema,
|
|
4418
|
+
installedAt: TimestampSchema.optional(),
|
|
4419
|
+
installer: ActorPointerSchema.optional(),
|
|
4420
|
+
packageManager: exports_external.enum(["bun", "npm", "pnpm", "yarn", "cargo", "pip", "other"]).optional(),
|
|
4421
|
+
options: MetadataSchema.optional(),
|
|
4422
|
+
generatedFiles: exports_external.array(ResourcePointerSchema).default([]),
|
|
4423
|
+
evidenceRefs: exports_external.array(EvidencePointerSchema).default([]),
|
|
4424
|
+
proofBundleRefs: exports_external.array(ResourcePointerSchema).default([])
|
|
4425
|
+
}).strict().superRefine((value, ctx) => {
|
|
4426
|
+
if (value.status === "installed" && !value.installedAt) {
|
|
4427
|
+
ctx.addIssue({
|
|
4428
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4429
|
+
message: "Installed scaffold records require installedAt",
|
|
4430
|
+
path: ["installedAt"]
|
|
4431
|
+
});
|
|
4432
|
+
}
|
|
4433
|
+
if (value.status === "installed" && value.generatedFiles.length === 0 && value.evidenceRefs.length === 0 && value.proofBundleRefs.length === 0) {
|
|
4434
|
+
ctx.addIssue({
|
|
4435
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4436
|
+
message: "Installed scaffold records require generated files, evidence, or proof bundle refs",
|
|
4437
|
+
path: ["generatedFiles"]
|
|
4438
|
+
});
|
|
4439
|
+
}
|
|
4440
|
+
if ((value.status === "failed" || value.status === "partial") && value.evidenceRefs.length === 0 && value.proofBundleRefs.length === 0) {
|
|
4441
|
+
ctx.addIssue({
|
|
4442
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4443
|
+
message: "Failed or partial scaffold records require evidence or proof bundle refs",
|
|
4444
|
+
path: ["evidenceRefs"]
|
|
4445
|
+
});
|
|
4446
|
+
}
|
|
4447
|
+
});
|
|
4308
4448
|
var ProofCheckResultSchema = exports_external.object({
|
|
4309
4449
|
checkId: exports_external.string().min(1),
|
|
4310
4450
|
status: ContractStatusSchema,
|
|
@@ -4451,7 +4591,9 @@ var ContractSchemaRegistry = {
|
|
|
4451
4591
|
[SCHEMA_IDS.contextPack]: ContextPackSchema,
|
|
4452
4592
|
[SCHEMA_IDS.agentTrajectory]: AgentTrajectorySchema,
|
|
4453
4593
|
[SCHEMA_IDS.validationPlan]: ValidationPlanSchema,
|
|
4454
|
-
[SCHEMA_IDS.proofBundle]: ProofBundleSchema
|
|
4594
|
+
[SCHEMA_IDS.proofBundle]: ProofBundleSchema,
|
|
4595
|
+
[SCHEMA_IDS.scaffoldManifest]: ScaffoldManifestSchema,
|
|
4596
|
+
[SCHEMA_IDS.scaffoldInstallRecord]: ScaffoldInstallRecordSchema
|
|
4455
4597
|
};
|
|
4456
4598
|
export {
|
|
4457
4599
|
contractBaseSchema,
|
|
@@ -4464,6 +4606,15 @@ export {
|
|
|
4464
4606
|
TagsSchema,
|
|
4465
4607
|
Sha256DigestSchema,
|
|
4466
4608
|
SchemaIdSchema,
|
|
4609
|
+
ScaffoldTypeSchema,
|
|
4610
|
+
ScaffoldStatusSchema,
|
|
4611
|
+
ScaffoldScriptSchema,
|
|
4612
|
+
ScaffoldOutputShapeSchema,
|
|
4613
|
+
ScaffoldManifestSchema,
|
|
4614
|
+
ScaffoldInstallStatusSchema,
|
|
4615
|
+
ScaffoldInstallRecordSchema,
|
|
4616
|
+
ScaffoldEnvVarSchema,
|
|
4617
|
+
ScaffoldCapabilitySchema,
|
|
4467
4618
|
SCHEMA_IDS,
|
|
4468
4619
|
ResourceRefSchema,
|
|
4469
4620
|
ResourcePointerSchema,
|
package/dist/validators.js
CHANGED
|
@@ -3989,7 +3989,7 @@ var coerce = {
|
|
|
3989
3989
|
var NEVER = INVALID;
|
|
3990
3990
|
// src/schemas.ts
|
|
3991
3991
|
var CONTRACTS_PACKAGE_NAME = "@hasna/contracts";
|
|
3992
|
-
var CONTRACTS_PACKAGE_VERSION = "0.
|
|
3992
|
+
var CONTRACTS_PACKAGE_VERSION = "0.2.0";
|
|
3993
3993
|
var SCHEMA_IDS = {
|
|
3994
3994
|
actorRef: "hasna.actor_ref.v1",
|
|
3995
3995
|
resourceRef: "hasna.resource_ref.v1",
|
|
@@ -4001,7 +4001,9 @@ var SCHEMA_IDS = {
|
|
|
4001
4001
|
contextPack: "hasna.context_pack.v1",
|
|
4002
4002
|
agentTrajectory: "hasna.agent_trajectory.v1",
|
|
4003
4003
|
validationPlan: "hasna.validation_plan.v1",
|
|
4004
|
-
proofBundle: "hasna.proof_bundle.v1"
|
|
4004
|
+
proofBundle: "hasna.proof_bundle.v1",
|
|
4005
|
+
scaffoldManifest: "hasna.scaffold_manifest.v1",
|
|
4006
|
+
scaffoldInstallRecord: "hasna.scaffold_install_record.v1"
|
|
4005
4007
|
};
|
|
4006
4008
|
var SchemaIdSchema = exports_external.string().regex(/^hasna\.[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)*\.v[0-9]+$/);
|
|
4007
4009
|
var TimestampSchema = exports_external.string().datetime();
|
|
@@ -4305,6 +4307,144 @@ var ValidationPlanSchema = contractBaseSchema(SCHEMA_IDS.validationPlan).extend(
|
|
|
4305
4307
|
verifier: ActorPointerSchema.optional(),
|
|
4306
4308
|
requiredEvidenceKinds: exports_external.array(EvidenceKindSchema).default([])
|
|
4307
4309
|
}).strict();
|
|
4310
|
+
var ScaffoldTypeSchema = exports_external.enum([
|
|
4311
|
+
"open_source",
|
|
4312
|
+
"internal_app",
|
|
4313
|
+
"platform",
|
|
4314
|
+
"app",
|
|
4315
|
+
"agent",
|
|
4316
|
+
"content",
|
|
4317
|
+
"overlay",
|
|
4318
|
+
"other"
|
|
4319
|
+
]);
|
|
4320
|
+
var ScaffoldStatusSchema = exports_external.enum(["draft", "active", "deprecated", "archived"]);
|
|
4321
|
+
var ScaffoldCapabilitySchema = exports_external.enum([
|
|
4322
|
+
"cli",
|
|
4323
|
+
"mcp",
|
|
4324
|
+
"library",
|
|
4325
|
+
"sdk",
|
|
4326
|
+
"rest_api",
|
|
4327
|
+
"dashboard",
|
|
4328
|
+
"database",
|
|
4329
|
+
"auth",
|
|
4330
|
+
"billing",
|
|
4331
|
+
"worker",
|
|
4332
|
+
"daemon",
|
|
4333
|
+
"native",
|
|
4334
|
+
"browser_extension",
|
|
4335
|
+
"ai_provider",
|
|
4336
|
+
"media_pipeline",
|
|
4337
|
+
"data_pipeline",
|
|
4338
|
+
"tests",
|
|
4339
|
+
"ci",
|
|
4340
|
+
"deployment",
|
|
4341
|
+
"docs",
|
|
4342
|
+
"other"
|
|
4343
|
+
]);
|
|
4344
|
+
var ScaffoldEnvVarSchema = exports_external.object({
|
|
4345
|
+
key: exports_external.string().regex(/^[A-Z][A-Z0-9_]*$/),
|
|
4346
|
+
description: exports_external.string().min(1),
|
|
4347
|
+
required: exports_external.boolean().default(false),
|
|
4348
|
+
secret: exports_external.boolean().default(false),
|
|
4349
|
+
group: exports_external.string().min(1).optional(),
|
|
4350
|
+
default: exports_external.string().optional()
|
|
4351
|
+
}).strict().superRefine((value, ctx) => {
|
|
4352
|
+
if (value.secret && value.default !== undefined) {
|
|
4353
|
+
ctx.addIssue({
|
|
4354
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4355
|
+
message: "Secret scaffold env vars cannot include defaults",
|
|
4356
|
+
path: ["default"]
|
|
4357
|
+
});
|
|
4358
|
+
}
|
|
4359
|
+
});
|
|
4360
|
+
var ScaffoldScriptSchema = exports_external.object({
|
|
4361
|
+
name: exports_external.string().min(1),
|
|
4362
|
+
command: exports_external.string().min(1),
|
|
4363
|
+
description: exports_external.string().min(1).optional(),
|
|
4364
|
+
required: exports_external.boolean().default(false)
|
|
4365
|
+
}).strict();
|
|
4366
|
+
var ScaffoldOutputShapeSchema = exports_external.object({
|
|
4367
|
+
packageManager: exports_external.enum(["bun", "npm", "pnpm", "yarn", "cargo", "pip", "other"]).optional(),
|
|
4368
|
+
languages: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4369
|
+
requiredFiles: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4370
|
+
requiredDirectories: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4371
|
+
optionalDirectories: exports_external.array(exports_external.string().min(1)).default([])
|
|
4372
|
+
}).strict();
|
|
4373
|
+
var ScaffoldManifestSchema = contractBaseSchema(SCHEMA_IDS.scaffoldManifest).extend({
|
|
4374
|
+
name: exports_external.string().min(1),
|
|
4375
|
+
version: exports_external.string().min(1),
|
|
4376
|
+
summary: exports_external.string().min(1),
|
|
4377
|
+
type: ScaffoldTypeSchema,
|
|
4378
|
+
status: ScaffoldStatusSchema.default("draft"),
|
|
4379
|
+
capabilities: exports_external.array(ScaffoldCapabilitySchema).default([]),
|
|
4380
|
+
techStack: exports_external.array(exports_external.string().min(1)).default([]),
|
|
4381
|
+
tags: TagsSchema,
|
|
4382
|
+
source: ResourcePointerSchema.optional(),
|
|
4383
|
+
output: ScaffoldOutputShapeSchema,
|
|
4384
|
+
env: exports_external.array(ScaffoldEnvVarSchema).default([]),
|
|
4385
|
+
scripts: exports_external.array(ScaffoldScriptSchema).default([]),
|
|
4386
|
+
validationChecks: exports_external.array(ValidationCheckSchema).default([]),
|
|
4387
|
+
evidenceRefs: exports_external.array(EvidencePointerSchema).default([])
|
|
4388
|
+
}).strict().superRefine((value, ctx) => {
|
|
4389
|
+
if (value.source?.uri?.startsWith("file://")) {
|
|
4390
|
+
ctx.addIssue({
|
|
4391
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4392
|
+
message: "Public scaffold manifest source refs cannot use local file:// URIs",
|
|
4393
|
+
path: ["source", "uri"]
|
|
4394
|
+
});
|
|
4395
|
+
}
|
|
4396
|
+
if (value.status === "active" && value.validationChecks.length === 0) {
|
|
4397
|
+
ctx.addIssue({
|
|
4398
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4399
|
+
message: "Active scaffold manifests require validation checks",
|
|
4400
|
+
path: ["validationChecks"]
|
|
4401
|
+
});
|
|
4402
|
+
}
|
|
4403
|
+
if (value.status === "active" && value.output.requiredFiles.length === 0 && value.output.requiredDirectories.length === 0) {
|
|
4404
|
+
ctx.addIssue({
|
|
4405
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4406
|
+
message: "Active scaffold manifests require at least one required file or directory",
|
|
4407
|
+
path: ["output"]
|
|
4408
|
+
});
|
|
4409
|
+
}
|
|
4410
|
+
});
|
|
4411
|
+
var ScaffoldInstallStatusSchema = exports_external.enum(["installed", "failed", "cancelled", "partial", "unknown"]);
|
|
4412
|
+
var ScaffoldInstallRecordSchema = contractBaseSchema(SCHEMA_IDS.scaffoldInstallRecord).extend({
|
|
4413
|
+
scaffoldId: exports_external.string().min(1),
|
|
4414
|
+
scaffoldVersion: exports_external.string().min(1).optional(),
|
|
4415
|
+
manifestRef: ResourcePointerSchema.optional(),
|
|
4416
|
+
target: ResourcePointerSchema,
|
|
4417
|
+
status: ScaffoldInstallStatusSchema,
|
|
4418
|
+
installedAt: TimestampSchema.optional(),
|
|
4419
|
+
installer: ActorPointerSchema.optional(),
|
|
4420
|
+
packageManager: exports_external.enum(["bun", "npm", "pnpm", "yarn", "cargo", "pip", "other"]).optional(),
|
|
4421
|
+
options: MetadataSchema.optional(),
|
|
4422
|
+
generatedFiles: exports_external.array(ResourcePointerSchema).default([]),
|
|
4423
|
+
evidenceRefs: exports_external.array(EvidencePointerSchema).default([]),
|
|
4424
|
+
proofBundleRefs: exports_external.array(ResourcePointerSchema).default([])
|
|
4425
|
+
}).strict().superRefine((value, ctx) => {
|
|
4426
|
+
if (value.status === "installed" && !value.installedAt) {
|
|
4427
|
+
ctx.addIssue({
|
|
4428
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4429
|
+
message: "Installed scaffold records require installedAt",
|
|
4430
|
+
path: ["installedAt"]
|
|
4431
|
+
});
|
|
4432
|
+
}
|
|
4433
|
+
if (value.status === "installed" && value.generatedFiles.length === 0 && value.evidenceRefs.length === 0 && value.proofBundleRefs.length === 0) {
|
|
4434
|
+
ctx.addIssue({
|
|
4435
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4436
|
+
message: "Installed scaffold records require generated files, evidence, or proof bundle refs",
|
|
4437
|
+
path: ["generatedFiles"]
|
|
4438
|
+
});
|
|
4439
|
+
}
|
|
4440
|
+
if ((value.status === "failed" || value.status === "partial") && value.evidenceRefs.length === 0 && value.proofBundleRefs.length === 0) {
|
|
4441
|
+
ctx.addIssue({
|
|
4442
|
+
code: exports_external.ZodIssueCode.custom,
|
|
4443
|
+
message: "Failed or partial scaffold records require evidence or proof bundle refs",
|
|
4444
|
+
path: ["evidenceRefs"]
|
|
4445
|
+
});
|
|
4446
|
+
}
|
|
4447
|
+
});
|
|
4308
4448
|
var ProofCheckResultSchema = exports_external.object({
|
|
4309
4449
|
checkId: exports_external.string().min(1),
|
|
4310
4450
|
status: ContractStatusSchema,
|
|
@@ -4451,7 +4591,9 @@ var ContractSchemaRegistry = {
|
|
|
4451
4591
|
[SCHEMA_IDS.contextPack]: ContextPackSchema,
|
|
4452
4592
|
[SCHEMA_IDS.agentTrajectory]: AgentTrajectorySchema,
|
|
4453
4593
|
[SCHEMA_IDS.validationPlan]: ValidationPlanSchema,
|
|
4454
|
-
[SCHEMA_IDS.proofBundle]: ProofBundleSchema
|
|
4594
|
+
[SCHEMA_IDS.proofBundle]: ProofBundleSchema,
|
|
4595
|
+
[SCHEMA_IDS.scaffoldManifest]: ScaffoldManifestSchema,
|
|
4596
|
+
[SCHEMA_IDS.scaffoldInstallRecord]: ScaffoldInstallRecordSchema
|
|
4455
4597
|
};
|
|
4456
4598
|
|
|
4457
4599
|
// src/validators.ts
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "hasna.scaffold_install_record.v1",
|
|
3
|
+
"id": "install_scaffold_open_source_invalid",
|
|
4
|
+
"createdAt": "2026-06-28T16:56:00.000Z",
|
|
5
|
+
"scaffoldId": "scaffold-open-source",
|
|
6
|
+
"target": {
|
|
7
|
+
"kind": "repo",
|
|
8
|
+
"id": "open-example",
|
|
9
|
+
"uri": "git+https://github.com/hasna/open-example.git"
|
|
10
|
+
},
|
|
11
|
+
"status": "installed"
|
|
12
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "hasna.scaffold_install_record.v1",
|
|
3
|
+
"id": "install_scaffold_open_source_001",
|
|
4
|
+
"createdAt": "2026-06-28T16:56:00.000Z",
|
|
5
|
+
"scaffoldId": "scaffold-open-source",
|
|
6
|
+
"scaffoldVersion": "1.0.0",
|
|
7
|
+
"manifestRef": {
|
|
8
|
+
"kind": "artifact",
|
|
9
|
+
"id": "scaffold-open-source-manifest",
|
|
10
|
+
"uri": "artifact://scaffolds/scaffold-open-source/scaffold.manifest.json"
|
|
11
|
+
},
|
|
12
|
+
"target": {
|
|
13
|
+
"kind": "repo",
|
|
14
|
+
"id": "open-example",
|
|
15
|
+
"uri": "git+https://github.com/hasna/open-example.git"
|
|
16
|
+
},
|
|
17
|
+
"status": "installed",
|
|
18
|
+
"installedAt": "2026-06-28T16:56:30.000Z",
|
|
19
|
+
"installer": {
|
|
20
|
+
"kind": "agent",
|
|
21
|
+
"id": "agent_codewith",
|
|
22
|
+
"name": "Codewith"
|
|
23
|
+
},
|
|
24
|
+
"packageManager": "bun",
|
|
25
|
+
"options": {
|
|
26
|
+
"includeDashboard": false,
|
|
27
|
+
"includeMcp": true
|
|
28
|
+
},
|
|
29
|
+
"generatedFiles": [
|
|
30
|
+
{
|
|
31
|
+
"kind": "file",
|
|
32
|
+
"id": "package_json",
|
|
33
|
+
"uri": "repo://open-example/package.json"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"evidenceRefs": [
|
|
37
|
+
{
|
|
38
|
+
"id": "ev_scaffold_validate",
|
|
39
|
+
"kind": "command_output",
|
|
40
|
+
"uri": "artifact://runs/install_scaffold_open_source_001/scaffolds-validate.txt"
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "hasna.scaffold_manifest.v1",
|
|
3
|
+
"id": "scaffold-empty",
|
|
4
|
+
"createdAt": "2026-06-28T16:55:00.000Z",
|
|
5
|
+
"name": "scaffold-empty",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"summary": "Invalid active scaffold without output requirements or validation.",
|
|
8
|
+
"type": "open_source",
|
|
9
|
+
"status": "active",
|
|
10
|
+
"output": {
|
|
11
|
+
"packageManager": "bun"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "hasna.scaffold_manifest.v1",
|
|
3
|
+
"id": "scaffold-open-source",
|
|
4
|
+
"createdAt": "2026-06-28T16:55:00.000Z",
|
|
5
|
+
"name": "scaffold-open-source",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"summary": "Bun and TypeScript CLI/MCP/library package scaffold for public Hasna open-source repos.",
|
|
8
|
+
"type": "open_source",
|
|
9
|
+
"status": "active",
|
|
10
|
+
"capabilities": ["cli", "mcp", "library", "tests", "ci", "docs"],
|
|
11
|
+
"techStack": ["Bun", "TypeScript", "Commander", "Zod"],
|
|
12
|
+
"tags": ["open-source", "cli", "mcp", "package"],
|
|
13
|
+
"source": {
|
|
14
|
+
"kind": "repo",
|
|
15
|
+
"id": "hasna_contracts",
|
|
16
|
+
"uri": "git+https://github.com/hasna/contracts.git"
|
|
17
|
+
},
|
|
18
|
+
"output": {
|
|
19
|
+
"packageManager": "bun",
|
|
20
|
+
"languages": ["TypeScript"],
|
|
21
|
+
"requiredFiles": ["package.json", "README.md", "src/index.ts"],
|
|
22
|
+
"requiredDirectories": ["src", "tests"],
|
|
23
|
+
"optionalDirectories": ["examples", "docs"]
|
|
24
|
+
},
|
|
25
|
+
"env": [
|
|
26
|
+
{
|
|
27
|
+
"key": "HASNA_HOME",
|
|
28
|
+
"description": "Optional Hasna state directory override.",
|
|
29
|
+
"required": false,
|
|
30
|
+
"secret": false,
|
|
31
|
+
"group": "runtime"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"scripts": [
|
|
35
|
+
{
|
|
36
|
+
"name": "test",
|
|
37
|
+
"command": "bun test",
|
|
38
|
+
"description": "Run unit tests.",
|
|
39
|
+
"required": true
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "typecheck",
|
|
43
|
+
"command": "tsc --noEmit",
|
|
44
|
+
"description": "Run TypeScript type checking.",
|
|
45
|
+
"required": true
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"validationChecks": [
|
|
49
|
+
{
|
|
50
|
+
"id": "typecheck",
|
|
51
|
+
"kind": "typecheck",
|
|
52
|
+
"command": "bun run typecheck",
|
|
53
|
+
"required": true
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "tests",
|
|
57
|
+
"kind": "test",
|
|
58
|
+
"command": "bun test",
|
|
59
|
+
"required": true
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/contracts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Shared schemas and validators for Hasna open-source agent infrastructure contracts.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -45,12 +45,13 @@
|
|
|
45
45
|
"typecheck": "tsc --noEmit",
|
|
46
46
|
"test": "bun test",
|
|
47
47
|
"lint": "tsc --noEmit",
|
|
48
|
-
"
|
|
48
|
+
"conformance": "bun run src/cli/index.ts conformance examples",
|
|
49
|
+
"verify:release": "bun run typecheck && bun test && bun run conformance && bun run build && bun run smoke:dist && bun run pack:check",
|
|
49
50
|
"smoke:dist": "bun scripts/smoke-dist.ts",
|
|
50
51
|
"pack:check": "bun pm pack --dry-run --ignore-scripts",
|
|
51
52
|
"dev:cli": "bun run src/cli/index.ts",
|
|
52
53
|
"prepack": "bun run verify:release",
|
|
53
|
-
"prepublishOnly": "bun run
|
|
54
|
+
"prepublishOnly": "bun run verify:release"
|
|
54
55
|
},
|
|
55
56
|
"keywords": [
|
|
56
57
|
"contracts",
|