@lesliechan721/aw 0.1.0-beta.34 → 0.1.0-beta.36

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 (102) hide show
  1. package/dist/scripts/test-plugin-scripts.js +1 -1
  2. package/dist/src/commands/aw-capabilities.d.ts +1 -1
  3. package/dist/src/commands/aw-capabilities.js +1 -0
  4. package/dist/src/commands/aw-capabilities.js.map +1 -1
  5. package/dist/src/commands/operation-plan.d.ts +19 -0
  6. package/dist/src/commands/operation-plan.js.map +1 -1
  7. package/dist/src/commands/rebuild-command.d.ts +1 -0
  8. package/dist/src/commands/rebuild-command.js +890 -8
  9. package/dist/src/commands/rebuild-command.js.map +1 -1
  10. package/dist/src/commands/rebuild-integration.d.ts +12 -0
  11. package/dist/src/commands/rebuild-integration.js +88 -2
  12. package/dist/src/commands/rebuild-integration.js.map +1 -1
  13. package/dist/src/commands/status-v6.js +109 -19
  14. package/dist/src/commands/status-v6.js.map +1 -1
  15. package/dist/src/commands/wizard.d.ts +5 -1
  16. package/dist/src/commands/wizard.js +4 -2
  17. package/dist/src/commands/wizard.js.map +1 -1
  18. package/dist/src/commands/write-commands.js +3 -0
  19. package/dist/src/commands/write-commands.js.map +1 -1
  20. package/dist/src/index.js +57 -4
  21. package/dist/src/index.js.map +1 -1
  22. package/dist/src/portable/materializer.js +19 -3
  23. package/dist/src/portable/materializer.js.map +1 -1
  24. package/dist/src/review/review-profile.js +19 -2
  25. package/dist/src/review/review-profile.js.map +1 -1
  26. package/dist/src/tui/components.d.ts +39 -0
  27. package/dist/src/tui/components.js +51 -18
  28. package/dist/src/tui/components.js.map +1 -1
  29. package/dist/src/tui/config-array-draft.d.ts +29 -0
  30. package/dist/src/tui/config-array-draft.js +48 -0
  31. package/dist/src/tui/config-array-draft.js.map +1 -0
  32. package/dist/src/tui/config-value-presentation.d.ts +1 -0
  33. package/dist/src/tui/config-value-presentation.js +17 -1
  34. package/dist/src/tui/config-value-presentation.js.map +1 -1
  35. package/dist/src/tui/console-app-v4.js +1742 -1368
  36. package/dist/src/tui/console-app-v4.js.map +1 -1
  37. package/dist/src/tui/content-item-card.d.ts +13 -0
  38. package/dist/src/tui/content-item-card.js +51 -0
  39. package/dist/src/tui/content-item-card.js.map +1 -0
  40. package/dist/src/tui/controller-runtime.js +45 -4
  41. package/dist/src/tui/controller-runtime.js.map +1 -1
  42. package/dist/src/tui/controller.d.ts +18 -0
  43. package/dist/src/tui/controller.js +168 -12
  44. package/dist/src/tui/controller.js.map +1 -1
  45. package/dist/src/tui/dependency-graph-view.d.ts +39 -0
  46. package/dist/src/tui/dependency-graph-view.js +121 -0
  47. package/dist/src/tui/dependency-graph-view.js.map +1 -0
  48. package/dist/src/tui/dependency-graph.js +16 -19
  49. package/dist/src/tui/dependency-graph.js.map +1 -1
  50. package/dist/src/tui/entity-cards.d.ts +55 -0
  51. package/dist/src/tui/entity-cards.js +220 -0
  52. package/dist/src/tui/entity-cards.js.map +1 -0
  53. package/dist/src/tui/input-display.js +10 -1
  54. package/dist/src/tui/input-display.js.map +1 -1
  55. package/dist/src/tui/model.d.ts +11 -0
  56. package/dist/src/tui/model.js +20 -4
  57. package/dist/src/tui/model.js.map +1 -1
  58. package/dist/src/tui/operation-diagnostic-screens.d.ts +2 -18
  59. package/dist/src/tui/operation-diagnostic-screens.js +16 -69
  60. package/dist/src/tui/operation-diagnostic-screens.js.map +1 -1
  61. package/dist/src/tui/operation-review-planner.js +44 -3
  62. package/dist/src/tui/operation-review-planner.js.map +1 -1
  63. package/dist/src/tui/plugin-content.d.ts +8 -0
  64. package/dist/src/tui/plugin-content.js +409 -65
  65. package/dist/src/tui/plugin-content.js.map +1 -1
  66. package/dist/src/tui/plugin-detail.d.ts +52 -0
  67. package/dist/src/tui/plugin-detail.js +165 -0
  68. package/dist/src/tui/plugin-detail.js.map +1 -0
  69. package/dist/src/tui/project-inventory.d.ts +68 -0
  70. package/dist/src/tui/project-inventory.js +203 -0
  71. package/dist/src/tui/project-inventory.js.map +1 -0
  72. package/dist/src/tui/query-header.d.ts +30 -0
  73. package/dist/src/tui/query-header.js +40 -0
  74. package/dist/src/tui/query-header.js.map +1 -0
  75. package/dist/src/tui/reader.d.ts +37 -0
  76. package/dist/src/tui/reader.js +47 -0
  77. package/dist/src/tui/reader.js.map +1 -0
  78. package/dist/src/tui/router.d.ts +26 -3
  79. package/dist/src/tui/router.js.map +1 -1
  80. package/dist/src/tui/screen-registry.d.ts +9 -1
  81. package/dist/src/tui/screen-registry.js +1 -1
  82. package/dist/src/tui/screen-registry.js.map +1 -1
  83. package/dist/src/tui/source-detail-card.d.ts +29 -0
  84. package/dist/src/tui/source-detail-card.js +45 -0
  85. package/dist/src/tui/source-detail-card.js.map +1 -0
  86. package/dist/src/tui/theme.d.ts +12 -0
  87. package/dist/src/tui/theme.js +12 -0
  88. package/dist/src/tui/theme.js.map +1 -1
  89. package/dist/src/tui/wizard.js +26 -4
  90. package/dist/src/tui/wizard.js.map +1 -1
  91. package/dist/src/types.d.ts +2 -0
  92. package/dist/src/types.js.map +1 -1
  93. package/dist/src/utils/catalog-source-references.js +2 -2
  94. package/dist/src/utils/local-marketplace.d.ts +1 -0
  95. package/dist/src/utils/local-marketplace.js +22 -0
  96. package/dist/src/utils/local-marketplace.js.map +1 -1
  97. package/dist/src/utils/plugin-config-write.js +3 -1
  98. package/dist/src/utils/plugin-config-write.js.map +1 -1
  99. package/dist/src/utils/plugin-config.d.ts +5 -5
  100. package/dist/src/utils/plugin-config.js +47 -23
  101. package/dist/src/utils/plugin-config.js.map +1 -1
  102. package/package.json +4 -4
