@vostride/agent-qa-ids 0.0.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,105 @@
1
+ # Functional Source License, Version 1.1, ALv2 Future License
2
+
3
+ ## Abbreviation
4
+
5
+ FSL-1.1-ALv2
6
+
7
+ ## Notice
8
+
9
+ Copyright 2026 Pranshu Chittora
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publicly perform, publicly display
28
+ and redistribute the Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
+ means making the Software available to others in a commercial product or
34
+ service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives of
65
+ the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software under
90
+ the Apache License, Version 2.0 that is effective on the second anniversary of
91
+ the date we make the Software available. On or after that date, you may use the
92
+ Software under the Apache License, Version 2.0, in which case the following
93
+ will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
96
+ this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software distributed
103
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
+ specific language governing permissions and limitations under the License.
package/NOTICE.md ADDED
@@ -0,0 +1,11 @@
1
+ # agent-qa Notice
2
+
3
+ agent-qa is provided by Pranshu Chittora.
4
+
5
+ Copyright 2026 Pranshu Chittora
6
+
7
+ agent-qa is licensed under the Functional Source License, Version 1.1, ALv2 Future License (FSL-1.1-ALv2). See `LICENSE.md` for the full license terms.
8
+
9
+ Under the Grant of Future License in `LICENSE.md`, each version of the Software is also granted under the Apache License, Version 2.0 effective on the second anniversary of the date that version was made available.
10
+
11
+ Third-party dependencies are distributed under their own license terms. This notice covers agent-qa itself and does not replace or modify notices required by third-party dependency owners.
package/dist/index.cjs ADDED
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ APPROVED_SAAS_PLACEHOLDERS: () => APPROVED_SAAS_PLACEHOLDERS,
24
+ APPROVED_SAAS_PLACEHOLDER_NAMES: () => APPROVED_SAAS_PLACEHOLDER_NAMES,
25
+ APPROVED_SAAS_PLACEHOLDER_SLUGS: () => APPROVED_SAAS_PLACEHOLDER_SLUGS,
26
+ CANONICAL_ID_WORDS: () => CANONICAL_ID_WORDS,
27
+ ENTITY_ID_TYPES: () => ENTITY_ID_TYPES,
28
+ LEGACY_OBSERVATION_ID_WORDS: () => LEGACY_OBSERVATION_ID_WORDS,
29
+ generateCanonicalId: () => generateCanonicalId,
30
+ generateHookId: () => generateHookId,
31
+ generateObservationId: () => generateObservationId,
32
+ generateRunId: () => generateRunId,
33
+ generateSuiteId: () => generateSuiteId,
34
+ generateTestId: () => generateTestId,
35
+ getEntityIdContract: () => getEntityIdContract,
36
+ getEntityIdContracts: () => getEntityIdContracts,
37
+ isCanonicalHookId: () => isCanonicalHookId,
38
+ isCanonicalId: () => isCanonicalId,
39
+ isCanonicalObservationId: () => isCanonicalObservationId,
40
+ isCanonicalRunId: () => isCanonicalRunId,
41
+ isCanonicalSuiteId: () => isCanonicalSuiteId,
42
+ isCanonicalTestId: () => isCanonicalTestId,
43
+ isObservationId: () => isObservationId,
44
+ selectApprovedSaasPlaceholder: () => selectApprovedSaasPlaceholder,
45
+ selectApprovedSaasPlaceholderSlug: () => selectApprovedSaasPlaceholderSlug
46
+ });
47
+ module.exports = __toCommonJS(index_exports);
48
+
49
+ // src/persistent-id.ts
50
+ var import_id_agent = require("id-agent");
51
+ var CANONICAL_ID_WORDS = 10;
52
+ var LEGACY_OBSERVATION_ID_WORDS = 6;
53
+ var PREFIX = {
54
+ test: "t",
55
+ suite: "s",
56
+ hook: "h",
57
+ observation: "obs",
58
+ run: "r"
59
+ };
60
+ var ENTITY_ID_TYPES = Object.keys(PREFIX);
61
+ function hasPrefixAndWordCount(value, prefix, wordCount) {
62
+ const parsed = (0, import_id_agent.parse)(value);
63
+ return parsed?.prefix === prefix && parsed.wordCount === wordCount;
64
+ }
65
+ function generateId(prefix) {
66
+ return (0, import_id_agent.idAgent)({ prefix, words: CANONICAL_ID_WORDS });
67
+ }
68
+ function generateTestId() {
69
+ return generateId(PREFIX.test);
70
+ }
71
+ function generateSuiteId() {
72
+ return generateId(PREFIX.suite);
73
+ }
74
+ function generateObservationId() {
75
+ return generateId(PREFIX.observation);
76
+ }
77
+ function generateHookId() {
78
+ return generateId(PREFIX.hook);
79
+ }
80
+ function generateRunId() {
81
+ return generateId(PREFIX.run);
82
+ }
83
+ function generateCanonicalId(type) {
84
+ return generateId(PREFIX[type]);
85
+ }
86
+ function isCanonicalTestId(value) {
87
+ return hasPrefixAndWordCount(value, PREFIX.test, CANONICAL_ID_WORDS);
88
+ }
89
+ function isCanonicalSuiteId(value) {
90
+ return hasPrefixAndWordCount(value, PREFIX.suite, CANONICAL_ID_WORDS);
91
+ }
92
+ function isCanonicalHookId(value) {
93
+ return hasPrefixAndWordCount(value, PREFIX.hook, CANONICAL_ID_WORDS);
94
+ }
95
+ function isCanonicalObservationId(value) {
96
+ return hasPrefixAndWordCount(value, PREFIX.observation, CANONICAL_ID_WORDS);
97
+ }
98
+ function isCanonicalRunId(value) {
99
+ return hasPrefixAndWordCount(value, PREFIX.run, CANONICAL_ID_WORDS);
100
+ }
101
+ function isCanonicalId(type, value) {
102
+ return hasPrefixAndWordCount(value, PREFIX[type], CANONICAL_ID_WORDS);
103
+ }
104
+ function isObservationId(value) {
105
+ return isCanonicalObservationId(value) || hasPrefixAndWordCount(value, PREFIX.observation, LEGACY_OBSERVATION_ID_WORDS);
106
+ }
107
+ function getEntityIdContract(type) {
108
+ const prefix = PREFIX[type];
109
+ return {
110
+ type,
111
+ prefix,
112
+ prefixWithSeparator: `${prefix}_`,
113
+ words: CANONICAL_ID_WORDS,
114
+ examplePattern: `${prefix}_word-word-word-word-word-word-word-word-word-word`
115
+ };
116
+ }
117
+ function getEntityIdContracts() {
118
+ return ENTITY_ID_TYPES.map((type) => getEntityIdContract(type));
119
+ }
120
+
121
+ // src/product-placeholders.ts
122
+ var APPROVED_SAAS_PLACEHOLDERS = [
123
+ { name: "Linear", slug: "linear" },
124
+ { name: "Vercel", slug: "vercel" },
125
+ { name: "Notion", slug: "notion" },
126
+ { name: "Stripe", slug: "stripe" },
127
+ { name: "GitHub", slug: "github" },
128
+ { name: "Slack", slug: "slack" },
129
+ { name: "Figma", slug: "figma" },
130
+ { name: "Shopify", slug: "shopify" },
131
+ { name: "Datadog", slug: "datadog" },
132
+ { name: "Supabase", slug: "supabase" }
133
+ ];
134
+ var APPROVED_SAAS_PLACEHOLDER_NAMES = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.name);
135
+ var APPROVED_SAAS_PLACEHOLDER_SLUGS = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.slug);
136
+ function hashSeed(seed) {
137
+ const input = String(seed);
138
+ let hash = 0;
139
+ for (let index = 0; index < input.length; index += 1) {
140
+ hash = hash * 31 + input.charCodeAt(index) >>> 0;
141
+ }
142
+ return hash;
143
+ }
144
+ function selectApprovedSaasPlaceholder(seed) {
145
+ return APPROVED_SAAS_PLACEHOLDERS[hashSeed(seed) % APPROVED_SAAS_PLACEHOLDERS.length];
146
+ }
147
+ function selectApprovedSaasPlaceholderSlug(seed) {
148
+ return selectApprovedSaasPlaceholder(seed).slug;
149
+ }
150
+ // Annotate the CommonJS export names for ESM import in node:
151
+ 0 && (module.exports = {
152
+ APPROVED_SAAS_PLACEHOLDERS,
153
+ APPROVED_SAAS_PLACEHOLDER_NAMES,
154
+ APPROVED_SAAS_PLACEHOLDER_SLUGS,
155
+ CANONICAL_ID_WORDS,
156
+ ENTITY_ID_TYPES,
157
+ LEGACY_OBSERVATION_ID_WORDS,
158
+ generateCanonicalId,
159
+ generateHookId,
160
+ generateObservationId,
161
+ generateRunId,
162
+ generateSuiteId,
163
+ generateTestId,
164
+ getEntityIdContract,
165
+ getEntityIdContracts,
166
+ isCanonicalHookId,
167
+ isCanonicalId,
168
+ isCanonicalObservationId,
169
+ isCanonicalRunId,
170
+ isCanonicalSuiteId,
171
+ isCanonicalTestId,
172
+ isObservationId,
173
+ selectApprovedSaasPlaceholder,
174
+ selectApprovedSaasPlaceholderSlug
175
+ });
176
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/persistent-id.ts","../src/product-placeholders.ts"],"sourcesContent":["export {\n CANONICAL_ID_WORDS,\n ENTITY_ID_TYPES,\n LEGACY_OBSERVATION_ID_WORDS,\n generateCanonicalId,\n generateHookId,\n generateObservationId,\n generateRunId,\n generateSuiteId,\n generateTestId,\n getEntityIdContract,\n getEntityIdContracts,\n isCanonicalId,\n isCanonicalHookId,\n isCanonicalObservationId,\n isCanonicalRunId,\n isCanonicalSuiteId,\n isCanonicalTestId,\n isObservationId,\n type EntityIdContract,\n type EntityIdType,\n} from './persistent-id.js'\n\nexport {\n type ApprovedSaasPlaceholder,\n APPROVED_SAAS_PLACEHOLDERS,\n APPROVED_SAAS_PLACEHOLDER_NAMES,\n APPROVED_SAAS_PLACEHOLDER_SLUGS,\n selectApprovedSaasPlaceholder,\n selectApprovedSaasPlaceholderSlug,\n} from './product-placeholders.js'\n","import { idAgent, parse } from 'id-agent'\n\nexport const CANONICAL_ID_WORDS = 10\nexport const LEGACY_OBSERVATION_ID_WORDS = 6\n\nconst PREFIX = {\n test: 't',\n suite: 's',\n hook: 'h',\n observation: 'obs',\n run: 'r',\n} as const\n\ntype Prefix = (typeof PREFIX)[keyof typeof PREFIX]\nexport type EntityIdType = keyof typeof PREFIX\n\nexport const ENTITY_ID_TYPES = Object.keys(PREFIX) as EntityIdType[]\n\nexport interface EntityIdContract {\n type: EntityIdType\n prefix: Prefix\n prefixWithSeparator: `${Prefix}_`\n words: number\n examplePattern: string\n}\n\nfunction hasPrefixAndWordCount(value: string, prefix: Prefix, wordCount: number): boolean {\n const parsed = parse(value)\n return parsed?.prefix === prefix && parsed.wordCount === wordCount\n}\n\nfunction generateId(prefix: Prefix): string {\n return idAgent({ prefix, words: CANONICAL_ID_WORDS })\n}\n\nexport function generateTestId(): string {\n return generateId(PREFIX.test)\n}\n\nexport function generateSuiteId(): string {\n return generateId(PREFIX.suite)\n}\n\nexport function generateObservationId(): string {\n return generateId(PREFIX.observation)\n}\n\nexport function generateHookId(): string {\n return generateId(PREFIX.hook)\n}\n\nexport function generateRunId(): string {\n return generateId(PREFIX.run)\n}\n\nexport function generateCanonicalId(type: EntityIdType): string {\n return generateId(PREFIX[type])\n}\n\nexport function isCanonicalTestId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.test, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalSuiteId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.suite, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalHookId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.hook, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalObservationId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.observation, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalRunId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.run, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalId(type: EntityIdType, value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX[type], CANONICAL_ID_WORDS)\n}\n\nexport function isObservationId(value: string): boolean {\n return isCanonicalObservationId(value)\n || hasPrefixAndWordCount(value, PREFIX.observation, LEGACY_OBSERVATION_ID_WORDS)\n}\n\nexport function getEntityIdContract(type: EntityIdType): EntityIdContract {\n const prefix = PREFIX[type]\n return {\n type,\n prefix,\n prefixWithSeparator: `${prefix}_`,\n words: CANONICAL_ID_WORDS,\n examplePattern: `${prefix}_word-word-word-word-word-word-word-word-word-word`,\n }\n}\n\nexport function getEntityIdContracts(): EntityIdContract[] {\n return ENTITY_ID_TYPES.map(type => getEntityIdContract(type))\n}\n","export interface ApprovedSaasPlaceholder {\n readonly name: string\n readonly slug: string\n}\n\nexport const APPROVED_SAAS_PLACEHOLDERS = [\n { name: 'Linear', slug: 'linear' },\n { name: 'Vercel', slug: 'vercel' },\n { name: 'Notion', slug: 'notion' },\n { name: 'Stripe', slug: 'stripe' },\n { name: 'GitHub', slug: 'github' },\n { name: 'Slack', slug: 'slack' },\n { name: 'Figma', slug: 'figma' },\n { name: 'Shopify', slug: 'shopify' },\n { name: 'Datadog', slug: 'datadog' },\n { name: 'Supabase', slug: 'supabase' },\n] as const satisfies readonly ApprovedSaasPlaceholder[]\n\nexport const APPROVED_SAAS_PLACEHOLDER_NAMES = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.name)\nexport const APPROVED_SAAS_PLACEHOLDER_SLUGS = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.slug)\n\nfunction hashSeed(seed: string | number): number {\n const input = String(seed)\n let hash = 0\n\n for (let index = 0; index < input.length; index += 1) {\n hash = (hash * 31 + input.charCodeAt(index)) >>> 0\n }\n\n return hash\n}\n\nexport function selectApprovedSaasPlaceholder(seed: string | number): ApprovedSaasPlaceholder {\n return APPROVED_SAAS_PLACEHOLDERS[hashSeed(seed) % APPROVED_SAAS_PLACEHOLDERS.length]\n}\n\nexport function selectApprovedSaasPlaceholderSlug(seed: string | number): string {\n return selectApprovedSaasPlaceholder(seed).slug\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAA+B;AAExB,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B;AAE3C,IAAM,SAAS;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,aAAa;AAAA,EACb,KAAK;AACP;AAKO,IAAM,kBAAkB,OAAO,KAAK,MAAM;AAUjD,SAAS,sBAAsB,OAAe,QAAgB,WAA4B;AACxF,QAAM,aAAS,uBAAM,KAAK;AAC1B,SAAO,QAAQ,WAAW,UAAU,OAAO,cAAc;AAC3D;AAEA,SAAS,WAAW,QAAwB;AAC1C,aAAO,yBAAQ,EAAE,QAAQ,OAAO,mBAAmB,CAAC;AACtD;AAEO,SAAS,iBAAyB;AACvC,SAAO,WAAW,OAAO,IAAI;AAC/B;AAEO,SAAS,kBAA0B;AACxC,SAAO,WAAW,OAAO,KAAK;AAChC;AAEO,SAAS,wBAAgC;AAC9C,SAAO,WAAW,OAAO,WAAW;AACtC;AAEO,SAAS,iBAAyB;AACvC,SAAO,WAAW,OAAO,IAAI;AAC/B;AAEO,SAAS,gBAAwB;AACtC,SAAO,WAAW,OAAO,GAAG;AAC9B;AAEO,SAAS,oBAAoB,MAA4B;AAC9D,SAAO,WAAW,OAAO,IAAI,CAAC;AAChC;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,sBAAsB,OAAO,OAAO,MAAM,kBAAkB;AACrE;AAEO,SAAS,mBAAmB,OAAwB;AACzD,SAAO,sBAAsB,OAAO,OAAO,OAAO,kBAAkB;AACtE;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,sBAAsB,OAAO,OAAO,MAAM,kBAAkB;AACrE;AAEO,SAAS,yBAAyB,OAAwB;AAC/D,SAAO,sBAAsB,OAAO,OAAO,aAAa,kBAAkB;AAC5E;AAEO,SAAS,iBAAiB,OAAwB;AACvD,SAAO,sBAAsB,OAAO,OAAO,KAAK,kBAAkB;AACpE;AAEO,SAAS,cAAc,MAAoB,OAAwB;AACxE,SAAO,sBAAsB,OAAO,OAAO,IAAI,GAAG,kBAAkB;AACtE;AAEO,SAAS,gBAAgB,OAAwB;AACtD,SAAO,yBAAyB,KAAK,KAChC,sBAAsB,OAAO,OAAO,aAAa,2BAA2B;AACnF;AAEO,SAAS,oBAAoB,MAAsC;AACxE,QAAM,SAAS,OAAO,IAAI;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,qBAAqB,GAAG,MAAM;AAAA,IAC9B,OAAO;AAAA,IACP,gBAAgB,GAAG,MAAM;AAAA,EAC3B;AACF;AAEO,SAAS,uBAA2C;AACzD,SAAO,gBAAgB,IAAI,UAAQ,oBAAoB,IAAI,CAAC;AAC9D;;;AChGO,IAAM,6BAA6B;AAAA,EACxC,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,EACjC,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,EACjC,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,EACjC,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,EACjC,EAAE,MAAM,UAAU,MAAM,SAAS;AAAA,EACjC,EAAE,MAAM,SAAS,MAAM,QAAQ;AAAA,EAC/B,EAAE,MAAM,SAAS,MAAM,QAAQ;AAAA,EAC/B,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,EACnC,EAAE,MAAM,YAAY,MAAM,WAAW;AACvC;AAEO,IAAM,kCAAkC,2BAA2B,IAAI,CAAC,SAAS,KAAK,IAAI;AAC1F,IAAM,kCAAkC,2BAA2B,IAAI,CAAC,SAAS,KAAK,IAAI;AAEjG,SAAS,SAAS,MAA+B;AAC/C,QAAM,QAAQ,OAAO,IAAI;AACzB,MAAI,OAAO;AAEX,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,WAAQ,OAAO,KAAK,MAAM,WAAW,KAAK,MAAO;AAAA,EACnD;AAEA,SAAO;AACT;AAEO,SAAS,8BAA8B,MAAgD;AAC5F,SAAO,2BAA2B,SAAS,IAAI,IAAI,2BAA2B,MAAM;AACtF;AAEO,SAAS,kCAAkC,MAA+B;AAC/E,SAAO,8BAA8B,IAAI,EAAE;AAC7C;","names":[]}
@@ -0,0 +1,76 @@
1
+ declare const CANONICAL_ID_WORDS = 10;
2
+ declare const LEGACY_OBSERVATION_ID_WORDS = 6;
3
+ declare const PREFIX: {
4
+ readonly test: "t";
5
+ readonly suite: "s";
6
+ readonly hook: "h";
7
+ readonly observation: "obs";
8
+ readonly run: "r";
9
+ };
10
+ type Prefix = (typeof PREFIX)[keyof typeof PREFIX];
11
+ type EntityIdType = keyof typeof PREFIX;
12
+ declare const ENTITY_ID_TYPES: EntityIdType[];
13
+ interface EntityIdContract {
14
+ type: EntityIdType;
15
+ prefix: Prefix;
16
+ prefixWithSeparator: `${Prefix}_`;
17
+ words: number;
18
+ examplePattern: string;
19
+ }
20
+ declare function generateTestId(): string;
21
+ declare function generateSuiteId(): string;
22
+ declare function generateObservationId(): string;
23
+ declare function generateHookId(): string;
24
+ declare function generateRunId(): string;
25
+ declare function generateCanonicalId(type: EntityIdType): string;
26
+ declare function isCanonicalTestId(value: string): boolean;
27
+ declare function isCanonicalSuiteId(value: string): boolean;
28
+ declare function isCanonicalHookId(value: string): boolean;
29
+ declare function isCanonicalObservationId(value: string): boolean;
30
+ declare function isCanonicalRunId(value: string): boolean;
31
+ declare function isCanonicalId(type: EntityIdType, value: string): boolean;
32
+ declare function isObservationId(value: string): boolean;
33
+ declare function getEntityIdContract(type: EntityIdType): EntityIdContract;
34
+ declare function getEntityIdContracts(): EntityIdContract[];
35
+
36
+ interface ApprovedSaasPlaceholder {
37
+ readonly name: string;
38
+ readonly slug: string;
39
+ }
40
+ declare const APPROVED_SAAS_PLACEHOLDERS: readonly [{
41
+ readonly name: "Linear";
42
+ readonly slug: "linear";
43
+ }, {
44
+ readonly name: "Vercel";
45
+ readonly slug: "vercel";
46
+ }, {
47
+ readonly name: "Notion";
48
+ readonly slug: "notion";
49
+ }, {
50
+ readonly name: "Stripe";
51
+ readonly slug: "stripe";
52
+ }, {
53
+ readonly name: "GitHub";
54
+ readonly slug: "github";
55
+ }, {
56
+ readonly name: "Slack";
57
+ readonly slug: "slack";
58
+ }, {
59
+ readonly name: "Figma";
60
+ readonly slug: "figma";
61
+ }, {
62
+ readonly name: "Shopify";
63
+ readonly slug: "shopify";
64
+ }, {
65
+ readonly name: "Datadog";
66
+ readonly slug: "datadog";
67
+ }, {
68
+ readonly name: "Supabase";
69
+ readonly slug: "supabase";
70
+ }];
71
+ declare const APPROVED_SAAS_PLACEHOLDER_NAMES: ("Linear" | "Vercel" | "Notion" | "Stripe" | "GitHub" | "Slack" | "Figma" | "Shopify" | "Datadog" | "Supabase")[];
72
+ declare const APPROVED_SAAS_PLACEHOLDER_SLUGS: ("linear" | "vercel" | "notion" | "stripe" | "github" | "slack" | "figma" | "shopify" | "datadog" | "supabase")[];
73
+ declare function selectApprovedSaasPlaceholder(seed: string | number): ApprovedSaasPlaceholder;
74
+ declare function selectApprovedSaasPlaceholderSlug(seed: string | number): string;
75
+
76
+ export { APPROVED_SAAS_PLACEHOLDERS, APPROVED_SAAS_PLACEHOLDER_NAMES, APPROVED_SAAS_PLACEHOLDER_SLUGS, type ApprovedSaasPlaceholder, CANONICAL_ID_WORDS, ENTITY_ID_TYPES, type EntityIdContract, type EntityIdType, LEGACY_OBSERVATION_ID_WORDS, generateCanonicalId, generateHookId, generateObservationId, generateRunId, generateSuiteId, generateTestId, getEntityIdContract, getEntityIdContracts, isCanonicalHookId, isCanonicalId, isCanonicalObservationId, isCanonicalRunId, isCanonicalSuiteId, isCanonicalTestId, isObservationId, selectApprovedSaasPlaceholder, selectApprovedSaasPlaceholderSlug };
@@ -0,0 +1,76 @@
1
+ declare const CANONICAL_ID_WORDS = 10;
2
+ declare const LEGACY_OBSERVATION_ID_WORDS = 6;
3
+ declare const PREFIX: {
4
+ readonly test: "t";
5
+ readonly suite: "s";
6
+ readonly hook: "h";
7
+ readonly observation: "obs";
8
+ readonly run: "r";
9
+ };
10
+ type Prefix = (typeof PREFIX)[keyof typeof PREFIX];
11
+ type EntityIdType = keyof typeof PREFIX;
12
+ declare const ENTITY_ID_TYPES: EntityIdType[];
13
+ interface EntityIdContract {
14
+ type: EntityIdType;
15
+ prefix: Prefix;
16
+ prefixWithSeparator: `${Prefix}_`;
17
+ words: number;
18
+ examplePattern: string;
19
+ }
20
+ declare function generateTestId(): string;
21
+ declare function generateSuiteId(): string;
22
+ declare function generateObservationId(): string;
23
+ declare function generateHookId(): string;
24
+ declare function generateRunId(): string;
25
+ declare function generateCanonicalId(type: EntityIdType): string;
26
+ declare function isCanonicalTestId(value: string): boolean;
27
+ declare function isCanonicalSuiteId(value: string): boolean;
28
+ declare function isCanonicalHookId(value: string): boolean;
29
+ declare function isCanonicalObservationId(value: string): boolean;
30
+ declare function isCanonicalRunId(value: string): boolean;
31
+ declare function isCanonicalId(type: EntityIdType, value: string): boolean;
32
+ declare function isObservationId(value: string): boolean;
33
+ declare function getEntityIdContract(type: EntityIdType): EntityIdContract;
34
+ declare function getEntityIdContracts(): EntityIdContract[];
35
+
36
+ interface ApprovedSaasPlaceholder {
37
+ readonly name: string;
38
+ readonly slug: string;
39
+ }
40
+ declare const APPROVED_SAAS_PLACEHOLDERS: readonly [{
41
+ readonly name: "Linear";
42
+ readonly slug: "linear";
43
+ }, {
44
+ readonly name: "Vercel";
45
+ readonly slug: "vercel";
46
+ }, {
47
+ readonly name: "Notion";
48
+ readonly slug: "notion";
49
+ }, {
50
+ readonly name: "Stripe";
51
+ readonly slug: "stripe";
52
+ }, {
53
+ readonly name: "GitHub";
54
+ readonly slug: "github";
55
+ }, {
56
+ readonly name: "Slack";
57
+ readonly slug: "slack";
58
+ }, {
59
+ readonly name: "Figma";
60
+ readonly slug: "figma";
61
+ }, {
62
+ readonly name: "Shopify";
63
+ readonly slug: "shopify";
64
+ }, {
65
+ readonly name: "Datadog";
66
+ readonly slug: "datadog";
67
+ }, {
68
+ readonly name: "Supabase";
69
+ readonly slug: "supabase";
70
+ }];
71
+ declare const APPROVED_SAAS_PLACEHOLDER_NAMES: ("Linear" | "Vercel" | "Notion" | "Stripe" | "GitHub" | "Slack" | "Figma" | "Shopify" | "Datadog" | "Supabase")[];
72
+ declare const APPROVED_SAAS_PLACEHOLDER_SLUGS: ("linear" | "vercel" | "notion" | "stripe" | "github" | "slack" | "figma" | "shopify" | "datadog" | "supabase")[];
73
+ declare function selectApprovedSaasPlaceholder(seed: string | number): ApprovedSaasPlaceholder;
74
+ declare function selectApprovedSaasPlaceholderSlug(seed: string | number): string;
75
+
76
+ export { APPROVED_SAAS_PLACEHOLDERS, APPROVED_SAAS_PLACEHOLDER_NAMES, APPROVED_SAAS_PLACEHOLDER_SLUGS, type ApprovedSaasPlaceholder, CANONICAL_ID_WORDS, ENTITY_ID_TYPES, type EntityIdContract, type EntityIdType, LEGACY_OBSERVATION_ID_WORDS, generateCanonicalId, generateHookId, generateObservationId, generateRunId, generateSuiteId, generateTestId, getEntityIdContract, getEntityIdContracts, isCanonicalHookId, isCanonicalId, isCanonicalObservationId, isCanonicalRunId, isCanonicalSuiteId, isCanonicalTestId, isObservationId, selectApprovedSaasPlaceholder, selectApprovedSaasPlaceholderSlug };
package/dist/index.js ADDED
@@ -0,0 +1,127 @@
1
+ // src/persistent-id.ts
2
+ import { idAgent, parse } from "id-agent";
3
+ var CANONICAL_ID_WORDS = 10;
4
+ var LEGACY_OBSERVATION_ID_WORDS = 6;
5
+ var PREFIX = {
6
+ test: "t",
7
+ suite: "s",
8
+ hook: "h",
9
+ observation: "obs",
10
+ run: "r"
11
+ };
12
+ var ENTITY_ID_TYPES = Object.keys(PREFIX);
13
+ function hasPrefixAndWordCount(value, prefix, wordCount) {
14
+ const parsed = parse(value);
15
+ return parsed?.prefix === prefix && parsed.wordCount === wordCount;
16
+ }
17
+ function generateId(prefix) {
18
+ return idAgent({ prefix, words: CANONICAL_ID_WORDS });
19
+ }
20
+ function generateTestId() {
21
+ return generateId(PREFIX.test);
22
+ }
23
+ function generateSuiteId() {
24
+ return generateId(PREFIX.suite);
25
+ }
26
+ function generateObservationId() {
27
+ return generateId(PREFIX.observation);
28
+ }
29
+ function generateHookId() {
30
+ return generateId(PREFIX.hook);
31
+ }
32
+ function generateRunId() {
33
+ return generateId(PREFIX.run);
34
+ }
35
+ function generateCanonicalId(type) {
36
+ return generateId(PREFIX[type]);
37
+ }
38
+ function isCanonicalTestId(value) {
39
+ return hasPrefixAndWordCount(value, PREFIX.test, CANONICAL_ID_WORDS);
40
+ }
41
+ function isCanonicalSuiteId(value) {
42
+ return hasPrefixAndWordCount(value, PREFIX.suite, CANONICAL_ID_WORDS);
43
+ }
44
+ function isCanonicalHookId(value) {
45
+ return hasPrefixAndWordCount(value, PREFIX.hook, CANONICAL_ID_WORDS);
46
+ }
47
+ function isCanonicalObservationId(value) {
48
+ return hasPrefixAndWordCount(value, PREFIX.observation, CANONICAL_ID_WORDS);
49
+ }
50
+ function isCanonicalRunId(value) {
51
+ return hasPrefixAndWordCount(value, PREFIX.run, CANONICAL_ID_WORDS);
52
+ }
53
+ function isCanonicalId(type, value) {
54
+ return hasPrefixAndWordCount(value, PREFIX[type], CANONICAL_ID_WORDS);
55
+ }
56
+ function isObservationId(value) {
57
+ return isCanonicalObservationId(value) || hasPrefixAndWordCount(value, PREFIX.observation, LEGACY_OBSERVATION_ID_WORDS);
58
+ }
59
+ function getEntityIdContract(type) {
60
+ const prefix = PREFIX[type];
61
+ return {
62
+ type,
63
+ prefix,
64
+ prefixWithSeparator: `${prefix}_`,
65
+ words: CANONICAL_ID_WORDS,
66
+ examplePattern: `${prefix}_word-word-word-word-word-word-word-word-word-word`
67
+ };
68
+ }
69
+ function getEntityIdContracts() {
70
+ return ENTITY_ID_TYPES.map((type) => getEntityIdContract(type));
71
+ }
72
+
73
+ // src/product-placeholders.ts
74
+ var APPROVED_SAAS_PLACEHOLDERS = [
75
+ { name: "Linear", slug: "linear" },
76
+ { name: "Vercel", slug: "vercel" },
77
+ { name: "Notion", slug: "notion" },
78
+ { name: "Stripe", slug: "stripe" },
79
+ { name: "GitHub", slug: "github" },
80
+ { name: "Slack", slug: "slack" },
81
+ { name: "Figma", slug: "figma" },
82
+ { name: "Shopify", slug: "shopify" },
83
+ { name: "Datadog", slug: "datadog" },
84
+ { name: "Supabase", slug: "supabase" }
85
+ ];
86
+ var APPROVED_SAAS_PLACEHOLDER_NAMES = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.name);
87
+ var APPROVED_SAAS_PLACEHOLDER_SLUGS = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.slug);
88
+ function hashSeed(seed) {
89
+ const input = String(seed);
90
+ let hash = 0;
91
+ for (let index = 0; index < input.length; index += 1) {
92
+ hash = hash * 31 + input.charCodeAt(index) >>> 0;
93
+ }
94
+ return hash;
95
+ }
96
+ function selectApprovedSaasPlaceholder(seed) {
97
+ return APPROVED_SAAS_PLACEHOLDERS[hashSeed(seed) % APPROVED_SAAS_PLACEHOLDERS.length];
98
+ }
99
+ function selectApprovedSaasPlaceholderSlug(seed) {
100
+ return selectApprovedSaasPlaceholder(seed).slug;
101
+ }
102
+ export {
103
+ APPROVED_SAAS_PLACEHOLDERS,
104
+ APPROVED_SAAS_PLACEHOLDER_NAMES,
105
+ APPROVED_SAAS_PLACEHOLDER_SLUGS,
106
+ CANONICAL_ID_WORDS,
107
+ ENTITY_ID_TYPES,
108
+ LEGACY_OBSERVATION_ID_WORDS,
109
+ generateCanonicalId,
110
+ generateHookId,
111
+ generateObservationId,
112
+ generateRunId,
113
+ generateSuiteId,
114
+ generateTestId,
115
+ getEntityIdContract,
116
+ getEntityIdContracts,
117
+ isCanonicalHookId,
118
+ isCanonicalId,
119
+ isCanonicalObservationId,
120
+ isCanonicalRunId,
121
+ isCanonicalSuiteId,
122
+ isCanonicalTestId,
123
+ isObservationId,
124
+ selectApprovedSaasPlaceholder,
125
+ selectApprovedSaasPlaceholderSlug
126
+ };
127
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/persistent-id.ts","../src/product-placeholders.ts"],"sourcesContent":["import { idAgent, parse } from 'id-agent'\n\nexport const CANONICAL_ID_WORDS = 10\nexport const LEGACY_OBSERVATION_ID_WORDS = 6\n\nconst PREFIX = {\n test: 't',\n suite: 's',\n hook: 'h',\n observation: 'obs',\n run: 'r',\n} as const\n\ntype Prefix = (typeof PREFIX)[keyof typeof PREFIX]\nexport type EntityIdType = keyof typeof PREFIX\n\nexport const ENTITY_ID_TYPES = Object.keys(PREFIX) as EntityIdType[]\n\nexport interface EntityIdContract {\n type: EntityIdType\n prefix: Prefix\n prefixWithSeparator: `${Prefix}_`\n words: number\n examplePattern: string\n}\n\nfunction hasPrefixAndWordCount(value: string, prefix: Prefix, wordCount: number): boolean {\n const parsed = parse(value)\n return parsed?.prefix === prefix && parsed.wordCount === wordCount\n}\n\nfunction generateId(prefix: Prefix): string {\n return idAgent({ prefix, words: CANONICAL_ID_WORDS })\n}\n\nexport function generateTestId(): string {\n return generateId(PREFIX.test)\n}\n\nexport function generateSuiteId(): string {\n return generateId(PREFIX.suite)\n}\n\nexport function generateObservationId(): string {\n return generateId(PREFIX.observation)\n}\n\nexport function generateHookId(): string {\n return generateId(PREFIX.hook)\n}\n\nexport function generateRunId(): string {\n return generateId(PREFIX.run)\n}\n\nexport function generateCanonicalId(type: EntityIdType): string {\n return generateId(PREFIX[type])\n}\n\nexport function isCanonicalTestId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.test, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalSuiteId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.suite, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalHookId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.hook, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalObservationId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.observation, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalRunId(value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX.run, CANONICAL_ID_WORDS)\n}\n\nexport function isCanonicalId(type: EntityIdType, value: string): boolean {\n return hasPrefixAndWordCount(value, PREFIX[type], CANONICAL_ID_WORDS)\n}\n\nexport function isObservationId(value: string): boolean {\n return isCanonicalObservationId(value)\n || hasPrefixAndWordCount(value, PREFIX.observation, LEGACY_OBSERVATION_ID_WORDS)\n}\n\nexport function getEntityIdContract(type: EntityIdType): EntityIdContract {\n const prefix = PREFIX[type]\n return {\n type,\n prefix,\n prefixWithSeparator: `${prefix}_`,\n words: CANONICAL_ID_WORDS,\n examplePattern: `${prefix}_word-word-word-word-word-word-word-word-word-word`,\n }\n}\n\nexport function getEntityIdContracts(): EntityIdContract[] {\n return ENTITY_ID_TYPES.map(type => getEntityIdContract(type))\n}\n","export interface ApprovedSaasPlaceholder {\n readonly name: string\n readonly slug: string\n}\n\nexport const APPROVED_SAAS_PLACEHOLDERS = [\n { name: 'Linear', slug: 'linear' },\n { name: 'Vercel', slug: 'vercel' },\n { name: 'Notion', slug: 'notion' },\n { name: 'Stripe', slug: 'stripe' },\n { name: 'GitHub', slug: 'github' },\n { name: 'Slack', slug: 'slack' },\n { name: 'Figma', slug: 'figma' },\n { name: 'Shopify', slug: 'shopify' },\n { name: 'Datadog', slug: 'datadog' },\n { name: 'Supabase', slug: 'supabase' },\n] as const satisfies readonly ApprovedSaasPlaceholder[]\n\nexport const APPROVED_SAAS_PLACEHOLDER_NAMES = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.name)\nexport const APPROVED_SAAS_PLACEHOLDER_SLUGS = APPROVED_SAAS_PLACEHOLDERS.map((item) => item.slug)\n\nfunction hashSeed(seed: string | number): number {\n const input = String(seed)\n let hash = 0\n\n for (let index = 0; index < input.length; index += 1) {\n hash = (hash * 31 + input.charCodeAt(index)) >>> 0\n }\n\n return hash\n}\n\nexport function selectApprovedSaasPlaceholder(seed: string | number): ApprovedSaasPlaceholder {\n return APPROVED_SAAS_PLACEHOLDERS[hashSeed(seed) % APPROVED_SAAS_PLACEHOLDERS.length]\n}\n\nexport function selectApprovedSaasPlaceholderSlug(seed: string | number): string {\n return selectApprovedSaasPlaceholder(seed).slug\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,58 @@
1
1
  {
2
2
  "name": "@vostride/agent-qa-ids",
3
- "version": "0.0.1",
4
- "main": "index.js",
5
- "files": []
3
+ "version": "0.1.2",
4
+ "private": false,
5
+ "description": "Canonical ID helpers for agent-qa tests, suites, hooks, and artifacts.",
6
+ "keywords": [
7
+ "agent-qa",
8
+ "testing",
9
+ "ids",
10
+ "validation"
11
+ ],
12
+ "license": "SEE LICENSE IN LICENSE.md",
13
+ "homepage": "https://github.com/vostride/agent-qa#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/vostride/agent-qa/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/vostride/agent-qa.git",
20
+ "directory": "packages/ids"
21
+ },
22
+ "engines": {
23
+ "node": ">=24"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public",
27
+ "registry": "https://registry.npmjs.org/"
28
+ },
29
+ "type": "module",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.js",
34
+ "require": "./dist/index.cjs"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "LICENSE.md",
40
+ "NOTICE.md"
41
+ ],
42
+ "scripts": {
43
+ "build": "tsup",
44
+ "dev": "tsup --watch",
45
+ "test": "vitest run",
46
+ "typecheck": "tsc --noEmit",
47
+ "clean": "rm -rf dist .turbo"
48
+ },
49
+ "dependencies": {
50
+ "id-agent": "1.0.3"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "~24.12.2",
54
+ "tsup": "~8.5.1",
55
+ "typescript": "~6.0.3",
56
+ "vitest": "~4.1.5"
57
+ }
6
58
  }