@forge/lint 5.12.0-next.6 → 5.12.0-next.7-experimental-4cf7fd3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # @forge/lint
2
2
 
3
+ ## 5.12.0-next.7-experimental-4cf7fd3
4
+
5
+ ### Minor Changes
6
+
7
+ - 414eba9: Add LLM module to manifest if sdk in use
8
+ - 738ce50: Add permission linter for Realtime subscribeGlobal method
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies [ee02b2c]
13
+ - Updated dependencies [9a6d346]
14
+ - Updated dependencies [260eb24]
15
+ - Updated dependencies [debdb02]
16
+ - Updated dependencies [8962080]
17
+ - Updated dependencies [aaf8a03]
18
+ - Updated dependencies [78efec7]
19
+ - @forge/csp@5.3.0-next.1-experimental-4cf7fd3
20
+ - @forge/manifest@11.0.0-next.3-experimental-4cf7fd3
21
+ - @forge/cli-shared@8.8.2-next.4-experimental-4cf7fd3
22
+
23
+ ## 5.12.0-next.7
24
+
25
+ ### Minor Changes
26
+
27
+ - 414eba9: Add LLM module to manifest if sdk in use
28
+
29
+ ### Patch Changes
30
+
31
+ - Updated dependencies [78efec7]
32
+ - @forge/manifest@11.0.0-next.3
33
+ - @forge/cli-shared@8.8.2-next.4
34
+
3
35
  ## 5.12.0-next.6
4
36
 
