traits 0.5.1 → 0.5.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 (103) hide show
  1. package/Source.ts +1 -1
  2. package/Trait.ts +109 -4
  3. package/TraitConflict.ts +43 -4
  4. package/TraitDerivation.ts +104 -32
  5. package/TraitEvaluation.ts +104 -49
  6. package/TraitStore.ts +128 -44
  7. package/TraitsConfig.ts +16 -9
  8. package/TraitsContext.ts +3 -1
  9. package/_util/Frontmatter.ts +78 -0
  10. package/_util/Git.ts +6 -5
  11. package/bin.ts +3 -1
  12. package/dist/Source.js +1 -1
  13. package/dist/Source.js.map +1 -1
  14. package/dist/Trait.d.ts +39 -5
  15. package/dist/Trait.d.ts.map +1 -1
  16. package/dist/Trait.js +66 -3
  17. package/dist/Trait.js.map +1 -1
  18. package/dist/TraitConflict.d.ts +47 -15
  19. package/dist/TraitConflict.d.ts.map +1 -1
  20. package/dist/TraitConflict.js +38 -4
  21. package/dist/TraitConflict.js.map +1 -1
  22. package/dist/TraitDerivation.d.ts +85 -28
  23. package/dist/TraitDerivation.d.ts.map +1 -1
  24. package/dist/TraitDerivation.js +85 -23
  25. package/dist/TraitDerivation.js.map +1 -1
  26. package/dist/TraitEvaluation.d.ts +38 -8
  27. package/dist/TraitEvaluation.d.ts.map +1 -1
  28. package/dist/TraitEvaluation.js +84 -47
  29. package/dist/TraitEvaluation.js.map +1 -1
  30. package/dist/TraitStore.d.ts +60 -10
  31. package/dist/TraitStore.d.ts.map +1 -1
  32. package/dist/TraitStore.js +57 -37
  33. package/dist/TraitStore.js.map +1 -1
  34. package/dist/TraitsConfig.d.ts +4 -3
  35. package/dist/TraitsConfig.d.ts.map +1 -1
  36. package/dist/TraitsConfig.js +12 -5
  37. package/dist/TraitsConfig.js.map +1 -1
  38. package/dist/TraitsContext.d.ts +2 -1
  39. package/dist/TraitsContext.d.ts.map +1 -1
  40. package/dist/TraitsContext.js.map +1 -1
  41. package/dist/_util/Frontmatter.d.ts +37 -0
  42. package/dist/_util/Frontmatter.d.ts.map +1 -0
  43. package/dist/_util/Frontmatter.js +52 -0
  44. package/dist/_util/Frontmatter.js.map +1 -0
  45. package/dist/_util/Git.d.ts +2 -3
  46. package/dist/_util/Git.d.ts.map +1 -1
  47. package/dist/_util/Git.js +4 -1
  48. package/dist/_util/Git.js.map +1 -1
  49. package/dist/bin.js +3 -1
  50. package/dist/bin.js.map +1 -1
  51. package/dist/getIncludedFiles.d.ts +13 -0
  52. package/dist/getIncludedFiles.d.ts.map +1 -0
  53. package/dist/getIncludedFiles.js +26 -0
  54. package/dist/getIncludedFiles.js.map +1 -0
  55. package/dist/main.js +14 -11
  56. package/dist/main.js.map +1 -1
  57. package/dist/package.json +7 -2
  58. package/dist/test/Frontmatter.test.d.ts +2 -0
  59. package/dist/test/Frontmatter.test.d.ts.map +1 -0
  60. package/dist/test/Frontmatter.test.js +29 -0
  61. package/dist/test/Frontmatter.test.js.map +1 -0
  62. package/dist/test/Trait.test.d.ts +2 -0
  63. package/dist/test/Trait.test.d.ts.map +1 -0
  64. package/dist/test/Trait.test.js +144 -0
  65. package/dist/test/Trait.test.js.map +1 -0
  66. package/dist/test/TraitDerivation.test.d.ts +2 -0
  67. package/dist/test/TraitDerivation.test.d.ts.map +1 -0
  68. package/dist/test/TraitDerivation.test.js +173 -0
  69. package/dist/test/TraitDerivation.test.js.map +1 -0
  70. package/dist/test/TraitEvaluation.test.d.ts +2 -0
  71. package/dist/test/TraitEvaluation.test.d.ts.map +1 -0
  72. package/dist/test/TraitEvaluation.test.js +116 -0
  73. package/dist/test/TraitEvaluation.test.js.map +1 -0
  74. package/dist/test/TraitIgnores.test.js +29 -5
  75. package/dist/test/TraitIgnores.test.js.map +1 -1
  76. package/dist/test/TraitStore.test.d.ts +2 -0
  77. package/dist/test/TraitStore.test.d.ts.map +1 -0
  78. package/dist/test/TraitStore.test.js +94 -0
  79. package/dist/test/TraitStore.test.js.map +1 -0
  80. package/dist/toolkit/CheckTraits.d.ts +121 -13
  81. package/dist/toolkit/CheckTraits.d.ts.map +1 -1
  82. package/dist/toolkit/CheckTraits.js +28 -40
  83. package/dist/toolkit/CheckTraits.js.map +1 -1
  84. package/dist/toolkit/DeriveTrait.d.ts +161 -45
  85. package/dist/toolkit/DeriveTrait.d.ts.map +1 -1
  86. package/dist/toolkit/DeriveTrait.js +26 -14
  87. package/dist/toolkit/DeriveTrait.js.map +1 -1
  88. package/dist/traitIgnores.d.ts +18 -0
  89. package/dist/traitIgnores.d.ts.map +1 -1
  90. package/dist/traitIgnores.js +10 -7
  91. package/dist/traitIgnores.js.map +1 -1
  92. package/getIncludedFiles.ts +42 -0
  93. package/main.ts +14 -11
  94. package/package.json +7 -2
  95. package/skills/traits/SKILL.md +92 -46
  96. package/toolkit/CheckTraits.ts +34 -55
  97. package/toolkit/DeriveTrait.ts +27 -14
  98. package/traitIgnores.ts +14 -6
  99. package/_util/words.ts +0 -555
  100. package/dist/_util/words.d.ts +0 -2
  101. package/dist/_util/words.d.ts.map +0 -1
  102. package/dist/_util/words.js +0 -556
  103. package/dist/_util/words.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ import { Effect, Schema as S } from "effect";
