@intra-mart/accel 0.1.0 → 0.3.0-next.202605250439

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 (44) hide show
  1. package/README.md +67 -5
  2. package/assets/assets.tar.gz +0 -0
  3. package/dist/asset/deployer.d.ts +13 -0
  4. package/dist/asset/deployer.js +84 -13
  5. package/dist/asset/walker.js +2 -0
  6. package/dist/commands/attach.d.ts +9 -0
  7. package/dist/commands/attach.js +84 -3
  8. package/dist/commands/deploy.d.ts +26 -0
  9. package/dist/commands/deploy.js +188 -0
  10. package/dist/commands/init.d.ts +4 -0
  11. package/dist/commands/init.js +20 -1
  12. package/dist/core/condition-evaluator.js +7 -1
  13. package/dist/core/constants.d.ts +2 -0
  14. package/dist/core/constants.js +8 -1
  15. package/dist/core/types.d.ts +51 -1
  16. package/dist/core/types.js +2 -0
  17. package/dist/core/validators.d.ts +2 -1
  18. package/dist/core/validators.js +58 -25
  19. package/dist/core/variable-interpolator.js +1 -0
  20. package/dist/deploy/api-client.d.ts +15 -0
  21. package/dist/deploy/api-client.js +81 -0
  22. package/dist/deploy/target-scanner.d.ts +5 -0
  23. package/dist/deploy/target-scanner.js +20 -0
  24. package/dist/i18n/en.js +80 -4
  25. package/dist/i18n/ja.js +83 -7
  26. package/dist/i18n/zh_CN.js +83 -7
  27. package/dist/index.js +2 -0
  28. package/dist/interactive/credentials-prompts.d.ts +2 -0
  29. package/dist/interactive/credentials-prompts.js +43 -0
  30. package/dist/interactive/format.d.ts +2 -0
  31. package/dist/interactive/format.js +33 -0
  32. package/dist/interactive/next-steps.d.ts +8 -0
  33. package/dist/interactive/next-steps.js +22 -0
  34. package/dist/interactive/progress.d.ts +2 -0
  35. package/dist/interactive/progress.js +21 -0
  36. package/dist/interactive/prompts.d.ts +1 -0
  37. package/dist/interactive/prompts.js +74 -15
  38. package/dist/interactive/summary.d.ts +3 -0
  39. package/dist/interactive/summary.js +58 -0
  40. package/dist/utils/credentials.d.ts +5 -0
  41. package/dist/utils/credentials.js +25 -0
  42. package/dist/utils/gitignore.d.ts +1 -0
  43. package/dist/utils/gitignore.js +23 -0
  44. package/package.json +2 -2
