@pome-sh/cli 0.15.0 → 0.16.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.
Files changed (36) hide show
  1. package/dist/build-info.json +3 -3
  2. package/dist/src/cli/checks.d.ts +3 -2
  3. package/dist/src/cli/checks.js +22 -9
  4. package/node_modules/@pome-sh/twin-linear/CHANGELOG.md +41 -0
  5. package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.d.ts +10 -0
  6. package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.js +117 -0
  7. package/node_modules/@pome-sh/twin-linear/dist/src/check-comments.js.map +1 -0
  8. package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.d.ts +25 -0
  9. package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.js +211 -0
  10. package/node_modules/@pome-sh/twin-linear/dist/src/check-issues.js.map +1 -0
  11. package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.d.ts +3 -0
  12. package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.js +9 -0
  13. package/node_modules/@pome-sh/twin-linear/dist/src/check-kind.js.map +1 -0
  14. package/node_modules/@pome-sh/twin-linear/dist/src/check-params.d.ts +8 -0
  15. package/node_modules/@pome-sh/twin-linear/dist/src/check-params.js +94 -0
  16. package/node_modules/@pome-sh/twin-linear/dist/src/check-params.js.map +1 -0
  17. package/node_modules/@pome-sh/twin-linear/dist/src/check-state.d.ts +98 -0
  18. package/node_modules/@pome-sh/twin-linear/dist/src/check-state.js +131 -0
  19. package/node_modules/@pome-sh/twin-linear/dist/src/check-state.js.map +1 -0
  20. package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.d.ts +2 -0
  21. package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.js +100 -0
  22. package/node_modules/@pome-sh/twin-linear/dist/src/check-tape.js.map +1 -0
  23. package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.d.ts +44 -0
  24. package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.js +93 -0
  25. package/node_modules/@pome-sh/twin-linear/dist/src/check-worlds.js.map +1 -0
  26. package/node_modules/@pome-sh/twin-linear/dist/src/checks.d.ts +29 -0
  27. package/node_modules/@pome-sh/twin-linear/dist/src/checks.js +52 -0
  28. package/node_modules/@pome-sh/twin-linear/dist/src/checks.js.map +1 -0
  29. package/node_modules/@pome-sh/twin-linear/dist/src/index.d.ts +2 -0
  30. package/node_modules/@pome-sh/twin-linear/dist/src/index.js +7 -0
  31. package/node_modules/@pome-sh/twin-linear/dist/src/index.js.map +1 -1
  32. package/node_modules/@pome-sh/twin-linear/package.json +1 -1
  33. package/package.json +2 -2
  34. package/tasks/24-linear-issue-triage.md +2 -2
  35. package/tasks/25-linear-comment-label-triage.md +3 -3
  36. package/tasks/26-github-linear-handoff.md +3 -4
