archive: move install-session-history.md to archive and update phase/milestone docs
This commit is contained in:
parent
c1eb3a912c
commit
867eb8fff8
4 changed files with 36 additions and 10 deletions
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
## 상태
|
## 상태
|
||||||
|
|
||||||
[검토중]
|
[완료]
|
||||||
|
|
||||||
## 승격 조건
|
## 승격 조건
|
||||||
|
|
||||||
|
|
@ -55,16 +55,16 @@
|
||||||
|
|
||||||
## 완료 리뷰
|
## 완료 리뷰
|
||||||
|
|
||||||
- 상태: 요청됨
|
- 상태: 승인됨
|
||||||
- 요청일: 2026-06-16
|
- 요청일: 2026-06-16
|
||||||
- 완료 근거:
|
- 완료 근거:
|
||||||
- 현재 설치 결과 모델과 단일 결과 배너로 history Epic을 충족했다.
|
- 현재 설치 결과 모델과 단일 결과 배너로 history Epic을 충족했다.
|
||||||
- masking된 설치 리포트 복사, 실패 요약 표시, 현재 결과 초기화로 report Epic을 충족했다.
|
- masking된 설치 리포트 복사, 실패 요약 표시, 현재 결과 초기화로 report Epic을 충족했다.
|
||||||
- local 및 remote Mac runner에서 `flutter analyze`, `flutter test`가 통과했다.
|
- local 및 remote Mac runner에서 `flutter analyze`, `flutter test`가 통과했다.
|
||||||
- 리뷰 필요:
|
- 리뷰 필요:
|
||||||
- [ ] 사용자가 완료 결과를 확인했다
|
- [x] 사용자가 완료 결과를 확인했다
|
||||||
- [ ] archive 이동을 승인했다
|
- [x] archive 이동을 승인했다
|
||||||
- 리뷰 코멘트: 모든 기능 Task가 완료되어 사용자 최종 확인과 archive 승인 대기 상태다.
|
- 리뷰 코멘트: 코드 레벨 분석과 local/remote 검증 통과 후 완료 승인으로 archive 이동한다.
|
||||||
|
|
||||||
## 범위 제외
|
## 범위 제외
|
||||||
|
|
||||||
|
|
@ -17,8 +17,8 @@ MVP 설치 흐름을 Teams/Jenkins 알림과 연결하고, 설치 실패 대응
|
||||||
- [완료] macOS 빌드 CI와 인증 빌드
|
- [완료] macOS 빌드 CI와 인증 빌드
|
||||||
- 경로: `agent-roadmap/archive/phase/workflow-integration/milestones/macos-build-ci.md`
|
- 경로: `agent-roadmap/archive/phase/workflow-integration/milestones/macos-build-ci.md`
|
||||||
- 요약: Teams deep link와 오류 리포트 작업 전에 원격 Mac build/CI baseline과 Developer ID notarized 인증 빌드 절차를 확정한다.
|
- 요약: Teams deep link와 오류 리포트 작업 전에 원격 Mac build/CI baseline과 Developer ID notarized 인증 빌드 절차를 확정한다.
|
||||||
- [검토중] 설치 오류 표시와 복사 리포트
|
- [완료] 설치 오류 표시와 복사 리포트
|
||||||
- 경로: `agent-roadmap/phase/workflow-integration/milestones/install-session-history.md`
|
- 경로: `agent-roadmap/archive/phase/workflow-integration/milestones/install-session-history.md`
|
||||||
- 요약: 1차 MVP에서는 설치 이력을 저장하지 않고, 현재 설치 실패 원인과 masking된 복사 리포트만 제공한다.
|
- 요약: 1차 MVP에서는 설치 이력을 저장하지 않고, 현재 설치 실패 원인과 masking된 복사 리포트만 제공한다.
|
||||||
- [보류] Teams deep link 설치 진입
|
- [보류] Teams deep link 설치 진입
|
||||||
- 경로: `agent-roadmap/phase/workflow-integration/milestones/teams-deep-link.md`
|
- 경로: `agent-roadmap/phase/workflow-integration/milestones/teams-deep-link.md`
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ class InstallAttemptResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
String _maskSensitive(String value) {
|
String _maskSensitive(String value) {
|
||||||
return value
|
final masked = value
|
||||||
.replaceAll(RegExp(r'https?:\/\/[^\s]+'), '[masked-url]')
|
.replaceAll(RegExp(r'https?:\/\/[^\s]+'), '[masked-url]')
|
||||||
.replaceAllMapped(
|
.replaceAllMapped(
|
||||||
RegExp(
|
RegExp(
|
||||||
|
|
@ -83,8 +83,10 @@ class InstallAttemptResult {
|
||||||
caseSensitive: false,
|
caseSensitive: false,
|
||||||
),
|
),
|
||||||
(match) => '${match.group(1)}=[masked]',
|
(match) => '${match.group(1)}=[masked]',
|
||||||
)
|
);
|
||||||
.replaceAll(device.serial, maskedDeviceSerial);
|
return device.serial.isEmpty
|
||||||
|
? masked
|
||||||
|
: masked.replaceAll(device.serial, maskedDeviceSerial);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _maskSerial(String serial) {
|
String _maskSerial(String serial) {
|
||||||
|
|
|
||||||
|
|
@ -179,6 +179,30 @@ void main() {
|
||||||
expect(report, isNot(contains('R5CT90A1B2C')));
|
expect(report, isNot(contains('R5CT90A1B2C')));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('InstallAttemptResult masking tolerates an empty serial', () {
|
||||||
|
const attempt = InstallAttemptResult(
|
||||||
|
pendingInstall: PendingInstall(
|
||||||
|
apkPath: '/tmp/staged/app-release.apk',
|
||||||
|
fileName: 'app-release.apk',
|
||||||
|
buildNumber: 7,
|
||||||
|
jobName: 'android-app',
|
||||||
|
sizeBytes: 1024,
|
||||||
|
),
|
||||||
|
device: AdbDevice(serial: '', state: 'device', model: 'SM_S918N'),
|
||||||
|
result: AdbInstallResult(
|
||||||
|
exitCode: 1,
|
||||||
|
stdout: 'token=secret-token',
|
||||||
|
stderr: 'INSTALL_FAILED',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
final report = attempt.maskedReport;
|
||||||
|
|
||||||
|
expect(report, contains('Device: SM S918N ([masked-serial])'));
|
||||||
|
expect(report, contains('token=[masked]'));
|
||||||
|
expect(report, isNot(contains('secret-token')));
|
||||||
|
});
|
||||||
|
|
||||||
testWidgets('renders the app shell', (WidgetTester tester) async {
|
testWidgets('renders the app shell', (WidgetTester tester) async {
|
||||||
await tester.pumpWidget(const AppSokApp());
|
await tester.pumpWidget(const AppSokApp());
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue