needware-cli 1.2.7 → 1.2.9

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.
@@ -5,4 +5,5 @@ export * from './command.js';
5
5
  export * from './config.js';
6
6
  export * from './error.js';
7
7
  export type { SDKConfig, SDKHealthStatus, SDKMetadata } from './sdk.js';
8
+ export * from './prompt.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxE,cAAc,aAAa,CAAC"}
@@ -4,4 +4,5 @@
4
4
  export * from './command.js';
5
5
  export * from './config.js';
6
6
  export * from './error.js';
7
+ export * from './prompt.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAE3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Prompt 类型定义
3
+ */
4
+ import { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk';
5
+ /**
6
+ * Prompt 输入类型
7
+ *
8
+ * 支持两种格式:
9
+ * 1. string - 普通文本或文件路径(自动识别)
10
+ * 2. SDKUserMessage - 符合 SDK 标准的消息对象
11
+ */
12
+ export type PromptInput = string | SDKUserMessage | AsyncIterable<SDKUserMessage>;
13
+ /**
14
+ * Prompt 解析结果
15
+ */
16
+ export interface ParsedPrompt {
17
+ /**
18
+ * 解析后的 prompt(可以是字符串或消息流)
19
+ */
20
+ prompt: string | AsyncIterable<SDKUserMessage>;
21
+ /**
22
+ * 会话 ID(从 SDKUserMessage 中提取)
23
+ */
24
+ sessionId?: string;
25
+ /**
26
+ * 是否为交互式模式
27
+ */
28
+ isInteractive: boolean;
29
+ }
30
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/types/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,cAAc,GACd,aAAa,CAAC,cAAc,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAE/C;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Prompt 类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/types/prompt.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Prompt 解析工具
3
+ */
4
+ import { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk';
5
+ import { PromptInput, ParsedPrompt } from '../types/prompt.js';
6
+ /**
7
+ * 解析 Prompt 输入(自动判断类型)
8
+ *
9
+ * 支持两种格式:
10
+ * 1. 字符串 - 普通文本或文件路径(自动识别)
11
+ * 2. SDKUserMessage JSON - 符合 SDK 标准的消息对象
12
+ */
13
+ export declare function parsePrompt(input: PromptInput): Promise<ParsedPrompt>;
14
+ /**
15
+ * 将字符串转换为消息流(用于交互式模式)
16
+ */
17
+ export declare function createMessageStream(sessionId: string, initialPrompt?: string): AsyncGenerator<SDKUserMessage>;
18
+ /**
19
+ * 从命令行参数解析 Prompt(自动判断类型)
20
+ */
21
+ export declare function parsePromptFromArgs(args: string[]): Promise<ParsedPrompt>;
22
+ //# sourceMappingURL=prompt-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-parser.d.ts","sourceRoot":"","sources":["../../src/utils/prompt-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI/D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA2C3E;AA8DD;;GAEG;AACH,wBAAuB,mBAAmB,CACxC,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,cAAc,CAAC,cAAc,CAAC,CAShC;AAyBD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAS/E"}
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Prompt 解析工具
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ /**
7
+ * 解析 Prompt 输入(自动判断类型)
8
+ *
9
+ * 支持两种格式:
10
+ * 1. 字符串 - 普通文本或文件路径(自动识别)
11
+ * 2. SDKUserMessage JSON - 符合 SDK 标准的消息对象
12
+ */
13
+ export async function parsePrompt(input) {
14
+ // 如果是异步迭代器(交互式模式),直接返回
15
+ if (isAsyncIterable(input)) {
16
+ return {
17
+ prompt: input,
18
+ isInteractive: true,
19
+ };
20
+ }
21
+ // 如果是字符串,进一步判断
22
+ if (typeof input === 'string') {
23
+ // 检查是否是文件路径
24
+ if (input.endsWith('.txt') || input.endsWith('.json') || input.endsWith('.md')) {
25
+ if (fs.existsSync(path.resolve(input))) {
26
+ return await parsePromptFromFile(input);
27
+ }
28
+ }
29
+ // 尝试解析为 SDKUserMessage JSON
30
+ if (input.trim().startsWith('{')) {
31
+ try {
32
+ const data = JSON.parse(input);
33
+ if (isSDKUserMessage(data)) {
34
+ return parseSDKUserMessage(data);
35
+ }
36
+ }
37
+ catch {
38
+ // 不是有效的 JSON,继续作为普通字符串处理
39
+ }
40
+ }
41
+ // 作为普通字符串处理
42
+ return {
43
+ prompt: input.trim(),
44
+ isInteractive: false,
45
+ };
46
+ }
47
+ // 如果是 SDKUserMessage 对象
48
+ if (isSDKUserMessage(input)) {
49
+ return parseSDKUserMessage(input);
50
+ }
51
+ throw new Error(`Unsupported prompt input type: ${typeof input}`);
52
+ }
53
+ /**
54
+ * 从文件读取 Prompt
55
+ */
56
+ async function parsePromptFromFile(filePath) {
57
+ const resolvedPath = path.resolve(filePath);
58
+ if (!fs.existsSync(resolvedPath)) {
59
+ throw new Error(`Prompt file not found: ${resolvedPath}`);
60
+ }
61
+ const content = fs.readFileSync(resolvedPath, 'utf-8').trim();
62
+ const ext = path.extname(filePath).toLowerCase();
63
+ // 如果是 JSON 文件,尝试解析为 SDKUserMessage
64
+ if (ext === '.json') {
65
+ try {
66
+ const data = JSON.parse(content);
67
+ if (isSDKUserMessage(data)) {
68
+ return parseSDKUserMessage(data);
69
+ }
70
+ throw new Error('JSON file must contain a valid SDKUserMessage object');
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Invalid JSON in prompt file: ${error instanceof Error ? error.message : 'Unknown error'}`);
74
+ }
75
+ }
76
+ // 否则作为纯文本处理
77
+ return {
78
+ prompt: content,
79
+ isInteractive: false,
80
+ };
81
+ }
82
+ /**
83
+ * 解析 SDKUserMessage
84
+ */
85
+ function parseSDKUserMessage(data) {
86
+ // 从 message 中提取文本内容
87
+ const message = data.message;
88
+ let promptText = '';
89
+ if (typeof message.content === 'string') {
90
+ promptText = message.content;
91
+ }
92
+ else if (Array.isArray(message.content)) {
93
+ // 如果 content 是数组,提取文本部分
94
+ promptText = message.content
95
+ .filter((item) => item.type === 'text')
96
+ .map((item) => item.text)
97
+ .join('\n');
98
+ }
99
+ return {
100
+ prompt: promptText.trim(),
101
+ sessionId: data.session_id,
102
+ isInteractive: false,
103
+ };
104
+ }
105
+ /**
106
+ * 将字符串转换为消息流(用于交互式模式)
107
+ */
108
+ export async function* createMessageStream(sessionId, initialPrompt) {
109
+ if (initialPrompt) {
110
+ yield {
111
+ session_id: sessionId,
112
+ type: 'user',
113
+ message: { role: 'user', content: initialPrompt.trim() },
114
+ parent_tool_use_id: null,
115
+ };
116
+ }
117
+ }
118
+ /**
119
+ * 类型守卫:检查是否为 AsyncIterable
120
+ */
121
+ function isAsyncIterable(obj) {
122
+ return obj && typeof obj[Symbol.asyncIterator] === 'function';
123
+ }
124
+ /**
125
+ * 类型守卫:检查是否为 SDKUserMessage
126
+ */
127
+ function isSDKUserMessage(obj) {
128
+ return (obj &&
129
+ typeof obj === 'object' &&
130
+ 'type' in obj &&
131
+ obj.type === 'user' &&
132
+ 'message' in obj &&
133
+ typeof obj.message === 'object' &&
134
+ 'session_id' in obj &&
135
+ typeof obj.session_id === 'string');
136
+ }
137
+ /**
138
+ * 从命令行参数解析 Prompt(自动判断类型)
139
+ */
140
+ export async function parsePromptFromArgs(args) {
141
+ if (args.length === 0) {
142
+ throw new Error('No prompt provided');
143
+ }
144
+ const firstArg = args[0];
145
+ // 使用统一的 parsePrompt 函数,它会自动判断类型
146
+ return parsePrompt(firstArg);
147
+ }
148
+ //# sourceMappingURL=prompt-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-parser.js","sourceRoot":"","sources":["../../src/utils/prompt-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ {
2
+ "type": "user",
3
+ "session_id": "my-session-123",
4
+ "message": {
5
+ "role": "user",
6
+ "content": "创建一个简单的计数器组件,包含增加、减少和重置按钮"
7
+ },
8
+ "parent_tool_use_id": null
9
+ }
10
+