@romandmitri/ai-patch 0.1.0 → 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 CHANGED
@@ -32,9 +32,9 @@ Text is the currently supported content format. JSON coming... if needed.
32
32
  object.
33
33
 
34
34
  ```ts
35
- import {ContentFormat, Target} from "@romandmitri/ai-patch";
36
- import {Output, generateText} from "ai";
37
- import {z} from "zod";
35
+ import { ContentFormat, Target } from "@romandmitri/ai-patch";
36
+ import { Output, generateText } from "ai";
37
+ import { z } from "zod";
38
38
 
39
39
  const documentTarget = new Target({
40
40
  content: "# Guide\n\nOld instructions.\n",
@@ -45,7 +45,7 @@ const summaryTarget = new Target({
45
45
  format: ContentFormat.Markdown,
46
46
  });
47
47
 
48
- const {output} = await generateText({
48
+ const { output } = await generateText({
49
49
  model,
50
50
  prompt: "Update the guide and its summary.",
51
51
  output: Output.object({
@@ -67,8 +67,8 @@ Each schema describes one immutable target. Operations cannot address another ta
67
67
  `Target.toVercelTool()` creates a target-bound AI SDK tool. Its strict input is `{ patches: Operation[] }`, and execution returns the updated content string.
68
68
 
69
69
  ```ts
70
- import {ContentFormat, Target} from "@romandmitri/ai-patch";
71
- import {generateText, isStepCount} from "ai";
70
+ import { ContentFormat, Target } from "@romandmitri/ai-patch";
71
+ import { generateText, isStepCount } from "ai";
72
72
 
