@coralai/sps-cli 0.8.0 → 0.8.1

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/dist/main.js CHANGED
@@ -10,7 +10,7 @@ import { executeMonitorTick } from './commands/monitorTick.js';
10
10
  import { executePmCommand } from './commands/pmCommand.js';
11
11
  import { executeCardAdd } from './commands/cardAdd.js';
12
12
  import { executeSetup } from './commands/setup.js';
13
- const VERSION = '0.8.0';
13
+ const VERSION = '0.8.1';
14
14
  const COMMANDS = {
15
15
  setup: { desc: 'Initial environment setup (credentials, directories)', usage: 'sps setup [--force]' },
16
16
  tick: { desc: 'Run continuous pipeline (--once for single tick)', usage: 'sps tick <project> [--once]' },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coralai/sps-cli",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -8,7 +8,7 @@
8
8
  "sps": "dist/main.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc && cp -r ../project-template ./project-template 2>/dev/null || true",
11
+ "build": "tsc && rm -rf ./project-template && cp -r ../project-template ./project-template",
12
12
  "dev": "tsx src/main.ts",
13
13
  "typecheck": "tsc --noEmit",
14
14
  "prepublishOnly": "npm run build"
@@ -1,10 +1,8 @@
1
1
  #!/usr/bin/env bash
2
2
  # batch_scheduler.sh — project-local cron entry point
3
- # Delegates to the unified workflow CLI tick command.
4
- # All scheduling, pipeline, QA, and monitor logic lives in the Node CLI.
3
+ # Delegates to the SPS CLI tick command.
5
4
  set -euo pipefail
6
5
 
7
6
  PROJECT_NAME="$(basename "$(cd "$(dirname "$0")" && pwd)")"
8
- WORKFLOW_CLI="$HOME/jarvis-skills/coding-work-flow/bin/workflow"
9
7
 
10
- exec "$WORKFLOW_CLI" tick "$PROJECT_NAME" "$@"
8
+ exec sps tick "$PROJECT_NAME" "$@"
@@ -1,7 +1,12 @@
1
1
  # ── 项目基础信息 ─────────────────────────────────────────────────
2
2
  export PROJECT_NAME="__PROJECT_NAME__"
3
3
  export PROJECT_DISPLAY="__PROJECT_DISPLAY__"
4
- export PROJECT_DIR="$HOME/projects/__PROJECT_NAME__"
4
+
5
+ # ── 路径配置(可选,不设置则使用默认值)───────────────────────────
6
+ # 业务代码仓库目录(默认: ~/projects/<project>)
7
+ # export PROJECT_DIR="$HOME/projects/__PROJECT_NAME__"
8
+ # Worker worktree 根目录(默认: ~/.coral/worktrees/)
9
+ # export WORKTREE_DIR="$HOME/.coral/worktrees"
5
10
 
6
11
  # ── GitLab ───────────────────────────────────────────────────────
7
12
  export GITLAB_PROJECT="__GITLAB_PROJECT__"
@@ -1,165 +0,0 @@
1
- #!/usr/bin/env bash
2
- # batch_scheduler.sh — project-local sequential scheduler (Planning → Backlog)
3
- set -euo pipefail
4
-
5
- PROJECT_NAME="$(basename "$(cd "$(dirname "$0")" && pwd)")"
6
- source ~/.jarvis.env
7
- source "$HOME/.projects/$PROJECT_NAME/conf"
8
-
9
- MPOST="bash $HOME/jarvis-skills/coding-work-flow/scripts/notify.sh"
10
- LOG="$HOME/.projects/$PROJECT_NAME/logs/batch_scheduler.log"
11
- mkdir -p "$(dirname "$LOG")"
12
- log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"; }
13
-
14
- if [ "${PM_TOOL:-trello}" = "trello" ]; then
15
- TAPI="https://api.trello.com/1"
16
- TQ="key=$TRELLO_API_KEY&token=$TRELLO_TOKEN"
17
- : "${TRELLO_LIST_PLANNING:?Missing TRELLO_LIST_PLANNING}"
18
- : "${TRELLO_LIST_BACKLOG:?Missing TRELLO_LIST_BACKLOG}"
19
- : "${TRELLO_LIST_TODO:?Missing TRELLO_LIST_TODO}"
20
- : "${TRELLO_LIST_INPROGRESS:?Missing TRELLO_LIST_INPROGRESS}"
21
- : "${TRELLO_LIST_QA:?Missing TRELLO_LIST_QA}"
22
-
23
- active=$(python3 - <<PY
24
- import urllib.request, json
25
- lists=['$TRELLO_LIST_BACKLOG','$TRELLO_LIST_TODO','$TRELLO_LIST_INPROGRESS','$TRELLO_LIST_QA']
26
- label='${PIPELINE_LABEL:-}'
27
- total=0
28
- for l in lists:
29
- url=f'$TAPI/lists/{l}/cards?$TQ&fields=id,name,labels'
30
- cards=json.loads(urllib.request.urlopen(url).read())
31
- if label:
32
- total += sum(1 for c in cards if any((lb.get('name') or '').strip()==label for lb in c.get('labels',[])))
33
- else:
34
- total += len(cards)
35
- print(total)
36
- PY
37
- )
38
- log "Active pipeline tasks: $active"
39
- if [ "$active" -gt 0 ]; then
40
- log "Pipeline still busy, skip promotion"
41
- exit 0
42
- fi
43
-
44
- next=$(PIPELINE_LABEL="${PIPELINE_LABEL:-}" TRELLO_JSON="$(curl -s "$TAPI/lists/$TRELLO_LIST_PLANNING/cards?$TQ&fields=id,name,labels,pos")" python3 - <<'PY'
45
- import json,os
46
- label=os.environ.get('PIPELINE_LABEL','').strip()
47
- obj=json.loads(os.environ.get('TRELLO_JSON','[]'))
48
- items=[]
49
- for c in obj:
50
- labels=[(lb.get('name') or '').strip() for lb in c.get('labels',[])]
51
- if label and label not in labels:
52
- continue
53
- items.append((c.get('pos', 10**18), c.get('id',''), c.get('name','')))
54
- items.sort()
55
- if items:
56
- _, cid, name = items[0]
57
- print(f"{cid}|{name}")
58
- PY
59
- )
60
- [ -z "$next" ] && { log "Planning empty, nothing to promote"; exit 0; }
61
- card_id="${next%%|*}"
62
- card_name="${next#*|}"
63
- curl -sf -X PUT "$TAPI/cards/$card_id?$TQ" -d "idList=$TRELLO_LIST_BACKLOG" > /dev/null
64
- log "Promoted: $card_name → Backlog"
65
- $MPOST "🚀 [$PROJECT_NAME] 推进任务:$card_name" >/dev/null 2>&1 || true
66
- exit 0
67
- fi
68
-
69
- HELPER="${PLANE_HELPER:-$HOME/.openclaw/workspace/skills/plane/scripts/plane_helper.py}"
70
- : "${PLANE_PROJECT_ID:?Missing PLANE_PROJECT_ID}"
71
- : "${PLANE_STATE_PLANNING:?Missing PLANE_STATE_PLANNING}"
72
- : "${PLANE_STATE_BACKLOG:?Missing PLANE_STATE_BACKLOG}"
73
- : "${PLANE_STATE_TODO:?Missing PLANE_STATE_TODO}"
74
- : "${PLANE_STATE_INPROGRESS:?Missing PLANE_STATE_INPROGRESS}"
75
- : "${PLANE_STATE_QA:?Missing PLANE_STATE_QA}"
76
-
77
- active=$(ACTIVE_STATE_IDS="$PLANE_STATE_BACKLOG,$PLANE_STATE_TODO,$PLANE_STATE_INPROGRESS,$PLANE_STATE_QA" PIPELINE_LABEL="${PIPELINE_LABEL:-}" PIPELINE_MIN_SEQ="${PIPELINE_MIN_SEQ:-}" LABELS_JSON="$(python3 "$HELPER" labels list "$PLANE_PROJECT_ID" 2>/dev/null)" PLANE_JSON="$(python3 "$HELPER" issues list "$PLANE_PROJECT_ID" 2>/dev/null)" python3 - <<'PY'
78
- import json,os
79
- obj=json.loads(os.environ['PLANE_JSON'])
80
- active=set(filter(None, os.environ.get('ACTIVE_STATE_IDS','').split(',')))
81
- want=os.environ.get('PIPELINE_LABEL','').strip()
82
- min_seq=(os.environ.get('PIPELINE_MIN_SEQ') or '').strip()
83
- count=0
84
- label_map={x.get('id'): x.get('name','') for x in json.loads(os.environ.get('LABELS_JSON','{"results":[]}')).get('results',[])}
85
- for it in obj.get('results',[]):
86
- if it.get('state') not in active:
87
- continue
88
- labels=[]
89
- for lb in it.get('labels',[]):
90
- if isinstance(lb, dict):
91
- name=(lb.get('name') or '').strip()
92
- else:
93
- name=(label_map.get(lb,'') or '').strip()
94
- if name:
95
- labels.append(name)
96
- if want and want not in labels:
97
- continue
98
- if min_seq:
99
- try:
100
- if int(it.get('sequence_id') or 0) < int(min_seq):
101
- continue
102
- except Exception:
103
- pass
104
- count += 1
105
- print(count)
106
- PY
107
- )
108
- log "Active pipeline tasks: $active"
109
- if [ "$active" -gt 0 ]; then
110
- log "Pipeline still busy, skip promotion"
111
- exit 0
112
- fi
113
-
114
- next=$(PIPELINE_LABEL="${PIPELINE_LABEL:-}" PIPELINE_ORDER_FILE="${PIPELINE_ORDER_FILE:-}" LABELS_JSON="$(python3 "$HELPER" labels list "$PLANE_PROJECT_ID" 2>/dev/null)" PLANE_JSON="$(python3 "$HELPER" issues list "$PLANE_PROJECT_ID" "$PLANE_STATE_PLANNING" 2>/dev/null)" python3 - <<'PY'
115
- import json,os
116
- obj=json.loads(os.environ['PLANE_JSON'])
117
- label_map={x.get('id'): x.get('name','') for x in json.loads(os.environ.get('LABELS_JSON','{"results":[]}')).get('results',[])}
118
- want=os.environ.get('PIPELINE_LABEL','').strip()
119
- order_file=(os.environ.get('PIPELINE_ORDER_FILE') or '').strip()
120
- seq_order=[]
121
- if order_file and os.path.exists(order_file):
122
- try:
123
- raw=json.load(open(order_file))
124
- if isinstance(raw, list):
125
- seq_order=[int(x) for x in raw]
126
- else:
127
- seq_order=[int(x) for x in raw.get('items',[])]
128
- except Exception:
129
- seq_order=[]
130
- items_by_seq={}
131
- for it in obj.get('results',[]):
132
- labels=[]
133
- for lb in it.get('labels',[]):
134
- if isinstance(lb, dict):
135
- name=(lb.get('name') or '').strip()
136
- else:
137
- name=(label_map.get(lb,'') or '').strip()
138
- if name:
139
- labels.append(name)
140
- if want and want not in labels:
141
- continue
142
- try:
143
- seq_num=int(it.get('sequence_id') or 0)
144
- except Exception:
145
- continue
146
- items_by_seq[seq_num]=(it.get('id',''), it.get('name',''))
147
- if seq_order:
148
- for seq in seq_order:
149
- if seq in items_by_seq:
150
- iid,name=items_by_seq[seq]
151
- print(f"{iid}|{name}")
152
- raise SystemExit(0)
153
- else:
154
- for seq in sorted(items_by_seq):
155
- iid,name=items_by_seq[seq]
156
- print(f"{iid}|{name}")
157
- raise SystemExit(0)
158
- PY
159
- )
160
- [ -z "$next" ] && { log "Planning empty, nothing to promote"; exit 0; }
161
- issue_id="${next%%|*}"
162
- issue_name="${next#*|}"
163
- python3 "$HELPER" issues move "$PLANE_PROJECT_ID" "$issue_id" "$PLANE_STATE_BACKLOG" >/dev/null
164
- log "Promoted: $issue_name → Backlog"
165
- $MPOST "🚀 [$PROJECT_NAME] 推进任务:$issue_name" >/dev/null 2>&1 || true
@@ -1,10 +0,0 @@
1
- # Project Template
2
-
3
- This folder is copied into `~/.projects/<project-name>/` for each new pipeline-managed project.
4
-
5
- Contents:
6
- - `conf` — project-specific configuration
7
- - `deploy.sh` — optional project-local deploy entrypoint
8
- - `batch_scheduler.sh` — project-local Planning → Backlog scheduler
9
- - `logs/` — runtime logs
10
- - `pm_meta/` — local PM metadata store (used especially for Plane)
@@ -1,165 +0,0 @@
1
- #!/usr/bin/env bash
2
- # batch_scheduler.sh — project-local sequential scheduler (Planning → Backlog)
3
- set -euo pipefail
4
-
5
- PROJECT_NAME="$(basename "$(cd "$(dirname "$0")" && pwd)")"
6
- source ~/.jarvis.env
7
- source "$HOME/.projects/$PROJECT_NAME/conf"
8
-
9
- MPOST="bash $HOME/jarvis-skills/coding-work-flow/scripts/notify.sh"
10
- LOG="$HOME/.projects/$PROJECT_NAME/logs/batch_scheduler.log"
11
- mkdir -p "$(dirname "$LOG")"
12
- log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"; }
13
-
14
- if [ "${PM_TOOL:-trello}" = "trello" ]; then
15
- TAPI="https://api.trello.com/1"
16
- TQ="key=$TRELLO_API_KEY&token=$TRELLO_TOKEN"
17
- : "${TRELLO_LIST_PLANNING:?Missing TRELLO_LIST_PLANNING}"
18
- : "${TRELLO_LIST_BACKLOG:?Missing TRELLO_LIST_BACKLOG}"
19
- : "${TRELLO_LIST_TODO:?Missing TRELLO_LIST_TODO}"
20
- : "${TRELLO_LIST_INPROGRESS:?Missing TRELLO_LIST_INPROGRESS}"
21
- : "${TRELLO_LIST_QA:?Missing TRELLO_LIST_QA}"
22
-
23
- active=$(python3 - <<PY
24
- import urllib.request, json
25
- lists=['$TRELLO_LIST_BACKLOG','$TRELLO_LIST_TODO','$TRELLO_LIST_INPROGRESS','$TRELLO_LIST_QA']
26
- label='${PIPELINE_LABEL:-}'
27
- total=0
28
- for l in lists:
29
- url=f'$TAPI/lists/{l}/cards?$TQ&fields=id,name,labels'
30
- cards=json.loads(urllib.request.urlopen(url).read())
31
- if label:
32
- total += sum(1 for c in cards if any((lb.get('name') or '').strip()==label for lb in c.get('labels',[])))
33
- else:
34
- total += len(cards)
35
- print(total)
36
- PY
37
- )
38
- log "Active pipeline tasks: $active"
39
- if [ "$active" -gt 0 ]; then
40
- log "Pipeline still busy, skip promotion"
41
- exit 0
42
- fi
43
-
44
- next=$(PIPELINE_LABEL="${PIPELINE_LABEL:-}" TRELLO_JSON="$(curl -s "$TAPI/lists/$TRELLO_LIST_PLANNING/cards?$TQ&fields=id,name,labels,pos")" python3 - <<'PY'
45
- import json,os
46
- label=os.environ.get('PIPELINE_LABEL','').strip()
47
- obj=json.loads(os.environ.get('TRELLO_JSON','[]'))
48
- items=[]
49
- for c in obj:
50
- labels=[(lb.get('name') or '').strip() for lb in c.get('labels',[])]
51
- if label and label not in labels:
52
- continue
53
- items.append((c.get('pos', 10**18), c.get('id',''), c.get('name','')))
54
- items.sort()
55
- if items:
56
- _, cid, name = items[0]
57
- print(f"{cid}|{name}")
58
- PY
59
- )
60
- [ -z "$next" ] && { log "Planning empty, nothing to promote"; exit 0; }
61
- card_id="${next%%|*}"
62
- card_name="${next#*|}"
63
- curl -sf -X PUT "$TAPI/cards/$card_id?$TQ" -d "idList=$TRELLO_LIST_BACKLOG" > /dev/null
64
- log "Promoted: $card_name → Backlog"
65
- $MPOST "🚀 [$PROJECT_NAME] 推进任务:$card_name" >/dev/null 2>&1 || true
66
- exit 0
67
- fi
68
-
69
- HELPER="${PLANE_HELPER:-$HOME/.openclaw/workspace/skills/plane/scripts/plane_helper.py}"
70
- : "${PLANE_PROJECT_ID:?Missing PLANE_PROJECT_ID}"
71
- : "${PLANE_STATE_PLANNING:?Missing PLANE_STATE_PLANNING}"
72
- : "${PLANE_STATE_BACKLOG:?Missing PLANE_STATE_BACKLOG}"
73
- : "${PLANE_STATE_TODO:?Missing PLANE_STATE_TODO}"
74
- : "${PLANE_STATE_INPROGRESS:?Missing PLANE_STATE_INPROGRESS}"
75
- : "${PLANE_STATE_QA:?Missing PLANE_STATE_QA}"
76
-
77
- active=$(ACTIVE_STATE_IDS="$PLANE_STATE_BACKLOG,$PLANE_STATE_TODO,$PLANE_STATE_INPROGRESS,$PLANE_STATE_QA" PIPELINE_LABEL="${PIPELINE_LABEL:-}" PIPELINE_MIN_SEQ="${PIPELINE_MIN_SEQ:-}" LABELS_JSON="$(python3 "$HELPER" labels list "$PLANE_PROJECT_ID" 2>/dev/null)" PLANE_JSON="$(python3 "$HELPER" issues list "$PLANE_PROJECT_ID" 2>/dev/null)" python3 - <<'PY'
78
- import json,os
79
- obj=json.loads(os.environ['PLANE_JSON'])
80
- active=set(filter(None, os.environ.get('ACTIVE_STATE_IDS','').split(',')))
81
- want=os.environ.get('PIPELINE_LABEL','').strip()
82
- min_seq=(os.environ.get('PIPELINE_MIN_SEQ') or '').strip()
83
- count=0
84
- label_map={x.get('id'): x.get('name','') for x in json.loads(os.environ.get('LABELS_JSON','{"results":[]}')).get('results',[])}
85
- for it in obj.get('results',[]):
86
- if it.get('state') not in active:
87
- continue
88
- labels=[]
89
- for lb in it.get('labels',[]):
90
- if isinstance(lb, dict):
91
- name=(lb.get('name') or '').strip()
92
- else:
93
- name=(label_map.get(lb,'') or '').strip()
94
- if name:
95
- labels.append(name)
96
- if want and want not in labels:
97
- continue
98
- if min_seq:
99
- try:
100
- if int(it.get('sequence_id') or 0) < int(min_seq):
101
- continue
102
- except Exception:
103
- pass
104
- count += 1
105
- print(count)
106
- PY
107
- )
108
- log "Active pipeline tasks: $active"
109
- if [ "$active" -gt 0 ]; then
110
- log "Pipeline still busy, skip promotion"
111
- exit 0
112
- fi
113
-
114
- next=$(PIPELINE_LABEL="${PIPELINE_LABEL:-}" PIPELINE_ORDER_FILE="${PIPELINE_ORDER_FILE:-}" LABELS_JSON="$(python3 "$HELPER" labels list "$PLANE_PROJECT_ID" 2>/dev/null)" PLANE_JSON="$(python3 "$HELPER" issues list "$PLANE_PROJECT_ID" "$PLANE_STATE_PLANNING" 2>/dev/null)" python3 - <<'PY'
115
- import json,os
116
- obj=json.loads(os.environ['PLANE_JSON'])
117
- label_map={x.get('id'): x.get('name','') for x in json.loads(os.environ.get('LABELS_JSON','{"results":[]}')).get('results',[])}
118
- want=os.environ.get('PIPELINE_LABEL','').strip()
119
- order_file=(os.environ.get('PIPELINE_ORDER_FILE') or '').strip()
120
- seq_order=[]
121
- if order_file and os.path.exists(order_file):
122
- try:
123
- raw=json.load(open(order_file))
124
- if isinstance(raw, list):
125
- seq_order=[int(x) for x in raw]
126
- else:
127
- seq_order=[int(x) for x in raw.get('items',[])]
128
- except Exception:
129
- seq_order=[]
130
- items_by_seq={}
131
- for it in obj.get('results',[]):
132
- labels=[]
133
- for lb in it.get('labels',[]):
134
- if isinstance(lb, dict):
135
- name=(lb.get('name') or '').strip()
136
- else:
137
- name=(label_map.get(lb,'') or '').strip()
138
- if name:
139
- labels.append(name)
140
- if want and want not in labels:
141
- continue
142
- try:
143
- seq_num=int(it.get('sequence_id') or 0)
144
- except Exception:
145
- continue
146
- items_by_seq[seq_num]=(it.get('id',''), it.get('name',''))
147
- if seq_order:
148
- for seq in seq_order:
149
- if seq in items_by_seq:
150
- iid,name=items_by_seq[seq]
151
- print(f"{iid}|{name}")
152
- raise SystemExit(0)
153
- else:
154
- for seq in sorted(items_by_seq):
155
- iid,name=items_by_seq[seq]
156
- print(f"{iid}|{name}")
157
- raise SystemExit(0)
158
- PY
159
- )
160
- [ -z "$next" ] && { log "Planning empty, nothing to promote"; exit 0; }
161
- issue_id="${next%%|*}"
162
- issue_name="${next#*|}"
163
- python3 "$HELPER" issues move "$PLANE_PROJECT_ID" "$issue_id" "$PLANE_STATE_BACKLOG" >/dev/null
164
- log "Promoted: $issue_name → Backlog"
165
- $MPOST "🚀 [$PROJECT_NAME] 推进任务:$issue_name" >/dev/null 2>&1 || true
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- # batch_scheduler.sh — project-local cron entry point
3
- # Delegates to the SPS CLI tick command.
4
- set -euo pipefail
5
-
6
- PROJECT_NAME="$(basename "$(cd "$(dirname "$0")" && pwd)")"
7
-
8
- exec sps tick "$PROJECT_NAME" "$@"
@@ -1,78 +0,0 @@
1
- # ── 项目基础信息 ─────────────────────────────────────────────────
2
- export PROJECT_NAME="__PROJECT_NAME__"
3
- export PROJECT_DISPLAY="__PROJECT_DISPLAY__"
4
-
5
- # ── 路径配置(可选,不设置则使用默认值)───────────────────────────
6
- # 业务代码仓库目录(默认: ~/projects/<project>)
7
- # export PROJECT_DIR="$HOME/projects/__PROJECT_NAME__"
8
- # Worker worktree 根目录(默认: ~/.coral/worktrees/)
9
- # export WORKTREE_DIR="$HOME/.coral/worktrees"
10
-
11
- # ── GitLab ───────────────────────────────────────────────────────
12
- export GITLAB_PROJECT="__GITLAB_PROJECT__"
13
- export GITLAB_PROJECT_ID="__GITLAB_PROJECT_ID__"
14
- export GITLAB_MERGE_BRANCH="__GITLAB_MERGE_BRANCH__"
15
- export GITLAB_RELEASE_BRANCH="__GITLAB_RELEASE_BRANCH__"
16
-
17
- # ── PM Backend ───────────────────────────────────────────────────
18
- export PM_TOOL="__PM_TOOL__"
19
-
20
- # ── Trello(PM_TOOL=trello 时填写)───────────────────────────────
21
- export TRELLO_BOARD_ID="__TRELLO_BOARD_ID__"
22
- export TRELLO_LIST_PLANNING="__TRELLO_LIST_PLANNING__"
23
- export TRELLO_LIST_BACKLOG="__TRELLO_LIST_BACKLOG__"
24
- export TRELLO_LIST_TODO="__TRELLO_LIST_TODO__"
25
- export TRELLO_LIST_INPROGRESS="__TRELLO_LIST_INPROGRESS__"
26
- export TRELLO_LIST_QA="__TRELLO_LIST_QA__"
27
- export TRELLO_LIST_DONE="__TRELLO_LIST_DONE__"
28
- export TRELLO_ACCOUNT="__TRELLO_ACCOUNT__"
29
-
30
- # ── Plane(PM_TOOL=plane 时填写)────────────────────────────────
31
- export PLANE_API_URL="__PLANE_API_URL__"
32
- export PLANE_API_KEY="__PLANE_API_KEY__"
33
- export PLANE_WORKSPACE_SLUG="__PLANE_WORKSPACE_SLUG__"
34
- export PLANE_PROJECT_ID="__PLANE_PROJECT_ID__"
35
- export PLANE_PROJECT_NAME="__PLANE_PROJECT_NAME__"
36
- export PLANE_STATE_PLANNING="__PLANE_STATE_PLANNING__"
37
- export PLANE_STATE_BACKLOG="__PLANE_STATE_BACKLOG__"
38
- export PLANE_STATE_TODO="__PLANE_STATE_TODO__"
39
- export PLANE_STATE_INPROGRESS="__PLANE_STATE_INPROGRESS__"
40
- export PLANE_STATE_QA="__PLANE_STATE_QA__"
41
- export PLANE_STATE_DONE="__PLANE_STATE_DONE__"
42
- export PLANE_STATE_CANCELLED="__PLANE_STATE_CANCELLED__"
43
-
44
- # ── Pipeline 筛选(可选)────────────────────────────────────────
45
- export PIPELINE_LABEL="__PIPELINE_LABEL__"
46
- export PIPELINE_ORDER_FILE="$HOME/.projects/__PROJECT_NAME__/pipeline_order.json"
47
-
48
- # ── CI ───────────────────────────────────────────────────────────
49
- export CI_MODE="__CI_MODE__"
50
-
51
- # ── 前端构建 ─────────────────────────────────────────────────────
52
- export HAS_FRONTEND="__HAS_FRONTEND__"
53
- export FRONTEND_DIR="__FRONTEND_DIR__"
54
-
55
- # ── 部署 ─────────────────────────────────────────────────────────
56
- export DEPLOY_ENABLED="__DEPLOY_ENABLED__"
57
- export DEPLOY_SCRIPT="$HOME/.projects/__PROJECT_NAME__/deploy.sh"
58
-
59
- # ── Worker / Agent ───────────────────────────────────────────────
60
- export WORKER_TOOL="__WORKER_TOOL__"
61
- export MAX_CONCURRENT_WORKERS=__MAX_CONCURRENT_WORKERS__
62
- export WORKER_RESTART_LIMIT=__WORKER_RESTART_LIMIT__
63
- export AUTOFIX_ATTEMPTS=__AUTOFIX_ATTEMPTS__
64
- export WORKER_SESSION_REUSE=true
65
- export MAX_ACTIONS_PER_TICK=1
66
-
67
- # ── 超时与策略 ───────────────────────────────────────────────────
68
- export INPROGRESS_TIMEOUT_HOURS=8
69
- export MONITOR_AUTO_QA=false
70
- export CONFLICT_DEFAULT=serial
71
- export TICK_LOCK_TIMEOUT_MINUTES=30
72
- export NEEDS_FIX_MAX_RETRIES=3
73
- export WORKTREE_RETAIN_HOURS=24
74
-
75
- # ── 通知(Matrix)──────────────────────────────────────────────
76
- export MATRIX_HOMESERVER="__MATRIX_HOMESERVER__"
77
- export MATRIX_ACCESS_TOKEN="__MATRIX_ACCESS_TOKEN__"
78
- export MATRIX_ROOM_ID="__MATRIX_ROOM_ID__"
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- echo "Deployment not configured for ${PROJECT_NAME:-unknown-project}"
File without changes