@@ -0,0 +1,13 @@
1
+ import type { PluginContentItem, PluginContentType } from './plugin-content.js';
2
+ import { type EntityCardLayout, entityCardWindowHeight } from './entity-cards.js';
3
+ export declare const contentTypeLabels: Record<PluginContentType, string>;
4
+ export declare function contentItemHasReader(item: PluginContentItem, width: number): boolean;
5
+ export declare function contentItemCardLayout(item: PluginContentItem, width: number): EntityCardLayout;
6
+ export declare function ContentItemCard(props: {
7
+ item: PluginContentItem;
8
+ width: number;
9
+ focused?: boolean;
10
+ lineOffset?: number;
11
+ lineLimit?: number;
12
+ }): React.JSX.Element;
13
+ export { entityCardWindowHeight as contentItemCardWindowHeight };
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import stringWidth from 'string-width';
4
+ import { ObjectCardFrame } from './components.js';
5
+ import { entityCardWindowHeight } from './entity-cards.js';
6
+ import { tuiTheme } from './theme.js';
7
+ import { wrapDisplayText } from './viewport.js';
8
+ export const contentTypeLabels = {
9
+ skill: 'Skill', agent: 'Agent', role: '角色', instruction: '指令', permission: '权限',
10
+ hook: 'Hook', command: '命令', mcpServer: 'MCP Server', app: 'App',
11
+ };
12
+ export function contentItemHasReader(item, width) {
13
+ const titleWidth = Math.max(1, width - 11 - stringWidth(contentTypeLabels[item.type]));
14
+ return Boolean(item.issue) || stringWidth(item.name) > titleWidth
15
+ || Boolean(item.description && wrapDisplayText(item.description, Math.max(1, width - 4)).length > 1);
16
+ }
17
+ function contentLines(item, width) {
18
+ const columns = Math.max(1, width - 4);
19
+ const lines = [];
20
+ const add = (text, kind) => {
21
+ for (const part of wrapDisplayText(text, columns))
22
+ lines.push({ text: part, kind });
23
+ };
24
+ if (item.descriptionState !== 'issue' && item.description) {
25
+ const wrapped = wrapDisplayText(item.description, columns);
26
+ add(wrapped.length > 1
27
+ ? `${wrapDisplayText(item.description, Math.max(1, columns - 1))[0]}…`
28
+ : wrapped[0], 'description');
29
+ }
30
+ add(item.tools.length ? item.tools.map((tool) => `[${tool}]`).join(' ') : '[工具未确认]', 'fact');
31
+ if (item.issue) {
32
+ add('! 简介读取问题 · Enter 查看原因', 'issue');
33
+ }
34
+ return lines;
35
+ }
36
+ export function contentItemCardLayout(item, width) {
37
+ const factRows = contentLines(item, width).length;
38
+ return { headerHeight: 1, factRows, fullHeight: factRows + 2,
39
+ sections: [{ key: item.id, offset: 0, height: factRows }] };
40
+ }
41
+ export function ContentItemCard(props) {
42
+ const lines = contentLines(props.item, props.width);
43
+ const offset = Math.min(Math.max(0, props.lineOffset ?? 0), Math.max(0, lines.length - 1));
44
+ const visible = lines.slice(offset, props.lineLimit === undefined
45
+ ? undefined : offset + Math.max(1, props.lineLimit));
46
+ return _jsxs(ObjectCardFrame, { width: props.width, title: props.item.name, headerMeta: contentTypeLabels[props.item.type], focused: props.focused, children: [offset > 0 ? _jsx(Text, { color: tuiTheme.colors.muted, children: "\u2191 \u524D\u9762\u8FD8\u6709\u4FE1\u606F" }) : null, visible.map((line, index) => _jsx(Box, { children: _jsx(Text, { color: line.kind === 'issue' ? tuiTheme.statusColors.warning
47
+ : line.kind === 'description' ? tuiTheme.colors.muted : tuiTheme.colors.text, children: line.text }) }, `${offset}:${index}`)), offset + visible.length < lines.length
48
+ ? _jsx(Text, { color: tuiTheme.colors.muted, children: "\u2193 \u540E\u9762\u8FD8\u6709\u4FE1\u606F" }) : null] });
49
+ }
50
+ export { entityCardWindowHeight as contentItemCardWindowHeight };
51
+ //# sourceMappingURL=content-item-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-item-card.js","sourceRoot":"","sources":["../../../src/tui/content-item-card.tsx"],"names":[],"mappings":"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"}
@@ -916,6 +916,11 @@ export function createTuiControllerDependencies(context, progressFeed, options =
916
916
  evidence: 'unavailable',
917
917
  items: [],
918
918
  notices: ['当前无法安全读取这个插件的目录内容。请检查来源状态后重试。'],
919
+ coverage: 'unavailable',
920
+ coverageIssue: {
921
+ code: 'unreadable',
922
+ message: '当前无法安全读取这个插件的目录内容。请检查来源状态后重试。',
923
+ },
919
924
  };