73
73
  const target = new Target({
74
74
  content: "# Guide\n\nOld instructions.\n",
@@ -2,7 +2,7 @@ import { OperationType } from "#src/operation/OperationType.js";
2
2
  import { z } from "zod";
3
3
  export const PatchOperation_Delete_Schema = z
4
4
  .strictObject({
5
- operation: z.literal(OperationType.Delete).describe("Delete the exact oldText anchor."),
5
+ operation: z.literal(OperationType.Delete).describe('Must be exactly "delete" (lowercase); delete the exact oldText anchor.'),
6
6
  expectedLine: z.number().int().min(1).describe("The exact 1-based line in the original target content where oldText must begin."),
7
7
  oldText: z
8
8
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_Delete.js","sourceRoot":"","sources":["../../src/operation/Operation_Delete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC;KAC3C,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACvF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;CACxI,CAAC;KACD,QAAQ,CAAC,mDAAmD,CAAuC,CAAC"}
1
+ {"version":3,"file":"Operation_Delete.js","sourceRoot":"","sources":["../../src/operation/Operation_Delete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC;KAC3C,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,wEAAwE,CAAC;IAC7H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;CACxI,CAAC;KACD,QAAQ,CAAC,mDAAmD,CAAuC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_InsertAfter.d.ts","sourceRoot":"","sources":["../../src/operation/Operation_InsertAfter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;kBAS6D,CAAC"}
1
+ {"version":3,"file":"Operation_InsertAfter.d.ts","sourceRoot":"","sources":["../../src/operation/Operation_InsertAfter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;kBAW6D,CAAC"}
@@ -2,7 +2,9 @@ import { OperationType } from "#src/operation/OperationType.js";
2
2
  import { z } from "zod";
3
3
  export const PatchOperation_InsertAfter_Schema = z
4
4
  .strictObject({
5
- operation: z.literal(OperationType.InsertAfter).describe("Insert newText immediately after the exact oldText anchor."),
5
+ operation: z
6
+ .literal(OperationType.InsertAfter)
7
+ .describe('Must be exactly "insertAfter" (case-sensitive); insert newText immediately after the exact oldText anchor.'),
6
8
  expectedLine: z.number().int().min(1).describe("The exact 1-based line in the original target content where oldText must begin."),
7
9
  oldText: z
8
10
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_InsertAfter.js","sourceRoot":"","sources":["../../src/operation/Operation_InsertAfter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC;KAChD,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,4DAA4D,CAAC;IACtH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;CACnF,CAAC;KACD,QAAQ,CAAC,oDAAoD,CAA4C,CAAC"}
1
+ {"version":3,"file":"Operation_InsertAfter.js","sourceRoot":"","sources":["../../src/operation/Operation_InsertAfter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC;KAChD,YAAY,CAAC;IACb,SAAS,EAAE,CAAC;SACV,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC;SAClC,QAAQ,CAAC,4GAA4G,CAAC;IACxH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;CACnF,CAAC;KACD,QAAQ,CAAC,oDAAoD,CAA4C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_InsertBefore.d.ts","sourceRoot":"","sources":["../../src/operation/Operation_InsertBefore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,kCAAkC;;;;;kBAS8D,CAAC"}
1
+ {"version":3,"file":"Operation_InsertBefore.d.ts","sourceRoot":"","sources":["../../src/operation/Operation_InsertBefore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,kCAAkC;;;;;kBAW8D,CAAC"}
@@ -2,7 +2,9 @@ import { OperationType } from "#src/operation/OperationType.js";
2
2
  import { z } from "zod";
3
3
  export const PatchOperation_InsertBefore_Schema = z
4
4
  .strictObject({
5
- operation: z.literal(OperationType.InsertBefore).describe("Insert newText immediately before the exact oldText anchor."),
5
+ operation: z
6
+ .literal(OperationType.InsertBefore)
7
+ .describe('Must be exactly "insertBefore" (case-sensitive); insert newText immediately before the exact oldText anchor.'),
6
8
  expectedLine: z.number().int().min(1).describe("The exact 1-based line in the original target content where oldText must begin."),
7
9
  oldText: z
8
10
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_InsertBefore.js","sourceRoot":"","sources":["../../src/operation/Operation_InsertBefore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC;KACjD,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,6DAA6D,CAAC;IACxH,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CACpF,CAAC;KACD,QAAQ,CAAC,qDAAqD,CAA6C,CAAC"}
1
+ {"version":3,"file":"Operation_InsertBefore.js","sourceRoot":"","sources":["../../src/operation/Operation_InsertBefore.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC;KACjD,YAAY,CAAC;IACb,SAAS,EAAE,CAAC;SACV,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC;SACnC,QAAQ,CAAC,8GAA8G,CAAC;IAC1H,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;CACpF,CAAC;KACD,QAAQ,CAAC,qDAAqD,CAA6C,CAAC"}
@@ -2,7 +2,7 @@ import { OperationType } from "#src/operation/OperationType.js";
2
2
  import { z } from "zod";
3
3
  export const PatchOperation_Replace_Schema = z
4
4
  .strictObject({
5
- operation: z.literal(OperationType.Replace).describe("Replace the exact oldText anchor with newText."),
5
+ operation: z.literal(OperationType.Replace).describe('Must be exactly "replace" (lowercase); replace the exact oldText anchor with newText.'),
6
6
  expectedLine: z.number().int().min(1).describe("The exact 1-based line in the original target content where oldText must begin."),
7
7
  oldText: z
8
8
  .string()
@@ -1 +1 @@
1
- {"version":3,"file":"Operation_Replace.js","sourceRoot":"","sources":["../../src/operation/Operation_Replace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC;KAC5C,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;IACtG,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CAClF,CAAC;KACD,QAAQ,CAAC,kDAAkD,CAAwC,CAAC"}
1
+ {"version":3,"file":"Operation_Replace.js","sourceRoot":"","sources":["../../src/operation/Operation_Replace.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC;KAC5C,YAAY,CAAC;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,uFAAuF,CAAC;IAC7I,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iFAAiF,CAAC;IACjI,OAAO,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,CAAC,4HAA4H,CAAC;IACxI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;CAClF,CAAC;KACD,QAAQ,CAAC,kDAAkD,CAAwC,CAAC"}
@@ -25,7 +25,7 @@ export class Target {
25
25
  });
26
26
  };
27
27
  toSchema() {
28
- const operationSchema = z.discriminatedUnion("operation", [
28
+ const operationSchema = z.union([
29
29
  PatchOperation_Replace_Schema,
30
30
  PatchOperation_InsertBefore_Schema,
31
31
  PatchOperation_InsertAfter_Schema,
@@ -1 +1 @@
1
- {"version":3,"file":"Target.js","sourceRoot":"","sources":["../../src/target/Target.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Target.js","sourceRoot":"","sources":["../../src/target/Target.ts"],"names":[],"mappings":"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"}
@@ -66,7 +66,8 @@ test("schema descriptions document target scope and exact atomic semantics", ()
66
66
  assert.match(schema.description ?? "", /Atomically update this target only/);
67
67
  assert.match(jsonSchema, /1-based line/);
68
68
  assert.match(jsonSchema, /exact text anchor/);
69
- assert.match(jsonSchema, /Replace the exact oldText anchor/);
69
+ assert.match(jsonSchema, /Must be exactly \\?"replace\\?" \(lowercase\)/);
70
+ assert.match(jsonSchema, /Must be exactly \\?"insertBefore\\?" \(case-sensitive\)/);
70
71
  assert.match(jsonSchema, /original content coordinates/);
71
72
  });
72
73
  test("two target schemas compose as independent object properties", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Target.schema.test.js","sourceRoot":"","sources":["../../../src/target/test/Target.schema.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Target.schema.test.js","sourceRoot":"","sources":["../../../src/target/test/Target.schema.test.ts"],"names":[],"mappings":"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"}
@@ -12,13 +12,15 @@ npm run build
12
12
  npm run format:check
13
13
  ```
14
14
 
15
- This repository is a library and has no development server or application run command.
15
+ This repository is a library and has no development server. During development, run `npm run dev` in a terminal; it performs an initial build and automatically
16
+ rebuilds `dist/` whenever a source file changes. Stop the watcher with Ctrl+C.
16
17
 
17
18
  ## Package Scripts
18
19
 
19
20
  - `npm test`: runs `src/target/test/*.test.ts` with Node's test runner and `tsx`.
20
21
  - `npm run typecheck`: checks source and test TypeScript configurations without emitting output.
21
22
  - `npm run build`: removes `dist/` and compiles JavaScript, declarations, and maps.
23
+ - `npm run dev`: watches source files and rebuilds `dist/` after each change.
22
24
  - `npm run clean`: removes generated `dist/` output.
23
25
  - `npm run format`: applies Prettier formatting.
24
26
  - `npm run format:check`: verifies formatting without modifying files.
@@ -0,0 +1,18 @@
1
+ # Publish
2
+
3
+ Reminder on how to publish to `npm` registry.
4
+
5
+ ```shell
6
+ git tag vXXX
7
+ git push --tags
8
+ ```
9
+
10
+ ```shell
11
+ npm whoami
12
+ npm login
13
+ ```
14
+
15
+ ```shell
16
+ npm pack --dry-run
17
+ npm publish --access public
18
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@romandmitri/ai-patch",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "author": "Roman Eidenzon <romandmitri@gmail.com> (https://www.romandmitri.com)",
5
5
  "description": "Validated, atomic text patches for precise AI and LLM edits to large text prompts/documents.",
6
6
  "repository": {
@@ -43,6 +43,7 @@
43
43
  "scripts": {
44
44
  "clean": "rimraf dist",
45
45
  "build": "npm run clean && tsc",
46
+ "dev": "tsc --watch --preserveWatchOutput",
46
47
  "format": "prettier --write .",
47
48
  "format:check": "prettier --check .",
48
49
  "test": "node --import tsx --test src/target/test/*.test.ts",