pi-apexlang 0.2.2 → 0.4.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 (239) hide show
  1. package/README.md +22 -5
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/UPSTREAM.json +2 -2
  4. package/docs/assets/overview.en.png +0 -0
  5. package/docs/assets/overview.en.svg +89 -0
  6. package/docs/assets/overview.uk.png +0 -0
  7. package/docs/assets/overview.uk.svg +89 -0
  8. package/docs/en/README.md +41 -0
  9. package/docs/en/architecture.md +73 -0
  10. package/docs/en/getting-started.md +77 -0
  11. package/docs/en/maintenance.md +83 -0
  12. package/docs/en/tool-reference.md +85 -0
  13. package/docs/uk/README.md +41 -0
  14. package/docs/uk/architecture.md +73 -0
  15. package/docs/uk/getting-started.md +77 -0
  16. package/docs/uk/maintenance.md +83 -0
  17. package/docs/uk/tool-reference.md +85 -0
  18. package/extensions/apexlang/index.ts +19 -10
  19. package/extensions/lib/apexlang-cli.d.mts +1 -2
  20. package/extensions/lib/apexlang-cli.mjs +18 -13
  21. package/extensions/lib/apexlang-local-validate.mjs +83 -0
  22. package/extensions/lib/apexlang-local-validator.py +116 -0
  23. package/extensions/lib/apexlang-runtime-validate.mjs +76 -0
  24. package/package.json +2 -1
  25. package/skills/apexlang/APEXlang Skills and Workflows.md +325 -0
  26. package/skills/apexlang/README.md +6 -6
  27. package/skills/apexlang/RELEASE-NOTES.md +2 -2
  28. package/skills/apexlang/SKILL.md +24 -19
  29. package/skills/apexlang/agents/openai.yaml +4 -3
  30. package/skills/apexlang/assets/apex-generation/components.registry.json +1001 -16
  31. package/skills/apexlang/assets/apexlang/domains-catalog.json +6 -1
  32. package/skills/apexlang/assets/component-attributes.json +1924 -180
  33. package/skills/apexlang/assets/component-policies.json +19 -10
  34. package/skills/apexlang/assets/contracts/grammar-semantic-rules.json +134 -0
  35. package/skills/apexlang/assets/contracts/package-layers.json +56 -0
  36. package/skills/apexlang/assets/contracts/page-construction-packs.json +154 -0
  37. package/skills/apexlang/assets/contracts/page-patterns.json +119 -0
  38. package/skills/apexlang/assets/grammar/apexlang.ebnf +11743 -0
  39. package/skills/apexlang/assets/indexes/font-apex-icon-index.json +1699 -0
  40. package/skills/apexlang/assets/routing-catalog-main.json +11 -10
  41. package/skills/apexlang/assets/routing-load-policy.json +35 -9
  42. package/skills/apexlang/assets/rules-mapping.json +110 -2
  43. package/skills/apexlang/assets/rules.catalog.json +1298 -0
  44. package/skills/apexlang/assets/validator-fix-recipes.json +372 -17
  45. package/skills/apexlang/assets/workspace-intelligence.json +7 -10
  46. package/skills/apexlang/manifest.json +268 -12
  47. package/skills/apexlang/references/domains/README.md +1 -1
  48. package/skills/apexlang/references/domains/page-components/buttons.md +2 -2
  49. package/skills/apexlang/references/domains/page-components/page-items.md +3 -3
  50. package/skills/apexlang/references/domains/page-components/regions/region-display-selector/workflow-region-display-selector.md +69 -0
  51. package/skills/apexlang/references/domains/page-components/regions.md +1 -0
  52. package/skills/apexlang/references/domains/template-components/comments.md +61 -0
  53. package/skills/apexlang/references/domains/template-components/registry.md +2 -0
  54. package/skills/apexlang/references/domains/template-components/templates.md +47 -0
  55. package/skills/apexlang/references/domains/template-components/timeline.md +51 -0
  56. package/skills/apexlang/references/ops/one-message-router-contract.md +2 -2
  57. package/skills/apexlang/references/ops/runtime-gates/01-direct-sqlcl-import.md +1 -1
  58. package/skills/apexlang/references/ops/runtime-gates/02-direct-sqlcl-validate-gate.md +1 -1
  59. package/skills/apexlang/references/ops/runtime-gates.md +17 -16
  60. package/skills/apexlang/references/ops/sqlcl-agents/00-connection-gate.md +7 -7
  61. package/skills/apexlang/references/ops/sqlcl.md +7 -8
  62. package/skills/apexlang/references/policies/compiler-prop-map.md +6 -4
  63. package/skills/apexlang/references/policies/governance/00-governance.md +2 -2
  64. package/skills/apexlang/references/policies/memory-bank/00-guard/ai.guard.md +126 -922
  65. package/skills/apexlang/references/policies/memory-bank/20-data/apex.logic.md +3 -3
  66. package/skills/apexlang/references/policies/memory-bank/20-data/db.connection.md +9 -11
  67. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.cards-page.md +95 -0
  68. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.page.md +2 -2
  69. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.smart-filter-search.md +145 -74
  70. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-interactions.md +9 -2
  71. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-media.md +6 -5
  72. package/skills/apexlang/references/policies/memory-bank/systemPatterns.md +9 -1
  73. package/skills/apexlang/references/workflows/apex-generation/agents/20-agent-draft.md +51 -232
  74. package/skills/apexlang/references/workflows/apex-generation/agents/30-agent-critique.md +49 -449
  75. package/skills/apexlang/references/workflows/apex-generation/agents/40-agent-revision.md +38 -238
  76. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-test-matrix.md +8 -2
  77. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-validation-notes.md +19 -3
  78. package/skills/apexlang/references/workflows/apex-generation/registry.md +15 -1
  79. package/skills/apexlang/references/workflows/apex-generation/templates.md +1 -1
  80. package/skills/apexlang/references/workflows/apex-generation.md +1 -1
  81. package/skills/apexlang/references/workflows/apexlang/apexlang-execution-model.md +5 -5
  82. package/skills/apexlang/references/workflows/apexlang/prompt-contracts.md +81 -10
  83. package/skills/apexlang/references/workflows/apexlang/workflow-create-app-from-fr-and-model.md +18 -7
  84. package/skills/apexlang/release-notes.json +156 -0
  85. package/skills/apexlang/runtime/grammar_contract.mjs +1166 -0
  86. package/skills/apexlang/runtime/internal/python/format_apexlang.py +210 -0
  87. package/skills/apexlang/runtime/internal/python/validate_apexlang.py +14142 -5843
  88. package/skills/apexlang/runtime/internal/python/validator_common.py +2 -0
  89. package/skills/apexlang/runtime/lib/catalogs.mjs +1026 -0
  90. package/skills/apexlang/runtime/lib/common.mjs +35 -0
  91. package/skills/apexlang/runtime/runtime.bundle.mjs +457 -57
  92. package/skills/apexlang/templates/items/combobox/combobox.explicit-defaults.md +1 -1
  93. package/skills/apexlang/templates/items/date-picker/date-picker._common.md +1 -1
  94. package/skills/apexlang/templates/items/date-picker/date-picker.explicit-defaults.md +1 -1
  95. package/skills/apexlang/templates/items/file-upload/file-upload._common.md +30 -24
  96. package/skills/apexlang/templates/items/file-upload/file-upload.compact-template.md +6 -0
  97. package/skills/apexlang/templates/items/file-upload/file-upload.explicit-defaults.md +23 -8
  98. package/skills/apexlang/templates/items/file-upload/file-upload.minimal.md +6 -0
  99. package/skills/apexlang/templates/items/hidden-item/hidden-item._common.md +1 -1
  100. package/skills/apexlang/templates/items/hidden-item/hidden-item.explicit-defaults.md +1 -1
  101. package/skills/apexlang/templates/items/items._common.md +3 -2
  102. package/skills/apexlang/templates/items/list-manager/list-manager.explicit-defaults.md +1 -1
  103. package/skills/apexlang/templates/items/markdown-editor/markdown-editor._common.md +1 -1
  104. package/skills/apexlang/templates/items/markdown-editor/markdown-editor.explicit-defaults.md +1 -1
  105. package/skills/apexlang/templates/items/number-field/number-field._common.md +8 -6
  106. package/skills/apexlang/templates/items/number-field/number-field.explicit-defaults.md +12 -2
  107. package/skills/apexlang/templates/items/popup-lov/popup-lov.explicit-defaults.md +1 -1
  108. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor._common.md +1 -1
  109. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor.explicit-defaults.md +1 -1
  110. package/skills/apexlang/templates/items/select-many/standard.md +1 -1
  111. package/skills/apexlang/templates/items/shuttle/shuttle.explicit-defaults.md +1 -1
  112. package/skills/apexlang/templates/items/switch/switch._common.md +8 -8
  113. package/skills/apexlang/templates/items/switch/switch.explicit-defaults.md +1 -1
  114. package/skills/apexlang/templates/items/text-area/text-area._common.md +2 -3
  115. package/skills/apexlang/templates/items/text-area/text-area.explicit-defaults.md +1 -1
  116. package/skills/apexlang/templates/items/text-area/text-area.required-length.md +1 -3
  117. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.explicit-defaults.md +1 -1
  118. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.required-length.md +1 -3
  119. package/skills/apexlang/templates/items/text-field/text-field._common.md +2 -3
  120. package/skills/apexlang/templates/items/text-field/text-field.explicit-defaults.md +1 -1
  121. package/skills/apexlang/templates/items/text-field/text-field.required-length.md +1 -3
  122. package/skills/apexlang/templates/page-examples/faceted-search/faceted-search.example.md +0 -5
  123. package/skills/apexlang/templates/page-examples/form-page/form-page.example.md +0 -9
  124. package/skills/apexlang/templates/page-examples/interactive-report-page/interactive-report-page.example.md +2 -2
  125. package/skills/apexlang/templates/page-examples/login-page/login-page.example.md +0 -8
  126. package/skills/apexlang/templates/page-examples/task-definition-initiated-tasks-page/task-definition-initiated-tasks-page.example.md +7 -17
  127. package/skills/apexlang/templates/page-examples/task-definition-my-tasks-page/task-definition-my-tasks-page.example.md +7 -65
  128. package/skills/apexlang/templates/page-examples/task-definition-task-details/task-definition-task-details.example.md +38 -201
  129. package/skills/apexlang/templates/region-components/calendar/calendar.custom-styling.md +3 -1
  130. package/skills/apexlang/templates/region-components/calendar/calendar.faceted-search.md +3 -2
  131. package/skills/apexlang/templates/region-components/cards/README.md +12 -4
  132. package/skills/apexlang/templates/region-components/cards/cards._common.md +176 -37
  133. package/skills/apexlang/templates/region-components/cards/cards._index.md +2 -1
  134. package/skills/apexlang/templates/region-components/cards/cards.refresh-after-dialog.md +46 -0
  135. package/skills/apexlang/templates/region-components/cards/cards.refresh-on-change.md +58 -0
  136. package/skills/apexlang/templates/region-components/cards/cards.rest-source.md +54 -18
  137. package/skills/apexlang/templates/region-components/cards/cards.standard.md +37 -21
  138. package/skills/apexlang/templates/region-components/chart/chart._series._common.md +1 -4
  139. package/skills/apexlang/templates/region-components/chart/chart.pie.md +6 -2
  140. package/skills/apexlang/templates/region-components/chart/chart.status-meter-gauge.md +1 -1
  141. package/skills/apexlang/templates/region-components/chart/chart.stock.md +2 -0
  142. package/skills/apexlang/templates/region-components/chart/features/chart.feature-chart-links.md +9 -7
  143. package/skills/apexlang/templates/region-components/faceted-search/faceted-search._common.md +1 -14
  144. package/skills/apexlang/templates/region-components/form/form._items._common.md +1 -5
  145. package/skills/apexlang/templates/region-components/interactive-report/interactive-report._columns._common.md +2 -6
  146. package/skills/apexlang/templates/region-components/interactive-report/interactive-report.page-header-actions.md +1 -7
  147. package/skills/apexlang/templates/region-components/list/README.md +1 -1
  148. package/skills/apexlang/templates/region-components/list/list._common.md +1 -1
  149. package/skills/apexlang/templates/region-components/map/map.backgrounds.md +12 -10
  150. package/skills/apexlang/templates/region-components/map/map.layer.extruded-polygons.md +16 -12
  151. package/skills/apexlang/templates/region-components/map/map.layer.heat-map.md +10 -7
  152. package/skills/apexlang/templates/region-components/map/map.layer.lines.md +10 -8
  153. package/skills/apexlang/templates/region-components/map/map.layer.polygons.md +21 -18
  154. package/skills/apexlang/templates/region-components/map/map.region.background-custom.md +25 -19
  155. package/skills/apexlang/templates/region-components/map/map.region.background-shared.md +19 -13
  156. package/skills/apexlang/templates/region-components/map/map.region.bbox-sql.md +13 -13
  157. package/skills/apexlang/templates/region-components/map/map.region.bbox-static.md +2 -2
  158. package/skills/apexlang/templates/region-components/map/map.region.browser-location.md +3 -7
  159. package/skills/apexlang/templates/region-components/map/map.region.init-position-sql.md +7 -7
  160. package/skills/apexlang/templates/region-components/region-display-selector/README.md +5 -2
  161. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._common.md +60 -7
  162. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._index.md +4 -1
  163. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.permutations.md +55 -0
  164. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.standard.md +91 -5
  165. package/skills/apexlang/templates/region-components/smart-filter-search/README.md +6 -2
  166. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._common.md +107 -46
  167. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._index.md +4 -3
  168. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search.standard.md +33 -17
  169. package/skills/apexlang/templates/shared-components/component-settings/component-settings._common.md +1 -0
  170. package/skills/apexlang/templates/shared-components/component-settings.example.md +1 -0
  171. package/skills/apexlang/templates/shared-components/email-templates.example.md +1 -1
  172. package/skills/apexlang/templates/shared-components/rest-data-sources/example_rest_data_source.example.md +40 -46
  173. package/skills/apexlang/templates/shared-components/task-definitions/action-task.example.md +2 -30
  174. package/skills/apexlang/templates/shared-components/task-definitions/approve-request.example.md +3 -31
  175. package/skills/apexlang/templates/template-components/README.md +27 -15
  176. package/skills/apexlang/templates/template-components/avatar/README.md +56 -0
  177. package/skills/apexlang/templates/template-components/avatar/avatar._common.md +149 -0
  178. package/skills/apexlang/templates/template-components/avatar/avatar._index.md +42 -0
  179. package/skills/apexlang/templates/template-components/{avatar._template_options.md → avatar/avatar._template_options.md} +1 -1
  180. package/skills/apexlang/templates/template-components/avatar/avatar.report-icon.md +48 -0
  181. package/skills/apexlang/templates/template-components/avatar/avatar.report-image-url-column.md +62 -0
  182. package/skills/apexlang/templates/template-components/avatar/avatar.report-initials.md +54 -0
  183. package/skills/apexlang/templates/template-components/badge/README.md +38 -0
  184. package/skills/apexlang/templates/template-components/badge/badge._common.md +183 -0
  185. package/skills/apexlang/templates/template-components/badge/badge._index.md +20 -0
  186. package/skills/apexlang/templates/template-components/badge/badge.report-link.md +66 -0
  187. package/skills/apexlang/templates/template-components/badge/badge.report-minimal.md +76 -0
  188. package/skills/apexlang/templates/template-components/comments/README.md +20 -0
  189. package/skills/apexlang/templates/template-components/comments/comments._common.md +43 -0
  190. package/skills/apexlang/templates/template-components/comments/comments._index.md +25 -0
  191. package/skills/apexlang/templates/template-components/{comments._template_options.md → comments/comments._template_options.md} +2 -1
  192. package/skills/apexlang/templates/template-components/comments/comments.apex-task-comments.md +77 -0
  193. package/skills/apexlang/templates/template-components/comments/comments.partial-column.md +120 -0
  194. package/skills/apexlang/templates/template-components/comments/comments.permutations.md +425 -0
  195. package/skills/apexlang/templates/template-components/content-row/README.md +1 -1
  196. package/skills/apexlang/templates/template-components/content-row/content-row._common.md +1 -1
  197. package/skills/apexlang/templates/template-components/content-row/content-row._index.md +1 -1
  198. package/skills/apexlang/templates/template-components/content-row/content-row._template_options.md +1 -1
  199. package/skills/apexlang/templates/template-components/flexbox-container/README.md +9 -0
  200. package/skills/apexlang/templates/template-components/flexbox-container/flexbox-container._index.md +13 -0
  201. package/skills/apexlang/templates/template-components/media-list/README.md +100 -0
  202. package/skills/apexlang/templates/template-components/media-list/media-list._common.md +174 -0
  203. package/skills/apexlang/templates/template-components/media-list/media-list._index.md +50 -0
  204. package/skills/apexlang/templates/template-components/{media-list._template_options.md → media-list/media-list._template_options.md} +8 -2
  205. package/skills/apexlang/templates/template-components/media-list/media-list.partial.md +50 -0
  206. package/skills/apexlang/templates/template-components/media-list/media-list.report-avatar-badge.md +76 -0
  207. package/skills/apexlang/templates/template-components/media-list/media-list.report-base.md +71 -0
  208. package/skills/apexlang/templates/template-components/media-list/media-list.report-grouped.md +40 -0
  209. package/skills/apexlang/templates/template-components/media-list/media-list.report-layouts.md +50 -0
  210. package/skills/apexlang/templates/template-components/media-list/media-list.report-link.md +53 -0
  211. package/skills/apexlang/templates/template-components/metric-card/README.md +19 -4
  212. package/skills/apexlang/templates/template-components/metric-card/metric-card._common.md +122 -29
  213. package/skills/apexlang/templates/template-components/metric-card/metric-card._index.md +6 -0
  214. package/skills/apexlang/templates/template-components/metric-card/metric-card._template_options.md +47 -2
  215. package/skills/apexlang/templates/template-components/metric-card/metric-card.partial-minimal.md +51 -0
  216. package/skills/apexlang/templates/template-components/metric-card/metric-card.permutations.md +56 -0
  217. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-avatar-badge.md +98 -0
  218. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-grouping-selection.md +131 -0
  219. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-link.md +66 -0
  220. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-minimal.md +97 -0
  221. package/skills/apexlang/templates/template-components/template-components.registry.json +90 -1
  222. package/skills/apexlang/templates/template-components/timeline/README.md +19 -0
  223. package/skills/apexlang/templates/template-components/timeline/timeline._common.md +43 -0
  224. package/skills/apexlang/templates/template-components/timeline/timeline._index.md +24 -0
  225. package/skills/apexlang/templates/template-components/{timeline._template_options.md → timeline/timeline._template_options.md} +2 -1
  226. package/skills/apexlang/templates/template-components/timeline/timeline.permutations.md +399 -0
  227. package/skills/apexlang/templates/template-components/timeline/timeline.report-sample-data.md +168 -0
  228. package/skills/apexlang/templates/workspace-components/credentials/credentials-for-open-ai.example.md +1 -1
  229. package/skills/apexlang/templates/workspace-components/generative-ai-services/open-ai.example.md +8 -6
  230. package/skills/apexlang/tools/apexctl.mjs +167 -4
  231. package/skills/apexlang/tools/compiler-truth-audit.mjs +95 -63
  232. package/skills/apexlang/tools/query-valid-props-context.mjs +30 -0
  233. package/skills/apexlang/tools/query-valid-props-normalize.mjs +1 -0
  234. package/skills/apexlang/tools/query-valid-props-runtime.mjs +13 -8
  235. package/skills/apexlang/tools/query-valid-props-semantics.mjs +391 -0
  236. package/skills/apexlang/tools/query-valid-props-template-components.mjs +15 -1
  237. package/skills/apexlang/tools/query-valid-props.mjs +198 -216
  238. /package/skills/apexlang/templates/template-components/{badge._template_options.md → badge/badge._template_options.md} +0 -0
  239. /package/skills/apexlang/templates/template-components/{flexbox-container._template_options.md → flexbox-container/flexbox-container._template_options.md} +0 -0