@@ -0,0 +1,52 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ //
3
+ // The Linear twin's assertable check vocabulary (F-1129, milestone A3).
4
+ //
5
+ // These live HERE, next to the state they read, because the twin owns that
6
+ // state's shape. pome-cloud imports this module from npm and adapts each
7
+ // declaration onto its predicate engine, so there is no second copy to
8
+ // reconcile — only a pin that can fall behind, which is what its drift gate
9
+ // exists to catch. The cloud's `deterministic/linear.ts`, including its
10
+ // hand-maintained mirror of the state shape whose header records a manual
11
+ // audit "verified against source, 2026-07-25", is deleted in the same
12
+ // milestone. That audit is the artifact this file retires.
13
+ //
14
+ // Linear is the LAST of A3's four vocabularies, and the one that answered the
15
+ // two questions the earlier three left open:
16
+ //
17
+ // * A rendered sentence cannot carry a pronoun. Six of the nine shipped
18
+ // criteria named their subject with "that issue", with no subject at all,
19
+ // or by pointing at the seed. Under position 2 an author picks a check and
20
+ // fills its parameters, and `evaluate(args, substrate)` receives only its
21
+ // own args — so there is no mechanism by which "that issue" could resolve.
22
+ // Every check therefore takes an explicit title, and the three task files
23
+ // were rewritten to say so.
24
+ // * twin-github FAILS on a selector miss and twin-slack SKIPS. Linear does
25
+ // both, split by evidence rather than by taste — see `check-state.ts`.
26
+ //
27
+ // This file is the ASSEMBLY. Declarations group by what they assert about
28
+ // (`check-issues.ts`, `check-comments.ts`, `check-tape.ts`), with typed slots in
29
+ // `check-params.ts`, fixture worlds in `check-worlds.ts`, and the reading of the
30
+ // exported tree in `check-state.ts`.
31
+ import { issueCommentContains, issueThreadedReply } from "./check-comments.js";
32
+ import { issueAssignee, issueEstimate, issueExists, issueHasLabel, issueState, } from "./check-issues.js";
33
+ import { noUnsupportedEndpoint } from "./check-tape.js";
34
+ // Order is not first-match-wins — the generated patterns are anchored and
35
+ // mutually exclusive, and `checks-contract.test.ts` proves no sentence is
36
+ // claimed by two. It is the order an authoring surface lists them in, running
37
+ // from the assertion an author reaches for first to the ones a specialised task
38
+ // needs.
39
+ export const LINEAR_CHECKS = [
40
+ issueExists,
41
+ issueState,
42
+ issueHasLabel,
43
+ issueEstimate,
44
+ issueAssignee,
45
+ issueCommentContains,
46
+ issueThreadedReply,
47
+ // Last, because the listing order runs from the assertion an author reaches
48
+ // for first to the ones a specialised task needs — and this is the only one
49
+ // that reads the run rather than the world it left behind.
50
+ noUnsupportedEndpoint,
51
+ ];
52
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/checks.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,wEAAwE;AACxE,EAAE;AACF,2EAA2E;AAC3E,yEAAyE;AACzE,uEAAuE;AACvE,4EAA4E;AAC5E,wEAAwE;AACxE,0EAA0E;AAC1E,sEAAsE;AACtE,2DAA2D;AAC3D,EAAE;AACF,8EAA8E;AAC9E,6CAA6C;AAC7C,EAAE;AACF,0EAA0E;AAC1E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,gCAAgC;AAChC,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,0EAA0E;AAC1E,iFAAiF;AACjF,iFAAiF;AACjF,qCAAqC;AAErC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAaxD,0EAA0E;AAC1E,0EAA0E;AAC1E,8EAA8E;AAC9E,gFAAgF;AAChF,SAAS;AACT,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW;IACX,UAAU;IACV,aAAa;IACb,aAAa;IACb,aAAa;IACb,oBAAoB;IACpB,kBAAkB;IAClB,4EAA4E;IAC5E,4EAA4E;IAC5E,2DAA2D;IAC3D,qBAAqB;CACb,CAAC"}
@@ -12,5 +12,7 @@ export { exportLinearState, linearStateDelta } from "./state.js";
12
12
  export type { LinearStateExport } from "./state.js";
13
13
  export { createLinearTwinApp, createLinearTwinDefinition, withPublicOAuth, } from "./twin.js";
14
14
  export { registerLinearRoutes } from "./routes.js";
15
+ export { LINEAR_CHECKS } from "./checks.js";
16
+ export type { Check, LinearCheckState, LinearCheckStateComment, LinearCheckStateIssue, LinearCheckStateLabel, LinearCheckStateTeam, LinearCheckStateUser, LinearCheckStateWorkflowState, } from "./checks.js";
15
17
  export type { LinearStateSeed, LinearTwinDatabase, LinearIssue, LinearUser, LinearTeam, LinearComment, } from "./types.js";
16
18
  export { DEFAULT_LINEAR_CLOCK, DEFAULT_LINEAR_EMAIL, DEFAULT_LINEAR_TOKEN, DEFAULT_LINEAR_SID, DEFAULT_LINEAR_PORT, LINEAR_PROVIDER_TOKEN_PREFIX, STATE_EXPORT_CAP, } from "./types.js";
@@ -10,5 +10,12 @@ export { defaultSeedState, linearSeedSchema, loadSeedFromEnv, parseSeed, } from
10
10
  export { exportLinearState, linearStateDelta } from "./state.js";
11
11
  export { createLinearTwinApp, createLinearTwinDefinition, withPublicOAuth, } from "./twin.js";
12
12
  export { registerLinearRoutes } from "./routes.js";