920
925
  }
921
926
  };
@@ -945,6 +950,23 @@ export function createTuiControllerDependencies(context, progressFeed, options =
945
950
  || JSON.stringify(batchBase.source) !== JSON.stringify(current.source))) {
946
951
  throw operationReviewStale('准备设置批次期间 Catalog 或来源发生变化。');
947
952
  }
953
+ for (const expected of Object.values(group.editEvidence ?? {})) {
954
+ if (expected.sourceIdentity !== current.source.sourceIdentity
955
+ || expected.schemaIdentity !== current.config.schemaIdentity) {
956
+ throw operationReviewStale('编辑期间插件来源或设置定义已变化,请重新打开列表。');
957
+ }
958
+ for (const scope of ['user', 'project']) {
959
+ if (expected.storeDigests[scope] === undefined)
960
+ continue;
961
+ const currentDigest = await configLayerStoreDigest({
962
+ source: current.source, pluginName: parsePluginId(intent.pluginId).pluginName,
963
+ scope, cwd: context.cwd, env: context.env,
964
+ });
965
+ if (expected.storeDigests[scope] !== currentDigest) {
966
+ throw operationReviewStale('编辑期间设置已被外部修改,请重新打开列表。');
967
+ }
968
+ }
969
+ }
948
970
  batchBase ??= current;
