(deps commandDeps)
| 1869 | } |
| 1870 | |
| 1871 | func newTaskReleaseCommand(deps commandDeps) *cobra.Command { |
| 1872 | var reason string |
| 1873 | var metadataRaw string |
| 1874 | |
| 1875 | cmd := &cobra.Command{ |
| 1876 | Use: "release <run-id> [run-id...]", |
| 1877 | Short: "Force release claimed task runs back to the queue", |
| 1878 | Args: cobra.MinimumNArgs(1), |
| 1879 | Example: ` # Release a claim without completing the run |
| 1880 | agh task release run-123 |
| 1881 | |
| 1882 | # Release multiple claims with shared audit evidence |
| 1883 | agh task release run-123 run-456 --reason handoff`, |
| 1884 | RunE: func(cmd *cobra.Command, args []string) error { |
| 1885 | runIDs, err := requiredTaskRunIDs(args) |
| 1886 | if err != nil { |
| 1887 | return err |
| 1888 | } |
| 1889 | request := ForceReleaseTaskRunRequest{ |
| 1890 | Reason: strings.TrimSpace(reason), |
| 1891 | } |
| 1892 | if cmd.Flags().Changed("metadata") { |
| 1893 | request.Metadata, err = parseAgentTaskJSONFlag("metadata", metadataRaw) |
| 1894 | if err != nil { |
| 1895 | return err |
| 1896 | } |
| 1897 | } |
| 1898 | |
| 1899 | client, err := clientFromDeps(deps) |
| 1900 | if err != nil { |
| 1901 | return err |
| 1902 | } |
| 1903 | if len(runIDs) == 1 { |
| 1904 | record, err := client.ForceReleaseTaskRun(cmd.Context(), runIDs[0], request) |
| 1905 | if err != nil { |
| 1906 | return err |
| 1907 | } |
| 1908 | return writeCommandOutput(cmd, taskRunBundle(record)) |
| 1909 | } |
| 1910 | record, err := client.BulkForceReleaseTaskRuns(cmd.Context(), BulkForceTaskRunRequest{ |
| 1911 | RunIDs: runIDs, |
| 1912 | Reason: request.Reason, |
| 1913 | Metadata: request.Metadata, |
| 1914 | }) |
| 1915 | if err != nil { |
| 1916 | return err |
| 1917 | } |
| 1918 | return writeCommandOutput(cmd, bulkForceTaskRunBundle(record)) |
| 1919 | }, |
| 1920 | } |
| 1921 | cmd.Flags().StringVar(&reason, "reason", "", "Optional release reason") |
| 1922 | cmd.Flags().StringVar(&metadataRaw, "metadata", "", "Optional release metadata JSON") |
| 1923 | return cmd |
| 1924 | } |
| 1925 | |
| 1926 | func newTaskRetryCommand(deps commandDeps) *cobra.Command { |
| 1927 | var metadataRaw string |
no test coverage detected