13
+ // The declared check vocabulary (F-1129). Re-exported from the root as
14
+ // twin-slack does, alongside the `@pome-sh/twin-linear/checks` subpath that
15
+ // pome-cloud and the CLI both import. The `LinearCheckState*` types are a
16
+ // CHECK's reading of the exported tree, and are deliberately distinct from the
17
+ // `LinearIssue` / `LinearUser` / `LinearComment` row types below: the export
18
+ // carries `stateId` and `labelIds` where those carry names.
19
+ export { LINEAR_CHECKS } from "./checks.js";
13
20
  export { DEFAULT_LINEAR_CLOCK, DEFAULT_LINEAR_EMAIL, DEFAULT_LINEAR_TOKEN, DEFAULT_LINEAR_SID, DEFAULT_LINEAR_PORT, LINEAR_PROVIDER_TOKEN_PREFIX, STATE_EXPORT_CAP, } from "./types.js";
14
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AASnD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,SAAS,GACV,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,uEAAuE;AACvE,4EAA4E;AAC5E,0EAA0E;AAC1E,+EAA+E;AAC/E,6EAA6E;AAC7E,4DAA4D;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAmB5C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/twin-linear",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Deterministic Linear-shaped twin for agent testing — SQLite-backed GraphQL + MCP + OAuth.",
5
5
  "private": false,
6
6
  "type": "module",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pome-sh/cli",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Digital-twin testing for AI agents — run tasks against resettable local or hosted twins and record tool-call traces for evaluation on pome.sh.",
5
5
  "keywords": [
6
6
  "ai",
@@ -69,7 +69,7 @@
69
69
  "@pome-sh/shared-types": "0.13.0",
70
70
  "@pome-sh/twin-gmail": "0.3.0",
71
71
  "@pome-sh/twin-github": "0.7.0",
72
- "@pome-sh/twin-linear": "0.1.1",
72
+ "@pome-sh/twin-linear": "0.2.0",
73
73
  "@pome-sh/twin-slack": "0.3.0",
74
74
  "@pome-sh/twin-stripe": "0.4.0",
75
75
  "ai": "^7.0.18",
@@ -14,8 +14,8 @@ The agent lists issues (MCP or GraphQL), updates the backlog issue's state, and
14
14
  creates one comment without contacting any live Linear endpoint.
15
15
 
16
16
  ## Success Criteria
17
- - [code] Issue "Triage inbox for agent eval" is in state In Progress
18
- - [code] A comment exists on that issue mentioning triage
17
+ - [code] Issue "Triage inbox for agent eval" in `ENG` is in state "In Progress"
18
+ - [code] A comment on issue "Triage inbox for agent eval" in `ENG` contains "triage"
19
19
  - [model] The agent confirms the issue was updated and commented on
20
20
 
21
21
  ## Config
@@ -16,9 +16,9 @@ with `parentId`, ensures the label exists, attaches it with `save_issue`, and
16
16
  sets `estimate` without contacting any live Linear endpoint.
17
17
 
18
18
  ## Success Criteria
19
- - [code] Issue "Needs comment and label triage" has estimate 2
20
- - [code] Issue has label "Needs triage"
21
- - [code] A reply comment exists with parentId equal to the seeded root comment
19
+ - [code] Issue "Needs comment and label triage" in `ENG` has estimate 2
20
+ - [code] Issue "Needs comment and label triage" in `ENG` has label "Needs triage"
21
+ - [code] A threaded reply to a seeded comment exists on issue "Needs comment and label triage" in `ENG`
22
22
  - [model] The agent confirms the threaded reply, label, and estimate were applied
23
23
 
24
24
  ## Config
@@ -17,10 +17,9 @@ GitHub or Linear.
17
17
 
18
18
  ## Success Criteria
19
19
  - [code:github] Issue #1 in `acme/api` is in state open
20
- - [code:linear] An issue titled "Orders 500 after deploy" exists
21
- - [code:linear] That issue is in state In Progress
22
- - [code:linear] That issue has label Agent
23
- - [code:linear] A comment exists on that issue mentioning GitHub issue #1
20
+ - [code:linear] Issue "Orders 500 after deploy" in `ENG` is in state "In Progress"
21
+ - [code:linear] Issue "Orders 500 after deploy" in `ENG` has label "Agent"
22
+ - [code:linear] A comment on issue "Orders 500 after deploy" in `ENG` contains "#1"
24
23
  - [model] The Linear issue clearly handoffs the GitHub orders bug without inventing unrelated work
25
24
 
26
25
  ## Config