needware-cli 1.2.8 → 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.
- package/EXAMPLES.md +241 -0
- package/README.md +70 -5
- package/dist/commands/agent.d.ts +4 -0
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +105 -6
- package/dist/commands/agent.js.map +1 -1
- package/dist/core/cli.js +1 -1
- package/dist/core/cli.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/prompt.d.ts +30 -0
- package/dist/types/prompt.d.ts.map +1 -0
- package/dist/types/prompt.js +5 -0
- package/dist/types/prompt.js.map +1 -0
- package/dist/utils/prompt-parser.d.ts +22 -0
- package/dist/utils/prompt-parser.d.ts.map +1 -0
- package/dist/utils/prompt-parser.js +148 -0
- package/dist/utils/prompt-parser.js.map +1 -0
- package/examples/sdk-message-example.json +10 -0
- package/install.sh +528 -0
- package/package.json +1 -1
- package/AGENT_COMMAND_SUMMARY.md +0 -364
- package/CHANGELOG.md +0 -172
- package/FEATURE_INTERACTIVE_MODE.md +0 -304
- package/INTERACTIVE_EXAMPLE.md +0 -306
- package/PROJECT_SUMMARY.md +0 -435
- package/QUICK_START.md +0 -216
- package/SETUP.md +0 -315
|
@@ -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 @@
|
|
|
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":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAkB;IAClD,uBAAuB;IACvB,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,eAAe;IACf,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,YAAY;QACZ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/E,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACvC,OAAO,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;QAED,YAAY;QACZ,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;YACpB,aAAa,EAAE,KAAK;SACrB,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAEjD,mCAAmC;IACnC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,YAAY;IACZ,OAAO;QACL,MAAM,EAAE,OAAO;QACf,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAoB;IAC/C,oBAAoB;IACpB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACxC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,wBAAwB;QACxB,UAAU,GAAG,OAAO,CAAC,OAAO;aACzB,MAAM,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,IAAI,EAAE;QACzB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CACxC,SAAiB,EACjB,aAAsB;IAEtB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM;YACJ,UAAU,EAAE,SAAS;YACrB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE;YACxD,kBAAkB,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAQ;IAC/B,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAQ;IAChC,OAAO,CACL,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,MAAM,IAAI,GAAG;QACb,GAAG,CAAC,IAAI,KAAK,MAAM;QACnB,SAAS,IAAI,GAAG;QAChB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,YAAY,IAAI,GAAG;QACnB,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CACnC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAc;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEzB,gCAAgC;IAChC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
|