tmux-connector 0.9.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +134 -42
- data/lib/tmux-connector.rb +34 -30
- data/lib/tmux-connector/commands/start.rb +62 -2
- data/lib/tmux-connector/host.rb +19 -0
- data/lib/tmux-connector/version.rb +1 -1
- data/spec/config_spec.rb +4 -0
- data/spec/fixtures/configs.yml +12 -0
- metadata +2 -3
- data/TODO.md +0 -12
data/README.md
CHANGED
@@ -2,8 +2,28 @@
|
|
2
2
|
|
3
3
|
Manage multiple servers using SSH and [tmux].
|
4
4
|
|
5
|
+
For the demo and short intro, read [this blog post][blog-post].
|
6
|
+
|
7
|
+
|
8
|
+
- [Features](#features)
|
9
|
+
- [Quick tease](#quick-tease)
|
10
|
+
- [CLI description](#cli-description)
|
11
|
+
- [Send command](#send-command)
|
12
|
+
- [Configuration](#configuration)
|
13
|
+
- [Sessions without configuration files](#sessions-without-configuration-files)
|
14
|
+
- [Requirements](#requirements)
|
15
|
+
- [Installation](#installation)
|
16
|
+
- [Installing tmux](#installing-tmux)
|
17
|
+
- [Tips](#tips)
|
18
|
+
- [SSH config files](#ssh-config-files)
|
19
|
+
- [Tmux configuration](#tmux-configuration)
|
20
|
+
- [Sending the commands](#sending-the-commands)
|
21
|
+
- [Contributing](#contributing)
|
22
|
+
- [Comments, ideas or if you feel like chatting](#comments-ideas-or-if-you-feel-like-chatting)
|
23
|
+
|
24
|
+
|
25
|
+
## Features
|
5
26
|
|
6
|
-
## Features:
|
7
27
|
* connect to multiple servers at once
|
8
28
|
* expressive layouts customizable for different server groups available
|
9
29
|
* issue commands to all servers or just a selected (custom) subgroup
|
@@ -51,6 +71,11 @@ Manage multiple servers using SSH and [tmux].
|
|
51
71
|
|
52
72
|
- resume (recreate) 's#3' session, even after computer restart
|
53
73
|
|
74
|
+
`tcon start -q "dev.node-staging-[[42,]]"`
|
75
|
+
|
76
|
+
- starts quick session (no config file); selects all 'node' servers that have
|
77
|
+
index of at least 42
|
78
|
+
|
54
79
|
|
55
80
|
## CLI description
|
56
81
|
|
@@ -63,12 +88,13 @@ even after computer restarts. Complex sessions with different layouts for
|
|
63
88
|
different kinds of servers can be easily created.
|
64
89
|
|
65
90
|
Usage:
|
66
|
-
tcon start <config-file>
|
67
|
-
[--
|
91
|
+
tcon start ( <config-file> | --quick-session=<qs-args> )
|
92
|
+
[--ssh-config=<file>] [--session-name=<name>]
|
93
|
+
[--purpose=<description>]
|
68
94
|
tcon resume <session-name>
|
69
95
|
tcon delete (<session-name> | --all)
|
70
96
|
tcon list
|
71
|
-
tcon send <session-name> (<command> | --command-file=<file>)
|
97
|
+
tcon send <session-name> ( <command> | --command-file=<file> )
|
72
98
|
[ --server-filter=<filter> | --group-filter=<regex>
|
73
99
|
| --filter=<regex> | --window=<index> ]
|
74
100
|
[--verbose]
|
@@ -76,35 +102,39 @@ Usage:
|
|
76
102
|
tcon --version
|
77
103
|
|
78
104
|
Options:
|
79
|
-
<config-file>
|
80
|
-
|
81
|
-
<
|
82
|
-
<
|
83
|
-
<
|
84
|
-
<
|
85
|
-
<
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
-
|
90
|
-
|
91
|
-
--
|
92
|
-
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
-
|
100
|
-
|
101
|
-
|
102
|
-
-
|
103
|
-
|
104
|
-
|
105
|
-
--
|
105
|
+
<config-file> Path to configuration file. Configuration file
|
106
|
+
describes how new session is started. YAML.
|
107
|
+
<qs-args> Arguments needed to start a quick session.
|
108
|
+
<session-name> Name to identify the session. Must be unique.
|
109
|
+
<command> Command to be executed on remote server[s].
|
110
|
+
<regex> String that represents valid Ruby regex.
|
111
|
+
<index> 0-based index.
|
112
|
+
<filter> Filter consisting of a valid ruby regex and
|
113
|
+
optionally of a special predicate.
|
114
|
+
For more information see README file.
|
115
|
+
-q --quick-session=qs-args Start the seesion without a configuration file.
|
116
|
+
Specify necessary argumenst instead.
|
117
|
+
-s --ssh-config=file Path to ssh config file. [default: ~/.ssh/config]
|
118
|
+
-n --session-name=name Name of the session.
|
119
|
+
-p --purpose=description Description of session's purpose.
|
120
|
+
--all Delete all existing sessions.
|
121
|
+
-f --server-filter=filter Filter to select a subset of the servers via
|
122
|
+
host names.
|
123
|
+
-g --group-filter=regex Filter to select a subset of the servers via
|
124
|
+
group membership.
|
125
|
+
-r --filter=regex Filter to select a subset of the servers via
|
126
|
+
host names or group membership.
|
127
|
+
Combines --server-filter and --group-filter.
|
128
|
+
-w --window=index Select a window via (0-based) index.
|
129
|
+
-c --command-file=file File containing the list of commands to be
|
130
|
+
executed on remote server[s].
|
131
|
+
-v --verbose Report how many servers were affected by the
|
132
|
+
send command.
|
133
|
+
-h --help Show this screen.
|
134
|
+
--version Show version.
|
106
135
|
~~~
|
107
136
|
|
137
|
+
|
108
138
|
### Send command
|
109
139
|
|
110
140
|
Send command sends user specified command(s) to chosen panes.
|
@@ -162,14 +192,10 @@ tcon send production -f 'worker' 'tail -f /var/log/syslog'
|
|
162
192
|
tcon send production -f 'worker :: <,3]; 7; <9,13>' 'C-c'
|
163
193
|
~~~
|
164
194
|
|
165
|
-
## Configuration
|
166
195
|
|
167
|
-
|
168
|
-
that hard and here I provide exhaustive details about configuration files.
|
196
|
+
## Configuration
|
169
197
|
|
170
|
-
|
171
|
-
command to simplify generation of configuration files. To accelerate the
|
172
|
-
process, open an issue or drop me an email: ivan@<< username >>.com)
|
198
|
+
To use this gem, you usually need to create a configuration file.
|
173
199
|
|
174
200
|
Let's get to it.
|
175
201
|
|
@@ -248,6 +274,9 @@ hostless:
|
|
248
274
|
merge-groups:
|
249
275
|
misc: ['cache', 'db', 'mongodb']
|
250
276
|
lbs: ['haproxy', 'nginx']
|
277
|
+
group-ranges:
|
278
|
+
cache: [1, 4]
|
279
|
+
node: [125, 131]
|
251
280
|
multiple-hosts:
|
252
281
|
regexes:
|
253
282
|
- !ruby-regexp '(nginx|haproxy)-'
|
@@ -283,7 +312,7 @@ Host dev.database-staging-1
|
|
283
312
|
~~~
|
284
313
|
|
285
314
|
and the following regex is used:
|
286
|
-
~~~
|
315
|
+
~~~yaml
|
287
316
|
regex: !ruby-regexp '^(\w+)\.(\w+)-([\w-]+)-(\d+)$'
|
288
317
|
~~~
|
289
318
|
|
@@ -345,7 +374,7 @@ Hostless panes can be used to:
|
|
345
374
|
layout purposes) together. This can be used to group a few servers that are
|
346
375
|
unique in type or small in numbers. E.g. grouping different DB servers.
|
347
376
|
|
348
|
-
~~~
|
377
|
+
~~~yaml
|
349
378
|
lbs: ['haproxy', 'nginx']
|
350
379
|
~~~
|
351
380
|
In this example two different kinds of loadbalancers are grouped together.
|
@@ -355,6 +384,21 @@ original and merge-group name.
|
|
355
384
|
|
356
385
|
Hostless groups can also be merged.
|
357
386
|
|
387
|
+
* * *
|
388
|
+
(optional) field __'group-ranges'__ contains groups that should be limited to
|
389
|
+
specific ranges of servers. Ranges are defined by lower and upper limits, both inclusive.
|
390
|
+
They are enforced on sort values (defined by aforementioned 'sort-by' field).
|
391
|
+
|
392
|
+
If the following group ranges were defined:
|
393
|
+
~~~yaml
|
394
|
+
group-ranges:
|
395
|
+
cache: [1, 4]
|
396
|
+
node: [125, 131]
|
397
|
+
~~~
|
398
|
+
Only cache servers with sort ids 1, 2, 3 or 4 would be included in the session.
|
399
|
+
Similarly for node servers, only servers with ids between 125 and 131 would be
|
400
|
+
included.
|
401
|
+
|
358
402
|
* * *
|
359
403
|
(optional) field __'multiple-hosts'__ contains __'regexes'__ and __'counts'__
|
360
404
|
fields. With those, some hosts can have multiple connections established, not
|
@@ -401,6 +445,43 @@ Take a look at [`spec/fixtures/configs.yml`][configs] for some configuration
|
|
401
445
|
possibilities (sections under 'input' fields).
|
402
446
|
|
403
447
|
|
448
|
+
## Sessions without configuration files
|
449
|
+
|
450
|
+
As mentioned in previous section, normally you need the configuration file to
|
451
|
+
start the session.
|
452
|
+
|
453
|
+
This is not true for some smaller sessions where you can directly specify all
|
454
|
+
necessary configuration in command line when starting the session.
|
455
|
+
|
456
|
+
You can use `--quick-session` (or `-q`) to start a quick session. Quick
|
457
|
+
session arguments must conform to the following format:
|
458
|
+
~~~
|
459
|
+
"<regex>[[<lower-limit>,<upper-limit>]]<additional-arguments>"
|
460
|
+
~~~
|
461
|
+
where:
|
462
|
+
|
463
|
+
* `<regex>` is similar to 'regex' filed in configuration file, but without the
|
464
|
+
sorting part (which is presumably last part of the full regex)
|
465
|
+
* `<lower-limit>` and `<upper-limit>` are optional elements and define range of
|
466
|
+
valid servers. Range is enforced on sorting part (which is not part of
|
467
|
+
previous regex, but presumably comes after it)
|
468
|
+
* `<optional-additional-arguments>` is list of optional arguments. This list
|
469
|
+
starts with ' :: ' and consists of key-value pairs separated by semicolon.
|
470
|
+
Currently only `h` and `v` arguments are supported. Format:
|
471
|
+
`:: h <max-horizontal-panes>; v <max-vertical-panes>`
|
472
|
+
|
473
|
+
Examples:
|
474
|
+
|
475
|
+
- `tcon start -q "dev.node-staging-[[1,24]]"`
|
476
|
+
- `tcon start -q "dev.node-staging-[[42,]]"`
|
477
|
+
- `tcon start -q "dev.node-staging-[[,]]"`
|
478
|
+
- `tcon start -q "dev.node-staging-[[,42]] :: h 2; v 2"`
|
479
|
+
|
480
|
+
Example with more complex regex (selects 2 kinds of servers):
|
481
|
+
|
482
|
+
- `tcon start -q "dev.(nginx|haproxy)-staging-[[10,30]] :: h 2; v 2"`
|
483
|
+
|
484
|
+
|
404
485
|
## Requirements
|
405
486
|
To be able to use the gem you should have ruby 1.9+ and tmux installed on a *nix
|
406
487
|
(Mac OS X, Linux, ...) machine. (Windows: here be dragons)
|
@@ -463,6 +544,19 @@ user, and so configure tmux to use Vim-like bindings to switch panes. For more
|
|
463
544
|
information, check my [dotfiles].
|
464
545
|
|
465
546
|
|
547
|
+
### Sending the commands
|
548
|
+
|
549
|
+
You need to run the send command from somewhere. There are (at least) 2
|
550
|
+
options:
|
551
|
+
|
552
|
+
* have a controller pane (or the whole window) inside the tcon session
|
553
|
+
- a pane not connected to a server to issue the commands to other panes
|
554
|
+
* have a separate terminal pane for issuing the send commands
|
555
|
+
- I'm a iTerm2 user, and so I split the window vertically: much bigger
|
556
|
+
top pane for the tcon session, and a smaller bottom pane to issue the
|
557
|
+
send commands
|
558
|
+
|
559
|
+
|
466
560
|
## Contributing
|
467
561
|
|
468
562
|
1. Fork it
|
@@ -480,9 +574,6 @@ comments (all other are welcome too). Just _drop me a line_. :)
|
|
480
574
|
|
481
575
|
## Comments, ideas or if you feel like chatting
|
482
576
|
|
483
|
-
Take a look at `TODO.md` file (in the repository) for ideas about additional
|
484
|
-
features in new versions.
|
485
|
-
|
486
577
|
ivan@<< username >>.com
|
487
578
|
|
488
579
|
I'd be happy to hear from you.
|
@@ -490,6 +581,7 @@ I'd be happy to hear from you.
|
|
490
581
|
Also, visit my [homepage].
|
491
582
|
|
492
583
|
|
584
|
+
[blog-post]: http://www.ikusalic.com/blog/2013/06/18/managing-multiple-servers-with-tcon/
|
493
585
|
[configs]: /spec/fixtures/configs.yml
|
494
586
|
[docopt]: https://github.com/docopt/docopt
|
495
587
|
[tmux]: http://en.wikipedia.org/wiki/Tmux
|
data/lib/tmux-connector.rb
CHANGED
@@ -12,12 +12,13 @@ even after computer restarts. Complex sessions with different layouts for
|
|
12
12
|
different kinds of servers can be easily created.
|
13
13
|
|
14
14
|
Usage:
|
15
|
-
tcon start <config-file>
|
16
|
-
[--
|
15
|
+
tcon start ( <config-file> | --quick-session=<qs-args> )
|
16
|
+
[--ssh-config=<file>] [--session-name=<name>]
|
17
|
+
[--purpose=<description>]
|
17
18
|
tcon resume <session-name>
|
18
19
|
tcon delete (<session-name> | --all)
|
19
20
|
tcon list
|
20
|
-
tcon send <session-name> (<command> | --command-file=<file>)
|
21
|
+
tcon send <session-name> ( <command> | --command-file=<file> )
|
21
22
|
[ --server-filter=<filter> | --group-filter=<regex>
|
22
23
|
| --filter=<regex> | --window=<index> ]
|
23
24
|
[--verbose]
|
@@ -25,33 +26,36 @@ Usage:
|
|
25
26
|
tcon --version
|
26
27
|
|
27
28
|
Options:
|
28
|
-
<config-file>
|
29
|
-
|
30
|
-
<
|
31
|
-
<
|
32
|
-
<
|
33
|
-
<
|
34
|
-
<
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
-
|
39
|
-
|
40
|
-
--
|
41
|
-
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
-
|
49
|
-
|
50
|
-
|
51
|
-
-
|
52
|
-
|
53
|
-
|
54
|
-
--
|
29
|
+
<config-file> Path to configuration file. Configuration file
|
30
|
+
describes how new session is started. YAML.
|
31
|
+
<qs-args> Arguments needed to start a quick session.
|
32
|
+
<session-name> Name to identify the session. Must be unique.
|
33
|
+
<command> Command to be executed on remote server[s].
|
34
|
+
<regex> String that represents valid Ruby regex.
|
35
|
+
<index> 0-based index.
|
36
|
+
<filter> Filter consisting of a valid ruby regex and
|
37
|
+
optionally of a special predicate.
|
38
|
+
For more information see README file.
|
39
|
+
-q --quick-session=qs-args Start the seesion without a configuration file.
|
40
|
+
Specify necessary argumenst instead.
|
41
|
+
-s --ssh-config=file Path to ssh config file. [default: ~/.ssh/config]
|
42
|
+
-n --session-name=name Name of the session.
|
43
|
+
-p --purpose=description Description of session's purpose.
|
44
|
+
--all Delete all existing sessions.
|
45
|
+
-f --server-filter=filter Filter to select a subset of the servers via
|
46
|
+
host names.
|
47
|
+
-g --group-filter=regex Filter to select a subset of the servers via
|
48
|
+
group membership.
|
49
|
+
-r --filter=regex Filter to select a subset of the servers via
|
50
|
+
host names or group membership.
|
51
|
+
Combines --server-filter and --group-filter.
|
52
|
+
-w --window=index Select a window via (0-based) index.
|
53
|
+
-c --command-file=file File containing the list of commands to be
|
54
|
+
executed on remote server[s].
|
55
|
+
-v --verbose Report how many servers were affected by the
|
56
|
+
send command.
|
57
|
+
-h --help Show this screen.
|
58
|
+
--version Show version.
|
55
59
|
HERE
|
56
60
|
|
57
61
|
def self.main(input_args)
|
@@ -13,14 +13,18 @@ module TmuxConnector
|
|
13
13
|
attr_reader :session
|
14
14
|
|
15
15
|
def initialize(args)
|
16
|
-
|
16
|
+
if args['<config-file>']
|
17
|
+
@config = TmuxConnector.get_config args['<config-file>']
|
18
|
+
elsif args['--quick-session']
|
19
|
+
@config = quick_session_to_config args['--quick-session']
|
20
|
+
end
|
17
21
|
|
18
22
|
ssh_hostnames = SSHConfig.get_hosts(args['--ssh-config'], config['reject-regex'])
|
19
23
|
@hosts = ssh_hostnames.reduce([]) do |acc, name|
|
20
24
|
( acc << Host.new(name, config) ) rescue nil
|
21
25
|
acc
|
22
26
|
end
|
23
|
-
raise "no hosts matching given configuration found, check your configuration
|
27
|
+
raise "no hosts matching given configuration found, check your configuration" if hosts.empty?
|
24
28
|
|
25
29
|
generate_groups
|
26
30
|
generate_merge_rules
|
@@ -35,6 +39,62 @@ module TmuxConnector
|
|
35
39
|
|
36
40
|
private
|
37
41
|
|
42
|
+
def quick_session_to_config(quick_args)
|
43
|
+
quick_regex = /(?<regex>.+)\[\[(?<first>[^,]*),\s*(?<second>[^\]]*)\]\]( :: (?<args>.+))?/
|
44
|
+
str_regex, first, last, additiona_args = quick_args.match(quick_regex)[1 .. -1]
|
45
|
+
|
46
|
+
first = "" if first =~ /^\s*$/
|
47
|
+
second = "" if second =~ /^\s*$/
|
48
|
+
|
49
|
+
conf = generate_fake_config str_regex
|
50
|
+
TmuxConnector.process_config! conf
|
51
|
+
apply_additional_arguments! conf, additiona_args
|
52
|
+
|
53
|
+
conf['group-ranges'] = {
|
54
|
+
TmuxConnector::QUICK_GROUP_ID => [first, last]
|
55
|
+
}
|
56
|
+
|
57
|
+
return conf
|
58
|
+
rescue
|
59
|
+
raise 'quick session argument parsing failed'
|
60
|
+
end
|
61
|
+
|
62
|
+
def generate_fake_config(str_regex)
|
63
|
+
return {
|
64
|
+
'regex' => "(#{ str_regex })(.+)",
|
65
|
+
'regex-parts-to' => {
|
66
|
+
'group-by' => [0],
|
67
|
+
'sort-by' => [-1]
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def apply_additional_arguments!(conf, args)
|
73
|
+
return if args.nil?
|
74
|
+
|
75
|
+
args_delimiter = /;\s*/
|
76
|
+
|
77
|
+
options = args.split(args_delimiter).reduce({}) do |acc, e|
|
78
|
+
k, v = e.split
|
79
|
+
acc[k] = v
|
80
|
+
acc
|
81
|
+
end
|
82
|
+
|
83
|
+
begin
|
84
|
+
h, v = Integer(options['h'], 10), Integer(options['v'], 10)
|
85
|
+
conf['layout'] = {
|
86
|
+
'default' => {
|
87
|
+
'custom' => {
|
88
|
+
'max-horizontal' => h,
|
89
|
+
'max-vertical' => v,
|
90
|
+
'panes-flow' => 'horizontal'
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
94
|
+
rescue
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
38
98
|
def generate_groups()
|
39
99
|
@groups = hosts.reduce({}) do |acc, e|
|
40
100
|
acc[e.group_id] ||= []
|
data/lib/tmux-connector/host.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
module TmuxConnector
|
2
|
+
QUICK_GROUP_ID = 'quick_group_id'
|
3
|
+
|
2
4
|
class Host
|
3
5
|
attr_accessor :sort_value
|
4
6
|
|
@@ -15,6 +17,7 @@ module TmuxConnector
|
|
15
17
|
@sort_value = config['regex-parts-to']['sort-by'].map { |i| groups[i] }.join '-'
|
16
18
|
@group_id = config['regex-parts-to']['group-by'].map { |i| groups[i] }.join '-'
|
17
19
|
|
20
|
+
check_range! config['group-ranges']
|
18
21
|
@count = get_count config
|
19
22
|
end
|
20
23
|
|
@@ -24,6 +27,22 @@ module TmuxConnector
|
|
24
27
|
|
25
28
|
private
|
26
29
|
|
30
|
+
def check_range!(ranges)
|
31
|
+
return if ranges.nil?
|
32
|
+
|
33
|
+
range = ranges[group_id] || ranges[TmuxConnector::QUICK_GROUP_ID]
|
34
|
+
if range
|
35
|
+
a, b = range.map(&:to_s)
|
36
|
+
x = sort_value
|
37
|
+
|
38
|
+
numbers_only = [a, b, x].all? { |e| e =~ /^[-+]?[0-9]*$/ }
|
39
|
+
a, b, x = [a, b, x].map { |e| Integer(e, 10) rescue nil } if numbers_only
|
40
|
+
|
41
|
+
raise if a && x < a
|
42
|
+
raise if b && x > b
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
27
46
|
def create_display_name(groups, config)
|
28
47
|
if config['name']
|
29
48
|
parts = []
|
data/spec/config_spec.rb
CHANGED
@@ -55,5 +55,9 @@ describe "Configuration file" do
|
|
55
55
|
it_should_behave_like "config test", 'hostless'
|
56
56
|
it_should_behave_like "config test", 'hostless-merge'
|
57
57
|
end
|
58
|
+
|
59
|
+
describe "group intervals" do
|
60
|
+
it_should_behave_like "config test", 'group-intervals'
|
61
|
+
end
|
58
62
|
end
|
59
63
|
end
|
data/spec/fixtures/configs.yml
CHANGED
@@ -48,6 +48,18 @@ merge:
|
|
48
48
|
misc: ['repo', 'mongodb', 'sshforwarder']
|
49
49
|
lbs: ['loadbalancer', 'ngx']
|
50
50
|
|
51
|
+
group-intervals:
|
52
|
+
input:
|
53
|
+
<<: *input-min
|
54
|
+
group-intervals:
|
55
|
+
lxc: [199, 243]
|
56
|
+
ngx: [11, 42]
|
57
|
+
expected:
|
58
|
+
<<: *expected-min
|
59
|
+
group-intervals:
|
60
|
+
lxc: [199, 243]
|
61
|
+
ngx: [11, 42]
|
62
|
+
|
51
63
|
layout-default:
|
52
64
|
input:
|
53
65
|
<<: *input-min
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tmux-connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: docopt
|
@@ -60,7 +60,6 @@ files:
|
|
60
60
|
- LICENSE.txt
|
61
61
|
- README.md
|
62
62
|
- Rakefile
|
63
|
-
- TODO.md
|
64
63
|
- bin/tcon
|
65
64
|
- lib/tmux-connector.rb
|
66
65
|
- lib/tmux-connector/command_handler.rb
|
data/TODO.md
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
possible features for new version:
|
2
|
-
* ensure it works with zsh
|
3
|
-
* generate default config via just regex(es)
|
4
|
-
* add strict config file validation
|
5
|
-
* add window (via option) that won't connect to nay server
|
6
|
-
- for tcon commands and regular actions on local machine
|
7
|
-
* startup command
|
8
|
-
|
9
|
-
code related:
|
10
|
-
* add specs
|
11
|
-
* test with ruby 2.0
|
12
|
-
* refactoring
|