5
37
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/lint/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAcxG,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,WAAY,UAAU,eAAe,UAAU,EAAE,4BAAuB,IA+CrG,CAAC;AAEF,eAAO,MAAM,YAAY,gBAAiB,UAAU,EAAE,KAAG,YAQxD,CAAC;AAEF,eAAO,MAAM,eAAe,aAChB,MAAM,UACR,eAAe,oBACN,OAAO,GAAG,QAAQ,CAAC,aAAa,KAChD,QAAQ,SAAS,CAOnB,CAAC;AAEF,eAAO,MAAM,IAAI,gBACF,MAAM,EAAE,YACX,QAAQ,eACL,MAAM,UACX,UAAU,kBACF,cAAc,6BAjBpB,MAAM,UACR,eAAe,oBACN,OAAO,GAAG,QAAQ,CAAC,aAAa,KAChD,QAAQ,SAAS,CAAC,YAgBV,eAAe,EAAE,KAazB,QAAQ,UAAU,EAAE,CAyCtB,CAAC;AAwBF,eAAO,MAAM,QAAQ,WACX,UAAU,kBACF,cAAc,WACtB,eAAe,KACtB,QAAQ,UAAU,EAAE,CAGtB,CAAC"}
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/lint/lint.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAexG,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,WAAY,UAAU,eAAe,UAAU,EAAE,4BAAuB,IA+CrG,CAAC;AAEF,eAAO,MAAM,YAAY,gBAAiB,UAAU,EAAE,KAAG,YAQxD,CAAC;AAEF,eAAO,MAAM,eAAe,aAChB,MAAM,UACR,eAAe,oBACN,OAAO,GAAG,QAAQ,CAAC,aAAa,KAChD,QAAQ,SAAS,CAOnB,CAAC;AAEF,eAAO,MAAM,IAAI,gBACF,MAAM,EAAE,YACX,QAAQ,eACL,MAAM,UACX,UAAU,kBACF,cAAc,6BAjBpB,MAAM,UACR,eAAe,oBACN,OAAO,GAAG,QAAQ,CAAC,aAAa,KAChD,QAAQ,SAAS,CAAC,YAgBV,eAAe,EAAE,KAczB,QAAQ,UAAU,EAAE,CAyCtB,CAAC;AAwBF,eAAO,MAAM,QAAQ,WACX,UAAU,kBACF,cAAc,WACtB,eAAe,KACtB,QAAQ,UAAU,EAAE,CAGtB,CAAC"}
package/out/lint/lint.js CHANGED
@@ -19,6 +19,7 @@ const invoke_remote_linter_1 = require("./linters/remote-linter/invoke-remote-li
19
19
  const storage_module_linter_1 = require("./linters/storage-module-linter/storage-module-linter");
20
20
  const frame_component_linter_1 = require("./linters/frame-component-linter/frame-component-linter");
21
21
  const deprecated_egress_permissions_manifest_linter_1 = require("./linters/manifest-linter/deprecated-egress-permissions-manifest-linter");
22
+ const llm_module_linter_1 = require("./linters/llm-module-linter/llm-module-linter");
22
23
  const reportLintResults = (logger, lintResults, showSummary = true) => {
23
24
  let numErrors = 0, numWarnings = 0;
24
25
  let noProblemsFound = true;
@@ -91,6 +92,7 @@ const lint = async (filesToLint, manifest, environment, logger, statsigService,
91
92
  new invoke_remote_linter_1.InvokeRemoteLinter(environment, manifest, logger),
92
93
  new storage_module_linter_1.StorageModulesLinter(environment, manifest, logger),
93
94
  new frame_component_linter_1.FrameComponentLinter(environment, manifest, logger),
95
+ new llm_module_linter_1.LlmModuleLinter(environment, manifest, logger),
94
96
  new deprecated_egress_permissions_manifest_linter_1.DeprecatedEgressPermissionsManifestLinter(logger, statsigService)
95
97
  ]) => {
96
98
  const { include, exclude } = await (0, cli_shared_1.listTSConfigIncludeExclude)(new cli_shared_1.FileSystemReader());
@@ -0,0 +1,9 @@
1
+ import { LintCriteriaMatch } from '../../linter-interface';
2
+ export interface LLMModuleLintCriteriaMatch extends LintCriteriaMatch {
3
+ type: 'llm';
4
+ }
5
+ export interface LLMModuleMatches {
6
+ [key: string]: LLMModuleLintCriteriaMatch[];
7
+ }
8
+ export declare const LLM_SDK_PACKAGE = "@atlassian/forge-llms-sdk";
9
+ //# sourceMappingURL=llm-linter-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-linter-interface.d.ts","sourceRoot":"","sources":["../../../../src/lint/linters/llm-module-linter/llm-linter-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,IAAI,EAAE,KAAK,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,0BAA0B,EAAE,CAAC;CAC7C;AAED,eAAO,MAAM,eAAe,8BAA8B,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LLM_SDK_PACKAGE = void 0;
4
+ exports.LLM_SDK_PACKAGE = '@atlassian/forge-llms-sdk';
@@ -0,0 +1,14 @@
1
+ import { LintFixState, LintLogger, LintResultRule } from '../../linter-interface';
2
+ import BaseLinter from '../../base-linter';
3
+ import { ManifestSchema as Manifest } from '@forge/manifest';
4
+ import { LLMModuleLintCriteriaMatch, LLMModuleMatches } from './llm-linter-interface';
5
+ export declare class LlmModuleLinter extends BaseLinter<LLMModuleLintCriteriaMatch, LLMModuleMatches, LLMModuleLintCriteriaMatch[]> {
6
+ private manifest;
7
+ constructor(environment: string, manifest: Manifest, logger: LintLogger);
8
+ addLintCriteriaMatch(usage: LLMModuleLintCriteriaMatch, filepath: string): void;
9
+ bootstrap(): Promise<void>;
10
+ protected setupMatchesMap(filePath: string): void;
11
+ protected getFixer(): ((errors: LintResultRule[], warnings: LintResultRule[], state: LintFixState) => Promise<LintFixState>) | undefined;
12
+ applyFixes(_errors: LintResultRule[], warnings: LintResultRule[], state: LintFixState): Promise<LintFixState>;
13
+ }
14
+ //# sourceMappingURL=llm-module-linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-module-linter.d.ts","sourceRoot":"","sources":["../../../../src/lint/linters/llm-module-linter/llm-module-linter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,UAAU,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAW,MAAM,iBAAiB,CAAC;AAGtE,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAItF,qBAAa,eAAgB,SAAQ,UAAU,CAC7C,0BAA0B,EAC1B,gBAAgB,EAChB,0BAA0B,EAAE,CAC7B;IAGG,OAAO,CAAC,QAAQ;gBADhB,WAAW,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,EAC1B,MAAM,EAAE,UAAU;IAKpB,oBAAoB,CAAC,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOvC,SAAS,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMjD,SAAS,CAAC,QAAQ,IACd,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,GACtG,SAAS;IAIP,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;CAiBpH"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LlmModuleLinter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const base_linter_1 = tslib_1.__importDefault(require("../../base-linter"));
6
+ const llm_node_visitor_1 = require("./llm-node-visitor");
7
+ const llm_verifier_1 = require("./llm-verifier");
8
+ const DEFAULT_LLM_MODULES = [{ key: 'llm', model: ['claude'] }];
9
+ class LlmModuleLinter extends base_linter_1.default {
10
+ manifest;
11
+ constructor(environment, manifest, logger) {
12
+ super(environment, logger);
13
+ this.manifest = manifest;
14
+ }
15
+ addLintCriteriaMatch(usage, filepath) {
16
+ const criteriaMatches = this.matches.get(filepath);
17
+ criteriaMatches?.llm.push(usage);
18
+ }
19
+ async bootstrap() {
20
+ this.nodeVisitors = [new llm_node_visitor_1.LlmNodeVisitor()];
21
+ this.verifiers = {
22
+ llm: new llm_verifier_1.LlmVerifier(this.environment, this.manifest)
23
+ };
24
+ }
25
+ setupMatchesMap(filePath) {
26
+ this.matches.set(filePath, {
27
+ llm: []
28
+ });
29
+ }
30
+ getFixer() {
31
+ return this.applyFixes;
32
+ }
33
+ async applyFixes(_errors, warnings, state) {
34
+ if (warnings?.length > 0) {
35
+ const currentModules = (await state.configFile.readConfig())?.modules ?? {};
36
+ const isLLMModuleMissing = warnings.find((warning) => warning.metadata?.missingLLMModule === 'llm') !== undefined;
37
+ if (isLLMModuleMissing && !currentModules.llm) {
38
+ const newModules = {
39
+ ...currentModules,
40
+ llm: DEFAULT_LLM_MODULES
41
+ };
42
+ await state.configFile.writeToConfigFile('modules', newModules);
43
+ state.warningsFixed += 1;
44
+ }
45
+ }
46
+ return state;
47
+ }
48
+ }
49
+ exports.LlmModuleLinter = LlmModuleLinter;
@@ -0,0 +1,9 @@
1
+ import { NodeVisitor } from '../node-visitor-interface';
2
+ import { LLMModuleLintCriteriaMatch } from './llm-linter-interface';
3
+ import { TSESTree } from '@typescript-eslint/typescript-estree';
4
+ export declare class LlmNodeVisitor implements NodeVisitor<LLMModuleLintCriteriaMatch> {
5
+ visit(node: TSESTree.Node, _parent: TSESTree.Node | undefined, onMatchCallback: (llmModuleCall: LLMModuleLintCriteriaMatch) => void): void;
6
+ private isNodeSDKPackageImport;
7
+ private isImportSpecifier;
8
+ }
9
+ //# sourceMappingURL=llm-node-visitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-node-visitor.d.ts","sourceRoot":"","sources":["../../../../src/lint/linters/llm-module-linter/llm-node-visitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAmB,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAkB,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAEhF,qBAAa,cAAe,YAAW,WAAW,CAAC,0BAA0B,CAAC;IACrE,KAAK,CACV,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,OAAO,EAAE,QAAQ,CAAC,IAAI,GAAG,SAAS,EAClC,eAAe,EAAE,CAAC,aAAa,EAAE,0BAA0B,KAAK,IAAI;IAgBtE,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,iBAAiB;CAM1B"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LlmNodeVisitor = void 0;
4
+ const llm_linter_interface_1 = require("./llm-linter-interface");
5
+ const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
6
+ class LlmNodeVisitor {
7
+ visit(node, _parent, onMatchCallback) {
8
+ if (this.isNodeSDKPackageImport(node) && 'specifiers' in node) {
9
+ node.specifiers.forEach((specifier) => {
10
+ if (this.isImportSpecifier(specifier)) {
11
+ if (specifier.loc) {
12
+ onMatchCallback({
13
+ type: 'llm',
14
+ ...specifier.loc.start
15
+ });
16
+ }
17
+ }
18
+ });
19
+ }
20
+ }
21
+ isNodeSDKPackageImport(node) {
22
+ return node.type === typescript_estree_1.AST_NODE_TYPES.ImportDeclaration && node.source.value === llm_linter_interface_1.LLM_SDK_PACKAGE;
23
+ }
24
+ isImportSpecifier(specifier) {
25
+ return ((specifier.type === typescript_estree_1.AST_NODE_TYPES.ImportSpecifier || specifier.type === typescript_estree_1.AST_NODE_TYPES.ImportDefaultSpecifier) &&
26
+ specifier.local.type === typescript_estree_1.AST_NODE_TYPES.Identifier);
27
+ }
28
+ }
29
+ exports.LlmNodeVisitor = LlmNodeVisitor;
@@ -0,0 +1,8 @@
1
+ import { BaseLintIssueVerifier, LintIssueVerifier } from '../verifier-interface';
2
+ import { LintClass, LintResultRule } from '../../linter-interface';
3
+ import { LLMModuleLintCriteriaMatch } from './llm-linter-interface';
4
+ export declare class LlmVerifier extends BaseLintIssueVerifier implements LintIssueVerifier<LLMModuleLintCriteriaMatch[]> {
5
+ protected getLintClass(): LintClass;
6
+ process(moduleCalls: LLMModuleLintCriteriaMatch[]): Promise<LintResultRule[]>;
7
+ }
8
+ //# sourceMappingURL=llm-verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-verifier.d.ts","sourceRoot":"","sources":["../../../../src/lint/linters/llm-module-linter/llm-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,wBAAwB,CAAC;AAGpE,qBAAa,WAAY,SAAQ,qBAAsB,YAAW,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;IAC/G,SAAS,CAAC,YAAY,IAAI,SAAS;IAItB,OAAO,CAAC,WAAW,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAe3F"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LlmVerifier = void 0;
4
+ const verifier_interface_1 = require("../verifier-interface");
5
+ const linter_interface_1 = require("../../linter-interface");
6
+ const text_1 = require("../../text");
7
+ class LlmVerifier extends verifier_interface_1.BaseLintIssueVerifier {
8
+ getLintClass() {
9
+ return linter_interface_1.LintClass.Warning;
10
+ }
11
+ async process(moduleCalls) {
12
+ if (this.manifest.modules && 'llm' in this.manifest.modules) {
13
+ return [];
14
+ }
15
+ return moduleCalls.map((llmModuleCall) => ({
16
+ class: this.getLintClass(),
17
+ message: text_1.messages.verifiers.llm.message('llm'),
18
+ reference: text_1.messages.verifiers.llm.reference,
19
+ ...llmModuleCall,
20
+ metadata: {
21
+ missingLLMModule: 'llm'
22
+ }
23
+ }));
24
+ }
25
+ }
26
+ exports.LlmVerifier = LlmVerifier;
@@ -45,6 +45,10 @@ export declare const messages: {
45
45
  message: (module: string) => string;
46
46
  reference: string;
47
47
  };
48
+ llm: {
49
+ message: (module: string) => string;
50
+ reference: string;
51
+ };
48
52
  frameComponentResource: {
49
53
  missing: {
50
54
  message: () => string;
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/lint/text/messages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;2BAGA,MAAM;;;;2BAKN,MAAM;2BAER,MAAM;;;;2BAKJ,MAAM;;;;iCAKA,MAAM;;;;iCAKN,MAAM;;;;8BAKT,MAAM,OAAO,MAAM;;;;+BAKlB,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,MAAM;;;;6BAKjE,MAAM;;;;+BAIJ,MAAM,QAAQ,MAAM,SAAS,MAAM;;;;8BAKpC,MAAM;;;;8BAIN,MAAM;;;;;;;;;oCASF,MAAM;;;;;6BAOX,MAAM;;;;CAI5B,CAAC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/lint/text/messages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;2BAGA,MAAM;;;;2BAKN,MAAM;2BAER,MAAM;;;;2BAKJ,MAAM;;;;iCAKA,MAAM;;;;iCAKN,MAAM;;;;8BAKT,MAAM,OAAO,MAAM;;;;+BAKlB,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,MAAM;;;;6BAKjE,MAAM;;;;+BAIJ,MAAM,QAAQ,MAAM,SAAS,MAAM;;;;8BAKpC,MAAM;;;;8BAIN,MAAM;;;;8BAIN,MAAM;;;;;;;;;oCASF,MAAM;;;;;6BAOX,MAAM;;;;CAI5B,CAAC"}
@@ -48,6 +48,10 @@ exports.messages = {
48
48
  message: (module) => `OS package is used but '${module}' module is not defined in the manifest`,
49
49
  reference: 'https://developer.atlassian.com/platform/forge/manifest-reference/#modules'
50
50
  },
51
+ llm: {
52
+ message: (module) => `LLM package is used but '${module}' module is not defined in the manifest`,
53
+ reference: 'https://developer.atlassian.com/platform/forge/manifest-reference/#modules'
54
+ },
51
55
  frameComponentResource: {
52
56
  missing: {
53
57
  message: () => 'The "resource" property is missing in the Frame component',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge/lint",
3
- "version": "5.12.0-next.6",
3
+ "version": "5.12.0-next.7-experimental-4cf7fd3",
4
4
  "description": "Linting for forge apps",
5
5
  "main": "out/index.js",
6
6
  "license": "SEE LICENSE IN LICENSE.txt",
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "devDependencies": {
13
13
  "@atlassian/xen-test-util": "^4.2.0",
14
- "@forge/api": "^6.1.6-next.0",
14
+ "@forge/api": "^6.1.6-next.0-experimental-4cf7fd3",
15
15
  "@types/array.prototype.flatmap": "^1.2.6",
16
16
  "@types/cross-spawn": "^6.0.6",
17
17
  "@types/eslint": "8.56.12",
@@ -19,10 +19,10 @@
19
19
  "eslint-plugin-import": "^2.29.1"
20
20
  },
21
21
  "dependencies": {
22
- "@forge/cli-shared": "8.8.2-next.3",
23
- "@forge/csp": "5.3.0-next.1",
22
+ "@forge/cli-shared": "8.8.2-next.4-experimental-4cf7fd3",
23
+ "@forge/csp": "5.3.0-next.1-experimental-4cf7fd3",
24
24
  "@forge/egress": "2.1.1",
25
- "@forge/manifest": "11.0.0-next.2",
25
+ "@forge/manifest": "11.0.0-next.3-experimental-4cf7fd3",
26
26
  "@typescript-eslint/typescript-estree": "^5.62.0",
27
27
  "array.prototype.flatmap": "^1.3.3",
28
28
  "@atlassian/atlassian-openapi": "^1.0.6",