949
971
  batchCatalogOperation ??= catalogOperationByEvidence.get(current);
950
972
  groupEvidence.push({
@@ -1846,11 +1868,15 @@ export function createTuiControllerDependencies(context, progressFeed, options =
1846
1868
  signal?.throwIfAborted();
1847
1869
  if (intent.action === 'cleanup') {
1848
1870
  const groups = [];
1871
+ const reviewedRemovedPlugins = new Set();
1849
1872
  for (const group of selection.groups) {
1850
1873
  signal?.throwIfAborted();
1874
+ const requestedPluginIds = group.requestedPluginIds.filter((pluginId) => !reviewedRemovedPlugins.has(pluginId));
1875
+ if (requestedPluginIds.length === 0)
1876
+ continue;
1851
1877
  const preview = await runBatchWriteGroup({
1852
1878
  intent,
1853
- group,
1879
+ group: { ...group, requestedPluginIds },
1854
1880
  cwd: context.cwd,
1855
1881
  runtime: {
1856
1882
  ...context,
@@ -1862,7 +1888,11 @@ export function createTuiControllerDependencies(context, progressFeed, options =
1862
1888
  } : {}),
1863
1889
  },
1864
1890
  });
1865
- groups.push({ ...group, preview, executable: preview.operationPlan !== undefined });
1891
+ for (const pluginId of preview.removedPluginCleanupIds ?? []) {
1892
+ reviewedRemovedPlugins.add(pluginId);
1893
+ }
1894
+ groups.push({ ...group, requestedPluginIds, preview,
1895
+ executable: preview.operationPlan !== undefined });
1866
1896
  }
1867
1897
  await preparation?.reporter.emit('evidence');
1868
1898
  signal?.throwIfAborted();
@@ -2025,6 +2055,9 @@ export function createTuiControllerDependencies(context, progressFeed, options =
2025
2055
  },
2026
2056
  operationPlan: preview.operationPlan,
2027
2057
  offlineCleanupPlans,
2058
+ ...(preview.removedPluginCleanupIds
2059
+ ? { removedPluginCleanupIds: preview.removedPluginCleanupIds }
2060
+ : {}),
2028
2061
  ...(offlineCleanupPlans.length === 1
2029
2062
  ? { offlineCleanup: offlineCleanupPlans[0] }
2030
2063
  : {}),
@@ -2740,7 +2773,7 @@ export function createTuiControllerDependencies(context, progressFeed, options =
2740
2773
  ...(sessionContextForPlugin(pluginId)
2741
2774
  ? { operationContext: sessionContextForPlugin(pluginId) }
2742
2775
  : {}),
2743
- consume: async ({ plugin }) => {
2776
+ consume: async ({ plugin, source }) => {
2744
2777
  if (!plugin.manifest.config) {
2745
2778
  throw new TuiOperationBlockedError('configSchemaUnavailable', '这个插件没有设置 schema。');
2746
2779
  }
@@ -2792,7 +2825,7 @@ export function createTuiControllerDependencies(context, progressFeed, options =
2792
2825
  const layerStore = layer.scope === 'effective'
2793
2826
  ? undefined
2794
2827
  : layer.scope === 'user' ? userStore : projectStore;
2795
- return buildConfigPage({
2828
+ const page = buildConfigPage({
2796
2829
  pluginId,
2797
2830
  schema: plugin.manifest.config,
2798
2831
  read,
@@ -2808,6 +2841,14 @@ export function createTuiControllerDependencies(context, progressFeed, options =
2808
2841
  ? target.refreshKeys
2809
2842
  : [])),
2810
2843
  });
2844
+ return { ...page, editEvidence: {
2845
+ sourceIdentity: source.sourceIdentity,
2846
+ schemaIdentity: source.manifestDigest,
2847
+ storeDigests: {
2848
+ user: digest({ exists: userStore.exists, rawDigest: userStore.rawDigest }),
2849
+ ...(projectStore ? { project: digest({ exists: projectStore.exists, rawDigest: projectStore.rawDigest }) } : {}),
2850
+ },
2851
+ } };
2811
2852
  },
2812
2853
  });
2813
2854
  },