2
+ declare const MissingFrontmatterError_base: S.Class<MissingFrontmatterError, S.TaggedStruct<"MissingFrontmatterError", {
3
+ readonly path: S.String;
4
+ }>, import("effect/Cause").YieldableError>;
5
+ export declare class MissingFrontmatterError extends MissingFrontmatterError_base {
6
+ get message(): string;
7
+ }
8
+ declare const UnterminatedFrontmatterError_base: S.Class<UnterminatedFrontmatterError, S.TaggedStruct<"UnterminatedFrontmatterError", {
9
+ readonly path: S.String;
10
+ }>, import("effect/Cause").YieldableError>;
11
+ export declare class UnterminatedFrontmatterError extends UnterminatedFrontmatterError_base {
12
+ get message(): string;
13
+ }
14
+ declare const InvalidYamlError_base: S.Class<InvalidYamlError, S.TaggedStruct<"InvalidYamlError", {
15
+ readonly path: S.String;
16
+ readonly line: S.optional<S.Int>;
17
+ readonly column: S.optional<S.Int>;
18
+ readonly cause: S.Defect;
19
+ }>, import("effect/Cause").YieldableError>;
20
+ export declare class InvalidYamlError extends InvalidYamlError_base {
21
+ get message(): string;
22
+ }
23
+ export type ParseError = typeof ParseError.Type;
24
+ export declare const ParseError: S.Union<readonly [typeof MissingFrontmatterError, typeof UnterminatedFrontmatterError, typeof InvalidYamlError]>;
25
+ export declare const parse: <Schema extends S.Top>(schema: Schema) => (input: {
26
+ readonly text: string;
27
+ readonly path: string;
28
+ }) => Effect.Effect<{
29
+ frontmatter: Schema["Type"];
30
+ body: string;
31
+ }, InvalidYamlError | MissingFrontmatterError | S.SchemaError | UnterminatedFrontmatterError, Schema["DecodingServices"]>;
32
+ export declare const serialize: (document: {
33
+ readonly frontmatter: unknown;
34
+ readonly body: string;
35
+ }) => string;
36
+ export {};
37
+ //# sourceMappingURL=Frontmatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Frontmatter.d.ts","sourceRoot":"","sources":["../../_util/Frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;;;;AAGlD,qBAAa,uBAAwB,SAAQ,4BAE3C;IACA,IAAa,OAAO,WAEnB;CACF;;;;AAED,qBAAa,4BAA6B,SAAQ,iCAKjD;IACC,IAAa,OAAO,WAEnB;CACF;;;;;;;AAED,qBAAa,gBAAiB,SAAQ,qBAKpC;IACA,IAAa,OAAO,WAEnB;CACF;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAC/C,eAAO,MAAM,UAAU,kHAAqF,CAAA;AAa5G,eAAO,MAAM,KAAK,GAAI,MAAM,SAAS,CAAC,CAAC,GAAG,UAAU,MAAM;mBACU,MAAM;mBAAiB,MAAM;;;;yHA0B7F,CAAA;AAEJ,eAAO,MAAM,SAAS,aAAc;IAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KAAG,MAC1B,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { Effect, pipe, Schema as S } from "effect";
2
+ import * as Yaml from "yaml";
3
+ export class MissingFrontmatterError extends S.TaggedError()("MissingFrontmatterError", {
4
+ path: S.String
5
+ }) {
6
+ get message() {
7
+ return "Document must start with YAML frontmatter";
8
+ }
9
+ }
10
+ export class UnterminatedFrontmatterError extends S.TaggedError()("UnterminatedFrontmatterError", {
11
+ path: S.String
12
+ }) {
13
+ get message() {
14
+ return "Frontmatter is missing its closing delimiter";
15
+ }
16
+ }
17
+ export class InvalidYamlError extends S.TaggedError()("InvalidYamlError", {
18
+ path: S.String,
19
+ line: S.Int.check(S.isGreaterThan(0)).pipe(S.optional),
20
+ column: S.Int.check(S.isGreaterThan(0)).pipe(S.optional),
21
+ cause: S.Defect()
22
+ }) {
23
+ get message() {
24
+ return "Invalid YAML frontmatter";
25
+ }
26
+ }
27
+ export const ParseError = S.Union([MissingFrontmatterError, UnterminatedFrontmatterError, InvalidYamlError]);
28
+ const OpeningDelimiter = S.Literals(["---\r\n", "---\n"]);
29
+ const FrontmatterLines = S.String.check(S.isPattern(/^(?:(?!---(?:\r?\n|$))[^\n]*\n)*$/));
30
+ const DocumentParts = S.String.pipe(S.decodeTo(S.Union([
31
+ S.TemplateLiteralParser([OpeningDelimiter, FrontmatterLines, S.Literals(["---\r\n", "---\n"]), S.String]),
32
+ S.TemplateLiteralParser([OpeningDelimiter, FrontmatterLines, "---", ""])
33
+ ])));
34
+ export const parse = (schema) => Effect.fn("Frontmatter.parse")(function* (input) {
35
+ const [, yaml, , body] = yield* pipe(input.text, S.decodeEffect(DocumentParts), Effect.mapError(() => pipe(input.text, S.is(S.Union([S.Literal("---"), S.TemplateLiteral([OpeningDelimiter, S.String])])))
36
+ ? UnterminatedFrontmatterError.make({ path: input.path })
37
+ : MissingFrontmatterError.make({ path: input.path })));
38
+ const parsed = yield* Effect.try({
39
+ try: () => Yaml.parse(yaml),
40
+ catch: (cause) => {
41
+ const position = cause instanceof Yaml.YAMLParseError ? cause.linePos?.[0] : undefined;
42
+ return InvalidYamlError.make({
43
+ path: input.path,
44
+ ...(position === undefined ? {} : { line: position.line + 1, column: position.col }),
45
+ cause
46
+ });
47
+ }
48
+ });
49
+ return yield* pipe(parsed, S.decodeUnknownEffect(schema), Effect.map((frontmatter) => ({ frontmatter, body })));
50
+ });
51
+ export const serialize = (document) => `---\n${Yaml.stringify(document.frontmatter)}---\n${document.body}`;
52
+ //# sourceMappingURL=Frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Frontmatter.js","sourceRoot":"","sources":["../../_util/Frontmatter.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,8 @@ import { ChildProcessSpawner } from "effect/process";
3
3
  declare const GitRootError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