package/dist/i18n/en.js CHANGED
@@ -1,16 +1,30 @@
1
1
  export const messages = {
2
+ "intro.init": "Generate an iAP (intra-mart Accel Platform) project and\nassets for Claude Code / GitHub Copilot.\nA few questions follow; everything is then deployed in one go.",
3
+ "intro.attach": "Mark the current directory as an iAP project and\ndeploy assets for Claude Code / GitHub Copilot.\nA few questions follow; everything is then deployed in one go.",
2
4
  "prompt.name": "Enter project name",
5
+ "prompt.name.hint": "Used as the directory name and recorded in pom.xml <name> and package.json name\nProvide a concise name that represents the system or feature you are creating (e.g. customer-portal, invoice-management)",
3
6
  "prompt.artifactId": "Enter artifact ID (Maven artifactId)",
7
+ "prompt.artifactId.hint": "Recorded in pom.xml as the Maven artifactId (the artifact's identifier)\nThe identifier that forms the built artifact's file name (jar/war) and Maven coordinates. Defaults to the project name; change only if you want a different identifier",
4
8
  "prompt.jugglingProject": "Enter IM-Juggling project path (optional)",
9
+ "prompt.jugglingProject.hint": "If set, the iAP version and modules are auto-detected from juggling.im\nPath to an existing IM-Juggling project directory you want to link; leave empty to skip (e.g. ../customer-portal-juggling)",
5
10
  "prompt.accelplatformVersion": "Select iAP version",
11
+ "prompt.accelplatformVersion.hint": "iAP release version. The deployed assets (CLAUDE.md, etc.) adapt to this version",
6
12
  "prompt.modules": "Select modules to use",
13
+ "prompt.modules.hint": "iAP optional product modules. Each selection deploys matching skills, config, and CLAUDE.md sections",
7
14
  "prompt.group": "Enter group name",
15
+ "prompt.group.hint": "Recorded in pom.xml as the Maven groupId (dot-separated organization identifier)\nAn identifier for your organization or team; reverse-domain notation reduces collisions (e.g. com.example, jp.co.intramart.app)",
8
16
  "prompt.projectVersion": "Enter project version",
17
+ "prompt.projectVersion.hint": "Recorded in pom.xml <version> and package.json version\nThe release version of your project; Semantic Versioning (MAJOR.MINOR.PATCH) is common (e.g. 0.1.0, 1.0.0-SNAPSHOT)",
9
18
  "prompt.description": "Enter project description",
19
+ "prompt.description.hint": "Recorded in pom.xml <description> and used in headers of CLAUDE.md and similar files\nA short description of what this system does; being specific helps future readers and search (e.g. Portal to manage customer information)",
10
20
  "prompt.database": "Select database",
21
+ "prompt.database.hint": "The DB iAP connects to. Used to generate sample config and example connection strings in assets",
11
22
  "prompt.javascript": "Use JavaScript instead of TypeScript?",
23
+ "prompt.javascript.hint": "Affects the whole project setup (presence of tsconfig.json, pom.xml / package.json dependencies and scripts, agent asset language guidance)",
12
24
  "prompt.agent": "Select agent",
25
+ "prompt.agent.hint": "claude-code deploys under .claude/, github-copilot deploys under .github/ (instructions, skills, etc.)",
13
26
  "prompt.withGit": "Initialize Git repository?",
27
+ "prompt.withGit.hint": "Runs git init inside the created project directory",
14
28
  "juggling.detected.version": "Detected version from juggling.im: {version}",
15
29
  "juggling.detected.modules": "Detected modules from juggling.im: {modules}",
16
30
  "juggling.notFound": "juggling.im not found at specified path: {path}",
@@ -19,6 +33,13 @@ export const messages = {
19
33
  "warning.gitNotFound": "git command not found. Skipping Git initialization.",
20
34
  "warning.fileExists": "File already exists, skipping: {path}",
21
35
  "attach.skipSummary": "{count} file(s) were skipped because they already exist.",
36
+ "attach.overwritePrompt": "{path} already exists. Overwrite?",
37
+ "attach.overwritePrompt.yes": "Yes (overwrite this file)",
38
+ "attach.overwritePrompt.no": "No (skip this file)",
39
+ "attach.overwritePrompt.all": "All (overwrite all remaining)",
40
+ "attach.overwritePrompt.skipAll": "Skip-all (skip all remaining)",
41
+ "attach.overwritten": "Overwritten: {path}",
42
+ "attach.overwriteSummary": "{count} file(s) overwritten.",
22
43
  "detach.confirm": "Detach Accel CLI from this project. Are you sure?",
23
44
  "detach.deleted": "Deleted: {path}",
24
45
  "detach.skipped": "Skipped: {path} (modifications detected)",
@@ -33,13 +54,68 @@ export const messages = {
33
54
  "error.invalidModule": "Invalid module: {module}",
34
55
  "error.invalidDatabase": "Invalid database: {database}",
35
56
  "error.invalidAgent": "Invalid agent: {agent}",
57
+ "error.invalidPackageManager": "Invalid package manager (expected one of bun, npm, yarn, pnpm): {packageManager}",
36
58
  "error.invalidName": "Project name contains invalid characters for a directory name, or is empty: {value}",
37
59
  "error.invalidArtifactId": "Artifact ID violates Maven naming rules (^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
38
60
  "error.invalidGroup": "Group name violates Maven groupId naming rules (dot-separated Java identifiers): {value}",
39
61
  "error.invalidProjectVersion": "Project version violates Maven version naming rules (^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
40
- "progress.downloading": "Downloading assets...",
41
- "progress.deploying": "Deploying assets...",
42
- "progress.installing": "Installing dependencies...",
43
- "progress.gitInit": "Initializing Git repository...",
62
+ "summary.heading": "Deployment settings",
63
+ "summary.label.name": "Project name",
64
+ "summary.label.artifactId": "Artifact ID",
65
+ "summary.label.group": "Group",
66
+ "summary.label.projectVersion": "Project version",
67
+ "summary.label.description": "Description",
68
+ "summary.label.accelplatformVersion": "iAP version",
69
+ "summary.label.modules": "Modules",
70
+ "summary.label.database": "Database",
71
+ "summary.label.javascript": "JavaScript",
72
+ "summary.label.agents": "Agents",
73
+ "summary.label.locale": "Locale",
74
+ "summary.label.packageManager": "Package manager",
75
+ "summary.label.jugglingProject": "IM-Juggling project",
76
+ "summary.outputDir": "Output directory",
77
+ "summary.empty": "(none)",
78
+ "progress.fetching": "Fetching asset repository...",
79
+ "progress.deploying.section": "Deploying under {section} ({files})",
80
+ "progress.deploying.root": "Deploying root-level files ({files})",
81
+ "progress.installing": "Running {command}...",
82
+ "progress.building": "Running {command}...",
83
+ "progress.gitInit": "Running git init...",
44
84
  "progress.complete": "Project creation complete.",
85
+ "nextSteps.heading": "Next steps",
86
+ "nextSteps.cd": "cd {path}",
87
+ "nextSteps.agent.claudeCode": "Run claude to start agent-driven development",
88
+ "nextSteps.agent.githubCopilot": "Run gh copilot to start agent-driven development",
89
+ "credentials.prompt.endpoint": "Enter the iAP endpoint (base URL)",
90
+ "credentials.prompt.endpoint.hint": "Specify the iAP base URL (e.g. https://example.com/imart). The API path (/api/bearer/...) is assembled automatically",
91
+ "credentials.prompt.apiKey": "Enter the API key (OAuth Bearer token)",
92
+ "credentials.prompt.apiKey.hint": "iAP OAuth token (scope: development). Saved to .accel/credentials.json and added to .gitignore",
93
+ "credentials.error.required": "A value is required",
94
+ "deploy.intro": "Accel CLI - deploy",
95
+ "deploy.progress.fetchingStagings": "Fetching staging environments...",
96
+ "deploy.progress.deploying": "Deploying...",
97
+ "deploy.selectStaging": "Select the target staging environment",
98
+ "deploy.selectZip": "Select the file to deploy",
99
+ "deploy.descriptionPrompt": "Enter a deployment description (optional)",
100
+ "deploy.confirm": "Deploy with the following settings. Continue?",
101
+ "deploy.confirm.endpoint": "Endpoint",
102
+ "deploy.confirm.stagingId": "Staging",
103
+ "deploy.confirm.sourceFile": "Source file",
104
+ "deploy.confirm.sentAs": "Sent as",
105
+ "deploy.result.deployId": "Deploy ID",
106
+ "deploy.result.stagingId": "Staging",
107
+ "deploy.result.status": "Status",
108
+ "deploy.result.createDate": "Created at",
109
+ "deploy.success": "Deployment complete.",
110
+ "deploy.cancelled": "Deployment cancelled.",
111
+ "deploy.error.noStagings": "No staging environments found. Create a staging environment on the iAP side first.",
112
+ "deploy.error.noTargetZip": "No deployable zip found under ./target/. Run a build (e.g. mvn package) first.",
113
+ "deploy.error.network": "Could not connect to iAP: {message}",
114
+ "deploy.error.server": "iAP returned an error: {message}",
115
+ "deploy.error.unauthorized": "Authentication failed (401). Check that the API key is correct.",
116
+ "deploy.error.forbidden": "Access denied (403). Check your permissions for this staging.",
117
+ "deploy.error.notFound": "Staging not found (404). Create the staging environment beforehand.",
118
+ "deploy.error.badRequest": "Bad request (400).",
119
+ "deploy.error.serverError": "A server error occurred (500).",
120
+ "deploy.error.unexpectedResponse": "Received an unexpected response (HTTP {status}).",
45
121
  };
package/dist/i18n/ja.js CHANGED
@@ -1,16 +1,30 @@
1
1
  export const messages = {
2
+ "intro.init": "iAP(intra-mart Accel Platform)プロジェクトと、\nClaude Code / GitHub Copilot 向けの資材を生成します。\nいくつか質問した後、最後に一括で配備します。",
3
+ "intro.attach": "カレントディレクトリを iAP プロジェクトとして認識させ、\nClaude Code / GitHub Copilot 向けの資材を配備します。\nいくつか質問した後、最後に一括で配備します。",
2
4
  "prompt.name": "プロジェクト名を入力してください",
5
+ "prompt.name.hint": "ディレクトリ名、pom.xml の <name>、package.json の name に反映されます\n作成するシステムや機能を端的に表す名称を指定してください(例: customer-portal, invoice-management)",
3
6
  "prompt.artifactId": "アーティファクトID(pomのartifactId)を入力してください",
7
+ "prompt.artifactId.hint": "Maven の artifactId として pom.xml に記録されます(成果物のID)\n成果物 (jar/war 等) のファイル名や、Maven で依存関係を識別するための ID の一部として使われます。デフォルトはプロジェクト名と同じ値で、別の識別子を使いたい場合のみ変更してください",
4
8
  "prompt.jugglingProject": "IM-Jugglingプロジェクトのパスを入力してください(省略可)",
9
+ "prompt.jugglingProject.hint": "指定すると juggling.im から iAPバージョンとモジュールを自動検出します\n連携したい既存の IM-Juggling プロジェクトのディレクトリパスを指定してください(例: ../customer-portal-juggling)",
5
10
  "prompt.accelplatformVersion": "iAPバージョンを選択してください",
11
+ "prompt.accelplatformVersion.hint": "iAP本体のリリース版。配備される資材(CLAUDE.md 等)の内容がこのバージョンに合わせて変化します",
6
12
  "prompt.modules": "利用するモジュールを選択してください",
13
+ "prompt.modules.hint": "iAP のオプション製品群。選択したモジュール向けの Skill や設定ファイル、CLAUDE.md 内のセクションが配備されます",
7
14
  "prompt.group": "グループ名を入力してください",
15
+ "prompt.group.hint": "Maven の groupId として pom.xml に記録されます(組織を表すドット区切り名)\n所属する組織やチームを表す識別子。逆ドメイン記法で書くと他者と衝突しにくいです(例: com.example, jp.co.intramart.app)",
8
16
  "prompt.projectVersion": "プロジェクトバージョンを入力してください",
17
+ "prompt.projectVersion.hint": "pom.xml の <version> と package.json の version に反映されます\nプロジェクトのリリースバージョン。セマンティックバージョニング(MAJOR.MINOR.PATCH)が一般的です(例: 0.1.0, 1.0.0-SNAPSHOT)",
9
18
  "prompt.description": "プロジェクトの説明を入力してください",
19
+ "prompt.description.hint": "pom.xml の <description> や CLAUDE.md 等のヘッダに反映されます\nこのシステムが何をするものかの簡潔な説明。具体的に書くと後で読む人や検索の助けになります(例: 顧客情報を管理するポータルサイト)",
10
20
  "prompt.database": "データベースを選択してください",
21
+ "prompt.database.hint": "iAP が接続する DB。資材内のサンプル設定や接続文字列の例の生成に使われます",
11
22
  "prompt.javascript": "TypeScriptの代わりにJavaScriptを利用しますか?",
23
+ "prompt.javascript.hint": "プロジェクト全体の構成(tsconfig.json の有無、pom.xml / package.json の依存・スクリプト、エージェント資材内の言語ガイド)に影響します",
12
24
  "prompt.agent": "エージェントを選択してください",
25
+ "prompt.agent.hint": "claude-code → .claude/ 配下、github-copilot → .github/ 配下に、指示書や skills などを配備します",
13
26
  "prompt.withGit": "Gitリポジトリを初期化しますか?",
27
+ "prompt.withGit.hint": "作成したプロジェクトディレクトリで git init を実行します",
14
28
  "juggling.detected.version": "juggling.imからバージョンを検出: {version}",
15
29
  "juggling.detected.modules": "juggling.imからモジュールを検出: {modules}",
16
30
  "juggling.notFound": "指定されたパスにjuggling.imが見つかりません: {path}",
@@ -19,6 +33,13 @@ export const messages = {
19
33
  "warning.gitNotFound": "gitコマンドが見つかりません。Git初期化をスキップします。",
20
34
  "warning.fileExists": "既存ファイルのためスキップ: {path}",
21
35
  "attach.skipSummary": "{count}件のファイルは既に存在したためスキップしました。",
36
+ "attach.overwritePrompt": "{path} は既に存在します。上書きしますか?",
37
+ "attach.overwritePrompt.yes": "Yes (このファイルを上書き)",
38
+ "attach.overwritePrompt.no": "No (このファイルをスキップ)",
39
+ "attach.overwritePrompt.all": "All (以降全て上書き)",
40
+ "attach.overwritePrompt.skipAll": "Skip-all (以降全てスキップ)",
41
+ "attach.overwritten": "上書き: {path}",
42
+ "attach.overwriteSummary": "{count}件のファイルを上書きしました。",
22
43
  "detach.confirm": "このプロジェクトからAccel CLIを解除します。よろしいですか?",
23
44
  "detach.deleted": "削除: {path}",
24
45
  "detach.skipped": "スキップ: {path} (変更が検出されました)",
@@ -33,13 +54,68 @@ export const messages = {
33
54
  "error.invalidModule": "無効なモジュールです: {module}",
34
55
  "error.invalidDatabase": "無効なデータベースです: {database}",
35
56
  "error.invalidAgent": "無効なエージェントです: {agent}",
57
+ "error.invalidPackageManager": "無効なパッケージマネージャです(bun, npm, yarn, pnpm のいずれかを指定してください): {packageManager}",
36
58
  "error.invalidName": "プロジェクト名にディレクトリ名として使用できない文字が含まれています、または空です: {value}",
37
- "error.invalidArtifactId": "アーティファクトIDが Maven の規約に違反しています(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
38
- "error.invalidGroup": "グループ名が Maven groupId の規約に違反しています(ドット区切りのJava識別子): {value}",
39
- "error.invalidProjectVersion": "プロジェクトバージョンが Maven version の規約に違反しています(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
40
- "progress.downloading": "資材をダウンロードしています...",
41
- "progress.deploying": "資材を配備しています...",
42
- "progress.installing": "依存関係をインストールしています...",
43
- "progress.gitInit": "Gitリポジトリを初期化しています...",
59
+ "error.invalidArtifactId": "アーティファクトIDが Maven の規約に違反しています(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
60
+ "error.invalidGroup": "グループ名が Maven groupId の規約に違反しています(ドット区切りのJava識別子): {value}",
61
+ "error.invalidProjectVersion": "プロジェクトバージョンが Maven version の規約に違反しています(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
62
+ "summary.heading": "配備設定",
63
+ "summary.label.name": "プロジェクト名",
64
+ "summary.label.artifactId": "アーティファクトID",
65
+ "summary.label.group": "グループ",
66
+ "summary.label.projectVersion": "プロジェクトバージョン",
67
+ "summary.label.description": "説明",
68
+ "summary.label.accelplatformVersion": "iAPバージョン",
69
+ "summary.label.modules": "モジュール",
70
+ "summary.label.database": "データベース",
71
+ "summary.label.javascript": "JavaScript",
72
+ "summary.label.agents": "エージェント",
73
+ "summary.label.locale": "ロケール",
74
+ "summary.label.packageManager": "パッケージマネージャ",
75
+ "summary.label.jugglingProject": "IM-Jugglingプロジェクト",
76
+ "summary.outputDir": "出力先",
77
+ "summary.empty": "(なし)",
78
+ "progress.fetching": "資材リポジトリを取得しています...",
79
+ "progress.deploying.section": "{section} 配下を配備中 ({files})",
80
+ "progress.deploying.root": "ルート直下を配備中 ({files})",
81
+ "progress.installing": "{command} を実行しています...",
82
+ "progress.building": "{command} を実行しています...",
83
+ "progress.gitInit": "git init を実行しています...",
44
84
  "progress.complete": "プロジェクトの作成が完了しました。",
85
+ "nextSteps.heading": "次の手順",
86
+ "nextSteps.cd": "cd {path}",
87
+ "nextSteps.agent.claudeCode": "claude を起動してエージェント開発を始めてください",
88
+ "nextSteps.agent.githubCopilot": "gh copilot を起動してエージェント開発を始めてください",
89
+ "credentials.prompt.endpoint": "iAP のエンドポイント(ベースURL)を入力してください",
90
+ "credentials.prompt.endpoint.hint": "iAP のベースURL を指定してください(例: https://example.com/imart)。API パス(/api/bearer/...)は自動で組み立てられます",
91
+ "credentials.prompt.apiKey": "APIキー(OAuth Bearer トークン)を入力してください",
92
+ "credentials.prompt.apiKey.hint": "iAP の OAuth トークン(scope: development)。.accel/credentials.json に保存され、.gitignore に追加されます",
93
+ "credentials.error.required": "値を入力してください",
94
+ "deploy.intro": "Accel CLI - deploy",
95
+ "deploy.progress.fetchingStagings": "ステージング環境を取得しています...",
96
+ "deploy.progress.deploying": "デプロイしています...",
97
+ "deploy.selectStaging": "デプロイ先のステージング環境を選択してください",
98
+ "deploy.selectZip": "デプロイするファイルを選択してください",
99
+ "deploy.descriptionPrompt": "デプロイメントの説明を入力してください(省略可)",
100
+ "deploy.confirm": "以下の内容でデプロイします。よろしいですか?",
101
+ "deploy.confirm.endpoint": "エンドポイント",
102
+ "deploy.confirm.stagingId": "ステージング",
103
+ "deploy.confirm.sourceFile": "対象ファイル",
104
+ "deploy.confirm.sentAs": "送信ファイル名",
105
+ "deploy.result.deployId": "デプロイID",
106
+ "deploy.result.stagingId": "ステージング",
107
+ "deploy.result.status": "ステータス",
108
+ "deploy.result.createDate": "作成日時",
109
+ "deploy.success": "デプロイが完了しました。",
110
+ "deploy.cancelled": "デプロイをキャンセルしました。",
111
+ "deploy.error.noStagings": "ステージング環境が見つかりません。先に iAP 側でステージング環境を作成してください。",
112
+ "deploy.error.noTargetZip": "./target/ 配下にデプロイ対象の zip が見つかりません。先にビルド(mvn package 等)を実行してください。",
113
+ "deploy.error.network": "iAP に接続できませんでした: {message}",
114
+ "deploy.error.server": "iAP からエラーが返されました: {message}",
115
+ "deploy.error.unauthorized": "認証に失敗しました(401)。APIキーが正しいか確認してください。",
116
+ "deploy.error.forbidden": "アクセスが拒否されました(403)。このステージングへの権限を確認してください。",
117
+ "deploy.error.notFound": "ステージングが見つかりません(404)。事前にステージング環境を作成してください。",
118
+ "deploy.error.badRequest": "リクエストが不正です(400)。",
119
+ "deploy.error.serverError": "サーバーエラーが発生しました(500)。",
120
+ "deploy.error.unexpectedResponse": "想定外のレスポンスを受信しました(HTTP {status})。",
45
121
  };
@@ -1,16 +1,30 @@
1
1
  export const messages = {
2
+ "intro.init": "生成 iAP(intra-mart Accel Platform)项目,\n以及面向 Claude Code / GitHub Copilot 的资源。\n将提出若干问题,最后统一进行部署。",
3
+ "intro.attach": "将当前目录识别为 iAP 项目,\n并部署面向 Claude Code / GitHub Copilot 的资源。\n将提出若干问题,最后统一进行部署。",
2
4
  "prompt.name": "请输入项目名称",
5
+ "prompt.name.hint": "用作目录名称,并写入 pom.xml 的 <name> 和 package.json 的 name\n请提供能简洁表达所创建系统或功能的名称(例如: customer-portal, invoice-management)",
3
6
  "prompt.artifactId": "请输入构件ID(Maven artifactId)",
7
+ "prompt.artifactId.hint": "作为 Maven artifactId 写入 pom.xml(构件的标识符)\n构成成品 (jar/war 等) 文件名和 Maven 坐标的标识符。默认与项目名称相同;如需使用其他标识符请修改",
4
8
  "prompt.jugglingProject": "请输入IM-Juggling项目路径(可选)",
9
+ "prompt.jugglingProject.hint": "若指定,则从 juggling.im 自动检测 iAP 版本和模块\n指定要联动的已有 IM-Juggling 项目目录路径;不需要时留空(例如: ../customer-portal-juggling)",
5
10
  "prompt.accelplatformVersion": "请选择iAP版本",
11
+ "prompt.accelplatformVersion.hint": "iAP 本体的发行版。部署的资源(CLAUDE.md 等)会根据该版本变化",
6
12
  "prompt.modules": "请选择要使用的模块",
13
+ "prompt.modules.hint": "iAP 的可选产品模块。每选一项会部署对应的 Skill、配置文件以及 CLAUDE.md 中的相应章节",
7
14
  "prompt.group": "请输入组名",
15
+ "prompt.group.hint": "作为 Maven groupId 写入 pom.xml(表示组织的点分标识符)\n表示所属组织或团队的标识符;按反向域名记法书写可减少与他人的冲突(例如: com.example, jp.co.intramart.app)",
8
16
  "prompt.projectVersion": "请输入项目版本",
17
+ "prompt.projectVersion.hint": "写入 pom.xml 的 <version> 和 package.json 的 version\n项目的发布版本;常用语义化版本(MAJOR.MINOR.PATCH)(例如: 0.1.0, 1.0.0-SNAPSHOT)",
9
18
  "prompt.description": "请输入项目描述",
19
+ "prompt.description.hint": "写入 pom.xml 的 <description>,并用于 CLAUDE.md 等文件的标题部分\n对该系统功能的简要说明;写得具体有助于日后阅读和检索(例如: 用于管理客户信息的门户网站)",
10
20
  "prompt.database": "请选择数据库",
21
+ "prompt.database.hint": "iAP 连接的数据库。用于生成资源中的示例配置和连接字符串样例",
11
22
  "prompt.javascript": "是否使用JavaScript代替TypeScript?",
23
+ "prompt.javascript.hint": "影响整个项目结构(是否存在 tsconfig.json、pom.xml / package.json 的依赖与脚本、代理资源中的语言指引)",
12
24
  "prompt.agent": "请选择代理",
25
+ "prompt.agent.hint": "claude-code 部署到 .claude/ 下,github-copilot 部署到 .github/ 下(指令书、skills 等)",
13
26
  "prompt.withGit": "是否初始化Git仓库?",
27
+ "prompt.withGit.hint": "在创建的项目目录中执行 git init",
14
28
  "juggling.detected.version": "从juggling.im检测到版本: {version}",
15
29
  "juggling.detected.modules": "从juggling.im检测到模块: {modules}",
16
30
  "juggling.notFound": "在指定路径未找到juggling.im: {path}",
@@ -19,6 +33,13 @@ export const messages = {
19
33
  "warning.gitNotFound": "未找到git命令。跳过Git初始化。",
20
34
  "warning.fileExists": "文件已存在,跳过: {path}",
21
35
  "attach.skipSummary": "{count}个文件已存在,已跳过。",
36
+ "attach.overwritePrompt": "{path} 已存在。要覆盖吗?",
37
+ "attach.overwritePrompt.yes": "Yes (覆盖此文件)",
38
+ "attach.overwritePrompt.no": "No (跳过此文件)",
39
+ "attach.overwritePrompt.all": "All (覆盖所有剩余文件)",
40
+ "attach.overwritePrompt.skipAll": "Skip-all (跳过所有剩余文件)",
41
+ "attach.overwritten": "已覆盖: {path}",
42
+ "attach.overwriteSummary": "已覆盖 {count} 个文件。",
22
43
  "detach.confirm": "从此项目解除Accel CLI。确定吗?",
23
44
  "detach.deleted": "已删除: {path}",
24
45
  "detach.skipped": "已跳过: {path} (检测到修改)",
@@ -33,13 +54,68 @@ export const messages = {
33
54
  "error.invalidModule": "无效的模块: {module}",
34
55
  "error.invalidDatabase": "无效的数据库: {database}",
35
56
  "error.invalidAgent": "无效的代理: {agent}",
57
+ "error.invalidPackageManager": "无效的包管理器(必须是 bun、npm、yarn、pnpm 之一): {packageManager}",
36
58
  "error.invalidName": "项目名称包含不能用作目录名的字符或为空: {value}",
37
- "error.invalidArtifactId": "构件ID违反Maven命名规则(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
38
- "error.invalidGroup": "组名违反Maven groupId命名规则(点分隔的Java标识符): {value}",
39
- "error.invalidProjectVersion": "项目版本违反Maven version命名规则(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
40
- "progress.downloading": "正在下载资源...",
41
- "progress.deploying": "正在部署资源...",
42
- "progress.installing": "正在安装依赖...",
43
- "progress.gitInit": "正在初始化Git仓库...",
59
+ "error.invalidArtifactId": "构件ID违反Maven命名规则(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
60
+ "error.invalidGroup": "组名违反Maven groupId命名规则(点分隔的Java标识符): {value}",
61
+ "error.invalidProjectVersion": "项目版本违反Maven version命名规则(^[A-Za-z0-9][A-Za-z0-9._-]*$): {value}",
62
+ "summary.heading": "部署设置",
63
+ "summary.label.name": "项目名称",
64
+ "summary.label.artifactId": "构件ID",
65
+ "summary.label.group": "",
66
+ "summary.label.projectVersion": "项目版本",
67
+ "summary.label.description": "描述",
68
+ "summary.label.accelplatformVersion": "iAP版本",
69
+ "summary.label.modules": "模块",
70
+ "summary.label.database": "数据库",
71
+ "summary.label.javascript": "JavaScript",
72
+ "summary.label.agents": "代理",
73
+ "summary.label.locale": "语言",
74
+ "summary.label.packageManager": "包管理器",
75
+ "summary.label.jugglingProject": "IM-Juggling项目",
76
+ "summary.outputDir": "输出目录",
77
+ "summary.empty": "(无)",
78
+ "progress.fetching": "正在获取资源仓库...",
79
+ "progress.deploying.section": "正在部署 {section} 下 ({files})",
80
+ "progress.deploying.root": "正在部署根目录文件 ({files})",
81
+ "progress.installing": "正在执行 {command}...",
82
+ "progress.building": "正在执行 {command}...",
83
+ "progress.gitInit": "正在执行 git init...",
44
84
  "progress.complete": "项目创建完成。",
85
+ "nextSteps.heading": "下一步",
86
+ "nextSteps.cd": "cd {path}",
87
+ "nextSteps.agent.claudeCode": "执行 claude 开始基于代理的开发",
88
+ "nextSteps.agent.githubCopilot": "执行 gh copilot 开始基于代理的开发",
89
+ "credentials.prompt.endpoint": "请输入 iAP 端点(基础URL)",
90
+ "credentials.prompt.endpoint.hint": "请指定 iAP 的基础URL(例如: https://example.com/imart)。API 路径(/api/bearer/...)会自动拼接",
91
+ "credentials.prompt.apiKey": "请输入 API 密钥(OAuth Bearer 令牌)",
92
+ "credentials.prompt.apiKey.hint": "iAP 的 OAuth 令牌(scope: development)。将保存到 .accel/credentials.json 并添加到 .gitignore",
93
+ "credentials.error.required": "请输入值",
94
+ "deploy.intro": "Accel CLI - deploy",
95
+ "deploy.progress.fetchingStagings": "正在获取暂存环境...",
96
+ "deploy.progress.deploying": "正在部署...",
97
+ "deploy.selectStaging": "请选择部署目标暂存环境",
98
+ "deploy.selectZip": "请选择要部署的文件",
99
+ "deploy.descriptionPrompt": "请输入部署说明(可选)",
100
+ "deploy.confirm": "将按以下内容部署。是否继续?",
101
+ "deploy.confirm.endpoint": "端点",
102
+ "deploy.confirm.stagingId": "暂存环境",
103
+ "deploy.confirm.sourceFile": "目标文件",
104
+ "deploy.confirm.sentAs": "发送文件名",
105
+ "deploy.result.deployId": "部署ID",
106
+ "deploy.result.stagingId": "暂存环境",
107
+ "deploy.result.status": "状态",
108
+ "deploy.result.createDate": "创建时间",
109
+ "deploy.success": "部署完成。",
110
+ "deploy.cancelled": "已取消部署。",
111
+ "deploy.error.noStagings": "未找到暂存环境。请先在 iAP 侧创建暂存环境。",
112
+ "deploy.error.noTargetZip": "在 ./target/ 下未找到可部署的 zip。请先执行构建(如 mvn package)。",
113
+ "deploy.error.network": "无法连接到 iAP: {message}",
114
+ "deploy.error.server": "iAP 返回了错误: {message}",
115
+ "deploy.error.unauthorized": "认证失败(401)。请确认 API 密钥是否正确。",
116
+ "deploy.error.forbidden": "访问被拒绝(403)。请确认对该暂存环境的权限。",
117
+ "deploy.error.notFound": "未找到暂存环境(404)。请事先创建暂存环境。",
118
+ "deploy.error.badRequest": "请求无效(400)。",
119
+ "deploy.error.serverError": "发生服务器错误(500)。",
120
+ "deploy.error.unexpectedResponse": "收到意外的响应(HTTP {status})。",
45
121
  };
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ import { defineCommand, runMain } from "citty";
3
3
  import { initCommand } from "./commands/init.js";
4
4
  import { attachCommand } from "./commands/attach.js";
5
5
  import { detachCommand } from "./commands/detach.js";
6
+ import { deployCommand } from "./commands/deploy.js";
6
7
  const main = defineCommand({
7
8
  meta: {
8
9
  name: "accel",
@@ -13,6 +14,7 @@ const main = defineCommand({
13
14
  init: initCommand,
14
15
  attach: attachCommand,
15
16
  detach: detachCommand,
17
+ deploy: deployCommand,
16
18
  },
17
19
  });
18
20
  runMain(main);
@@ -0,0 +1,2 @@
1
+ import type { AccelCredentials } from "../core/types.js";
2
+ export declare const ensureCredentials: (projectDir: string, locale: string) => Promise<AccelCredentials>;
@@ -0,0 +1,43 @@
1
+ import * as p from "@clack/prompts";
2
+ import { readCredentials, writeCredentials, normalizeEndpoint, CREDENTIALS_GITIGNORE_ENTRY, } from "../utils/credentials.js";
3
+ import { ensureGitignoreEntry } from "../utils/gitignore.js";
4
+ import { getMessage } from "../i18n/index.js";
5
+ import { withHint } from "./format.js";
6
+ const requiredValidator = (locale) => (value) => !value || value.trim().length === 0
7
+ ? getMessage("credentials.error.required", locale)
8
+ : undefined;
9
+ export const ensureCredentials = async (projectDir, locale) => {
10
+ const existing = await readCredentials(projectDir);
11
+ let endpoint = existing.endpoint;
12
+ let apiKey = existing.apiKey;
13
+ let changed = false;
14
+ if (!endpoint) {
15
+ const input = await p.text({
16
+ message: withHint("credentials.prompt.endpoint", locale),
17
+ validate: requiredValidator(locale),
18
+ });
19
+ if (p.isCancel(input))
20
+ process.exit(0);
21
+ endpoint = input;
22
+ changed = true;
23
+ }
24
+ if (!apiKey) {
25
+ const input = await p.password({
26
+ message: withHint("credentials.prompt.apiKey", locale),
27
+ validate: requiredValidator(locale),
28
+ });
29
+ if (p.isCancel(input))
30
+ process.exit(0);
31
+ apiKey = input;
32
+ changed = true;
33
+ }
34
+ const creds = {
35
+ endpoint: normalizeEndpoint(endpoint),
36
+ apiKey,
37
+ };
38
+ if (changed) {
39
+ await writeCredentials(projectDir, creds);
40
+ await ensureGitignoreEntry(projectDir, CREDENTIALS_GITIGNORE_ENTRY);
41
+ }
42
+ return creds;
43
+ };
@@ -0,0 +1,2 @@
1
+ export declare const withHint: (baseKey: string, locale: string) => string;
2
+ export declare const displayWidth: (s: string) => number;
@@ -0,0 +1,33 @@
1
+ import { getMessage } from "../i18n/index.js";
2
+ export const withHint = (baseKey, locale) => {
3
+ const main = getMessage(baseKey, locale);
4
+ const hintKey = `${baseKey}.hint`;
5
+ const hint = getMessage(hintKey, locale);
6
+ if (hint === hintKey)
7
+ return main;
8
+ return `${main}\n${hint}`;
9
+ };
10
+ const isWide = (ch) => {
11
+ const code = ch.codePointAt(0) ?? 0;
12
+ if (code >= 0x1100 && code <= 0x115f)
13
+ return true;
14
+ if (code >= 0x2e80 && code <= 0x9fff)
15
+ return true;
16
+ if (code >= 0xa000 && code <= 0xa4cf)
17
+ return true;
18
+ if (code >= 0xac00 && code <= 0xd7a3)
19
+ return true;
20
+ if (code >= 0xf900 && code <= 0xfaff)
21
+ return true;
22
+ if (code >= 0xff00 && code <= 0xff60)
23
+ return true;
24
+ if (code >= 0xffe0 && code <= 0xffe6)
25
+ return true;
26
+ return false;
27
+ };
28
+ export const displayWidth = (s) => {
29
+ let w = 0;
30
+ for (const ch of s)
31
+ w += isWide(ch) ? 2 : 1;
32
+ return w;
33
+ };
@@ -0,0 +1,8 @@
1
+ export type NextStepsOptions = {
2
+ projectDir: string;
3
+ agents: string[];
4
+ isInit: boolean;
5
+ locale: string;
6
+ };
7
+ export declare const buildNextStepsBody: (opts: NextStepsOptions) => string;
8
+ export declare const printNextSteps: (opts: NextStepsOptions) => void;
@@ -0,0 +1,22 @@
1
+ import * as p from "@clack/prompts";
2
+ import { basename } from "node:path";
3
+ import { getMessage } from "../i18n/index.js";
4
+ export const buildNextStepsBody = (opts) => {
5
+ const steps = [];
6
+ if (opts.isInit) {
7
+ steps.push(getMessage("nextSteps.cd", opts.locale, { path: basename(opts.projectDir) }));
8
+ }
9
+ if (opts.agents.includes("claude-code")) {
10
+ steps.push(getMessage("nextSteps.agent.claudeCode", opts.locale));
11
+ }
12
+ if (opts.agents.includes("github-copilot")) {
13
+ steps.push(getMessage("nextSteps.agent.githubCopilot", opts.locale));
14
+ }
15
+ return steps.map((s, i) => `${i + 1}. ${s}`).join("\n");
16
+ };
17
+ export const printNextSteps = (opts) => {
18
+ const body = buildNextStepsBody(opts);
19
+ if (body.length === 0)
20
+ return;
21
+ p.note(body, getMessage("nextSteps.heading", opts.locale));
22
+ };
@@ -0,0 +1,2 @@
1
+ import { type ProgressCallbacks } from "../asset/deployer.js";
2
+ export declare const buildProgressCallbacks: (locale: string) => ProgressCallbacks;
@@ -0,0 +1,21 @@
1
+ import * as p from "@clack/prompts";
2
+ import { ROOT_SECTION } from "../asset/deployer.js";
3
+ import { getMessage } from "../i18n/index.js";
4
+ const MAX_FILES_SHOWN = 3;
5
+ const formatFileList = (files) => {
6
+ if (files.length <= MAX_FILES_SHOWN)
7
+ return files.join(", ");
8
+ return `${files.slice(0, MAX_FILES_SHOWN).join(", ")} +${files.length - MAX_FILES_SHOWN}`;
9
+ };
10
+ export const buildProgressCallbacks = (locale) => ({
11
+ onFetchStart: () => p.log.info(getMessage("progress.fetching", locale)),
12
+ onSectionDeploy: (section, files) => {
13
+ const filesStr = formatFileList(files);
14
+ const key = section === ROOT_SECTION
15
+ ? "progress.deploying.root"
16
+ : "progress.deploying.section";
17
+ p.log.info(getMessage(key, locale, { section, files: filesStr }));
18
+ },
19
+ onInstallStart: (command) => p.log.info(getMessage("progress.installing", locale, { command })),
20
+ onBuildStart: (command) => p.log.info(getMessage("progress.building", locale, { command })),
21
+ });
@@ -12,6 +12,7 @@ export type PromptOptions = {
12
12
  database?: string;
13
13
  javascript?: boolean;
14
14
  agent?: string[];
15
+ packageManager?: string;
15
16
  locale: string;
16
17
  withGit?: boolean;
17
18
  noInteraction?: boolean;