@@ -4,6 +4,7 @@ import { cp, lstat, mkdir, readFile, readdir, realpath, rm, writeFile } from "no
4
4
  import { dirname, extname, isAbsolute, relative, resolve, sep } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { stripVTControlCharacters } from "node:util";
7
+ import { normalizeApxLineEndings } from "../../skills/apexlang/runtime/lib/common.mjs";
7
8
 
8
9
  const moduleDirectory = dirname(fileURLToPath(import.meta.url));
9
10
 
@@ -21,6 +22,8 @@ export const APEXLANG_ACTIONS = Object.freeze([
21
22
 
22
23
  const apexctlPath = resolve(APEXLANG_SKILL_ROOT, "tools/apexctl.mjs");
23
24
  const queryValidPropsPath = resolve(APEXLANG_SKILL_ROOT, "tools/query-valid-props.mjs");
25
+ const localValidatePath = resolve(moduleDirectory, "apexlang-local-validate.mjs");
26
+ const runtimeValidatePath = resolve(moduleDirectory, "apexlang-runtime-validate.mjs");
24
27
  const runtimeRoundtripPath = resolve(moduleDirectory, "apexlang-runtime-roundtrip.mjs");
25
28
  const sqlclPtyProxyPath = resolve(moduleDirectory, "apexlang-sqlcl-pty.py");
26
29
  const CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/;
@@ -214,9 +217,9 @@ export function buildApexlangCommand(input) {
214
217
  }
215
218
 
216
219
  if (action === "local_validate") {
217
- const args = ["apexlang", "validate", "--app-path", requirePath(input, "app_path", action)];
220
+ const args = ["--app-path", requirePath(input, "app_path", action)];
218
221
  addFlag(args, "--fix-vocab", input.fix_vocab);
219
- return apexctl(args);
222
+ return { scriptPath: localValidatePath, args, prelude: [] };
220
223
  }
221
224
 
222
225
  if (action === "compiler_truth_audit") {
@@ -309,7 +312,11 @@ export function buildApexlangCommand(input) {
309
312
  addOption(args, "--apex-root", optionalPath(input, "apex_root"));
310
313
  addOption(args, "--compiler-oracle-home", optionalPath(input, "compiler_oracle_home"));
311
314
  addFlag(args, "--supporting-objects", input.supporting_objects);
312
- return apexctl(args, [{ scriptPath: apexctlPath, args: probeArgs }]);
315
+ return {
316
+ scriptPath: runtimeValidatePath,
317
+ args,
318
+ prelude: [{ scriptPath: apexctlPath, args: probeArgs }]
319
+ };
313
320
  }
314
321
 
315
322
  export function buildApexlangImportCommand(input, importOptions = {}) {
@@ -621,7 +628,7 @@ async function clearStaleRuntimeEvidence(command, outputRoot) {
621
628
  }
622
629
  }
623
630
 
624
- export async function prepareRuntimeApp(input, cwd, outputRoot, prepareOptions = {}) {
631
+ export async function prepareRuntimeApp(input, cwd, outputRoot) {
625
632
  if (!runtimeActionUsesDeployment(input)) {
626
633
  return { appPath: input.app_path ? resolve(cwd, input.app_path) : undefined, staged: false };
627
634
  }
@@ -663,10 +670,6 @@ export async function prepareRuntimeApp(input, cwd, outputRoot, prepareOptions =
663
670
  );
664
671
  }
665
672
 
666
- if (topLevelWorkspace && prepareOptions.forceStage !== true) {
667
- return { appPath, staged: false, workspaceSource: "workspace.name" };
668
- }
669
-
670
673
  const stageKey = createHash("sha256")
671
674
  .update(`${appPath}\0${requestedWorkspace.toUpperCase()}`)
672
675
  .digest("hex")
@@ -701,6 +704,10 @@ export async function prepareRuntimeApp(input, cwd, outputRoot, prepareOptions =
701
704
  `${JSON.stringify(deployment, null, 2)}\n`,
702
705
  "utf8"
703
706
  );
707
+ // Oracle normalizes source line endings before live validation/import. Apply
708
+ // that same normalization only to the staged copy, before binding its digest,
709
+ // so validation and import approve identical bytes without changing the project.
710
+ await normalizeApxLineEndings(stagedAppPath);
704
711
  return {
705
712
  appPath: stagedAppPath,
706
713
  staged: true,
@@ -2118,9 +2125,7 @@ async function runCommand(input, command, options, runOptions = {}) {
2118
2125
  if (input.action === "workspace_probe" || command.prelude.length > 0) {
2119
2126
  await assertWorkspaceProbeCannotFollowSymlinks(options.cwd);
2120
2127
  }
2121
- const runtimeApp = await prepareRuntimeApp(input, options.cwd, options.outputRoot, {
2122
- forceStage: runOptions.forceRuntimeStage === true
2123
- });
2128
+ const runtimeApp = await prepareRuntimeApp(input, options.cwd, options.outputRoot);
2124
2129
  const preRunAppDigest = runtimeApp.appPath && runtimeActionUsesDeployment(input)
2125
2130
  ? await computeApexlangAppDigest(runtimeApp.appPath)
2126
2131
  : undefined;
@@ -2189,7 +2194,7 @@ export async function runApexlangImport(input, options, importOptions = {}) {
2189
2194
  normalizedInput,
2190
2195
  buildApexlangImportCommand(normalizedInput, importOptions),
2191
2196
  options,
2192
- { forceRuntimeStage: true, expectedAppDigest }
2197
+ { expectedAppDigest }
2193
2198
  );
2194
2199
  if (result.ok || importOptions.targetResolutionMode === "create-new") return result;
2195
2200
  return runWarningCompatibleImport(normalizedInput, result, options);
@@ -2205,6 +2210,6 @@ export function runApexlangCreateNewProof(input, options, proofOptions = {}) {
2205
2210
  createNewConfirmed: false
2206
2211
  }),
2207
2212
  options,
2208
- { forceRuntimeStage: true, expectedAppDigest }
2213
+ { expectedAppDigest }
2209
2214
  );
2210
2215
  }
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawnSync } from "node:child_process";
4
+ import { mkdirSync } from "node:fs";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+
8
+ const moduleDirectory = dirname(fileURLToPath(import.meta.url));
9
+ const skillRoot = resolve(moduleDirectory, "../../skills/apexlang");
10
+ const runtimeRoot = resolve(skillRoot, "runtime");
11
+ const pythonRoot = resolve(runtimeRoot, "internal/python");
12
+ const optimizedDslValidator = resolve(moduleDirectory, "apexlang-local-validator.py");
13
+
14
+ function readOption(args, name) {
15
+ const index = args.indexOf(name);
16
+ return index >= 0 && index + 1 < args.length ? String(args[index + 1]).trim() : "";
17
+ }
18
+
19
+ function main() {
20
+ const args = process.argv.slice(2);
21
+ const appPath = readOption(args, "--app-path");
22
+ if (!appPath) {
23
+ console.error("Missing required --app-path");
24
+ return 1;
25
+ }
26
+
27
+ const outputRoot = String(process.env.APEXLANG_OUTPUT_ROOT ?? "").trim();
28
+ if (!outputRoot) {
29
+ console.error("APEXLANG_OUTPUT_ROOT is required in packaged apexlang runtime");
30
+ return 1;
31
+ }
32
+
33
+ const reportDir = resolve(outputRoot, "logs");
34
+ mkdirSync(reportDir, { recursive: true });
35
+ const fixVocab = args.includes("--fix-vocab");
36
+ const commands = [
37
+ [
38
+ resolve(pythonRoot, "validate_apexlang_vocab.py"),
39
+ [
40
+ "--app-path",
41
+ appPath,
42
+ "--report-path",
43
+ join(reportDir, "apexlang-vocab-report.json"),
44
+ fixVocab ? "--rewrite" : "--check-only"
45
+ ]
46
+ ],
47
+ [
48
+ optimizedDslValidator,
49
+ ["--report-path", join(reportDir, "apexlang-dsl-report.json"), appPath]
50
+ ],
51
+ [
52
+ resolve(pythonRoot, "validate_validations.py"),
53
+ ["--report-path", join(reportDir, "apexlang-validations-report.json"), appPath]
54
+ ]
55
+ ];
56
+
57
+ let failures = 0;
58
+ for (const [scriptPath, scriptArgs] of commands) {
59
+ const result = spawnSync("python3", [scriptPath, ...scriptArgs], {
60
+ cwd: process.cwd(),
61
+ encoding: "utf8",
62
+ env: {
63
+ ...process.env,
64
+ APEXLANG_EMBEDDED_TOOLS_ROOT: resolve(skillRoot, "tools"),
65
+ APEXLANG_PACKAGE_ROOT: skillRoot,
66
+ APEXLANG_RUNTIME_ROOT: runtimeRoot,
67
+ PYTHONDONTWRITEBYTECODE: "1"
68
+ }
69
+ });
70
+ if (result.stdout) process.stdout.write(result.stdout);
71
+ if (result.stderr) process.stderr.write(result.stderr);
72
+ if (typeof result.status !== "number" || result.status !== 0) failures += 1;
73
+ }
74
+
75
+ if (failures > 0) {
76
+ console.log("APEXLANG_LOCAL_CHECK_FAILED");
77
+ return 1;
78
+ }
79
+ console.log("APEXLANG_LOCAL_CHECK_OK");
80
+ return 0;
81
+ }
82
+
83
+ process.exitCode = main();
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env python3
2
+ """Run Oracle's DSL validator with per-process parser acceleration.
3
+
4
+ The vendored Oracle skill stays byte-for-byte unchanged. This launcher imports
5
+ its validator, replaces only pure parsing helpers with equivalent cached
6
+ implementations, and then calls the original command-line entry point.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from bisect import bisect_right
12
+ from functools import lru_cache, wraps
13
+ import importlib.util
14
+ import os
15
+ from pathlib import Path
16
+ import sys
17
+ from types import ModuleType
18
+ from typing import Any, Callable
19
+
20
+
21
+ class _SparseDepthIndex:
22
+ """Store lexical depth checkpoints only at offsets requested by validators."""
23
+
24
+ __slots__ = ("positions", "states")
25
+
26
+ def __init__(self) -> None:
27
+ self.positions: list[int] = [0]
28
+ self.states: list[tuple[int, int, bool]] = [(0, 0, False)]
29
+
30
+
31
+ _DEPTH_INDEXES: dict[str, _SparseDepthIndex] = {}
32
+
33
+
34
+ def _sparse_nesting_depth(text: str, idx: int) -> tuple[int, int]:
35
+ """Return Oracle-compatible nesting depth using the closest prior checkpoint."""
36
+ target_idx = min(len(text), idx) if idx >= 0 else max(0, len(text) + idx)
37
+ index = _DEPTH_INDEXES.setdefault(text, _SparseDepthIndex())
38
+ checkpoint_slot = bisect_right(index.positions, target_idx) - 1
39
+ start = index.positions[checkpoint_slot]
40
+ paren_depth, brace_depth, in_string = index.states[checkpoint_slot]
41
+
42
+ for pos in range(start, target_idx):
43
+ ch = text[pos]
44
+ if ch == '"' and (pos == 0 or text[pos - 1] != "\\"):
45
+ in_string = not in_string
46
+ continue
47
+ if in_string:
48
+ continue
49
+ if ch == "(":
50
+ paren_depth += 1
51
+ elif ch == ")":
52
+ paren_depth = max(0, paren_depth - 1)
53
+ elif ch == "{":
54
+ brace_depth += 1
55
+ elif ch == "}":
56
+ brace_depth = max(0, brace_depth - 1)
57
+
58
+ if start != target_idx:
59
+ insert_at = checkpoint_slot + 1
60
+ index.positions.insert(insert_at, target_idx)
61
+ index.states.insert(insert_at, (paren_depth, brace_depth, in_string))
62
+ return paren_depth, brace_depth
63
+
64
+
65
+ def _validator_path() -> Path:
66
+ runtime_override = os.environ.get("APEXLANG_RUNTIME_ROOT", "").strip()
67
+ runtime_root = (
68
+ Path(runtime_override).resolve()
69
+ if runtime_override
70
+ else Path(__file__).resolve().parents[2] / "skills" / "apexlang" / "runtime"
71
+ )
72
+ return runtime_root / "internal" / "python" / "validate_apexlang.py"
73
+
74
+
75
+ def _load_oracle_validator(path: Path) -> ModuleType:
76
+ sys.path.insert(0, str(path.parent))
77
+ spec = importlib.util.spec_from_file_location("_pi_apexlang_oracle_validator", path)
78
+ if spec is None or spec.loader is None:
79
+ raise RuntimeError(f"Cannot load Oracle APEXlang validator: {path}")
80
+ module = importlib.util.module_from_spec(spec)
81
+ sys.modules[spec.name] = module
82
+ spec.loader.exec_module(module)
83
+ return module
84
+
85
+
86
+ def _cache_list_function(function: Callable[..., list[Any]]) -> Callable[..., list[Any]]:
87
+ """Cache immutable results while preserving Oracle's fresh-list return type."""
88
+ cached = lru_cache(maxsize=None)(lambda *args: tuple(function(*args)))
89
+
90
+ @wraps(function)
91
+ def wrapper(*args: Any) -> list[Any]:
92
+ return list(cached(*args))
93
+
94
+ return wrapper
95
+
96
+
97
+ def _accelerate(module: ModuleType) -> None:
98
+ module.nesting_depth = _sparse_nesting_depth
99
+ for name in (
100
+ "find_component_blocks",
101
+ "find_named_brace_blocks",
102
+ "find_immediate_component_blocks",
103
+ "find_immediate_named_brace_blocks",
104
+ ):
105
+ setattr(module, name, _cache_list_function(getattr(module, name)))
106
+ module.block_body = lru_cache(maxsize=None)(module.block_body)
107
+
108
+
109
+ def main(argv: list[str]) -> int:
110
+ validator = _load_oracle_validator(_validator_path())
111
+ _accelerate(validator)
112
+ return int(validator.main(argv))
113
+
114
+
115
+ if __name__ == "__main__":
116
+ sys.exit(main(sys.argv[1:]))
@@ -0,0 +1,76 @@
1
+ import { dirname, resolve } from "node:path";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
+
4
+ const moduleDirectory = dirname(fileURLToPath(import.meta.url));
5
+ const packageRoot = resolve(moduleDirectory, "../../skills/apexlang");
6
+ const runtimeRoot = resolve(packageRoot, "runtime");
7
+
8
+ export async function loadPackagedRuntimeValidation() {
9
+ process.env.APEXLANG_PACKAGE_ROOT = packageRoot;
10
+ process.env.APEXLANG_RUNTIME_ROOT = runtimeRoot;
11
+ process.env.APEXLANG_EMBEDDED_TOOLS_ROOT = resolve(packageRoot, "tools");
12
+
13
+ const [runtime, grammar, common] = await Promise.all([
14
+ import(pathToFileURL(resolve(runtimeRoot, "runtime.bundle.mjs")).href),
15
+ import(pathToFileURL(resolve(runtimeRoot, "grammar_contract.mjs")).href),
16
+ import(pathToFileURL(resolve(runtimeRoot, "lib/common.mjs")).href)
17
+ ]);
18
+ // Oracle's packaged Media List gate still addresses these two helpers using
19
+ // source-tree paths. Redirect only their locations; keep its gate and reports.
20
+ const dependencies = {
21
+ resolveMediaListGrammarContract: (options) => runtime.resolveMediaListGrammarContract({
22
+ ...options,
23
+ buildGrammarContractFn: grammar.buildGrammarContract
24
+ }),
25
+ runTargetBuildLocalValidation: ({ appPath, componentContractPath }) => common.runCommand(
26
+ "python3",
27
+ [
28
+ resolve(runtimeRoot, "internal/python/validate_apexlang.py"),
29
+ "--component-attributes",
30
+ componentContractPath,
31
+ appPath
32
+ ],
33
+ { allowFailure: true, passthrough: false, env: { PYTHONDONTWRITEBYTECODE: "1" } }
34
+ )
35
+ };
36
+ return {
37
+ ...dependencies,
38
+ run: (options) => runtime.runRuntimeValidate({
39
+ ...options,
40
+ _deps: { ...dependencies, ...options._deps }
41
+ })
42
+ };
43
+ }
44
+
45
+ function readOption(args, name, fallback = "") {
46
+ const index = args.indexOf(name);
47
+ return index >= 0 && index + 1 < args.length ? args[index + 1] : fallback;
48
+ }
49
+
50
+ async function main(args) {
51
+ if (args[0] !== "runtime" || args[1] !== "validate") {
52
+ throw new Error("The pi APEXlang validation launcher accepts only runtime validate.");
53
+ }
54
+ const validation = await loadPackagedRuntimeValidation();
55
+ const result = await validation.run({
56
+ appPath: readOption(args, "--app-path"),
57
+ dbConnectionName: readOption(args, "--db-connection-name"),
58
+ executionMode: readOption(args, "--execution-mode", "auto"),
59
+ targetResolutionMode: readOption(args, "--target-resolution-mode", "update-existing"),
60
+ workspaceId: readOption(args, "--workspaceid"),
61
+ supportingObjects: args.includes("--supporting-objects"),
62
+ preflightOnly: args.includes("--preflight-only"),
63
+ apexRoot: readOption(args, "--apex-root"),
64
+ compilerOracleHome: readOption(args, "--compiler-oracle-home"),
65
+ artifactDir: readOption(args, "--artifact-dir"),
66
+ vscodeProblemsPath: readOption(args, "--vscode-problems-path"),
67
+ reportPath: readOption(args, "--report-path"),
68
+ transcriptPath: readOption(args, "--transcript-path")
69
+ });
70
+ process.stdout.write(`${JSON.stringify(result.payload, null, 2)}\n`);
71
+ process.exitCode = result.code;
72
+ }
73
+
74
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
75
+ await main(process.argv.slice(2));
76
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-apexlang",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "APEXlang support for pi, powered by Oracle's public APEXlang skill.",
5
5
  "type": "module",
6
6
  "license": "UPL-1.0",
@@ -22,6 +22,7 @@
22
22
  "agent-skill"
23
23
  ],
24
24
  "files": [
25
+ "docs",
25
26
  "extensions",
26
27
  "skills",
27
28
  "!extensions/**/__pycache__/**",