4
  readonly _tag: "GitRootError";
5
5
  } & Readonly<A>;
6
- export declare class GitRootError extends GitRootError_base<{
7
- readonly message: string;
8
- }> {
6
+ export declare class GitRootError extends GitRootError_base {
7
+ get message(): string;
9
8
  }
10
9
  /** The current checkout root, including when running in a linked worktree. */
11
10
  export declare const getWorktreeRoot: Effect.Effect<string, GitRootError | import("effect/PlatformError").PlatformError, ChildProcessSpawner.ChildProcessSpawner>;
@@ -1 +1 @@
1
- {"version":3,"file":"Git.d.ts","sourceRoot":"","sources":["../../_util/Git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;;;;AAElE,qBAAa,YAAa,SAAQ,kBAAiC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAanG,8EAA8E;AAC9E,eAAO,MAAM,eAAe,6HAAgE,CAAA;AAE5F,8DAA8D;AAC9D,eAAO,MAAM,UAAU,yIAIrB,CAAA"}
1
+ {"version":3,"file":"Git.d.ts","sourceRoot":"","sources":["../../_util/Git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;;;;AAElE,qBAAa,YAAa,SAAQ,iBAAgC;IAChE,IAAa,OAAO,WAEnB;CACF;AAUD,8EAA8E;AAC9E,eAAO,MAAM,eAAe,6HAAgE,CAAA;AAE5F,8DAA8D;AAC9D,eAAO,MAAM,UAAU,yIAIrB,CAAA"}
package/dist/_util/Git.js CHANGED
@@ -1,10 +1,13 @@
1
1
  import { Data, Effect, Path, String } from "effect";
2
2
  import { ChildProcess, ChildProcessSpawner } from "effect/process";
3
3
  export class GitRootError extends Data.TaggedError("GitRootError") {
4
+ get message() {
5
+ return "Run from inside a Git repository or worktree";
6
+ }
4
7
  }
5
8
  const resolveRoot = Effect.fn("Git.resolveRoot")(function* (command) {
6
9
  const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
7
- return yield* spawner.string(command).pipe(Effect.map(String.trim), Effect.filterOrFail(String.isNonEmpty, () => new GitRootError({ message: "Run from inside a Git repository or worktree" })));
10
+ return yield* spawner.string(command).pipe(Effect.map(String.trim), Effect.filterOrFail(String.isNonEmpty, () => new GitRootError()));
8
11
  });
9
12
  /** The current checkout root, including when running in a linked worktree. */
10
13
  export const getWorktreeRoot = resolveRoot(ChildProcess.make `git rev-parse --show-toplevel`);
@@ -1 +1 @@
1
- {"version":3,"file":"Git.js","sourceRoot":"","sources":["../../_util/Git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAA+B;CAAG;AAEnG,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA6B;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAA;IAC9D,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,MAAM,CAAC,YAAY,CACjB,MAAM,CAAC,UAAU,EACjB,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CACpF,CACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAA,+BAA+B,CAAC,CAAA;AAE5F,8DAA8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAA,uDAAuD,CAAC,CAAA;IAC3G,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"Git.js","sourceRoot":"","sources":["../../_util/Git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAElE,MAAM,OAAO,YAAa,SAAQ,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IAChE,IAAa,OAAO;QAClB,OAAO,8CAA8C,CAAA;IACvD,CAAC;CACF;AAED,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,EAAE,OAA6B;IACvF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAA;IAC9D,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CACxC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,CACjE,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAA,+BAA+B,CAAC,CAAA;AAE5F,8DAA8D;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAA,uDAAuD,CAAC,CAAA;IAC3G,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA"}
package/dist/bin.js CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
- // traits-ignore-file dawn_sparrow_wolf-37a52965-6425-476e-bc3a-d20ce70bc1a6: Effect utilities are unavailable until this launcher installs dependencies.
2
+ // traits-ignore-file effect-utilities-with-native-behavior-exceptions: Effect utilities are unavailable until this launcher installs dependencies.
3
+ // traits-ignore-file 121f5624-31b3-41d6-a63c-30c040743ef8: Native Node APIs must install project dependencies before Effect platform services are available.
4
+ // traits-ignore-file a0e777e3-a8e0-4feb-9d8b-aa6d6f9eaa91: Dependency installation must finish before Effect error-handling APIs are available.
3
5
  import { spawn } from "node:child_process";
4
6
  import { once } from "node:events";
5
7
  import { existsSync, readFileSync } from "node:fs";
package/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../bin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Effect, Path, Schema as S } from "effect";
2
+ import { ChildProcessSpawner } from "effect/process";
3
+ import { TraitsContext } from "./TraitsContext.ts";
4
+ declare const GitFileListingError_base: S.Class<GitFileListingError, S.TaggedStruct<"GitFileListingError", {
5
+ readonly directory: S.String;
6
+ readonly exitCode: S.Int;
7
+ }>, import("effect/Cause").YieldableError>;
8
+ export declare class GitFileListingError extends GitFileListingError_base {
9
+ get message(): string;
10
+ }
11
+ export declare const getIncludedFiles: Effect.Effect<Set<string> | undefined, GitFileListingError | import("effect/PlatformError").PlatformError, ChildProcessSpawner.ChildProcessSpawner | Path.Path | TraitsContext>;
12
+ export {};
13
+ //# sourceMappingURL=getIncludedFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIncludedFiles.d.ts","sourceRoot":"","sources":["../getIncludedFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAS,IAAI,EAAQ,MAAM,IAAI,CAAC,EAAkB,MAAM,QAAQ,CAAA;AACtF,OAAO,EAAgB,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;;;;;AAElD,qBAAa,mBAAoB,SAAQ,wBAGvC;IACA,IAAa,OAAO,WAEnB;CACF;AAED,eAAO,MAAM,gBAAgB,iLA2B8B,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { Array, Effect, Equal, Path, pipe, Schema as S, Stream, String } from "effect";
2
+ import { ChildProcess, ChildProcessSpawner } from "effect/process";
3
+ import { TraitsContext } from "./TraitsContext.js";
4
+ export class GitFileListingError extends S.TaggedError()("GitFileListingError", {
5
+ directory: S.String,
6
+ exitCode: S.Int.check(S.isGreaterThan(0))
7
+ }) {
8
+ get message() {
9
+ return `git ls-files exited with code ${this.exitCode}`;
10
+ }
11
+ }
12
+ export const getIncludedFiles = Effect.gen(function* () {
13
+ const context = yield* TraitsContext;
14
+ if (!context.config.excludeGitignored)
15
+ return undefined;
16
+ const path = yield* Path.Path;
17
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
18
+ const process = yield* spawner.spawn(ChildProcess.make `git ls-files --cached --others --exclude-standard --full-name -z`.pipe(ChildProcess.setCwd(context.configRoot)));
19
+ const output = yield* process.stdout.pipe(Stream.decodeText(), Stream.mkString);
20
+ yield* process.exitCode.pipe(Effect.filterOrFail(Equal.equals(0), (exitCode) => GitFileListingError.make({
21
+ directory: context.configRoot,
22
+ exitCode
23
+ })));
24
+ return pipe(output, String.split("\0"), Array.filter(String.isNonEmpty), Array.map((file) => path.resolve(context.configRoot, file)), (files) => new Set(files));
25
+ }).pipe(Effect.scoped, Effect.withSpan("getIncludedFiles"));
26
+ //# sourceMappingURL=getIncludedFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getIncludedFiles.js","sourceRoot":"","sources":["../getIncludedFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,OAAO,mBAAoB,SAAQ,CAAC,CAAC,WAAW,EAAuB,CAAC,qBAAqB,EAAE;IACnG,SAAS,EAAE,CAAC,CAAC,MAAM;IACnB,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;CAC1C,CAAC;IACA,IAAa,OAAO;QAClB,OAAO,iCAAiC,IAAI,CAAC,QAAQ,EAAE,CAAA;IACzD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB;QAAE,OAAO,SAAS,CAAA;IAEvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,mBAAmB,CAAA;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAClC,YAAY,CAAC,IAAI,CAAA,kEAAkE,CAAC,IAAI,CACtF,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CACxC,CACF,CAAA;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC/E,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAC1B,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAChD,mBAAmB,CAAC,IAAI,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC,UAAU;QAC7B,QAAQ;KACT,CAAC,CACH,CACF,CAAA;IACD,OAAO,IAAI,CACT,MAAM,EACN,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAClB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAC3D,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAC1B,CAAA;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAA"}
package/dist/main.js CHANGED
@@ -17,8 +17,8 @@ Command.make("traits", {
17
17
  version: PackageJson.version,
18
18
  protocols: [McpProtocol.v2025_11_25],
19
19
  instructions: String.stripMargin(`
20
- | Traits are durable, reusable coding preferences stored as .agents/traits/<three_words-uuid>.md in the working directory.
21
- | The full filename stem is the trait ID; use it in tool calls, for example rose_karate_frog-<uuid>.
20
+ | Traits are durable, reusable coding preferences. The filesystem adapter stores each as .agents/traits/<name>.md, with a unique descriptive kebab-case name (no redundant trait- prefix) in frontmatter and no separate id.
21
+ | The unique name is the canonical identity across storage backends. Use exact names for focused traitNames selections and ignore directives, not filenames. Update references after renaming. Duplicate names are rejected.
22
22
  | Before completing a response to a user correction, coding preference, or approved alternative idiom, check whether it expresses a reusable rule.
23
23
  | Treat multi-turn exchanges as a whole: asking about a better idiom and then approving it can establish a preference without saying "always" or "trait".
24
24
  | Err on the side of proposing a concise trait unless you have read an existing trait that clearly covers the exact rule and its scope.
@@ -34,24 +34,27 @@ Command.make("traits", {
34
34
  | Approval to edit code alone is not approval to persist a trait. Make the requested edit, but also propose the reusable rule before your final response.
35
35
  | Also act on explicit requests to remember a convention. Skip one-off requirements, transient facts, and preferences already covered.
36
36
  | Read existing trait files before drafting. Keep each trait concise and independently applicable, preserving scope and exceptions.
37
+ | Keep frontmatter complementary: mime restricts file types, when defines positive semantic scope, and skip is only an independent exception within that scope. Omit redundant fields; never repeat when's negation as skip. Keep bodies standalone without repeated requirements or duplicate traits.
38
+ | Write when values as conditions without a redundant leading When, for example when: editing React state.
37
39
  | Call derive_trait with the drafted body as proposedTrait. It saves only distinct rules; Covered means reuse an existing trait.
38
40
  | A single clarification candidate is selected automatically and shown for approval; supply a complete replacement preserving the existing rule.
39
- | Multiple candidates return Clarification entries without writing: refine the proposal or clarify intent. Do not supply a target ID.
40
- | After fallback approval, retry with the same proposedTrait and approved: true; Updated preserves the selected existing ID.
41
- | Every derive_trait response is one tagged TraitDerivation outcome. Created returns the saved trait and ID; Updated and Resolved return saved replacements.
41
+ | Multiple candidates return Clarification entries without writing: refine the proposal or clarify intent. Do not supply a clarification target.
42
+ | After fallback approval, retry with the same name, proposedTrait and approved: true; Updated preserves the selected existing name.
43
+ | Every derive_trait response is one tagged TraitDerivation outcome. Created returns the saved trait with its unique name; Updated and Resolved return saved replacements.
42
44
  | Covered and Clarification return existing traits without writing. Inconclusive returns relationship findings and blocks all writes.
43
- | Each inconclusive outcome's findings distinguish conflict from inconclusive via reason; clarify ambiguity before retrying.
44
- | Confirmed conflicts enter reconciliation inside derive_trait, selecting only the conflicting originals for an explicit replacement approval.
45
- | Approval must cover affected IDs/bodies, removals, the proposal, and generated reconciliation. Nothing is replaced silently.
46
- | After approval, reconciliation gives the proposal precedence in direct conflicts, saves generated replacements, then removes the conflicting originals.
47
- | Resolved returns saved replacement bodies and IDs. Review them and check relevant code; do not derive the same proposal again.
45
+ | Inconclusive outcome findings use reason to distinguish conflict, coverage_gap, and inconclusive; clarify ambiguity before retrying.
46
+ | Covered requires independent second-pass verification of the saved body and applicability metadata against the complete proposal. Similar intent is insufficient; coverage gaps enter approval-gated reconciliation and inconclusive verification blocks writes.
47
+ | Confirmed conflicts and verified coverage gaps enter reconciliation inside derive_trait, selecting only the affected originals for an explicit replacement approval.
48
+ | Approval must cover affected names, bodies, removals, the proposal, and generated reconciliation. Nothing is replaced silently.
49
+ | After approval, reconciliation gives the proposal precedence in direct conflicts, updates selected names reused by replacements, saves new names, then removes only originals whose names were not reused. Unaffected names and duplicate generated names cannot be overwritten.
50
+ | Resolved returns saved replacement bodies and unique names. Review them and check relevant code; do not derive the same proposal again.
48
51
  | After generating or changing TypeScript files, call check_traits on those files.
49
52
  | check_traits accepts include as file paths or glob strings, for example include: ["traits/**/*.ts"]. Overlapping matches are deduplicated.
50
53
  | Restrict assessments to project-owned source and relevant authored configuration/docs. Prefer an explicit project-file manifest for whole-project audits.
51
54
  | Never submit dependency/reference code, generated build output or lockfiles, Git metadata, secrets, .env files, credentials, or binary assets for assessment.
52
55
  | Unmatched patterns select nothing. Built-in exclusions cover dependencies, Git metadata, and nested worktrees; configure project-specific filenames or native glob patterns through TraitsConfig.excludes.
53
56
  | After saving or resolving a trait, check the relevant TypeScript files explicitly; creation does not run that review for you.
54
- | Omit traitIds for all traits; use specific IDs for focused follow-ups. Before committing or opening a PR, review the changed TypeScript files.
57
+ | Omit traitNames for all traits; use specific names for focused follow-ups. Before committing or opening a PR, review the changed TypeScript files.
55
58
  | Checks read current full files in 200-line chunks, not Git diffs. A finding's startLine locates a chunk, not an exact violation.
56
59
  | Each finding includes assessment.classification and probabilities: inconclusive is unresolved context, not a confirmed violation. Probabilities are not calibrated guarantees.
57
60
  | Take responsibility for trait compliance whenever a violation is discovered, through tool findings or your own inspection.
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../main.ts"],"names":[],"mappings":"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"}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "traits",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,7 +21,8 @@
21
21
  "dist/**/*.js.map",
22
22
  "dist/**/*.d.ts",
23
23
  "dist/**/*.d.ts.map",
24
- "!dist/vite.config.*"
24
+ "!dist/vite.config.*",
25
+ "!dist/integration/**"
25
26
  ],
26
27
  "type": "module",
27
28
  "exports": {
@@ -41,8 +42,12 @@
41
42
  },
42
43
  "access": "public"
43
44
  },
45
+ "dependencies": {
46
+ "yaml": "^2.9.1"
47
+ },
44
48
  "devDependencies": {
45
49
  "@effect/platform-node": "catalog:",
50
+ "@effect/vitest": "catalog:",
46
51
  "effect": "catalog:"
47
52
  },
48
53
  "peerDependencies": {
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Frontmatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Frontmatter.test.d.ts","sourceRoot":"","sources":["../../test/Frontmatter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { expect, it } from "@effect/vitest";
2
+ import { Effect, pipe, Schema as S } from "effect";
3
+ import * as Frontmatter from "../_util/Frontmatter.js";
4
+ it.effect("reports document errors with the source path and YAML position", Effect.fnUntraced(function* () {
5
+ for (const example of [
6
+ { text: "Body", error: { _tag: "MissingFrontmatterError" } },
7
+ { text: "---\nname: example", error: { _tag: "UnterminatedFrontmatterError" } },
8
+ {
9
+ text: "---\nname: [\n---\nBody",
10
+ error: { _tag: "InvalidYamlError", line: 3, column: 1, cause: expect.any(Error) }
11
+ }
12
+ ]) {
13
+ const result = yield* pipe({ text: example.text, path: "/docs/example.md" }, Frontmatter.parse(S.JsonObject), Effect.result);
14
+ expect(result).toMatchObject({ _tag: "Failure", failure: { ...example.error, path: "/docs/example.md" } });
15
+ }
16
+ }));
17
+ it.effect("decodes supplied schemas and preserves body delimiters and line endings", Effect.fnUntraced(function* () {
18
+ const document = yield* pipe({
19
+ text: "---\r\ntitle: Example\r\n---\r\nBody\r\n---\r\n",
20
+ path: "/docs/example.md"
21
+ }, Frontmatter.parse(S.Struct({ title: S.String })));
22
+ expect(document).toEqual({ frontmatter: { title: "Example" }, body: "Body\r\n---\r\n" });
23
+ const invalid = yield* pipe({
24
+ text: "---\ntitle: 2\n---",
25
+ path: "/docs/example.md"
26
+ }, Frontmatter.parse(S.Struct({ title: S.String })), Effect.result);
27
+ expect(invalid).toMatchObject({ _tag: "Failure", failure: { _tag: "SchemaError" } });
28
+ }));
29
+ //# sourceMappingURL=Frontmatter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Frontmatter.test.js","sourceRoot":"","sources":["../../test/Frontmatter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAElD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAA;AAEtD,EAAE,CAAC,MAAM,CACP,gEAAgE,EAChE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;IACzB,KAAK,MAAM,OAAO,IAAI;QACpB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE;QAC5D,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,8BAA8B,EAAE,EAAE;QAC/E;YACE,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;SAClF;KACF,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CACxB,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAChD,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,EAC/B,MAAM,CAAC,MAAM,CACd,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;IAC5G,CAAC;AACH,CAAC,CAAC,CACH,CAAA;AAED,EAAE,CAAC,MAAM,CACP,yEAAyE,EACzE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,CAC1B;QACE,IAAI,EAAE,iDAAiD;QACvD,IAAI,EAAE,kBAAkB;KACzB,EACD,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CACjD,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAA;IACxF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CACzB;QACE,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,kBAAkB;KACzB,EACD,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAChD,MAAM,CAAC,MAAM,CACd,CAAA;IACD,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;AACtF,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Trait.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Trait.test.d.ts","sourceRoot":"","sources":["../../test/Trait.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ import { expect, it } from "@effect/vitest";
2
+ import { Effect, pipe, Result, Schema as S, String } from "effect";
3
+ import * as Trait from "../Trait.js";
4
+ const name = Trait.TraitName.make("test-trait");
5
+ it.effect("roundtrips a dedicated BAD-to-GOOD diff separately from metadata and body", Effect.fnUntraced(function* () {
6
+ const diff = "-const value = bad()\n+const value = good()";
7
+ const body = "Prefer good().\n\n---\nKeep this separator.\n";
8
+ const trait = Trait.Trait.make({ name, diff, body, priority: 2 });
9
+ const text = Trait.serialize(trait);
10
+ expect(text).toContain(`---\n\n\`\`\`diff\n${diff}\n\`\`\`\n\n---\n${body}`);
11
+ expect(text).not.toContain("diff:");
12
+ const parsed = yield* Trait.parse(text, "/traits/test.md");
13
+ expect(parsed).toEqual(trait);
14
+ const crlf = yield* Trait.parse(pipe(text, String.replaceAll("\n", "\r\n")), "/traits/test.md");
15
+ expect(crlf.diff).toBe(pipe(diff, String.replaceAll("\n", "\r\n")));
16
+ expect(crlf.body).toBe(pipe(body, String.replaceAll("\n", "\r\n")));
17
+ }));
18
+ it.effect("rejects incomplete leading examples and examples without both sides", Effect.fnUntraced(function* () {
19
+ for (const example of [
20
+ "```diff\n-bad()\n+good()\n```\nBody",
21
+ "```diff\n+good()\n```\n\n---\nBody",
22
+ "```diff\n-bad()\n"
23
+ ]) {
24
+ const result = yield* Trait.parse(`---\nname: ${name}\n---\n${example}`, "/traits/test.md").pipe(Effect.result);
25
+ expect(Result.isFailure(result)).toBe(true);
26
+ }
27
+ }));
28
+ it.effect("loads frontmatter without changing the Markdown body", Effect.fnUntraced(function* () {
29
+ const body = "Keep this body.\n\n---\nNot a header.\n";
30
+ const trait = yield* Trait.parse(`---\nname: ${name}\n---\n${body}`, "/traits/test.md");
31
+ expect(trait).toEqual({ name, body });
32
+ expect(Trait.serialize(trait)).toBe(`---\nname: ${name}\n---\n${body}`);
33
+ }));
34
+ it.effect("parses YAML metadata separately from the body and preserves additional fields", Effect.fnUntraced(function* () {
35
+ const trait = yield* Trait.parse(`---\nname: ${name}\nwhen: editing schemas.\nmime:\n - text/typescript\npriority: 2\n---\nBody.\n`, "/traits/test.md");
36
+ expect(trait).toEqual({
37
+ name,
38
+ body: "Body.\n",
39
+ when: "editing schemas.",
40
+ mime: ["text/typescript"],
41
+ priority: 2
42
+ });
43
+ const roundtrip = yield* Trait.parse(Trait.serialize(trait), "/traits/test.md");
44
+ expect(roundtrip).toEqual(trait);
45
+ expect(Trait.serialize(trait)).toContain("when: editing schemas.");
46
+ expect(Trait.serialize(trait)).not.toContain("activation:");
47
+ }));
48
+ it.effect("supports scalar MIME values, multiline when, and CRLF headers", Effect.fnUntraced(function* () {
49
+ const trait = yield* Trait.parse(`---\r\nname: ${name}\r\nwhen: |\r\n editing\r\n React components.\r\nmime: text/tsx\r\n---\r\nBody.\r\n`, "/traits/test.md");
50
+ expect(trait.when).toBe("editing\nReact components.\n");
51
+ expect(trait.mime).toBe("text/tsx");
52
+ expect(trait.body).toBe("Body.\r\n");
53
+ }));
54
+ it.effect("supports minimal frontmatter and a closing delimiter at end of file", Effect.fnUntraced(function* () {
55
+ const empty = yield* Trait.parse(`---\nname: ${name}\n---\nBody`, "/traits/test.md");
56
+ expect(empty).toEqual({ name, body: "Body" });
57
+ const atEnd = yield* Trait.parse(`---\nname: ${name}\nmime: text/typescript\n---`, "/traits/test.md");
58
+ expect(atEnd).toEqual({
59
+ name,
60
+ body: "",
61
+ mime: "text/typescript"
62
+ });
63
+ }));
64
+ it.effect("rejects malformed, unterminated, and incorrectly typed metadata", Effect.fnUntraced(function* () {
65
+ for (const text of [
66
+ "---\nmime: [\n---\nBody",
67
+ "---\nmime: text/typescript\nBody",
68
+ "---\n- not an object\n---\nBody",
69
+ `---\nname: ${name}\nwhen: false\n---\nBody`,
70
+ `---\nname: ${name}\nmime: 123\n---\nBody`,
71
+ "---\nname: invalid_name\n---\nBody",
72
+ "---\nwhen: Missing name\n---\nBody",
73
+ "Body without frontmatter",
74
+ `Body before frontmatter\n---\nname: ${name}\n---\nBody`
75
+ ]) {
76
+ const result = yield* Trait.parse(text, "/traits/test.md").pipe(Effect.result);
77
+ expect(Result.isFailure(result)).toBe(true);
78
+ }
79
+ }));
80
+ it.effect("serializes updated bodies without dropping metadata", Effect.fnUntraced(function* () {
81
+ const trait = Trait.Trait.make({
82
+ name,
83
+ body: "Replacement\n",
84
+ when: "editing.",
85
+ mime: "text/tsx"
86
+ });
87
+ const roundtrip = yield* Trait.parse(Trait.serialize(trait), "/traits/test.md");
88
+ expect(roundtrip).toEqual(trait);
89
+ }));
90
+ it.effect("preserves skip conditions alongside when without changing the body", Effect.fnUntraced(function* () {
91
+ const trait = yield* Trait.parse(`---\nname: ${name}\nwhen: editing React state.\nskip: When a custom registry is required.\n---\nBody`, "/traits/test.md");
92
+ expect(trait.skip).toBe("When a custom registry is required.");
93
+ expect(trait.when).toBe("editing React state.");
94
+ expect(trait.body).toBe("Body");
95
+ const roundtrip = yield* Trait.parse(Trait.serialize(trait), "/traits/test.md");
96
+ expect(roundtrip).toEqual(trait);
97
+ }));
98
+ it.effect("rejects non-string skip conditions", Effect.fnUntraced(function* () {
99
+ const result = yield* Trait.parse(`---\nname: ${name}\nskip: true\n---\nBody`, "/traits/test.md").pipe(Effect.result);
100
+ expect(Result.isFailure(result)).toBe(true);
101
+ }));
102
+ it.effect("preserves frontmatter identity while keeping the Markdown body authoritative", Effect.fnUntraced(function* () {
103
+ const trait = yield* Trait.parse(`---\nname: ${name}\nbody: Other body\nmime: text/typescript\n---\nBody`, "/traits/test.md");
104
+ expect(trait).toEqual({ name, body: "Body", mime: "text/typescript" });
105
+ expect(Trait.serialize(trait)).toBe(`---\nmime: text/typescript\nname: ${name}\n---\nBody`);
106
+ }));
107
+ it.effect("requires a safe descriptive name", Effect.fnUntraced(function* () {
108
+ for (const invalid of [
109
+ "",
110
+ "../escape",
111
+ "with/slash",
112
+ "name.md",
113
+ "Uppercase",
114
+ "two words",
115
+ "snake_case",
116
+ "trait-example",
117
+ pipe("a", String.repeat(81))
118
+ ]) {
119
+ const result = yield* Trait.parse(`---\nname: ${JSON.stringify(invalid)}\n---\nBody`, "/traits/test.md").pipe(Effect.result);
120
+ expect(Result.isFailure(result)).toBe(true);
121
+ }
122
+ const missing = yield* Trait.parse("---\nmime: text/typescript\n---\nBody", "/traits/test.md").pipe(Effect.result);
123
+ expect(Result.isFailure(missing)).toBe(true);
124
+ }));
125
+ it.effect("roundtrips nested JSON-compatible extension metadata", Effect.fnUntraced(function* () {
126
+ const trait = Trait.Trait.make({
127
+ name,
128
+ body: "Body",
129
+ metadata: { values: [null, true, 2, "text", { nested: false }] }
130
+ });
131
+ const roundtrip = yield* Trait.parse(Trait.serialize(trait), "/traits/test.md");
132
+ expect(roundtrip).toEqual(trait);
133
+ }));
134
+ it.effect("rejects non-JSON extension values in frontmatter and domain records", Effect.fnUntraced(function* () {
135
+ for (const value of [".nan", ".inf", "-.inf", "{ nested: [.nan] }"]) {
136
+ const result = yield* Trait.parse(`---\nname: ${name}\nmetadata: ${value}\n---\nBody`, "/traits/test.md").pipe(Effect.result);
137
+ expect(Result.isFailure(result)).toBe(true);
138
+ }
139
+ for (const metadata of [undefined, NaN, Infinity, { nested: [undefined] }]) {
140
+ const result = yield* pipe({ name, body: "Body", metadata }, S.decodeUnknownEffect(Trait.Trait), Effect.result);
141
+ expect(Result.isFailure(result)).toBe(true);
142
+ }
143
+ }));
144
+ //# sourceMappingURL=Trait.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Trait.test.js","sourceRoot":"","sources":["../../test/Trait.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=TraitDerivation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TraitDerivation.test.d.ts","sourceRoot":"","sources":["../../test/TraitDerivation.test.ts"],"names":[],"mappings":""}