@planu/cli 0.73.0 → 0.75.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 +1 -1
- package/dist/config/license-plans.json +6 -1
- package/dist/engine/elicitation/index.d.ts +1 -0
- package/dist/engine/elicitation/index.d.ts.map +1 -1
- package/dist/engine/elicitation/index.js +1 -0
- package/dist/engine/elicitation/index.js.map +1 -1
- package/dist/engine/elicitation/question-generator.d.ts +13 -0
- package/dist/engine/elicitation/question-generator.d.ts.map +1 -0
- package/dist/engine/elicitation/question-generator.js +112 -0
- package/dist/engine/elicitation/question-generator.js.map +1 -0
- package/dist/engine/project-health-checker.d.ts.map +1 -1
- package/dist/engine/project-health-checker.js +19 -3
- package/dist/engine/project-health-checker.js.map +1 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/configure-oauth-handler.d.ts +4 -0
- package/dist/tools/configure-oauth-handler.d.ts.map +1 -0
- package/dist/tools/configure-oauth-handler.js +57 -0
- package/dist/tools/configure-oauth-handler.js.map +1 -0
- package/dist/tools/create-spec/post-creation.js +1 -1
- package/dist/tools/create-spec/post-creation.js.map +1 -1
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts.map +1 -1
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js +30 -5
- package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js.map +1 -1
- package/dist/tools/create-spec-hu/frontend-architecture-hu-adapter.d.ts +8 -0
- package/dist/tools/create-spec-hu/frontend-architecture-hu-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/frontend-architecture-hu-adapter.js +95 -0
- package/dist/tools/create-spec-hu/frontend-architecture-hu-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu/serverless-hu-adapter.d.ts +8 -0
- package/dist/tools/create-spec-hu/serverless-hu-adapter.d.ts.map +1 -0
- package/dist/tools/create-spec-hu/serverless-hu-adapter.js +46 -0
- package/dist/tools/create-spec-hu/serverless-hu-adapter.js.map +1 -0
- package/dist/tools/create-spec-hu.d.ts.map +1 -1
- package/dist/tools/create-spec-hu.js +8 -0
- package/dist/tools/create-spec-hu.js.map +1 -1
- package/dist/tools/elicit-requirements-handler.d.ts +4 -0
- package/dist/tools/elicit-requirements-handler.d.ts.map +1 -0
- package/dist/tools/elicit-requirements-handler.js +68 -0
- package/dist/tools/elicit-requirements-handler.js.map +1 -0
- package/dist/tools/export-session.d.ts.map +1 -1
- package/dist/tools/export-session.js +11 -6
- package/dist/tools/export-session.js.map +1 -1
- package/dist/tools/generate-spec-from-design.d.ts +3 -0
- package/dist/tools/generate-spec-from-design.d.ts.map +1 -0
- package/dist/tools/generate-spec-from-design.js +90 -0
- package/dist/tools/generate-spec-from-design.js.map +1 -0
- package/dist/tools/register-elicitation-tools.d.ts +3 -0
- package/dist/tools/register-elicitation-tools.d.ts.map +1 -0
- package/dist/tools/register-elicitation-tools.js +33 -0
- package/dist/tools/register-elicitation-tools.js.map +1 -0
- package/dist/tools/register-generate-spec-from-design.d.ts +3 -0
- package/dist/tools/register-generate-spec-from-design.d.ts.map +1 -0
- package/dist/tools/register-generate-spec-from-design.js +45 -0
- package/dist/tools/register-generate-spec-from-design.js.map +1 -0
- package/dist/tools/register-oauth-tools.d.ts +3 -0
- package/dist/tools/register-oauth-tools.d.ts.map +1 -0
- package/dist/tools/register-oauth-tools.js +24 -0
- package/dist/tools/register-oauth-tools.js.map +1 -0
- package/dist/tools/update-status-actions.d.ts.map +1 -1
- package/dist/tools/update-status-actions.js +1 -2
- package/dist/tools/update-status-actions.js.map +1 -1
- package/dist/tools/validate.js +1 -1
- package/dist/tools/validate.js.map +1 -1
- package/dist/transports/http-transport.d.ts.map +1 -1
- package/dist/transports/http-transport.js +17 -0
- package/dist/transports/http-transport.js.map +1 -1
- package/dist/transports/oauth-validator.d.ts +6 -0
- package/dist/transports/oauth-validator.d.ts.map +1 -0
- package/dist/transports/oauth-validator.js +76 -0
- package/dist/transports/oauth-validator.js.map +1 -0
- package/dist/types/design-to-spec.d.ts +11 -0
- package/dist/types/design-to-spec.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/oauth.d.ts +17 -0
- package/dist/types/oauth.d.ts.map +1 -0
- package/dist/types/oauth.js +3 -0
- package/dist/types/oauth.js.map +1 -0
- package/dist/types/spec-elicitation.d.ts +24 -0
- package/dist/types/spec-elicitation.d.ts.map +1 -0
- package/dist/types/spec-elicitation.js +3 -0
- package/dist/types/spec-elicitation.js.map +1 -0
- package/package.json +1 -1
- package/src/config/license-plans.json +6 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// tools/create-spec-hu/frontend-architecture-hu-adapter.ts
|
|
2
|
+
// SPEC-147: Inject frontend architecture ACs when atomic design, design systems,
|
|
3
|
+
// or component-driven patterns are detected.
|
|
4
|
+
const ATOMIC_DESIGN_DIR_KEYWORDS = ['atoms', 'molecules', 'organisms', 'templates', 'pages'];
|
|
5
|
+
const COMPONENT_LIBRARY_KEYWORDS = [
|
|
6
|
+
'storybook',
|
|
7
|
+
'chromatic',
|
|
8
|
+
'ladle',
|
|
9
|
+
'histoire',
|
|
10
|
+
'react-styleguidist',
|
|
11
|
+
];
|
|
12
|
+
const DESIGN_TOKEN_KEYWORDS = ['style-dictionary', 'theo', 'design-tokens', 'token-transformer'];
|
|
13
|
+
/** Returns true when the project follows atomic design structure. */
|
|
14
|
+
function hasAtomicDesign(knowledge) {
|
|
15
|
+
const stack = Array.isArray(knowledge.stack) ? knowledge.stack.map((s) => s.toLowerCase()) : [];
|
|
16
|
+
if (stack.some((s) => ATOMIC_DESIGN_DIR_KEYWORDS.some((k) => s.includes(k)))) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const conventions = knowledge.conventions;
|
|
20
|
+
const designSystem = (conventions?.['design-system-type'] ?? '').toLowerCase();
|
|
21
|
+
if (designSystem.includes('atomic')) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
/** Returns true when a component documentation tool (Storybook, etc.) is detected. */
|
|
27
|
+
function hasComponentLibrary(knowledge) {
|
|
28
|
+
const stack = Array.isArray(knowledge.stack) ? knowledge.stack.map((s) => s.toLowerCase()) : [];
|
|
29
|
+
const tooling = knowledge.tooling;
|
|
30
|
+
const toolingValues = Object.values(tooling ?? {})
|
|
31
|
+
.join(' ')
|
|
32
|
+
.toLowerCase();
|
|
33
|
+
return (COMPONENT_LIBRARY_KEYWORDS.some((k) => stack.some((s) => s.includes(k)) || toolingValues.includes(k)) ||
|
|
34
|
+
(Array.isArray(knowledge.externalServices) &&
|
|
35
|
+
knowledge.externalServices.some((s) => COMPONENT_LIBRARY_KEYWORDS.some((k) => s.toLowerCase().includes(k)))));
|
|
36
|
+
}
|
|
37
|
+
/** Returns true when design tokens tooling is present. */
|
|
38
|
+
function hasDesignTokens(knowledge) {
|
|
39
|
+
const stack = Array.isArray(knowledge.stack) ? knowledge.stack.map((s) => s.toLowerCase()) : [];
|
|
40
|
+
return DESIGN_TOKEN_KEYWORDS.some((k) => stack.some((s) => s.includes(k)));
|
|
41
|
+
}
|
|
42
|
+
/** Returns true when the project is frontend-focused. */
|
|
43
|
+
function isFrontendProject(knowledge) {
|
|
44
|
+
const frontendPatterns = ['spa', 'ssr', 'ssg', 'isr', 'jamstack', 'islands', 'mpa'];
|
|
45
|
+
if (frontendPatterns.includes(knowledge.architecture.primary)) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
const stack = Array.isArray(knowledge.stack) ? knowledge.stack.map((s) => s.toLowerCase()) : [];
|
|
49
|
+
const frontendFrameworks = [
|
|
50
|
+
'react',
|
|
51
|
+
'vue',
|
|
52
|
+
'angular',
|
|
53
|
+
'svelte',
|
|
54
|
+
'solid',
|
|
55
|
+
'astro',
|
|
56
|
+
'next',
|
|
57
|
+
'nuxt',
|
|
58
|
+
'remix',
|
|
59
|
+
'qwik',
|
|
60
|
+
];
|
|
61
|
+
if (frontendFrameworks.some((f) => stack.some((s) => s.includes(f)))) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
const apps = Array.isArray(knowledge.apps) ? knowledge.apps : [];
|
|
65
|
+
return apps.some((a) => a.type === 'frontend');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Returns frontend architecture acceptance criteria when atomic design,
|
|
69
|
+
* component library, or design token patterns are detected.
|
|
70
|
+
* Auto-injected into create_spec HU output (SPEC-147).
|
|
71
|
+
*/
|
|
72
|
+
export function buildFrontendArchitectureHuSection(knowledge) {
|
|
73
|
+
if (!knowledge || !isFrontendProject(knowledge)) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
const sections = [];
|
|
77
|
+
const atomic = hasAtomicDesign(knowledge);
|
|
78
|
+
const componentLib = hasComponentLibrary(knowledge);
|
|
79
|
+
const designTokens = hasDesignTokens(knowledge);
|
|
80
|
+
if (!atomic && !componentLib && !designTokens) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
sections.push('', '## Frontend Architecture Constraints', '');
|
|
84
|
+
if (atomic) {
|
|
85
|
+
sections.push('> This project uses **Atomic Design** — components are organized by complexity (atoms → molecules → organisms).', '', '**Component Structure Criteria:**', '- [ ] Atoms are stateless and accept only props — no internal API calls or side effects', '- [ ] Molecules compose atoms only — no direct access to global state or stores', '- [ ] Organisms may connect to global state, but must export a pure presentational variant for testing', '- [ ] New components placed at the correct atomic level — not in a generic `components/` catch-all', '- [ ] No duplicate component created when an existing atom/molecule covers the same use case', '');
|
|
86
|
+
}
|
|
87
|
+
if (componentLib) {
|
|
88
|
+
sections.push('**Component Documentation Criteria (Storybook / Component Library):**', '- [ ] New UI component has at least one Story covering its default and edge-case states', '- [ ] Story uses realistic mock data — no `undefined` or `null` props that hide visual bugs', '- [ ] Accessibility check passes in Storybook (a11y addon or axe) with no critical violations', '');
|
|
89
|
+
}
|
|
90
|
+
if (designTokens) {
|
|
91
|
+
sections.push('**Design Token Criteria:**', '- [ ] Colors, spacing, and typography use design tokens — no hardcoded hex values or px sizes', '- [ ] New token added to the token schema before use in components', '- [ ] Token names follow the existing naming convention (e.g. `color.brand.primary`, `spacing.md`)', '');
|
|
92
|
+
}
|
|
93
|
+
return sections;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=frontend-architecture-hu-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontend-architecture-hu-adapter.js","sourceRoot":"","sources":["../../../src/tools/create-spec-hu/frontend-architecture-hu-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProjectKnowledge } from '../../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns serverless-specific acceptance criteria lines when applicable.
|
|
4
|
+
* Injects a mandatory AC reminding developers that module-level mutable state
|
|
5
|
+
* resets on cold starts and must be persisted in Redis or a database.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildServerlessHuSection(knowledge: ProjectKnowledge | null | undefined): string[];
|
|
8
|
+
//# sourceMappingURL=serverless-hu-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverless-hu-adapter.d.ts","sourceRoot":"","sources":["../../../src/tools/create-spec-hu/serverless-hu-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AA0B7D;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAkBjG"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// tools/create-spec-hu/serverless-hu-adapter.ts
|
|
2
|
+
// SPEC-177: Auto-inject serverless in-memory state AC when project is serverless.
|
|
3
|
+
const SERVERLESS_PLATFORM_KEYWORDS = [
|
|
4
|
+
'vercel',
|
|
5
|
+
'netlify',
|
|
6
|
+
'lambda',
|
|
7
|
+
'cloudflare-workers',
|
|
8
|
+
'deno-deploy',
|
|
9
|
+
];
|
|
10
|
+
/** Returns true when the project targets a serverless runtime. */
|
|
11
|
+
function isServerlessPlatform(knowledge) {
|
|
12
|
+
const stack = Array.isArray(knowledge.stack) ? knowledge.stack.map((s) => s.toLowerCase()) : [];
|
|
13
|
+
if (stack.some((s) => /serverless|vercel|netlify|edge/i.test(s))) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const services = Array.isArray(knowledge.externalServices)
|
|
17
|
+
? knowledge.externalServices.map((s) => s.toLowerCase())
|
|
18
|
+
: [];
|
|
19
|
+
const conventions = knowledge.conventions;
|
|
20
|
+
const deployPlatform = (conventions?.['deploy-platform'] ?? '').toLowerCase();
|
|
21
|
+
return SERVERLESS_PLATFORM_KEYWORDS.some((p) => services.some((s) => s.includes(p)) || deployPlatform.includes(p));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Returns serverless-specific acceptance criteria lines when applicable.
|
|
25
|
+
* Injects a mandatory AC reminding developers that module-level mutable state
|
|
26
|
+
* resets on cold starts and must be persisted in Redis or a database.
|
|
27
|
+
*/
|
|
28
|
+
export function buildServerlessHuSection(knowledge) {
|
|
29
|
+
if (!knowledge || !isServerlessPlatform(knowledge)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
return [
|
|
33
|
+
'',
|
|
34
|
+
'## Serverless State Constraints',
|
|
35
|
+
'',
|
|
36
|
+
'> This project targets a serverless runtime (Vercel / Netlify / Lambda / Cloudflare Workers / Deno Deploy).',
|
|
37
|
+
'> Module-level state resets on every cold start — treat each function invocation as stateless.',
|
|
38
|
+
'',
|
|
39
|
+
'**Acceptance Criteria:**',
|
|
40
|
+
'- [ ] No module-level mutable state for cross-request data — use Redis or database persistence instead (serverless cold starts reset module state)',
|
|
41
|
+
'- [ ] Caches, counters, and session data are stored in an external store (Redis, KV, DB), never in module scope',
|
|
42
|
+
'- [ ] Any shared configuration objects are immutable after module initialization',
|
|
43
|
+
'',
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=serverless-hu-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverless-hu-adapter.js","sourceRoot":"","sources":["../../../src/tools/create-spec-hu/serverless-hu-adapter.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,kFAAkF;AAIlF,MAAM,4BAA4B,GAAG;IACnC,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,oBAAoB;IACpB,aAAa;CACd,CAAC;AAEF,kEAAkE;AAClE,SAAS,oBAAoB,CAAC,SAA2B;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC;QACxD,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,WAAW,GAAG,SAAS,CAAC,WAAiD,CAAC;IAChF,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9E,OAAO,4BAA4B,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,SAA8C;IACrF,IAAI,CAAC,SAAS,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;QACL,EAAE;QACF,iCAAiC;QACjC,EAAE;QACF,6GAA6G;QAC7G,gGAAgG;QAChG,EAAE;QACF,0BAA0B;QAC1B,oJAAoJ;QACpJ,iHAAiH;QACjH,kFAAkF;QAClF,EAAE;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-spec-hu.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec-hu.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,IAAI,EAEJ,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-spec-hu.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec-hu.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,IAAI,EAEJ,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAuC3B,OAAO,EACL,cAAc,EACd,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,wCAAwC,CAAC;AAoBhD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,gBAAgB,GAAG,IAAI,EACnC,WAAW,CAAC,EAAE,OAAO,EACrB,SAAS,CAAC,EAAE,SAAS,EACrB,WAAW,CAAC,EAAE,gBAAgB,GAC7B,MAAM,CAqJR"}
|
|
@@ -22,6 +22,8 @@ import { buildAiTestingGovernanceSection } from './create-spec-hu/ai-testing-gov
|
|
|
22
22
|
import { buildBuildToolHuSection } from './create-spec-hu/build-tool-hu-adapter.js';
|
|
23
23
|
import { buildAiNativeHuSection } from './create-spec-hu/ai-native-hu-adapter.js';
|
|
24
24
|
import { buildFrontendPerfHuSection } from './create-spec-hu/frontend-perf-hu-adapter.js';
|
|
25
|
+
import { buildServerlessHuSection } from './create-spec-hu/serverless-hu-adapter.js';
|
|
26
|
+
import { buildFrontendArchitectureHuSection } from './create-spec-hu/frontend-architecture-hu-adapter.js';
|
|
25
27
|
import { generateHUBody, buildLintingRulesSection, buildEnvVariablesSection, } from './create-spec-hu/hu-body-generators.js';
|
|
26
28
|
export { generateHUBody, generateIosAccessibilityCriteria, generateAndroidAccessibilityCriteria, } from './create-spec-hu/hu-body-generators.js';
|
|
27
29
|
// Keywords that trigger the Linting Rules section
|
|
@@ -134,6 +136,10 @@ export function generateHUContent(spec, description, knowledge, requestDocs, tea
|
|
|
134
136
|
const aiNativeSection = buildAiNativeHuSection(knowledge);
|
|
135
137
|
// SPEC-057: Frontend perf criteria (Core Web Vitals, bundle size, MFE boundaries, SSR hydration)
|
|
136
138
|
const frontendPerfHuSection = buildFrontendPerfHuSection(knowledge);
|
|
139
|
+
// SPEC-177: Serverless state constraints — no in-memory mutable state for cross-request data
|
|
140
|
+
const serverlessSection = buildServerlessHuSection(knowledge);
|
|
141
|
+
// SPEC-147: Frontend architecture constraints — atomic design, component library, design tokens
|
|
142
|
+
const frontendArchitectureSection = buildFrontendArchitectureHuSection(knowledge);
|
|
137
143
|
return [
|
|
138
144
|
...header,
|
|
139
145
|
...depWarningsSection,
|
|
@@ -156,6 +162,8 @@ export function generateHUContent(spec, description, knowledge, requestDocs, tea
|
|
|
156
162
|
...buildToolHuSection,
|
|
157
163
|
...aiNativeSection,
|
|
158
164
|
...frontendPerfHuSection,
|
|
165
|
+
...serverlessSection,
|
|
166
|
+
...frontendArchitectureSection,
|
|
159
167
|
...doraSection,
|
|
160
168
|
...goldenPathSection,
|
|
161
169
|
...selfServiceSection,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-spec-hu.js","sourceRoot":"","sources":["../../src/tools/create-spec-hu.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-spec-hu.js","sourceRoot":"","sources":["../../src/tools/create-spec-hu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ToolResult, ElicitRequirementsInput } from '../types/index.js';
|
|
2
|
+
/** Handle elicit_requirements tool call */
|
|
3
|
+
export declare function handleElicitRequirements(input: ElicitRequirementsInput): Promise<ToolResult>;
|
|
4
|
+
//# sourceMappingURL=elicit-requirements-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicit-requirements-handler.d.ts","sourceRoot":"","sources":["../../src/tools/elicit-requirements-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AA6C7E,2CAA2C;AAC3C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,UAAU,CAAC,CA4C5F"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { generateSpecQuestions, formatQuestionsAsPrompt, parseAnswers, } from '../engine/elicitation/index.js';
|
|
3
|
+
/** Build a clarification summary from parsed answers */
|
|
4
|
+
function buildSummary(session, parsedAnswers) {
|
|
5
|
+
const lines = [`## Clarification Summary for "${session.title}"`, ''];
|
|
6
|
+
const labelMap = {
|
|
7
|
+
users: 'Users',
|
|
8
|
+
success: 'Success criteria',
|
|
9
|
+
scope: 'Scope',
|
|
10
|
+
edge_cases: 'Edge cases',
|
|
11
|
+
data: 'Data requirements',
|
|
12
|
+
api_contract: 'API changes',
|
|
13
|
+
performance: 'Performance requirements',
|
|
14
|
+
};
|
|
15
|
+
for (const [key, label] of Object.entries(labelMap)) {
|
|
16
|
+
const answer = parsedAnswers[key];
|
|
17
|
+
if (answer !== undefined && answer.length > 0) {
|
|
18
|
+
lines.push(`**${label}**: ${answer}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
lines.push('');
|
|
22
|
+
lines.push('**Ready to create spec!** Call `create_spec` with:');
|
|
23
|
+
lines.push(`- title: "${session.title}"`);
|
|
24
|
+
const answersSummary = Object.entries(parsedAnswers)
|
|
25
|
+
.map(([k, v]) => `${labelMap[k] ?? k}: ${v}`)
|
|
26
|
+
.join('; ');
|
|
27
|
+
const enrichedDescription = answersSummary.length > 0 ? `${session.title}. ${answersSummary}` : session.title;
|
|
28
|
+
lines.push(`- description: "${enrichedDescription}"`);
|
|
29
|
+
return lines.join('\n');
|
|
30
|
+
}
|
|
31
|
+
/** Handle elicit_requirements tool call */
|
|
32
|
+
export function handleElicitRequirements(input) {
|
|
33
|
+
const { title, description, answers } = input;
|
|
34
|
+
const context = {
|
|
35
|
+
hasDatabase: description.toLowerCase().includes('data') ||
|
|
36
|
+
description.toLowerCase().includes('store') ||
|
|
37
|
+
description.toLowerCase().includes('database'),
|
|
38
|
+
isApi: description.toLowerCase().includes('api') || description.toLowerCase().includes('endpoint'),
|
|
39
|
+
};
|
|
40
|
+
const questions = generateSpecQuestions(title, description, context);
|
|
41
|
+
const sessionId = input.sessionId ?? randomUUID();
|
|
42
|
+
const session = {
|
|
43
|
+
sessionId,
|
|
44
|
+
title,
|
|
45
|
+
questions,
|
|
46
|
+
answers: {},
|
|
47
|
+
};
|
|
48
|
+
// First call — return questions
|
|
49
|
+
if (answers === undefined || answers.trim().length === 0) {
|
|
50
|
+
const prompt = formatQuestionsAsPrompt(session);
|
|
51
|
+
const text = [
|
|
52
|
+
`## Questions for "${title}"`,
|
|
53
|
+
'',
|
|
54
|
+
prompt,
|
|
55
|
+
'',
|
|
56
|
+
'**Next step**: Answer these questions, then call `elicit_requirements` again with your answers and the sessionId.',
|
|
57
|
+
`sessionId: ${sessionId}`,
|
|
58
|
+
].join('\n');
|
|
59
|
+
return Promise.resolve({ content: [{ type: 'text', text }] });
|
|
60
|
+
}
|
|
61
|
+
// Follow-up call — parse answers and return summary
|
|
62
|
+
const parsedAnswers = parseAnswers(questions, answers);
|
|
63
|
+
session.answers = parsedAnswers;
|
|
64
|
+
session.completedAt = new Date().toISOString();
|
|
65
|
+
const summary = buildSummary(session, parsedAnswers);
|
|
66
|
+
return Promise.resolve({ content: [{ type: 'text', text: summary }] });
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=elicit-requirements-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicit-requirements-handler.js","sourceRoot":"","sources":["../../src/tools/elicit-requirements-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-session.d.ts","sourceRoot":"","sources":["../../src/tools/export-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAC;AAqD3F,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"export-session.d.ts","sourceRoot":"","sources":["../../src/tools/export-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAC;AAqD3F,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6CzF"}
|
|
@@ -60,13 +60,18 @@ export async function handleExportSession(params) {
|
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
if (format === 'json') {
|
|
63
|
+
const summary = [
|
|
64
|
+
`✅ **Session exported:** ${session.id}`,
|
|
65
|
+
'',
|
|
66
|
+
`**Project:** ${session.projectId}`,
|
|
67
|
+
`**Started:** ${session.startedAt}`,
|
|
68
|
+
`**Tool Calls:** ${String(session.toolCallCount)}`,
|
|
69
|
+
`**Active Specs:** ${String(session.activeSpecs.length)}`,
|
|
70
|
+
`**Decisions:** ${String(session.decisions.length)}`,
|
|
71
|
+
`**Modified Files:** ${String(session.modifiedFiles.length)}`,
|
|
72
|
+
].join('\n');
|
|
63
73
|
return {
|
|
64
|
-
content: [
|
|
65
|
-
{
|
|
66
|
-
type: 'text',
|
|
67
|
-
text: `\`\`\`json\n${JSON.stringify(session, null, 2)}\n\`\`\``,
|
|
68
|
-
},
|
|
69
|
-
],
|
|
74
|
+
content: [{ type: 'text', text: summary }],
|
|
70
75
|
structuredContent: session,
|
|
71
76
|
};
|
|
72
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-session.js","sourceRoot":"","sources":["../../src/tools/export-session.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"export-session.js","sourceRoot":"","sources":["../../src/tools/export-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-spec-from-design.d.ts","sourceRoot":"","sources":["../../src/tools/generate-spec-from-design.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAqFjF,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,UAAU,CAAC,CAkCrB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// tools/generate-spec-from-design.ts — Generate a Planu spec from a UI/UX design description (SPEC-159)
|
|
2
|
+
import { handleCreateSpec } from './create-spec.js';
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Acceptance criteria generator
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
function buildAcceptanceCriteria(input) {
|
|
7
|
+
const criteria = [];
|
|
8
|
+
for (const screen of input.screens ?? []) {
|
|
9
|
+
criteria.push(`- [ ] ${screen} screen renders correctly with all specified elements`);
|
|
10
|
+
}
|
|
11
|
+
for (const flow of input.userFlows ?? []) {
|
|
12
|
+
criteria.push(`- [ ] ${flow}`);
|
|
13
|
+
}
|
|
14
|
+
for (const component of input.components ?? []) {
|
|
15
|
+
criteria.push(`- [ ] ${component} behaves as described`);
|
|
16
|
+
}
|
|
17
|
+
criteria.push('- [ ] Design matches the provided specification — no missing elements or layout deviations');
|
|
18
|
+
criteria.push('- [ ] All interactive elements have visible loading/disabled states');
|
|
19
|
+
criteria.push('- [ ] Screen is responsive / accessible (keyboard navigable, ARIA labels on interactive elements)');
|
|
20
|
+
return criteria;
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Spec content builder
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function buildSpecContent(input, criteria) {
|
|
26
|
+
const lines = [];
|
|
27
|
+
lines.push(`# ${input.title}`, '');
|
|
28
|
+
lines.push('## Description', input.designDescription, '');
|
|
29
|
+
if ((input.screens ?? []).length > 0) {
|
|
30
|
+
lines.push('## Screens');
|
|
31
|
+
for (const screen of input.screens ?? []) {
|
|
32
|
+
lines.push(`- ${screen}`);
|
|
33
|
+
}
|
|
34
|
+
lines.push('');
|
|
35
|
+
}
|
|
36
|
+
if ((input.userFlows ?? []).length > 0) {
|
|
37
|
+
lines.push('## User Flows');
|
|
38
|
+
for (const flow of input.userFlows ?? []) {
|
|
39
|
+
lines.push(`- ${flow}`);
|
|
40
|
+
}
|
|
41
|
+
lines.push('');
|
|
42
|
+
}
|
|
43
|
+
lines.push('## Acceptance Criteria', ...criteria, '');
|
|
44
|
+
if ((input.components ?? []).length > 0) {
|
|
45
|
+
lines.push('## Design Notes');
|
|
46
|
+
lines.push(`Components involved: ${(input.components ?? []).join(', ')}`);
|
|
47
|
+
lines.push('');
|
|
48
|
+
}
|
|
49
|
+
return lines.join('\n');
|
|
50
|
+
}
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Tag deduplication helper
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
function buildTags(providedTags) {
|
|
55
|
+
const autoTags = ['design', 'frontend', 'ux'];
|
|
56
|
+
const combined = [...providedTags, ...autoTags];
|
|
57
|
+
return [...new Set(combined)];
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Handler
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
export async function handleGenerateSpecFromDesign(args) {
|
|
63
|
+
const criteria = buildAcceptanceCriteria(args);
|
|
64
|
+
const specContent = buildSpecContent(args, criteria);
|
|
65
|
+
const tags = buildTags(args.tags ?? []);
|
|
66
|
+
const createSpecResult = await handleCreateSpec({
|
|
67
|
+
projectPath: args.projectPath,
|
|
68
|
+
title: args.title,
|
|
69
|
+
description: specContent,
|
|
70
|
+
type: args.type ?? 'feature',
|
|
71
|
+
scope: 'feature',
|
|
72
|
+
target: 'frontend',
|
|
73
|
+
tags,
|
|
74
|
+
});
|
|
75
|
+
if (createSpecResult.isError === true) {
|
|
76
|
+
return createSpecResult;
|
|
77
|
+
}
|
|
78
|
+
const note = 'Generated from design description. Review and adjust acceptance criteria to match your design system.';
|
|
79
|
+
const existingText = createSpecResult.content[0]?.type === 'text' ? createSpecResult.content[0].text : '';
|
|
80
|
+
return {
|
|
81
|
+
...createSpecResult,
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: `${existingText}\n\n> ${note}`,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=generate-spec-from-design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-spec-from-design.js","sourceRoot":"","sources":["../../src/tools/generate-spec-from-design.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-elicitation-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-elicitation-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuChE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { safeLicensed } from './safe-handler.js';
|
|
3
|
+
import { handleElicitRequirements } from './elicit-requirements-handler.js';
|
|
4
|
+
export function registerElicitationTools(server) {
|
|
5
|
+
server.registerTool('elicit_requirements', {
|
|
6
|
+
description: 'Interactively clarify requirements before creating a spec. ' +
|
|
7
|
+
'First call returns structured questions for the user to answer. ' +
|
|
8
|
+
'Second call (with answers + sessionId) returns a structured summary ready to pass to create_spec.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
projectId: z.string().min(1).describe('Project ID where the spec will be created.'),
|
|
11
|
+
title: z.string().min(3).max(200).describe('Feature title to clarify requirements for.'),
|
|
12
|
+
description: z
|
|
13
|
+
.string()
|
|
14
|
+
.min(10)
|
|
15
|
+
.max(2000)
|
|
16
|
+
.describe('Initial description of the feature or change.'),
|
|
17
|
+
answers: z
|
|
18
|
+
.string()
|
|
19
|
+
.max(3000)
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('User answers to the clarification questions (numbered list). ' +
|
|
22
|
+
'Provide this on the follow-up call to get a spec-ready summary.'),
|
|
23
|
+
sessionId: z
|
|
24
|
+
.string()
|
|
25
|
+
.max(100)
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Session ID returned from the previous call. ' +
|
|
28
|
+
'Pass this on the follow-up call to continue the same elicitation session.'),
|
|
29
|
+
},
|
|
30
|
+
annotations: { title: 'Elicit Requirements', readOnlyHint: false },
|
|
31
|
+
}, safeLicensed('elicit_requirements', async (args) => handleElicitRequirements(args)));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=register-elicitation-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-elicitation-tools.js","sourceRoot":"","sources":["../../src/tools/register-elicitation-tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAG5E,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EACT,6DAA6D;YAC7D,kEAAkE;YAClE,mGAAmG;QACrG,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACnF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACxF,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,GAAG,CAAC,EAAE,CAAC;iBACP,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,CAAC,+CAA+C,CAAC;YAC5D,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACP,+DAA+D;gBAC7D,iEAAiE,CACpE;YACH,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,8CAA8C;gBAC5C,2EAA2E,CAC9E;SACJ;QACD,WAAW,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAY,EAAE,KAAK,EAAE;KACnE,EACD,YAAY,CAAC,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACjD,wBAAwB,CAAC,IAA+B,CAAC,CAC1D,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-generate-spec-from-design.d.ts","sourceRoot":"","sources":["../../src/tools/register-generate-spec-from-design.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgD1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// tools/register-generate-spec-from-design.ts — Register generate_spec_from_design tool (SPEC-159)
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { handleGenerateSpecFromDesign } from './generate-spec-from-design.js';
|
|
4
|
+
import { safeTracked } from './safe-handler.js';
|
|
5
|
+
export function registerGenerateSpecFromDesignTool(server) {
|
|
6
|
+
server.registerTool('generate_spec_from_design', {
|
|
7
|
+
description: 'Generate a Planu spec from a UI/UX design description. Accepts screen descriptions, user flows, and component lists to produce a structured spec with acceptance criteria derived from the design intent.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
projectPath: z.string().min(1).max(4096).describe('Absolute path to the project root'),
|
|
10
|
+
title: z.string().min(3).max(200).describe("Feature title, e.g. 'User Profile Screen'"),
|
|
11
|
+
designDescription: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(10)
|
|
14
|
+
.max(5000)
|
|
15
|
+
.describe('Full description of the design: what the user sees, what they can do, visual structure'),
|
|
16
|
+
screens: z
|
|
17
|
+
.array(z.string().max(500))
|
|
18
|
+
.max(20)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('List of screen names or descriptions included in this design'),
|
|
21
|
+
userFlows: z
|
|
22
|
+
.array(z.string().max(500))
|
|
23
|
+
.max(20)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe("User flows, e.g. 'User taps Save → shows success toast → returns to list'"),
|
|
26
|
+
components: z
|
|
27
|
+
.array(z.string().max(200))
|
|
28
|
+
.max(30)
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('UI components involved: buttons, forms, modals, etc.'),
|
|
31
|
+
type: z
|
|
32
|
+
.enum(['feature', 'bugfix', 'refactor'])
|
|
33
|
+
.optional()
|
|
34
|
+
.default('feature')
|
|
35
|
+
.describe('Spec type: feature, bugfix, or refactor'),
|
|
36
|
+
tags: z
|
|
37
|
+
.array(z.string().max(50))
|
|
38
|
+
.max(10)
|
|
39
|
+
.optional()
|
|
40
|
+
.describe("Tags for the spec, e.g. ['frontend', 'mobile', 'ux']"),
|
|
41
|
+
},
|
|
42
|
+
annotations: { readOnlyHint: false, destructiveHint: false },
|
|
43
|
+
}, safeTracked('generate_spec_from_design', async (args) => handleGenerateSpecFromDesign(args)));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=register-generate-spec-from-design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-generate-spec-from-design.js","sourceRoot":"","sources":["../../src/tools/register-generate-spec-from-design.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAGnG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,UAAU,kCAAkC,CAAC,MAAiB;IAClE,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,WAAW,EACT,2MAA2M;QAC7M,WAAW,EAAE;YACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACtF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACvF,iBAAiB,EAAE,CAAC;iBACjB,MAAM,EAAE;iBACR,GAAG,CAAC,EAAE,CAAC;iBACP,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,CACP,wFAAwF,CACzF;YACH,OAAO,EAAE,CAAC;iBACP,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC1B,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,8DAA8D,CAAC;YAC3E,SAAS,EAAE,CAAC;iBACT,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC1B,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,2EAA2E,CAAC;YACxF,UAAU,EAAE,CAAC;iBACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAC1B,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YACnE,IAAI,EAAE,CAAC;iBACJ,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;iBACvC,QAAQ,EAAE;iBACV,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CAAC,yCAAyC,CAAC;YACtD,IAAI,EAAE,CAAC;iBACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACzB,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACpE;QACD,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE;KAC7D,EACD,WAAW,CAAC,2BAA2B,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACtD,4BAA4B,CAAC,IAAmC,CAAC,CAClE,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-oauth-tools.d.ts","sourceRoot":"","sources":["../../src/tools/register-oauth-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6B1D"}
|